aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ports/libmlservo/src/lib.rs571
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-color/parsing/color-mix-out-of-gamut.html.ini (renamed from tests/wpt/metadata/css/css-color/parsing/gamut-mapping.html.ini)22
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-padding-004.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/overlay/animation/overlay-interpolation.html.ini264
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini12
-rw-r--r--tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini6
-rw-r--r--tests/wpt/metadata/MANIFEST.json1883
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-color/parsing/color-mix-out-of-gamut.html.ini54
-rw-r--r--tests/wpt/metadata/css/css-conditional/at-supports-selector-file-selector-button.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/percentage-padding-004.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-composition.html.ini750
-rw-r--r--tests/wpt/metadata/css/css-position/overlay/animation/overlay-interpolation.html.ini264
-rw-r--r--tests/wpt/metadata/css/cssom/idlharness.html.ini12
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-body-read-task-handling.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/data-urls/navigate.window.js.ini6
-rw-r--r--tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini3
-rw-r--r--tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini3
-rw-r--r--tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini2
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.https.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini2
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse-during-unload.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini3
-rw-r--r--tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.w.html.ini2
-rw-r--r--tests/wpt/metadata/html/dom/idlharness.https.html.ini30
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html.ini12
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini9
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini7
-rw-r--r--tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini3
-rw-r--r--tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js.ini4
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini3
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.ini14
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini3
-rw-r--r--tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini3
-rw-r--r--tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini3
-rw-r--r--tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini3
-rw-r--r--tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini3
-rw-r--r--tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini4
-rw-r--r--tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini3
-rw-r--r--tests/wpt/metadata/performance-timeline/navigation-id-worker-created-entries.html.ini3
-rw-r--r--tests/wpt/metadata/resource-timing/idlharness.any.js.ini12
-rw-r--r--tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini17
-rw-r--r--tests/wpt/metadata/streams/readable-streams/owning-type-message-port.any.js.ini21
-rw-r--r--tests/wpt/metadata/streams/readable-streams/owning-type-video-frame.any.js.ini38
-rw-r--r--tests/wpt/metadata/streams/readable-streams/owning-type.any.js.ini39
-rw-r--r--tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini2
-rw-r--r--tests/wpt/metadata/webmessaging/without-ports/017.html.ini4
-rw-r--r--tests/wpt/metadata/webmessaging/without-ports/018.html.ini4
-rw-r--r--tests/wpt/metadata/websockets/multi-globals/url-parsing/url-parsing.html.ini3
-rw-r--r--tests/wpt/mozilla/meta/css/stylesheet_media_queries.html.ini3
-rw-r--r--tests/wpt/web-platform-tests/.azure-pipelines.yml28
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js14
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html25
-rw-r--r--tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html13
-rw-r--r--tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html14
-rw-r--r--tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html16
-rw-r--r--tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-write-multiple.tentative.https.sub.html106
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/resources/page.html26
-rw-r--r--tests/wpt/web-platform-tests/common/rendering-utils.js8
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js22
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/nonce-hiding/nonce-hiding-move-document.html26
-rw-r--r--tests/wpt/web-platform-tests/cookies/resources/list-cookies-for-script.py12
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-braillelabel-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription_is_empty-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/core-aam/blockquote-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/core-aam/caption-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/core-aam/deletion-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/core-aam/insertion-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/core-aam/mark-manual.html93
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menuitem-manual.html (renamed from tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html)6
-rw-r--r--tests/wpt/web-platform-tests/core-aam/meter-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/core-aam/paragraph-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/core-aam/suggestion-manual.html (renamed from tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html)44
-rw-r--r--tests/wpt/web-platform-tests/core-aam/time-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/floats/float-in-nested-multicol-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html8
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html68
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html5
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html8
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-001.html (renamed from tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-002.html99
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.html44
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht19
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht19
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht19
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht19
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html282
-rw-r--r--tests/wpt/web-platform-tests/css/css-color/parsing/color-mix-out-of-gamut.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-color/parsing/gamut-mapping.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-conditional/at-supports-selector-file-selector-button.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-contain/container-queries/display-contents-dynamic-style-queries.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/percentage-padding-004.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html665
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/font-features-two-stylesheets-crash.html10
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006.html79
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002-ref.html96
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002.html100
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/overlay/animation/overlay-interpolation.html80
-rw-r--r--tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html2
-rw-r--r--tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html4
-rw-r--r--tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-button.tentative.html77
-rw-r--r--tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-summary.tentative.html90
-rw-r--r--tests/wpt/web-platform-tests/fenced-frame/automatic-beacon-click-handler.https.html80
-rw-r--r--tests/wpt/web-platform-tests/fenced-frame/resources/automatic-beacon-store.py25
-rw-r--r--tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js5
-rw-r--r--tests/wpt/web-platform-tests/fenced-frame/resources/utils.js32
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/abort/general.any.js2
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html38
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.https.html (renamed from tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.html)8
-rw-r--r--tests/wpt/web-platform-tests/graphics-aria/META.yml4
-rw-r--r--tests/wpt/web-platform-tests/graphics-aria/graphics-roles.html22
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html (renamed from tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html)46
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage.html34
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData.html34
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html35
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html35
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html35
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html35
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed-expected.html23
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed.html22
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html35
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html38
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html49
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html35
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html49
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html37
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html51
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html35
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html49
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html37
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html51
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html24
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.html36
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html50
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html6
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html23
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.html25
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.w.html39
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py112
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml195
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml44
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml140
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js12
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html11
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html62
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html2
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html2
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html13
-rw-r--r--tests/wpt/web-platform-tests/html/dom/idlharness.https.html2
-rw-r--r--tests/wpt/web-platform-tests/html/dom/idlharness.worker.js2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-only-if-applies.html75
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname-iframe.html (renamed from tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr-iframe.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname.js12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html142
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html197
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html71
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html16
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hide.tentative.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hover.tentative.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-show.tentative.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-toggle.tentative.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide.tentative.html129
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html7
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-hover-hide-common.js139
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js29
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js25
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.headers2
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js5
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/reporterror-in-detached-window-crash.html11
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/structured-clone/structured-clone-detached-window-crash.html11
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/README.md5
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl16
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-cascade.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cssom.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/fenced-frame.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/fs.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/html.idl8
-rw-r--r--tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/real-world-meshing.idl21
-rw-r--r--tests/wpt/web-platform-tests/interfaces/resource-timing.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/scroll-animations.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/shared-storage.idl80
-rw-r--r--tests/wpt/web-platform-tests/interfaces/storage-buckets.idl53
-rw-r--r--tests/wpt/web-platform-tests/interfaces/trust-token-api.idl7
-rw-r--r--tests/wpt/web-platform-tests/interfaces/turtledove.idl28
-rw-r--r--tests/wpt/web-platform-tests/interfaces/url.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webauthn.idl37
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl8
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl8
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webcodecs.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webgpu.idl222
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webnn.idl7
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl3
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webxrlayers.idl9
-rw-r--r--tests/wpt/web-platform-tests/lint.ignore5
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html9
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-video-key-frame-distance.html39
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html21
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html2
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html40
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html2
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html2
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html26
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html2
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id-worker-created-entries.html27
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js50
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/resources/worker-navigation-id.js6
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html22
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html3
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html13
-rw-r--r--tests/wpt/web-platform-tests/preload/modulepreload-as.html67
-rw-r--r--tests/wpt/web-platform-tests/preload/modulepreload-sri.html18
-rw-r--r--tests/wpt/web-platform-tests/preload/modulepreload.html161
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test-ref.html72
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test.html57
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html34
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html24
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html14
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html541
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html2
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html43
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html24
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html2
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html29
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html8
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html50
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html96
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html10
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html16
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html15
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html32
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html2
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html92
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sibling-gcs.html52
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/support/animation-range.css82
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js2
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html14
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html41
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-computed.tentative.html35
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-parsing.tentative.html29
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope.html314
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html16
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html14
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html8
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html20
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html114
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html44
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html16
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html16
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html32
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html78
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html8
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html12
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html4
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html2
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html31
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html49
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html32
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js10
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js10
-rw-r--r--tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js4
-rw-r--r--tests/wpt/web-platform-tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js35
-rw-r--r--tests/wpt/web-platform-tests/storage/buckets/bucket-storage-policy.tentative.https.any.js21
-rw-r--r--tests/wpt/web-platform-tests/storage/buckets/buckets_storage_policy.tentative.https.any.js46
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/owning-type-message-port.any.js49
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/owning-type-video-frame.any.js128
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/owning-type.any.js91
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/read-task-handling.window.js46
-rw-r--r--tests/wpt/web-platform-tests/streams/transferable/transform-stream-members.any.js16
-rw-r--r--tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html8
-rw-r--r--tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html6
-rw-r--r--tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html4
-rw-r--r--tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html12
-rw-r--r--tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html8
-rw-r--r--tests/wpt/web-platform-tests/svg/pservers/reftests/pattern-opacity-01.svg14
-rw-r--r--tests/wpt/web-platform-tests/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg3
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml1
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/azure/color_profile.yml5
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/commands.json9
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/macos_color_profile.py43
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/requirements_macos_color_profile.txt4
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt2
-rw-r--r--tests/wpt/web-platform-tests/tools/mypy.ini9
-rw-r--r--tests/wpt/web-platform-tests/tools/requirements_tests.txt2
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/wpt.py9
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py94
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py36
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py62
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py98
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py9
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/role/abstract-roles.html35
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/role/fallback-roles.html35
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/role/form-roles.html28
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/role/invalid-roles.html37
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/role/role_none_conflict_resolution.html37
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/role/roles.html2
-rw-r--r--tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js7
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/back/back.py2
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py7
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py14
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py40
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py7
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py9
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py2
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py2
-rw-r--r--tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpParameters-codec.html422
-rw-r--r--tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/current/current.html2
-rw-r--r--tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/incumbent/incumbent.html13
-rw-r--r--tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/url-parsing.html22
-rw-r--r--tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js13
-rw-r--r--tests/wpt/web-platform-tests/webtransport/handlers/echo_datagram_length.py8
482 files changed, 13345 insertions, 2655 deletions
diff --git a/ports/libmlservo/src/lib.rs b/ports/libmlservo/src/lib.rs
new file mode 100644
index 00000000000..f18136d2dea
--- /dev/null
+++ b/ports/libmlservo/src/lib.rs
@@ -0,0 +1,571 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use egl::egl::EGLContext;
+use egl::egl::EGLDisplay;
+use egl::egl::EGLSurface;
+use egl::egl::MakeCurrent;
+use egl::egl::SwapBuffers;
+use libc::{dup2, pipe, read};
+use log::info;
+use log::warn;
+use rust_webvr::api::MagicLeapVRService;
+use servo::euclid::Scale;
+use servo::keyboard_types::Key;
+use servo::servo_url::ServoUrl;
+use servo::webrender_api::units::{DeviceIntRect, DevicePixel, DevicePoint, LayoutPixel};
+use simpleservo::{self, deinit, gl_glue, MouseButton, ServoGlue, SERVO};
+use simpleservo::{
+ Coordinates, EventLoopWaker, HostTrait, InitOptions, InputMethodType, PromptResult,
+ VRInitOptions,
+};
+use smallvec::SmallVec;
+use std::cell::Cell;
+use std::ffi::CStr;
+use std::ffi::CString;
+use std::io::Write;
+use std::os::raw::c_char;
+use std::os::raw::c_int;
+use std::os::raw::c_void;
+use std::rc::Rc;
+use std::thread;
+use std::time::Duration;
+use std::time::Instant;
+use webxr::magicleap::MagicLeapDiscovery;
+
+#[repr(u32)]
+pub enum MLLogLevel {
+ Fatal = 0,
+ Error = 1,
+ Warning = 2,
+ Info = 3,
+ Debug = 4,
+ Verbose = 5,
+}
+
+#[repr(C)]
+#[allow(non_camel_case_types)]
+pub enum MLKeyType {
+ kNone,
+ kCharacter,
+ kBackspace,
+ kShift,
+ kSpeechToText,
+ kPageEmoji,
+ kPageLowerLetters,
+ kPageNumericSymbols,
+ kCancel,
+ kSubmit,
+ kPrevious,
+ kNext,
+ kClear,
+ kClose,
+ kEnter,
+ kCustom1,
+ kCustom2,
+ kCustom3,
+ kCustom4,
+ kCustom5,
+}
+
+#[repr(transparent)]
+#[derive(Clone, Copy)]
+pub struct MLLogger(Option<extern "C" fn(MLLogLevel, *const c_char)>);
+
+#[repr(transparent)]
+pub struct MLHistoryUpdate(Option<extern "C" fn(MLApp, bool, bool)>);
+
+#[repr(transparent)]
+pub struct MLURLUpdate(Option<extern "C" fn(MLApp, *const c_char)>);
+
+#[repr(transparent)]
+pub struct MLKeyboard(Option<extern "C" fn(MLApp, bool)>);
+
+#[repr(transparent)]
+#[derive(Clone, Copy)]
+pub struct MLApp(*mut c_void);
+
+const LOG_LEVEL: log::LevelFilter = log::LevelFilter::Info;
+
+fn call<F, T>(f: F) -> Result<T, &'static str>
+where
+ F: FnOnce(&mut ServoGlue) -> Result<T, &'static str>,
+{
+ SERVO.with(|s| match s.borrow_mut().as_mut() {
+ Some(ref mut s) => (f)(s),
+ None => Err("Servo is not available in this thread"),
+ })
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn init_servo(
+ ctxt: EGLContext,
+ surf: EGLSurface,
+ disp: EGLDisplay,
+ landscape: bool,
+ app: MLApp,
+ logger: MLLogger,
+ history_update: MLHistoryUpdate,
+ url_update: MLURLUpdate,
+ keyboard: MLKeyboard,
+ url: *const c_char,
+ default_args: *const c_char,
+ width: u32,
+ height: u32,
+ hidpi: f32,
+) -> *mut ServoInstance {
+ redirect_stdout_to_log(logger);
+ let _ = log::set_boxed_logger(Box::new(logger));
+ log::set_max_level(LOG_LEVEL);
+
+ let gl = gl_glue::egl::init().expect("EGL initialization failure");
+
+ let coordinates = Coordinates::new(
+ 0,
+ 0,
+ width as i32,
+ height as i32,
+ width as i32,
+ height as i32,
+ );
+
+ let mut url = CStr::from_ptr(url).to_str().unwrap_or("about:blank");
+
+ // If the URL has a space in it, then treat everything before the space as arguments
+ let args = if let Some(i) = url.rfind(' ') {
+ let (front, back) = url.split_at(i);
+ url = back;
+ front.split(' ').map(|s| s.to_owned()).collect()
+ } else if !default_args.is_null() {
+ CStr::from_ptr(default_args)
+ .to_str()
+ .unwrap_or("")
+ .split(' ')
+ .map(|s| s.to_owned())
+ .collect()
+ } else {
+ Vec::new()
+ };
+
+ info!("got args: {:?}", args);
+
+ let vr_init = if !landscape {
+ let name = String::from("Magic Leap VR Display");
+ let (service, heartbeat) = MagicLeapVRService::new(name, ctxt, gl.gl_wrapper.clone())
+ .expect("Failed to create VR service");
+ let service = Box::new(service);
+ let heartbeat = Box::new(heartbeat);
+ VRInitOptions::VRService(service, heartbeat)
+ } else {
+ VRInitOptions::None
+ };
+
+ let xr_discovery: Option<Box<dyn webxr_api::Discovery>> = if !landscape {
+ let discovery = MagicLeapDiscovery::new(ctxt, gl.gl_wrapper.clone());
+ Some(Box::new(discovery))
+ } else {
+ None
+ };
+
+ let opts = InitOptions {
+ args,
+ density: hidpi,
+ xr_discovery,
+ coordinates,
+ gl_context_pointer: Some(ctxt),
+ native_display_pointer: Some(disp),
+ ..Default::default()
+ };
+ let wakeup = Box::new(EventLoopWakerInstance);
+ let shut_down_complete = Rc::new(Cell::new(false));
+ let callbacks = Box::new(HostCallbacks {
+ app,
+ ctxt,
+ surf,
+ disp,
+ landscape,
+ shut_down_complete: shut_down_complete.clone(),
+ history_update,
+ url_update,
+ keyboard,
+ });
+ info!("Starting servo");
+ simpleservo::init(opts, gl.gl_wrapper, wakeup, callbacks).expect("error initializing Servo");
+
+ let result = Box::new(ServoInstance {
+ scroll_state: ScrollState::TriggerUp,
+ scroll_scale: Scale::new(SCROLL_SCALE / hidpi),
+ shut_down_complete,
+ });
+ Box::into_raw(result)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn heartbeat_servo(_servo: *mut ServoInstance) {
+ let _ = call(|s| s.perform_updates());
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn keyboard_servo(
+ _servo: *mut ServoInstance,
+ key_code: char,
+ key_type: MLKeyType,
+) {
+ let key = match key_type {
+ MLKeyType::kCharacter => Key::Character([key_code].iter().collect()),
+ MLKeyType::kBackspace => Key::Backspace,
+ MLKeyType::kEnter => Key::Enter,
+ _ => return,
+ };
+ // TODO: can the ML1 generate separate press and release events?
+ let key2 = key.clone();
+ let _ = call(move |s| s.key_down(key2));
+ let _ = call(move |s| s.key_up(key));
+}
+
+// Some magic numbers.
+
+// How far does the cursor have to move for it to count as a drag rather than a click?
+// (In device pixels squared, to avoid taking a sqrt when calculating move distance.)
+const DRAG_CUTOFF_SQUARED: f32 = 900.0;
+
+// How much should we scale scrolling by?
+const SCROLL_SCALE: f32 = 3.0;
+
+#[no_mangle]
+pub unsafe extern "C" fn move_servo(servo: *mut ServoInstance, x: f32, y: f32) {
+ // Servo's cursor was moved
+ if let Some(servo) = servo.as_mut() {
+ let point = DevicePoint::new(x, y);
+ match servo.scroll_state {
+ ScrollState::TriggerUp => {
+ servo.scroll_state = ScrollState::TriggerUp;
+ let _ = call(|s| s.mouse_move(x, y));
+ },
+ ScrollState::TriggerDown(start)
+ if (start - point).square_length() < DRAG_CUTOFF_SQUARED =>
+ {
+ return;
+ },
+ ScrollState::TriggerDown(start) => {
+ servo.scroll_state = ScrollState::TriggerDragging(start, point);
+ let _ = call(|s| s.mouse_move(x, y));
+ let delta = (point - start) * servo.scroll_scale;
+ let start = start.to_i32();
+ let _ = call(|s| s.scroll_start(delta.x, delta.y, start.x, start.y));
+ },
+ ScrollState::TriggerDragging(start, prev) => {
+ servo.scroll_state = ScrollState::TriggerDragging(start, point);
+ let _ = call(|s| s.mouse_move(x, y));
+ let delta = (point - prev) * servo.scroll_scale;
+ let start = start.to_i32();
+ let _ = call(|s| s.scroll(delta.x, delta.y, start.x, start.y));
+ },
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn trigger_servo(servo: *mut ServoInstance, x: f32, y: f32, down: bool) {
+ // Servo was triggered
+ if let Some(servo) = servo.as_mut() {
+ let point = DevicePoint::new(x, y);
+ match servo.scroll_state {
+ ScrollState::TriggerUp if down => {
+ servo.scroll_state = ScrollState::TriggerDown(point);
+ let _ = call(|s| s.mouse_down(x, y, MouseButton::Left));
+ },
+ ScrollState::TriggerDown(start) if !down => {
+ servo.scroll_state = ScrollState::TriggerUp;
+ let _ = call(|s| s.mouse_up(start.x, start.y, MouseButton::Left));
+ let _ = call(|s| s.click(start.x as f32, start.y as f32));
+ let _ = call(|s| s.mouse_move(start.x, start.y));
+ },
+ ScrollState::TriggerDragging(start, prev) if !down => {
+ servo.scroll_state = ScrollState::TriggerUp;
+ let delta = (point - prev) * servo.scroll_scale;
+ let start = start.to_i32();
+ let _ = call(|s| s.scroll_end(delta.x, delta.y, start.x, start.y));
+ let _ = call(|s| s.mouse_up(x, y, MouseButton::Left));
+ },
+ _ => return,
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn traverse_servo(_servo: *mut ServoInstance, delta: i32) {
+ // Traverse the session history
+ if delta == 0 {
+ let _ = call(|s| s.reload());
+ } else if delta < 0 {
+ let _ = call(|s| s.go_back());
+ } else {
+ let _ = call(|s| s.go_forward());
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn navigate_servo(_servo: *mut ServoInstance, text: *const c_char) {
+ let text = CStr::from_ptr(text)
+ .to_str()
+ .expect("Failed to convert text to UTF-8");
+ let url = ServoUrl::parse(text).unwrap_or_else(|_| {
+ let mut search = ServoUrl::parse("https://duckduckgo.com")
+ .expect("Failed to parse search URL")
+ .into_url();
+ search.query_pairs_mut().append_pair("q", text);
+ ServoUrl::from_url(search)
+ });
+ let _ = call(|s| s.load_uri(url.as_str()));
+}
+
+// Some magic numbers for shutdown
+const SHUTDOWN_DURATION: Duration = Duration::from_secs(10);
+const SHUTDOWN_POLL_INTERVAL: Duration = Duration::from_millis(100);
+
+#[no_mangle]
+pub unsafe extern "C" fn discard_servo(servo: *mut ServoInstance) {
+ if let Some(servo) = servo.as_mut() {
+ let servo = Box::from_raw(servo);
+ let finish = Instant::now() + SHUTDOWN_DURATION;
+ let _ = call(|s| s.request_shutdown());
+ while !servo.shut_down_complete.get() {
+ let _ = call(|s| s.perform_updates());
+ if Instant::now() > finish {
+ warn!("Incomplete shutdown.");
+ }
+ thread::sleep(SHUTDOWN_POLL_INTERVAL);
+ }
+ deinit();
+ }
+}
+
+struct HostCallbacks {
+ ctxt: EGLContext,
+ surf: EGLSurface,
+ disp: EGLDisplay,
+ landscape: bool,
+ shut_down_complete: Rc<Cell<bool>>,
+ history_update: MLHistoryUpdate,
+ url_update: MLURLUpdate,
+ app: MLApp,
+ keyboard: MLKeyboard,
+}
+
+impl HostTrait for HostCallbacks {
+ fn flush(&self) {
+ // Immersive and landscape apps have different requirements for who calls SwapBuffers.
+ if self.landscape {
+ SwapBuffers(self.disp, self.surf);
+ }
+ }
+
+ fn make_current(&self) {
+ MakeCurrent(self.disp, self.surf, self.surf, self.ctxt);
+ }
+
+ fn prompt_alert(&self, message: String, _trusted: bool) {
+ warn!("Prompt Alert: {}", message);
+ }
+
+ fn prompt_ok_cancel(&self, message: String, _trusted: bool) -> PromptResult {
+ warn!("Prompt not implemented. Cancelled. {}", message);
+ PromptResult::Secondary
+ }
+
+ fn prompt_yes_no(&self, message: String, _trusted: bool) -> PromptResult {
+ warn!("Prompt not implemented. Cancelled. {}", message);
+ PromptResult::Secondary
+ }
+
+ fn prompt_input(&self, message: String, default: String, _trusted: bool) -> Option<String> {
+ warn!("Input prompt not implemented. {}", message);
+ Some(default)
+ }
+
+ fn on_load_started(&self) {}
+ fn on_load_ended(&self) {}
+ fn on_title_changed(&self, _title: String) {}
+ fn on_allow_navigation(&self, _url: String) -> bool {
+ true
+ }
+ fn on_url_changed(&self, url: String) {
+ if let Ok(cstr) = CString::new(url.as_str()) {
+ if let Some(url_update) = self.url_update.0 {
+ url_update(self.app, cstr.as_ptr());
+ }
+ }
+ }
+
+ fn on_history_changed(&self, can_go_back: bool, can_go_forward: bool) {
+ if let Some(history_update) = self.history_update.0 {
+ history_update(self.app, can_go_back, can_go_forward);
+ }
+ }
+
+ fn on_animating_changed(&self, _animating: bool) {}
+
+ fn on_shutdown_complete(&self) {
+ self.shut_down_complete.set(true);
+ }
+
+ fn on_ime_show(
+ &self,
+ _input_type: InputMethodType,
+ _text: Option<(String, i32)>,
+ _multiline: bool,
+ _bounds: DeviceIntRect,
+ ) {
+ if let Some(keyboard) = self.keyboard.0 {
+ keyboard(self.app, true)
+ }
+ }
+
+ fn on_ime_hide(&self) {
+ if let Some(keyboard) = self.keyboard.0 {
+ keyboard(self.app, false)
+ }
+ }
+
+ fn get_clipboard_contents(&self) -> Option<String> {
+ None
+ }
+
+ fn set_clipboard_contents(&self, _contents: String) {}
+
+ fn on_devtools_started(&self, port: Result<u16, ()>) {
+ match port {
+ Ok(p) => info!("Devtools Server running on port {}", p),
+ Err(()) => error!("Error running Devtools server"),
+ }
+ }
+}
+
+pub struct ServoInstance {
+ scroll_state: ScrollState,
+ scroll_scale: Scale<f32, DevicePixel, LayoutPixel>,
+ shut_down_complete: Rc<Cell<bool>>,
+}
+
+#[derive(Clone, Copy)]
+enum ScrollState {
+ TriggerUp,
+ TriggerDown(DevicePoint),
+ TriggerDragging(DevicePoint, DevicePoint),
+}
+
+struct EventLoopWakerInstance;
+
+impl EventLoopWaker for EventLoopWakerInstance {
+ fn clone_box(&self) -> Box<dyn EventLoopWaker> {
+ Box::new(EventLoopWakerInstance)
+ }
+
+ fn wake(&self) {}
+}
+
+impl log::Log for MLLogger {
+ fn enabled(&self, metadata: &log::Metadata) -> bool {
+ metadata.level() <= LOG_LEVEL
+ }
+
+ fn log(&self, record: &log::Record) {
+ if let Some(log) = self.0 {
+ let lvl = match record.level() {
+ log::Level::Error => MLLogLevel::Error,
+ log::Level::Warn => MLLogLevel::Warning,
+ log::Level::Info => MLLogLevel::Info,
+ log::Level::Debug => MLLogLevel::Debug,
+ log::Level::Trace => MLLogLevel::Verbose,
+ };
+ let mut msg = SmallVec::<[u8; 128]>::new();
+ write!(msg, "{}\0", record.args()).unwrap();
+ log(lvl, &msg[0] as *const _ as *const _);
+ }
+ }
+
+ fn flush(&self) {}
+}
+
+fn redirect_stdout_to_log(logger: MLLogger) {
+ let log = match logger.0 {
+ None => return,
+ Some(log) => log,
+ };
+
+ // The first step is to redirect stdout and stderr to the logs.
+ // We redirect stdout and stderr to a custom descriptor.
+ let mut pfd: [c_int; 2] = [0, 0];
+ unsafe {
+ pipe(pfd.as_mut_ptr());
+ dup2(pfd[1], 1);
+ dup2(pfd[1], 2);
+ }
+
+ let descriptor = pfd[0];
+
+ // Then we spawn a thread whose only job is to read from the other side of the
+ // pipe and redirect to the logs.
+ let _detached = thread::spawn(move || {
+ const BUF_LENGTH: usize = 512;
+ let mut buf = vec![b'\0' as c_char; BUF_LENGTH];
+
+ // Always keep at least one null terminator
+ const BUF_AVAILABLE: usize = BUF_LENGTH - 1;
+ let buf = &mut buf[..BUF_AVAILABLE];
+
+ let mut cursor = 0_usize;
+
+ loop {
+ let result = {
+ let read_into = &mut buf[cursor..];
+ unsafe {
+ read(
+ descriptor,
+ read_into.as_mut_ptr() as *mut _,
+ read_into.len(),
+ )
+ }
+ };
+
+ let end = if result == 0 {
+ return;
+ } else if result < 0 {
+ log(
+ MLLogLevel::Error,
+ b"error in log thread; closing\0".as_ptr() as *const _,
+ );
+ return;
+ } else {
+ result as usize + cursor
+ };
+
+ // Only modify the portion of the buffer that contains real data.
+ let buf = &mut buf[0..end];
+
+ if let Some(last_newline_pos) = buf.iter().rposition(|&c| c == b'\n' as c_char) {
+ buf[last_newline_pos] = b'\0' as c_char;
+ log(MLLogLevel::Info, buf.as_ptr());
+ if last_newline_pos < buf.len() - 1 {
+ let pos_after_newline = last_newline_pos + 1;
+ let len_not_logged_yet = buf[pos_after_newline..].len();
+ for j in 0..len_not_logged_yet as usize {
+ buf[j] = buf[pos_after_newline + j];
+ }
+ cursor = len_not_logged_yet;
+ } else {
+ cursor = 0;
+ }
+ } else if end == BUF_AVAILABLE {
+ // No newline found but the buffer is full, flush it anyway.
+ // `buf.as_ptr()` is null-terminated by BUF_LENGTH being 1 less than BUF_AVAILABLE.
+ log(MLLogLevel::Info, buf.as_ptr());
+ cursor = 0;
+ } else {
+ cursor = end;
+ }
+ }
+ });
+}
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini
new file mode 100644
index 00000000000..58e4780d677
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-background-repaint-parent.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini
new file mode 100644
index 00000000000..ae7e0461e5b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-background-repaint.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini
new file mode 100644
index 00000000000..a6f5e206966
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-outline-repaint-parent.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini
new file mode 100644
index 00000000000..e7b7f5a85d4
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-outline-repaint.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-color/parsing/gamut-mapping.html.ini b/tests/wpt/metadata-layout-2020/css/css-color/parsing/color-mix-out-of-gamut.html.ini
index a83221e93e7..f1ebf996f5f 100644
--- a/tests/wpt/metadata/css/css-color/parsing/gamut-mapping.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-color/parsing/color-mix-out-of-gamut.html.ini
@@ -1,4 +1,4 @@
-[gamut-mapping.html]
+[color-mix-out-of-gamut.html]
[Property color value 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
@@ -14,13 +14,13 @@
[Property color value 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
- [Property color value 'color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
+ [Property color value 'color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
[Property color value 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
- [Property color value 'color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
+ [Property color value 'color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
[Property color value 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
@@ -41,26 +41,14 @@
[Property color value 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
- [Property color value 'color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
+ [Property color value 'color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
[Property color value 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
- [Property color value 'color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
+ [Property color value 'color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
[Property color value 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
expected: FAIL
-
- [Property color value 'color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
- expected: FAIL
-
- [Property color value 'color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
- expected: FAIL
-
- [Property color value 'color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
- expected: FAIL
-
- [Property color value 'color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-padding-004.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-padding-004.html.ini
new file mode 100644
index 00000000000..e025cd0107b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-padding-004.html.ini
@@ -0,0 +1,2 @@
+[percentage-padding-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/animation/overlay-interpolation.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/animation/overlay-interpolation.html.ini
new file mode 100644
index 00000000000..0327458e15a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/animation/overlay-interpolation.html.ini
@@ -0,0 +1,264 @@
+[overlay-interpolation.html]
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.9) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini b/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini
index bf09731b3cd..68f7b709026 100644
--- a/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/cssom/idlharness.html.ini
@@ -490,3 +490,15 @@
[ShadowRoot interface: attribute adoptedStyleSheets]
expected: FAIL
+
+ [CSSImportRule interface: attribute layerName]
+ expected: FAIL
+
+ [CSSImportRule interface: attribute supportsText]
+ expected: FAIL
+
+ [CSSImportRule interface: sheet.cssRules[0\] must inherit property "layerName" with the proper type]
+ expected: FAIL
+
+ [CSSImportRule interface: sheet.cssRules[0\] must inherit property "supportsText" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini b/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini
index dd073891148..07f0769fafe 100644
--- a/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini
+++ b/tests/wpt/metadata/FileAPI/reading-data-section/filereader_readAsDataURL.any.js.ini
@@ -2,7 +2,13 @@
[readAsDataURL result for Blob with unspecified MIME type]
expected: FAIL
+ [readAsDataURL result for empty Blob]
+ expected: FAIL
+
[filereader_readAsDataURL.any.html]
[readAsDataURL result for Blob with unspecified MIME type]
expected: FAIL
+
+ [readAsDataURL result for empty Blob]
+ expected: FAIL
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 7df803243c2..b8872017d44 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -1884,6 +1884,13 @@
{}
]
],
+ "font-features-two-stylesheets-crash.html": [
+ "0e6490974c27afe7aff29a22418107890eef45e2",
+ [
+ null,
+ {}
+ ]
+ ],
"infinite-size-crash.html": [
"d44cf4a37e26a772a4742a825a7422b795dfc9ee",
[
@@ -5593,6 +5600,26 @@
]
}
}
+ },
+ "webappapis": {
+ "scripting": {
+ "reporterror-in-detached-window-crash.html": [
+ "33662caa4d1d1f207daab615d4d1a2796d12d8a5",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
+ "structured-clone": {
+ "structured-clone-detached-window-crash.html": [
+ "75971023d2d79f17ec7f952fd6accf1473780d1f",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
}
},
"infrastructure": {
@@ -8678,6 +8705,27 @@
{}
]
],
+ "aria-braillelabel-manual.html": [
+ "a0668e8a5016777fb7bde8d2b986cada68fe23cd",
+ [
+ null,
+ {}
+ ]
+ ],
+ "aria-brailleroledescription-manual.html": [
+ "e509c88159bb86033094b8d4f1a5242ef23cd6be",
+ [
+ null,
+ {}
+ ]
+ ],
+ "aria-brailleroledescription_is_empty-manual.html": [
+ "6d24fe641e272011cd2508f3c98dc8651a1335e5",
+ [
+ null,
+ {}
+ ]
+ ],
"aria-busy_false-manual.html": [
"70a25082c69a82fcc5bbb09d83a6265e8b982fcf",
[
@@ -9120,7 +9168,7 @@
]
],
"aria-keyshortcuts-manual.html": [
- "cbc474343d80e358dbc97a62e0f713d4f1e2af1c",
+ "5d071cb82df48c3a490342bda761f73c84c94293",
[
null,
{}
@@ -9519,7 +9567,7 @@
]
],
"blockquote-manual.html": [
- "97ae290c4025345c87542c21514c5501a336c8c9",
+ "13d6859ec0716a45d6e26f6c10492bf346f42f5a",
[
null,
{}
@@ -9554,7 +9602,7 @@
]
],
"caption-manual.html": [
- "00afda60ebf1d48549cd14be8c0db4ad81edb69e",
+ "68a1af8553db42bd72da7fdac9d0aa32b59713d8",
[
null,
{}
@@ -9624,7 +9672,7 @@
]
],
"deletion-manual.html": [
- "4aed1d3e64b67715e2479fa432c28c3b95c1a476",
+ "4f6b0d7feb76d4fc21f6cf18c74b8adf849e6a9d",
[
null,
{}
@@ -9834,7 +9882,7 @@
]
],
"insertion-manual.html": [
- "86210664ce7b95881d6bc85a2720235a715d43bc",
+ "7b5fd8098512174207ed5118d84392a42fc9d780",
[
null,
{}
@@ -9896,6 +9944,13 @@
{}
]
],
+ "mark-manual.html": [
+ "8373fa133da91bc635082589a6b8e3e974256abd",
+ [
+ null,
+ {}
+ ]
+ ],
"marquee-manual.html": [
"2c0e9a938561250443055871cc19fa399c6a1fc4",
[
@@ -9938,15 +9993,8 @@
{}
]
],
- "menuitem_not_owned_by_or_child_of_group-manual.html": [
- "abb582f52014560b756af3dd4530d49595f2e7a8",
- [
- null,
- {}
- ]
- ],
- "menuitem_owned_by_or_child_of_group-manual.html": [
- "c2c3d7ce4b8d039389569532c188b97cf4faec04",
+ "menuitem-manual.html": [
+ "49c3cacbe82d769482d5178100623cec81840828",
[
null,
{}
@@ -9974,7 +10022,7 @@
]
],
"meter-manual.html": [
- "8010322a62c0721c08692ddd8234e8ca22f38c5d",
+ "74c8ba807379177dc05ba3f36d5f9bdee36d7bfc",
[
null,
{}
@@ -10037,7 +10085,7 @@
]
],
"paragraph-manual.html": [
- "56a26c8c01a4736e1e2c78436a6d2105bbfb7fce",
+ "b79f61e0c6ecb7749a8e5fd4d99c086bb14b4469",
[
null,
{}
@@ -10218,6 +10266,13 @@
{}
]
],
+ "suggestion-manual.html": [
+ "f31bcab8defbb01a592ef78403a0645c72fabb03",
+ [
+ null,
+ {}
+ ]
+ ],
"superscript-manual.html": [
"5863f9b188ed893c9cddc9f5b80829674fd5f4f1",
[
@@ -10289,7 +10344,7 @@
]
],
"time-manual.html": [
- "864cde1df18d5f2e12297545864f44c384b9294f",
+ "542015953b7760d386f6d2c25650305eb214963c",
[
null,
{}
@@ -30237,7 +30292,7 @@
"css": {
"printing": {
"animation-timeline-none-with-progress-print.tentative.html": [
- "3939a1df48d7dfab5abc21a824d5d28af1163368",
+ "c37c1b95ef531a206a52bdfda1f76694d6ace066",
[
null,
[
@@ -30292,7 +30347,7 @@
]
],
"scroll-timeline-specified-scroller-print.html": [
- "05fab3e46ad22d01d26d5fe5ba90edb4dab798f3",
+ "dd4add49b0f0946cfbd5e4889c20ce21086af4d7",
[
null,
[
@@ -59517,6 +59572,19 @@
{}
]
],
+ "float-in-nested-multicol-001.html": [
+ "8e1a257e389d0fdc6a4a69f63b81f32378a7b944",
+ [
+ null,
+ [
+ [
+ "/css/reference/blank.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
"float-no-content-beside-001.html": [
"f073453ecaf5a884ed11606d05b1b5066f2e50e3",
[
@@ -128295,7 +128363,7 @@
{}
]
],
- "anchor-scroll-basics.tentative.html": [
+ "anchor-scroll-001.html": [
"fa42e33d9266a41e803f427f4bec729a4636a858",
[
null,
@@ -137100,6 +137168,32 @@
{}
]
],
+ "color-mix-currentcolor-background-repaint-parent.html": [
+ "44399c198862837fcf5f25e9af0cb83c8e62f9cf",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "color-mix-currentcolor-background-repaint.html": [
+ "a8f742b6c53effac1e23491fc5a3843c90a82129",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"color-mix-currentcolor-border-repaint-parent.html": [
"5182dd8d0fbd968bff3931a0a32884d7aa4cf6f2",
[
@@ -137126,6 +137220,32 @@
{}
]
],
+ "color-mix-currentcolor-outline-repaint-parent.html": [
+ "0d434b1d351e9853426fe99d7f889649eaceda10",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "color-mix-currentcolor-outline-repaint.html": [
+ "8892d818f9bbda92b02404347586d5c953d4793c",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css-border-radius-001.html": [
"8b0e2e9a36c67393f0497b174784c5245cee1d7c",
[
@@ -153504,6 +153624,19 @@
{}
]
],
+ "at-supports-selector-file-selector-button.html": [
+ "a51e503ef696fc0075234747a709ab8190fcf6d1",
+ [
+ null,
+ [
+ [
+ "/css/css-conditional/at-supports-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css-supports-001.xht": [
"9221309d45fd637e613a1c11519a09fa105a4830",
[
@@ -177033,6 +177166,19 @@
{}
]
],
+ "percentage-padding-004.html": [
+ "ca96e546cc86e6a0c0db1a9884653cdecfab7409",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"percentage-size-subitems-001.html": [
"70f3953052a3a770c6cd15ee169607a00fc452b0",
[
@@ -190424,6 +190570,19 @@
{}
]
],
+ "orthogonal-writing-mode-006.html": [
+ "95d124322891aeb89d323fc5425725b32143ccf1",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"parent-repeat-auto-fit-001.html": [
"8ecbccbea64320054f940d9c2e2d31dd028daa14",
[
@@ -190683,6 +190842,19 @@
],
{}
]
+ ],
+ "writing-directions-002.html": [
+ "078d5808b04ad21ce4ed0814691d2842ccd8bc57",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/subgrid/writing-directions-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"table-grid-item-dynamic-001.html": [
@@ -308059,6 +308231,97 @@
{}
]
],
+ "2d.layer.render-opportunities.createImageBitmap.html": [
+ "4ffcaa3e3c0defe2355eb9c2d8a6886a5c2e097a",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.drawImage.html": [
+ "4eb0b6f721b974e013e18fabc9d283ce2b13d20c",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.getImageData.html": [
+ "3cf514a03f4f626133733245ce297e2def1d3252",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.putImageData.html": [
+ "8da3dafbb7c1d1c16eb357be595bf6c29f7b4a90",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.requestAnimationFrame.html": [
+ "889ff5ba09cdf89ec31cc4fbb2d6fb2475a8c552",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.toBlob.html": [
+ "908730424a8de315866b819f4f7b3a393a3c0abc",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.toDataURL.html": [
+ "152f66a12b3d7d1d94c752a364f5ec9adaeb0269",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"2d.layer.restore-style.html": [
"2537f409d6d99e0175667725ffedd5c384071864",
[
@@ -308116,6 +308379,19 @@
]
}
]
+ ],
+ "2d.layer.unclosed.html": [
+ "788889ee7ef1ca5fe1b33dd011dafa10e9d141df",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/layers/2d.layer.unclosed-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"manual": {
@@ -309103,7 +309379,7 @@
"offscreen": {
"filters": {
"2d.filter.canvasFilterObject.dropShadow.tentative.html": [
- "55f2d2c24b5e712180a7dd78f2cc21f2e7b2dddd",
+ "18af95c1eebf7b52265943e020416d39d020b555",
[
null,
[
@@ -309116,7 +309392,7 @@
]
],
"2d.filter.canvasFilterObject.dropShadow.tentative.w.html": [
- "633d202012c4ad6d9dcf61a9776cb375905163f0",
+ "b94424dd9962c16c76533205c59b6ac18eea2707",
[
null,
[
@@ -309131,7 +309407,7 @@
},
"layers": {
"2d.layer.endlayer.alone.html": [
- "f088c89aa7cb1c678c16bc2f317385254f645007",
+ "6a0e5cce71719615966c649a1623ed98e27637b6",
[
null,
[
@@ -309144,7 +309420,7 @@
]
],
"2d.layer.endlayer.alone.w.html": [
- "96c8011550665865f7684aec66c887053ee98ee2",
+ "ddb2671aaabf37d51b6f4167e8bd16bd2fb88998",
[
null,
[
@@ -309157,7 +309433,7 @@
]
],
"2d.layer.endlayer.unmatched.html": [
- "a87c7364cfa1069df8269d79aa71a565d951369a",
+ "b204c49e5eb1d67dd4785b3cd2fc68afb2f90542",
[
null,
[
@@ -309170,7 +309446,7 @@
]
],
"2d.layer.endlayer.unmatched.w.html": [
- "9507809a528426755f2aa0a3a41c7235b4cfe127",
+ "2e1cb62c32a94ef4965b7cefdd5489055595acf7",
[
null,
[
@@ -309183,7 +309459,7 @@
]
],
"2d.layer.global-states.alpha.blending.html": [
- "bb7dd933372556976d06a0f4aac312ccf3874e94",
+ "71414b4b3790b97ad4947418c4ab9b1b04abcb57",
[
null,
[
@@ -309196,7 +309472,7 @@
]
],
"2d.layer.global-states.alpha.blending.shadow.html": [
- "70b32e43395d65654062d7471fe1cd7e77906964",
+ "551df36b15e450b2dee9a11b1933b7498aee7601",
[
null,
[
@@ -309209,7 +309485,7 @@
]
],
"2d.layer.global-states.alpha.blending.shadow.w.html": [
- "45932d4cd5d182e47a6d588485ed1bde32f266c7",
+ "6851a4a8468c83939879849ab99484f7603d0222",
[
null,
[
@@ -309222,7 +309498,7 @@
]
],
"2d.layer.global-states.alpha.blending.w.html": [
- "ff33fc450529c74a612c663b83d40e5a9df584ef",
+ "618480c813fdd19049284ead5e1ec8f636b1d4c6",
[
null,
[
@@ -309235,7 +309511,7 @@
]
],
"2d.layer.global-states.alpha.composite.html": [
- "21582189b1d800e96fed5317f92c23090092b0a7",
+ "94fed5752df2b618e2b34b4ca8a931b024bc1044",
[
null,
[
@@ -309248,7 +309524,7 @@
]
],
"2d.layer.global-states.alpha.composite.shadow.html": [
- "bb3d886b54fb0ea2f836a991ab88200101269880",
+ "841742ef1e7fcbd796952d1888d6654db7f543ab",
[
null,
[
@@ -309261,7 +309537,7 @@
]
],
"2d.layer.global-states.alpha.composite.shadow.w.html": [
- "592f92921b8b6fb97d833c0f2fad37efba7bf52e",
+ "ef44257c0ad3d57efbe222badd43cc3142115fb0",
[
null,
[
@@ -309274,7 +309550,7 @@
]
],
"2d.layer.global-states.alpha.composite.w.html": [
- "2359e92790fa03dc25a3fdb4b1a2a9ff74e8415a",
+ "d7d2b7a21e28596a4b031ee771dff98dc7ce063b",
[
null,
[
@@ -309287,7 +309563,7 @@
]
],
"2d.layer.global-states.alpha.html": [
- "67a8ae60249f12d79bb424abcec7258da5ce199b",
+ "63a264e6819fd67841f69bf240da0dcc7dd2a562",
[
null,
[
@@ -309300,7 +309576,7 @@
]
],
"2d.layer.global-states.alpha.shadow.html": [
- "a67f5872f78f204248ebd6dd5cea041f1a72d24a",
+ "daa788cd1505083bfcb5e9a2d7b38df84092758b",
[
null,
[
@@ -309313,7 +309589,7 @@
]
],
"2d.layer.global-states.alpha.shadow.w.html": [
- "35df72aabcd888df0e7b51e118aa931bd4db4a6f",
+ "f75db3d249068e56a1f44287dee5cbc592a40bba",
[
null,
[
@@ -309326,7 +309602,7 @@
]
],
"2d.layer.global-states.alpha.w.html": [
- "2db6b64738cb94c675146e298111e63763f1777e",
+ "694f31e208b3276a0c30c7dc4eb4750e48386f6a",
[
null,
[
@@ -309339,7 +309615,7 @@
]
],
"2d.layer.global-states.blending.html": [
- "6bcfd2854a607bbaddba85d8c07b4ebb01126dbf",
+ "6a36bb4ba101ce5e91f0279c95a728e94d808912",
[
null,
[
@@ -309352,7 +309628,7 @@
]
],
"2d.layer.global-states.blending.shadow.html": [
- "f1e9b7d23a31ae4b3b50cad0bc0d6a16b64f9640",
+ "9ad87aa0cd2bf7822fbcbda30b26db279bf33a06",
[
null,
[
@@ -309365,7 +309641,7 @@
]
],
"2d.layer.global-states.blending.shadow.w.html": [
- "1d22e94f6f9e7a9cbb025f9ba2ef246f90a24d85",
+ "dc52e9e9251329199814103d18923c659c59265f",
[
null,
[
@@ -309378,7 +309654,7 @@
]
],
"2d.layer.global-states.blending.w.html": [
- "227c72b80ac676eaa38277e78a8479d432bb8c2a",
+ "8964e97713cd9eea2cdef3904194b3f461fb4be7",
[
null,
[
@@ -309391,7 +309667,7 @@
]
],
"2d.layer.global-states.composite.html": [
- "9d4d1dce8a422ffc5125ece855e54ff9ee8aeb60",
+ "84fb4b3d95a199c82d6b556af8a13cce374877ef",
[
null,
[
@@ -309404,7 +309680,7 @@
]
],
"2d.layer.global-states.composite.shadow.html": [
- "9ad39065c6a32facdbcd0b2cbf1b4383e1447757",
+ "2e0883f5af81035a80d24ae4ed471ee7f5717051",
[
null,
[
@@ -309417,7 +309693,7 @@
]
],
"2d.layer.global-states.composite.shadow.w.html": [
- "b45c9d3aadc678748d6982ca904b8e40e3e720fc",
+ "66d44050581365e7a23943101a2cf55adaf85dfe",
[
null,
[
@@ -309430,7 +309706,7 @@
]
],
"2d.layer.global-states.composite.w.html": [
- "66493889b20c5c7412cae395e40761b1597ec6c8",
+ "b695871fcdcfc55469ae9f29983bff485edd76b8",
[
null,
[
@@ -309443,7 +309719,7 @@
]
],
"2d.layer.global-states.filter.alpha.blending.html": [
- "37d0e3dd1c5543e400cc3a087fcc7437330c4149",
+ "bf483ccc9259c0ea7edb9ee0ba365190e227da93",
[
null,
[
@@ -309456,7 +309732,7 @@
]
],
"2d.layer.global-states.filter.alpha.blending.shadow.html": [
- "93278cb5aa380fb59c953a2f3d4c9c4460e05e98",
+ "d914a70867fa8899c8cd2ec81d2130e10f84d98f",
[
null,
[
@@ -309469,7 +309745,7 @@
]
],
"2d.layer.global-states.filter.alpha.blending.shadow.w.html": [
- "783693f2c1430e558d23b332d2e6b260bd325134",
+ "a1acd0d083a4889f95c09e05dc660643ed9c0fd3",
[
null,
[
@@ -309482,7 +309758,7 @@
]
],
"2d.layer.global-states.filter.alpha.blending.w.html": [
- "53533e4ece628306624a49e871ef9c5b4667ceea",
+ "47503d5478bb9605f03776c03cf6f6ca057f36a9",
[
null,
[
@@ -309495,7 +309771,7 @@
]
],
"2d.layer.global-states.filter.alpha.composite.html": [
- "f0af85f8f51fa31982720f87ef4092d88870a29d",
+ "7d4f8ecda52d36836f8ed2ed0db5ab4889a05dc0",
[
null,
[
@@ -309508,7 +309784,7 @@
]
],
"2d.layer.global-states.filter.alpha.composite.shadow.html": [
- "46cd28b6c2b8b08875eb4621b283d2d994b26b5f",
+ "f75bd251ac4378b0dace8e77a2cd1932a3c0c485",
[
null,
[
@@ -309521,7 +309797,7 @@
]
],
"2d.layer.global-states.filter.alpha.composite.shadow.w.html": [
- "044b75927b399edc9601c3c52159f628fb688073",
+ "783a04cafbf837b4dc30e2eea562426e2fcd5de9",
[
null,
[
@@ -309534,7 +309810,7 @@
]
],
"2d.layer.global-states.filter.alpha.composite.w.html": [
- "be25ca66b169c6d873cfbfcac8ad28ba3ec36b22",
+ "ed8af9a0f1dff1efbf32076bc5d9e90effef3fdf",
[
null,
[
@@ -309547,7 +309823,7 @@
]
],
"2d.layer.global-states.filter.alpha.html": [
- "6567094376b6a31b375cfa08e6fe4e99991163fb",
+ "4f8954f978c2971a0b168adbd83092f63427a999",
[
null,
[
@@ -309560,7 +309836,7 @@
]
],
"2d.layer.global-states.filter.alpha.shadow.html": [
- "3059bf306cd76531ca094ca4fea104af64b54b96",
+ "0cfa86a0125fcf17661190dc7d1b7621a8008998",
[
null,
[
@@ -309573,7 +309849,7 @@
]
],
"2d.layer.global-states.filter.alpha.shadow.w.html": [
- "a481073ccfc59b244c0af2ad11b88f3de6e74b2b",
+ "015fe946338aa0ee4dd76a093a08eae22bb76e08",
[
null,
[
@@ -309586,7 +309862,7 @@
]
],
"2d.layer.global-states.filter.alpha.w.html": [
- "b5d81078899bcdd88adf63e62a9c52a87ba66262",
+ "4334fd6c1b067acaf3d2e9fbac52d35d54852f82",
[
null,
[
@@ -309599,7 +309875,7 @@
]
],
"2d.layer.global-states.filter.blending.html": [
- "a574e82932871d2ffb023962c4d32712cd766a65",
+ "7f3d1a2cb3c73488cdeda5752de4d53fe582acaf",
[
null,
[
@@ -309612,7 +309888,7 @@
]
],
"2d.layer.global-states.filter.blending.shadow.html": [
- "4bdf80337f8a93087c2530b6690dbd7b3e84d63e",
+ "9b9862e57ffa9022f80d9aa6e5ef38fef117e58d",
[
null,
[
@@ -309625,7 +309901,7 @@
]
],
"2d.layer.global-states.filter.blending.shadow.w.html": [
- "23cd4e834b04f23cca1dafee2659e24000a972ff",
+ "1d7e74b64eb53aee1139a399e47f685ee2dfe226",
[
null,
[
@@ -309638,7 +309914,7 @@
]
],
"2d.layer.global-states.filter.blending.w.html": [
- "bd7a51d89877bb871c8532870549e5e47b3d4794",
+ "f5ccee1d858b5931063c7f9fde4d2a0a713136fc",
[
null,
[
@@ -309651,7 +309927,7 @@
]
],
"2d.layer.global-states.filter.composite.html": [
- "663a953a29e2725f46b3a00acb711e150ae7d517",
+ "2e8272b2bfa963d25937e14c4892b0e764a7deed",
[
null,
[
@@ -309664,7 +309940,7 @@
]
],
"2d.layer.global-states.filter.composite.shadow.html": [
- "52ad8646f01c2f58cad4e68ad116987cdd765a47",
+ "077041a29400d15a867258a6c895309c2d592539",
[
null,
[
@@ -309677,7 +309953,7 @@
]
],
"2d.layer.global-states.filter.composite.shadow.w.html": [
- "bf7139edce6c23f2891d1fecb33ed4a9be622cdb",
+ "b162354da44529283e62056500ff0d0e9e008b12",
[
null,
[
@@ -309690,7 +309966,7 @@
]
],
"2d.layer.global-states.filter.composite.w.html": [
- "1f30d1e5644f373683def54c618abd3f19a33aef",
+ "b4158392660152977a246cb84593f253bbc15ecd",
[
null,
[
@@ -309703,7 +309979,7 @@
]
],
"2d.layer.global-states.filter.no-global-states.html": [
- "0619faa944ffea351f61b7cd4841b933895868a1",
+ "ccae63a26ab5682ad02897017d6e8dc3c1302b59",
[
null,
[
@@ -309716,7 +309992,7 @@
]
],
"2d.layer.global-states.filter.no-global-states.w.html": [
- "3a7168382006be4f6fbc4bd324b87532b578084f",
+ "6ce768ad2678c701e6c53503d6eac169287639fe",
[
null,
[
@@ -309729,7 +310005,7 @@
]
],
"2d.layer.global-states.filter.shadow.html": [
- "69120c105e5d17f1d5c6cbd1aa8a3d3a30948e0b",
+ "9a20e39fd5a22853717fbb91faab13e5eea12ca5",
[
null,
[
@@ -309742,7 +310018,7 @@
]
],
"2d.layer.global-states.filter.shadow.w.html": [
- "8a770b2911e58e78b66a528bd92c25edb963af05",
+ "26bdf7558762db5139631eee06dcaf4865b19b05",
[
null,
[
@@ -309755,7 +310031,7 @@
]
],
"2d.layer.global-states.no-global-states.html": [
- "022736c7b5b46c6eba7b22615cc166eaacf7accb",
+ "c8a98153816c1ae5f3064e75b7609b95264ce030",
[
null,
[
@@ -309768,7 +310044,7 @@
]
],
"2d.layer.global-states.no-global-states.w.html": [
- "80ed4e4503d02b12b4c4b6e657935cd451510868",
+ "db03a3fd0c3c9f820fe5889b27483a4d8f070727",
[
null,
[
@@ -309781,7 +310057,7 @@
]
],
"2d.layer.global-states.shadow.html": [
- "6402dc5760751d92a0642a1fd55285068fee7106",
+ "41a832c516e6bb7ff03dd7d802c6965c9ad41ca5",
[
null,
[
@@ -309794,7 +310070,7 @@
]
],
"2d.layer.global-states.shadow.w.html": [
- "e41e7aee4641bf6d32f5465c622daef21ffb5691",
+ "7b78f4b739ad8644a7082367bf67b673c951a1c1",
[
null,
[
@@ -309807,7 +310083,7 @@
]
],
"2d.layer.nested.html": [
- "0c168493c2143cd68e2a21fedbd64a2438e0a6a5",
+ "9e5b7d5826c17ee5a6c52bbd53a1cbc2b70081e3",
[
null,
[
@@ -309820,7 +310096,7 @@
]
],
"2d.layer.nested.w.html": [
- "3b81691e06ba27bc1f8f57e14af117ee72677523",
+ "99e73906096bd8f7f0fb81ddf5aea70853ad05e5",
[
null,
[
@@ -309832,8 +310108,164 @@
{}
]
],
+ "2d.layer.render-opportunities.convertToBlob.html": [
+ "c1a139a3de8db540284dd7100f11232ccc9aed10",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.convertToBlob.w.html": [
+ "404fef3ad6a597ed99a1a66be6e3ff5264644d02",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.createImageBitmap.html": [
+ "876b027170edc6d2021dd233299b4256c73b9a92",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.createImageBitmap.w.html": [
+ "9a89492e399222bc9252ec92c3336098dc07e070",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.drawImage.html": [
+ "dd178206073801c5e0eafda4abc39f25ef4bac71",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.drawImage.w.html": [
+ "80fbfbd272ed7ee29497f6a6989a94113c07f5ca",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.getImageData.html": [
+ "b6f3c1b5626ffb0f7e75eaadea73651baf3b48de",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.getImageData.w.html": [
+ "187eb0fce96bff4c105ce154c1b101a24b3095f1",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.putImageData.html": [
+ "b4600156136c3aadb98db5e6a9de4beb54a95a69",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.putImageData.w.html": [
+ "9ffac071c36b2e2f85280be0ba511c664e0a42e2",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.transferToImageBitmap.html": [
+ "27830644b0553d125995a87055b65b752cfd5b41",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.render-opportunities.transferToImageBitmap.w.html": [
+ "06e016020db2ed99a47b1c8c336b168735a973ca",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"2d.layer.restore-style.html": [
- "66f99835df4dbc04adc5ab3aedbf83d3116ee9e5",
+ "a3593cd2a82748df9db8bd74a67dbc29dcaefb31",
[
null,
[
@@ -309862,7 +310294,7 @@
]
],
"2d.layer.restore-style.w.html": [
- "a717a1d31222b4f5c7d5f481156a613259660a1f",
+ "a66fc2bc598344c7c9afc51dbdecbd13935b37a3",
[
null,
[
@@ -309891,7 +310323,7 @@
]
],
"2d.layer.several-complex.html": [
- "1d50bd4de6160a6fce2fd641236cb7e086cc0d4f",
+ "c4b50282805374bbee713ae7b9506eccc7d39cce",
[
null,
[
@@ -309920,7 +310352,7 @@
]
],
"2d.layer.several-complex.w.html": [
- "7982a8dbc4fbbee7e3492f7fe269ea3046c30b4b",
+ "114c5e06868141114c22f830a12fa31673eb5d0a",
[
null,
[
@@ -309947,6 +310379,32 @@
]
}
]
+ ],
+ "2d.layer.unclosed.html": [
+ "689ee801cf27dcb8b61e9e89c5655a31708d689b",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.layer.unclosed.w.html": [
+ "0c7812e88c7bd34d18ebee8c8730547a4295fe30",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
}
}
@@ -320900,6 +321358,19 @@
},
"scroll-animations": {
"css": {
+ "animation-range-visual-test.html": [
+ "f675f5108aec2ef2eb27793efca6e7e6a88f3324",
+ [
+ null,
+ [
+ [
+ "/scroll-animations/css/animation-range-visual-test-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"scroll-animation-initial-offset.html": [
"34ae52d47927ee73c9c41c6f608bcd988e8f0cd7",
[
@@ -320992,7 +321463,7 @@
]
],
"scroll-timeline-update-reversed-animation.html": [
- "93ad6916ea7df38088093d5c82cb952ba8a65f4c",
+ "6bc18544f4ac7e61e98d5363520d3abaa1c48564",
[
null,
[
@@ -321005,7 +321476,7 @@
]
],
"view-timeline-range-update-reversed-animation.html": [
- "c7199161607162d106ba24a4815eb6f9cbbaf6e5",
+ "960a8e6ecfb90bf9c03178aab3fa8b3047c41dc3",
[
null,
[
@@ -321018,7 +321489,7 @@
]
],
"view-timeline-range-update.html": [
- "e8e761d86ba14e100b00758e52f5956cf4c8e340",
+ "5400d8314b087d479f0a6270c6c0b8c07af5a4a7",
[
null,
[
@@ -321031,7 +321502,7 @@
]
],
"view-timeline-subject-bounds-update.html": [
- "7001eceeaf8f4997d7fb3f8b297eaa3827c537e6",
+ "2961fedd4258bc60a3a0a9e404e56a4c5bd7dd39",
[
null,
[
@@ -323451,6 +323922,19 @@
{}
]
],
+ "pattern-opacity-01.svg": [
+ "eb2d2d7e9a9a7776e5ffeeaf51ba992204a70fc4",
+ [
+ null,
+ [
+ [
+ "/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"pattern-viewbox-01.svg": [
"618b8fc29e69d2624d5556d6bbcdba600ce21a4a",
[
@@ -328280,7 +328764,7 @@
},
"support": {
".azure-pipelines.yml": [
- "7851cd61e1f3e1ade11251758ac89831fbf80318",
+ "a21ebce6bc7abf9ab36066631637fc8ccbae23f7",
[]
],
".gitattributes": [
@@ -331624,7 +332108,15 @@
[]
]
},
+ "accept-ch.wildcard.https.sub.html.sub.headers": [
+ "66ad9243c7dc54e59052fa4fe64124cd63d0e84e",
+ []
+ ],
"critical-ch": {
+ "critical-ch.navigation-timing.restart.https.html.headers": [
+ "b221a32886fffa1fd8dc5562fa211b8446db835b",
+ []
+ ],
"resources": {
"echo-critical-hint.py": [
"a5c5160f7503ea3644b6d2deb9827994025c1af9",
@@ -331773,6 +332265,14 @@
"f5beb4c3654c53ed136374519516505593b24a0b",
[]
],
+ "accept-ch.wildcard.iframe.https.sub.html": [
+ "250a9d9e2247db9c9d8bd65e11141ff2e4ff5087",
+ []
+ ],
+ "accept-ch.wildcard.iframe.https.sub.html.sub.headers": [
+ "c1c0fcd5c2ae6298f124de4ec74a05bd29d47ea8",
+ []
+ ],
"clienthintslist.py": [
"3d1f7caf4680fcdff15995aa08a31630f547e8f6",
[]
@@ -332023,6 +332523,10 @@
"6e555e3b197ce2f448f59d61e1488a0175490145",
[]
],
+ "page.html": [
+ "35bde8e5016bd3ff045ebe8cc3e0e39b08d90dc1",
+ []
+ ],
"user-activation.js": [
"ed294bb9cb27b552f23061118fcd260dc6b86a8f",
[]
@@ -332201,7 +332705,7 @@
[]
],
"rendering-utils.js": [
- "8027cd5f8484702c35348eaf8b405684915cf283",
+ "46283bd5d078a14922e24160053017b6e8cb072c",
[]
],
"sab.js": [
@@ -350995,7 +351499,7 @@
[]
],
"testharness-helper.sub.js": [
- "4adc52169612c91237460e9f6b04fc86171eba6d",
+ "7d2307ebbc974446d59fd7b023fe9f7ce088c193",
[]
]
}
@@ -352969,6 +353473,10 @@
"72fa50e66ebf5b552e930f63ce06e93298f1fdcb",
[]
],
+ "list-cookies-for-script.py": [
+ "b325d1f7450faaf9a932b48f8699a49a7221f88f",
+ []
+ ],
"list.py": [
"4cb6639659abb611a5f3245f4e437f2544664b24",
[]
@@ -373031,6 +373539,22 @@
"10324966edb042c1c7298ce22dad76766c2a777b",
[]
],
+ "color-mix-currentcolor-background-repaint-expected.xht": [
+ "05a13794482a94f6c10bd9d4c98704e63ef60331",
+ []
+ ],
+ "color-mix-currentcolor-background-repaint-parent-expected.xht": [
+ "05a13794482a94f6c10bd9d4c98704e63ef60331",
+ []
+ ],
+ "color-mix-currentcolor-outline-repaint-expected.xht": [
+ "05a13794482a94f6c10bd9d4c98704e63ef60331",
+ []
+ ],
+ "color-mix-currentcolor-outline-repaint-parent-expected.xht": [
+ "05a13794482a94f6c10bd9d4c98704e63ef60331",
+ []
+ ],
"document-canvas-remove-body-ref.html": [
"8612aaafa99b6805690766d4ac5f910a695a7991",
[]
@@ -388788,6 +389312,10 @@
"f8fa0ab81b9fecee6d9efbb8f20e4af4cd1d89ad",
[]
],
+ "orthogonal-writing-mode-006-ref.html": [
+ "2bf12f083fe9f8da36076dcc27413c599b43a076",
+ []
+ ],
"parent-repeat-auto-fit-001-ref.html": [
"2217497cd2bf1813ecb585564788b81488079b85",
[]
@@ -388847,6 +389375,10 @@
"writing-directions-001-ref.html": [
"90612516889e8feb5b5b0ce6820b44d8531ab8be",
[]
+ ],
+ "writing-directions-002-ref.html": [
+ "cd1ee527ab1053bc5aa4b3e10466b09cfaa605e0",
+ []
]
},
"support": {
@@ -413835,6 +414367,10 @@
"1b63235b7cdffe9ebb43bfac3a01d5220e1519fb",
[]
],
+ "automatic-beacon-store.py": [
+ "f783c8530c4386321c6da8e7be1ff4732074917d",
+ []
+ ],
"background-fetch-inner.https.html": [
"1bca25a957a3fe4069df838a5b7cbaa42e813f9b",
[]
@@ -414112,7 +414648,7 @@
[]
],
"fledge-bidding-logic.js": [
- "c19cc1d0337472981283e3e729c93d8f4328f2b1",
+ "ab6685f1842db5b7e76a1c9f8443125c500e5c37",
[]
],
"fledge-bidding-logic.js.headers": [
@@ -414532,7 +415068,7 @@
[]
],
"utils.js": [
- "2263fc1db18ecddd9674b5b7b6b65e8456670058",
+ "4638f37cbb1576e4b85e98616cf1c159a79e3d95",
[]
],
"web-bluetooth-inner.html": [
@@ -417475,6 +418011,12 @@
[]
]
},
+ "graphics-aria": {
+ "META.yml": [
+ "692db91315ef759184fa1e4b7e259a9af40f3686",
+ []
+ ]
+ },
"gyroscope": {
"Gyroscope-disabled-by-feature-policy.https.html.headers": [
"3d91d5840be655ce477c46b3456b2fbe9cd3a3a2",
@@ -420301,6 +420843,34 @@
"65525d4d6a23db56e5717147a60fa8e22d0519a2",
[]
],
+ "2d.layer.render-opportunities.createImageBitmap-expected.html": [
+ "8ce0c51e8e4f8dbea647b19b75b86c0e53415b25",
+ []
+ ],
+ "2d.layer.render-opportunities.drawImage-expected.html": [
+ "1ddc6d1b44964c2fe9708be8a7cc9262eea3273a",
+ []
+ ],
+ "2d.layer.render-opportunities.getImageData-expected.html": [
+ "ea0e78e0f28b02dffada148b1cb0872bfc6b7a26",
+ []
+ ],
+ "2d.layer.render-opportunities.putImageData-expected.html": [
+ "3d63bbe776672c9af514714ca96446179eb72eb2",
+ []
+ ],
+ "2d.layer.render-opportunities.requestAnimationFrame-expected.html": [
+ "138f3a7ccbb11c075119245fdbce9e9feba7265f",
+ []
+ ],
+ "2d.layer.render-opportunities.toBlob-expected.html": [
+ "fda8e8d7c6da225d60ef5de884ba4cbd2d5117c1",
+ []
+ ],
+ "2d.layer.render-opportunities.toDataURL-expected.html": [
+ "22a9770331d82a0965e6f06f4f98dfe8c681da09",
+ []
+ ],
"2d.layer.restore-style-expected.html": [
"1d0ac3558d1d4c15609c364a6e5678ed329fa272",
[]
@@ -420308,6 +420878,10 @@
"2d.layer.several-complex-expected.html": [
"84ad6244740e997d62cd0bdf4f017a7a6c15d713",
[]
+ ],
+ "2d.layer.unclosed-expected.html": [
+ "c41b253c95ba2b4f970b6ae59b58e444df14d866",
+ []
]
},
"manual": {
@@ -421151,6 +421725,30 @@
"65525d4d6a23db56e5717147a60fa8e22d0519a2",
[]
],
+ "2d.layer.render-opportunities.convertToBlob-expected.html": [
+ "1e61775165527caed9da4cb1cde38f6a09438904",
+ []
+ ],
+ "2d.layer.render-opportunities.createImageBitmap-expected.html": [
+ "8ce0c51e8e4f8dbea647b19b75b86c0e53415b25",
+ []
+ ],
+ "2d.layer.render-opportunities.drawImage-expected.html": [
+ "1ddc6d1b44964c2fe9708be8a7cc9262eea3273a",
+ []
+ ],
+ "2d.layer.render-opportunities.getImageData-expected.html": [
+ "ea0e78e0f28b02dffada148b1cb0872bfc6b7a26",
+ []
+ ],
+ "2d.layer.render-opportunities.putImageData-expected.html": [
+ "3d63bbe776672c9af514714ca96446179eb72eb2",
+ []
+ ],
+ "2d.layer.render-opportunities.transferToImageBitmap-expected.html": [
+ "2833849da67f06693a228d9d3cec8c5ba56c8a8c",
+ []
+ ],
"2d.layer.restore-style-expected.html": [
"1d0ac3558d1d4c15609c364a6e5678ed329fa272",
[]
@@ -421158,6 +421756,10 @@
"2d.layer.several-complex-expected.html": [
"84ad6244740e997d62cd0bdf4f017a7a6c15d713",
[]
+ ],
+ "2d.layer.unclosed-expected.html": [
+ "c41b253c95ba2b4f970b6ae59b58e444df14d866",
+ []
]
},
"manual": {
@@ -421267,7 +421869,7 @@
[]
],
"gentestutilsunion.py": [
- "e923a0777ba2127a84bcc251363b9d02ebc4aee2",
+ "bf5fdeee506055248a5b94fcad4d036ee697f11a",
[]
],
"name2dir-canvas.yaml": [
@@ -421283,7 +421885,7 @@
[]
],
"templates-new.yaml": [
- "0940471dd4d5f6244b9a08111a930367afb2f726",
+ "7d8ebfccf565a293138aecc3eaecc54d0176c573",
[]
],
"templates.yaml": [
@@ -421370,11 +421972,11 @@
[]
],
"filters.yaml": [
- "292dfcc0ec7aa92afcba9eb8d6506517c229e634",
+ "dd84f913f9ba04480759b9f2010006e97902f13d",
[]
],
"layers.yaml": [
- "d398ef2b5a2a62aed4d675a2cb71b9d7a5e805e1",
+ "fe1902c61b7548a33e8b6d39c35c0c4ce270e85c",
[]
],
"line-styles.yaml": [
@@ -422045,7 +422647,7 @@
[]
],
"iframe-test.js": [
- "a18688caf786bb54d19df621b984dad3f9c1d411",
+ "f788cbd1ebdb7a76dff082d0a59649bf756310b2",
[]
],
"popup-test.js": [
@@ -422131,12 +422733,16 @@
"d5c99062d2bb8f9660b68c172754867b598ed43f",
[]
],
+ "reporting-bcg-reuse.https.html.sub.headers": [
+ "33abadd83dd9187bfa5ecf811f9fef7058412780",
+ []
+ ],
"reporting-from-rp-ro.https.html.sub.headers": [
- "424ad3e8de0297a2e66dd53914f0e5faa8651bff",
+ "07ecad96f2493c7ddc70cc5f37d242c07f0cabb1",
[]
],
"reporting-from-rp.https.html.sub.headers": [
- "6339ea34c7045eabe7457cf0c170edd35ea2ba76",
+ "a61e2919c8acb6be886ef16e764f1ba5dcabe9bc",
[]
],
"reporting-to-rp-ro.https.html.headers": [
@@ -428615,10 +429221,16 @@
[]
],
"attributes-common-to-form-controls": {
- "dirname-ltr-iframe.html": [
- "b5ed7e3d9a717746d9653c7d5f867f3acbf3e47f",
- []
- ]
+ "resources": {
+ "dirname-iframe.html": [
+ "b5ed7e3d9a717746d9653c7d5f867f3acbf3e47f",
+ []
+ ],
+ "dirname.js": [
+ "f0e97bc30142bcf4ee0429283486091203b2c220",
+ []
+ ]
+ }
},
"constraints": {
"support": {
@@ -429359,12 +429971,16 @@
[]
],
"resources": {
+ "popover-hover-hide-common.js": [
+ "9f407ef157d8a4f86c2787ed27e73e07dfb3b129",
+ []
+ ],
"popover-styles.css": [
"df683c3c64f4de11c49c14b9dc53cc4165dff4a7",
[]
],
"popover-utils.js": [
- "aa69b7d41ae032330dc20a9e565e0b1ff9c53058",
+ "4dc4d8138d80c1ee23a1addef0749241ac4f25b8",
[]
]
}
@@ -432511,6 +433127,22 @@
}
},
"processing-model-2": {
+ "integration-with-the-javascript-agent-formalism": {
+ "atomics-wait-async.https.any.js.headers": [
+ "5f8621ef83660c66f0d037ea28fafefb558140f1",
+ []
+ ],
+ "resources": {
+ "notify-worker.js": [
+ "2780e5bc34eec9e49d4311459cd7fc285fbe3f65",
+ []
+ ],
+ "notify-worker.js.headers": [
+ "6604450991a122e3e241e40b1b9e0516c525389d",
+ []
+ ]
+ }
+ },
"integration-with-the-javascript-job-queue": {
"resources": {
"README.md": [
@@ -433239,7 +433871,7 @@
[]
],
"README.md": [
- "82138a300b84382094b7d971794d6f4501a01358",
+ "7d0ec556aa45e60fdf03f21d24087d0dbd836005",
[]
],
"assumptions": {
@@ -433558,7 +434190,7 @@
[]
],
"file_upload.sub.html.ini": [
- "e2bfbf8fb8fb71003bd06a8356fec3a074395040",
+ "26ffac48154796962709d2e74451a5ca77c2c690",
[]
],
"generate_test_report.html.ini": [
@@ -433979,7 +434611,7 @@
[]
],
"attribution-reporting-api.idl": [
- "76640f54c8d5bd22151509d4d9b8a018d9492a09",
+ "ed4497b56ff5b7cafe3ae43ae1fcba1638f4b29c",
[]
],
"audio-output.idl": [
@@ -434079,11 +434711,11 @@
[]
],
"css-cascade-6.idl": [
- "37cdfb8293097e4297691f92ad291fc0433269f3",
+ "3bdf6ba3a6bf4dddada0edfd96c68e5c9e774630",
[]
],
"css-cascade.idl": [
- "9011dc7fd9e2a3f835e6d6ff565d9854db82e96f",
+ "0dd9969f6ebc0b5c98e4a251fa67275ece32307b",
[]
],
"css-color-5.idl": [
@@ -434187,7 +434819,7 @@
[]
],
"cssom.idl": [
- "222b3dc09ec0eeecfd83d6f25c71c0f250481453",
+ "7f5bf17139874ee5fd6d7dfcd835a03e6396dd6b",
[]
],
"custom-state-pseudo-class.idl": [
@@ -434247,7 +434879,7 @@
[]
],
"fenced-frame.idl": [
- "2869b95e6bb3c5968a3ced65cefd5b4509dbff9d",
+ "6b0734d1f7be28a29ab26b8ca6a17fe623fa249c",
[]
],
"fetch.idl": [
@@ -434271,7 +434903,7 @@
[]
],
"fs.idl": [
- "e2474132abfb4c7ffe2e6ebcca7158d4eadbee75",
+ "e341ab387d9c4767c52ad661286ddbf75d7770bf",
[]
],
"fullscreen.idl": [
@@ -434323,7 +434955,7 @@
[]
],
"html.idl": [
- "33d4de0db976e1ee3008fa743772202f9207b14a",
+ "99b33705b3991c1ffd3823e8d8d2e7aacebf56a9",
[]
],
"idle-detection.idl": [
@@ -434447,7 +435079,7 @@
[]
],
"mediastream-recording.idl": [
- "99f30282333a933c6f59e0e34ac127742efea2f7",
+ "496bfcf2e27da7a7da6c653b8e7f27b702f7386f",
[]
],
"model-element.idl": [
@@ -434570,6 +435202,10 @@
"d8ee0bb3a46f856ac2ea18f5731b8270a36c0262",
[]
],
+ "real-world-meshing.idl": [
+ "38fe71f6c66a7f798d75c71ad5fe128cf7c13ed3",
+ []
+ ],
"referrer-policy.idl": [
"0ef9a1fdecc87241a536df9f725f3d7e2030d3e3",
[]
@@ -434595,7 +435231,7 @@
[]
],
"resource-timing.idl": [
- "151e5d46d842742cf7f7a6328bedcc40e4cf7456",
+ "aa17003493eb2bd32dc1be241aa88323cb1889c5",
[]
],
"sanitizer-api.idl": [
@@ -434627,7 +435263,7 @@
[]
],
"scroll-animations.idl": [
- "14215509c9fec9db69602ed1f91c0ee1ee7052d0",
+ "31b3746e9d4d629e468646e695726814682e615e",
[]
],
"scroll-to-text-fragment.idl": [
@@ -434635,7 +435271,7 @@
[]
],
"secure-payment-confirmation.idl": [
- "9061b243477b4aaecc4ce756d5e0aae654342fe5",
+ "08ec8065c53081b50091ac780c9b330abb6dc1b5",
[]
],
"selection-api.idl": [
@@ -434658,6 +435294,10 @@
"4fc1f085ea2c24b73a9fa5f7d706d87fedf225a6",
[]
],
+ "shared-storage.idl": [
+ "eb5806f9a6db83daa76d3807af3683cb07b6ba39",
+ []
+ ],
"speech-api.idl": [
"74085481525c943296f023e94a6532e5bc9f5b15",
[]
@@ -434666,6 +435306,10 @@
"fff583e0982399d7ebdd001653d4bf338a14243a",
[]
],
+ "storage-buckets.idl": [
+ "f3d500a5711d393e72975d212f1654dd9c93f8e4",
+ []
+ ],
"storage-buckets.tentative.idl": [
"73d72ceab9805195704bbc63fca6ba658018784f",
[]
@@ -434699,7 +435343,7 @@
[]
],
"trust-token-api.idl": [
- "ee339590827e0f678d9dc1dfe592d4ab33ba697c",
+ "f521acea1f5e5f5d593576f4af9534bf4371bd0b",
[]
],
"trusted-types.idl": [
@@ -434707,7 +435351,7 @@
[]
],
"turtledove.idl": [
- "cd81a3d87ef8cb476ee303eafe58fb3b9d4fbca2",
+ "8add667b57509d3ec86ff214de6ee7380721fe18",
[]
],
"ua-client-hints.idl": [
@@ -434719,7 +435363,7 @@
[]
],
"url.idl": [
- "6549e45f419cd89e9e5e5f28889da8ff18cf2d79",
+ "a5e4d1eb492e8248d74824bd53b3a2120e847fe5",
[]
],
"urlpattern.idl": [
@@ -434795,7 +435439,7 @@
[]
],
"webauthn.idl": [
- "58a9e285232184b99caed6434b1a66f8a8ecee4a",
+ "c7f72eacfd079e1555c355c4648692787ab1a3c6",
[]
],
"webcodecs-aac-codec-registration.idl": [
@@ -434803,11 +435447,11 @@
[]
],
"webcodecs-av1-codec-registration.idl": [
- "00e4493d3c0a957fefbaeeeb95efeaa26afd871c",
+ "ab20879728db6ba619600ac82478162ea87a7e6e",
[]
],
"webcodecs-avc-codec-registration.idl": [
- "d4074f647dab2b1af158a4f544ccd4737164b32c",
+ "2b952c2219422bfd657976b222a397313ac7551e",
[]
],
"webcodecs-flac-codec-registration.idl": [
@@ -434827,7 +435471,7 @@
[]
],
"webcodecs.idl": [
- "77649029db69dd81b77f4178f9325537d50e4198",
+ "0b95dc8b75788e126d395ec9d69371b11f0d3a6c",
[]
],
"webcrypto-secure-curves.idl": [
@@ -434847,7 +435491,7 @@
[]
],
"webgpu.idl": [
- "284327a578999a7a068952526ab457389e40729f",
+ "34f78a1d8cd52b59eff807de7ab383afda60d53d",
[]
],
"webhid.idl": [
@@ -434863,11 +435507,11 @@
[]
],
"webnn.idl": [
- "2c2ab35e909712ad4ab89fe0f16358b4e92b353c",
+ "d2b973a624b46f86299ad65d05e515e3d3c4b773",
[]
],
"webrtc-encoded-transform.idl": [
- "e48f1080c41209bd83d90e002aa00d52f4c2425f",
+ "59710bf46c2e3b57f09aaacccb80eb2c48f33406",
[]
],
"webrtc-ice.idl": [
@@ -434883,7 +435527,7 @@
[]
],
"webrtc-stats.idl": [
- "7e820a26df4844bcd094e16089a86ebca235a612",
+ "a5fb3294b7e64b56b0afec24ab25112ab3cac4cd",
[]
],
"webrtc-svc.idl": [
@@ -434947,7 +435591,7 @@
[]
],
"webxrlayers.idl": [
- "e182f47b9c5bce5b6f3c8d47109358eb6c999856",
+ "c8b3a71c699cb641d1b037d2b2c41190fea11bd7",
[]
],
"window-controls-overlay.idl": [
@@ -435262,7 +435906,7 @@
]
},
"lint.ignore": [
- "7118adb16114c8ae8b9da512470fb94124f5b8cb",
+ "1672f3b52e7a09b0e98ff6bd14c1ca6a9a5ab160",
[]
],
"loading": {
@@ -438289,7 +438933,7 @@
[]
],
"navigation-id.helper.js": [
- "53099cadb254df0a4d087bc9dd75340b5ddb40fa",
+ "1b72fe9908d573c902e8457aad24615431b5e719",
[]
],
"not-restored-reasons": {
@@ -438343,6 +438987,10 @@
"bd7fba2ccf4b6ab7e604273c25010e31e443e376",
[]
],
+ "worker-navigation-id.js": [
+ "3a2740d0675c84faa34781307ba6a323586ad90e",
+ []
+ ],
"worker-with-performance-observer.js": [
"a72fe81c47feace765613a0962f2a7e63f71fa25",
[]
@@ -442391,6 +443039,10 @@
[]
],
"css": {
+ "animation-range-visual-test-ref.html": [
+ "c246f7f1b0a541aa3eb3cbdd01efd57d3018d5b9",
+ []
+ ],
"animation-update-ref.html": [
"7e375a1df7f063ba6cdbbdad92beb73915b84d6e",
[]
@@ -442434,8 +443086,12 @@
[]
],
"support": {
+ "animation-range.css": [
+ "453d076b6f34533d8b9105a96d8d30c1e66aac51",
+ []
+ ],
"testcommon.js": [
- "66bc27bb104ebead9b7466c4ead9076f589ac5e0",
+ "91540774d08a1b68a65ff68298f5dbff1ef674a1",
[]
]
}
@@ -444687,15 +445343,15 @@
[]
],
"partitioned-cookies-3p-credentialless-frame.html": [
- "3fdf937ae1a7f6feff8db0b2905353721cfd503a",
+ "25ddf601457c484160490a267cd8053f84c01063",
[]
],
"partitioned-cookies-3p-frame.html": [
- "6a8ed6ca989f1eeb2c9d46d8aaf0e202f0995e31",
+ "00b3412c41fb566fcab380e83f3ca9bbcd4aa859",
[]
],
"partitioned-cookies-3p-sw.js": [
- "bc2a2831568f4cc438933b88b7cad6997beb041b",
+ "767dbf443275a427facf340d72cb63d6bdc10df2",
[]
],
"partitioned-cookies-3p-window.html": [
@@ -444703,7 +445359,7 @@
[]
],
"partitioned-cookies-sw.js": [
- "bc2a2831568f4cc438933b88b7cad6997beb041b",
+ "767dbf443275a427facf340d72cb63d6bdc10df2",
[]
],
"partitioned-service-worker-iframe-claim.html": [
@@ -445910,7 +446566,7 @@
[]
],
"soft-navigation-helper.js": [
- "e8e5846c93b3f50f59a4b0b77529cda7fb0259de",
+ "baf26be8b0bf7a06a3e85bc46769e62f796283a0",
[]
]
}
@@ -447299,6 +447955,10 @@
"120941444a4898197d6b6001f9908a6cd48b62ba",
[]
],
+ "pattern-opacity-01-ref.svg": [
+ "1c9c68bd9d5becec895d4cacac93082bc2defcec",
+ []
+ ],
"pattern-viewbox-01-ref.svg": [
"c9f6931deadd57bad20ae1dbbd529d595b14adfb",
[]
@@ -447771,13 +448431,17 @@
[]
],
"affected_tests.yml": [
- "ffb1fe1f6fb14add4f1f833203343f0aefd20c76",
+ "6d3d32acc82640e80ebd92618d539ae596cdb348",
[]
],
"checkout.yml": [
"618c571465963a478a308899328d5fa5851d491e",
[]
],
+ "color_profile.yml": [
+ "d90c6ca429d55c1e7beee3a25d713970e085688c",
+ []
+ ],
"com.apple.SafariTechnologyPreview.plist": [
"122080972c9f63410062ee8d33d0ed0286af8f11",
[]
@@ -447860,7 +448524,7 @@
[]
],
"commands.json": [
- "59463144967d782537a48a19a4d8a3a39a637eb8",
+ "f26baddacadefc150ec36db11ef0f83dc20e6ca1",
[]
],
"epochs_update.sh": [
@@ -447875,6 +448539,10 @@
"44de9fe1ad078673e92385bd6e4bedba129c2485",
[]
],
+ "macos_color_profile.py": [
+ "f0919d77159795975ad2e0a68db37d96d82f7bb1",
+ []
+ ],
"make_hosts_file.py": [
"f3397281b71e85978a8bf737a1e52a0d622bc174",
[]
@@ -447891,8 +448559,12 @@
"a976e5d639866a58f46f2eb5ff3a619289b277ef",
[]
],
+ "requirements_macos_color_profile.txt": [
+ "c3448a98dfff36a8afdd3f4063e09aa875552be3",
+ []
+ ],
"requirements_tc.txt": [
- "91789c95e305fe737a34aa403ded9ca81aaa1652",
+ "9ab88012762a02398a80f8a5e4cb77c50f382450",
[]
],
"run_tc.py": [
@@ -448391,7 +449063,7 @@
]
},
"mypy.ini": [
- "def40c0bd0614c297bd1b1213f2182a2dba07a2a",
+ "5dc55c5b7470de4845f09bbc50b32a1d6686c1b1",
[]
],
"pytest.ini": [
@@ -448411,7 +449083,7 @@
[]
],
"requirements_tests.txt": [
- "ca946a306e7b31d75be71cb9a5e52b8e44aaf346",
+ "ed41215bcc1bc16b3221dd80cfbe66e2521efe69",
[]
],
"runner": {
@@ -456586,7 +457258,7 @@
[]
],
"wpt.py": [
- "e423a8c67c5a2ea195515cf78504f590a83a7985",
+ "e1df4ef42dcfb8e923711cbbf781eb224057d7c4",
[]
]
},
@@ -456626,7 +457298,7 @@
]
},
"requirements.txt": [
- "fcaab2e6674ab475428baa900bd5c174412d5d28",
+ "28be0b3c6e10e5881bc6acfe700d17f514167979",
[]
],
"requirements_chromium.txt": [
@@ -456688,7 +457360,7 @@
[]
],
"chrome.py": [
- "7092122d8c40e8327cfb91bcfecea5ca25776066",
+ "3bdbf6f962c3a8de49cd70212ffed22692bfb2e5",
[]
],
"chrome_android.py": [
@@ -456804,7 +457476,7 @@
[]
],
"executorchrome.py": [
- "a3a733efbd256cce6715685b05dce952102c22c0",
+ "5df9de5f7e3c9b119af2a592c3214af9f30ef65e",
[]
],
"executorcontentshell.py": [
@@ -456828,7 +457500,7 @@
[]
],
"executorwebdriver.py": [
- "ab7d1ab0d4c5200b39962c256f9e27ab9492ccc7",
+ "9a771f11c6ca9db2b1641af20cfdd9c9525477f5",
[]
],
"executorwktr.py": [
@@ -456987,7 +457659,7 @@
[]
],
"testloader.py": [
- "c35e509776aae10ba83528058ef813068a2f0ef9",
+ "950273c38941ca95ae3ab068f7573983d4da76f6",
[]
],
"testrunner.py": [
@@ -457046,7 +457718,7 @@
[]
],
"test_testloader.py": [
- "45b78496d1bdd741a65b77b8983451fdaa853abf",
+ "cef75e03be10535b7be60c324b04092b52ddaac9",
[]
],
"test_update.py": [
@@ -457093,7 +457765,7 @@
[]
],
"wptcommandline.py": [
- "416e75b417f607b1cbb1e1d5bdc3ebd736af67bd",
+ "1c5895eec6ea8b19274a4fc6800d87efcb2c5c09",
[]
],
"wptlogging.py": [
@@ -461800,6 +462472,20 @@
"44f42eda493c27f5b4c83a3b53d427a2c51f7ce4",
[]
]
+ },
+ "url-parsing": {
+ "current": {
+ "current.html": [
+ "82a48d409901b47cf3e2dfc22532b46de2dd60a1",
+ []
+ ]
+ },
+ "incumbent": {
+ "incumbent.html": [
+ "2c5572b77493367aae1dc35c88b4713fdc47f352",
+ []
+ ]
+ }
}
},
"security": {
@@ -461979,6 +462665,10 @@
"4347d4aae3e1c6475b21a8f246fb768d91a43afc",
[]
],
+ "echo_datagram_length.py": [
+ "f0610b085fe30b4d5fda6473bf17fc498eb47650",
+ []
+ ],
"query.py": [
"75d458255ad7af10508dce9905bf2ddb259f3699",
[]
@@ -466739,7 +467429,7 @@
]
],
"filereader_readAsDataURL.any.js": [
- "d6812121295beedc38164a41cea20c848533369f",
+ "4f9dbf7a754a87694c737487a903467a4725cc7a",
[
"FileAPI/reading-data-section/filereader_readAsDataURL.any.html",
{
@@ -487878,7 +488568,28 @@
]
]
},
+ "accept-ch.wildcard.https.sub.html": [
+ "36eccd6a5229ea39e6d94ad8d8e4bb9ae188f428",
+ [
+ null,
+ {}
+ ]
+ ],
"critical-ch": {
+ "critical-ch.navigation-timing.no-restart.https.html": [
+ "a7c2ad705db844db61f6038ed0bba496a0598ce2",
+ [
+ null,
+ {}
+ ]
+ ],
+ "critical-ch.navigation-timing.restart.https.html": [
+ "d3a49a2e91ecf44b271e196fa6f5d766433bd161",
+ [
+ null,
+ {}
+ ]
+ ],
"iframe.https.window.js": [
"cbf128149e983fa1fb4e4ef085f5179c16b50016",
[
@@ -488592,6 +489303,15 @@
}
]
],
+ "async-navigator-clipboard-write-multiple.tentative.https.sub.html": [
+ "73cdd2f049e3ba1b0413476e49f0f98ef366c247",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"async-promise-write-blobs-read-blobs.https.html": [
"12184c92e0777f5d10a63ad8e075e8422d5545a5",
[
@@ -491528,7 +492248,7 @@
},
"embedded-enforcement": {
"allow_csp_from-header.html": [
- "dd66bb77ac76f7fd9f8b626d41952298ff54d53f",
+ "b2abcbece0e3866b000096889465227c47ac7178",
[
null,
{}
@@ -495389,6 +496109,13 @@
]
},
"nonce-hiding": {
+ "nonce-hiding-move-document.html": [
+ "49de893ba03fbd25125fcf13eff8c352e4992d85",
+ [
+ null,
+ {}
+ ]
+ ],
"nonces.html": [
"7ee10a7b29e5a54918a75037ded0e5bd087f601a",
[
@@ -501276,21 +502003,21 @@
]
],
"anchor-name-001.html": [
- "a7b4b01ff472b1488f2de50ddf7cadbda7ca34b9",
+ "4caf3ee2100327b03b73c5180ac4ecc8a3761173",
[
null,
{}
]
],
"anchor-name-002.html": [
- "4c14e1d63c93ce59192b4fb54c13042f15480814",
+ "63b5d66a4e3ba66cdbac4bd550fbe385dcea102e",
[
null,
{}
]
],
"anchor-name-003.html": [
- "91ff5bc9065ed3d9b9f321971ccf0cadb31a992b",
+ "9ab6b66d944cae1998f8d90add8cb3809575d0aa",
[
null,
{}
@@ -501325,7 +502052,7 @@
]
],
"anchor-name-inline-001.html": [
- "70b753cda2d8aaabddbdc42d1e5cc6588279e88b",
+ "dba3472f5b1a2146a66eaf4c3d2429add3151321",
[
null,
{}
@@ -501346,14 +502073,14 @@
]
],
"anchor-name-multicol-003.html": [
- "8b06b4c641caab53b6c4038c7100a78678360928",
+ "02fd1c164d65865940a1506ffe15c927d3324c05",
[
null,
{}
]
],
"anchor-name-multicol-004.html": [
- "881578a4639e44abd04dfe7ead64345727e43cb2",
+ "fdd1772359ff609af103adce8fe5c673e360f8cf",
[
null,
{}
@@ -501395,7 +502122,7 @@
]
],
"anchor-position-003.html": [
- "d5263fcddff526860684ecf68264e1ef7fe56f81",
+ "c149dd0e110e6486ed3aa9c453fd9f74efcee38e",
[
null,
{}
@@ -501500,14 +502227,14 @@
]
],
"anchor-position-multicol-003.html": [
- "bf3e48ed207d12bb4c766009d33bb07041b2ca48",
+ "d23779ad9bf88ee4b49f9c9bdc97d3ce47d2a509",
[
null,
{}
]
],
"anchor-position-multicol-004.html": [
- "2be88797541fd29a23b0d8b47448dcb5c5c81bb5",
+ "399494120ea0ea5da5534a0a14a9b99e598222d5",
[
null,
{}
@@ -501542,7 +502269,7 @@
]
],
"anchor-position-multicol-fixed-001.html": [
- "6fca40dd7e90631d4272a0d27431e55cc6aca21f",
+ "b94680816e9aca235b7e499e1d902fbd95dd442e",
[
null,
{}
@@ -501590,6 +502317,20 @@
{}
]
],
+ "anchor-scroll-002.html": [
+ "88e8a754b5b1c81b75f3befabdf16216148b1317",
+ [
+ null,
+ {}
+ ]
+ ],
+ "anchor-scroll-basics.html": [
+ "6b2d96708bd44808f0cb7ce10a1b52e708e09eba",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-scroll-fallback-position-001.html": [
"a9a5d8c0ff4e84858c180eb440b514400ab97779",
[
@@ -504729,7 +505470,7 @@
]
],
"color-computed-color-mix-function.html": [
- "8f05a99967c0902ad6e1c4d621b8d7af6ef85ef6",
+ "c1ca47491ffe165c76b8cf3187effd8ee10da126",
[
null,
{}
@@ -504868,6 +505609,13 @@
{}
]
],
+ "color-mix-out-of-gamut.html": [
+ "1803397f8a71dcfea8be93621fd47b33591f464e",
+ [
+ null,
+ {}
+ ]
+ ],
"color-valid-color-contrast-function.html": [
"bdb8f0f588805797c1589802043d761560f4cdb8",
[
@@ -504938,13 +505686,6 @@
{}
]
],
- "gamut-mapping.html": [
- "02133acced21478aa311f8e66f8cca52236deaf0",
- [
- null,
- {}
- ]
- ],
"opacity-computed.html": [
"27d9316415f24bf8e398cc992508b0036935291c",
[
@@ -505593,6 +506334,13 @@
{}
]
],
+ "display-contents-dynamic-style-queries.html": [
+ "782cf566552423193669f9f0da034f802d265067",
+ [
+ null,
+ {}
+ ]
+ ],
"display-contents.html": [
"d96a46d06a85f024f0fce9d43e34dec6e271ea76",
[
@@ -509002,6 +509750,13 @@
},
"css-fonts": {
"animations": {
+ "font-size-adjust-composition.html": [
+ "d98b0ffd10e5550ab7ccc7a96d02ebb93385ddcb",
+ [
+ null,
+ {}
+ ]
+ ],
"font-size-adjust-interpolation.html": [
"a138d7fee5a39bc925a7a4cc5224dcc3db5cc387",
[
@@ -515155,7 +515910,7 @@
]
],
"clip-path-invalid.html": [
- "6b91f74ad484d4d0d70fa679db378d04e238125f",
+ "1dbdb5acab0cc86ed0f98d79c245b24c147a7053",
[
null,
{}
@@ -515169,7 +515924,7 @@
]
],
"clip-path-valid.html": [
- "ec6ac5ae9bc349c8cb1dd473e9f9dc65f4002c97",
+ "895cdfacac6cc8ac56e67738aed53e55be7b2fcf",
[
null,
{}
@@ -516521,6 +517276,15 @@
]
],
"overlay": {
+ "animation": {
+ "overlay-interpolation.html": [
+ "a3034b88c131e12b2be6b268d46444d1a0645cff",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"overlay-computed.html": [
"f1a0a315de6eeb08863d9fd4dbad2588b3492d89",
[
@@ -533994,14 +534758,14 @@
]
],
"offset-path-parsing-invalid.html": [
- "949e45d828f102b8c3298a4d75ecc0a66c727a6b",
+ "28b45db8469f2b953df0381e9877bfc03f8b5b71",
[
null,
{}
]
],
"offset-path-parsing-valid.html": [
- "95a9f8aabbc96eed703d86c512a5206036dd8dac",
+ "59a64b2116d603fa9ce79a614b8029033f2f1c42",
[
null,
{}
@@ -544024,6 +544788,24 @@
}
]
],
+ "typing-space-in-editable-button.tentative.html": [
+ "0f399378abf3de5f5bc90f82dddf138e447e8d70",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "typing-space-in-editable-summary.tentative.html": [
+ "30a751d5239d378e70eaf9766c16fcb2e510bd36",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"undo-insertparagraph-after-moving-split-nodes.html": [
"c61bcff9e9246abdabe8f5acc97b489db5708b94",
[
@@ -559153,6 +559935,15 @@
{}
]
],
+ "automatic-beacon-click-handler.https.html": [
+ "505eb6174f20de38ce6103f76e46dccc8caaa7a2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"background-fetch.https.html": [
"7036f2bb5f3bb5e42b5af1b5f970141c0884b5ef",
[
@@ -560315,7 +561106,7 @@
]
],
"general.any.js": [
- "7bf98ba9b247924d1e0c813c8010112d63e965ca",
+ "3727bb42afe49ba8b52b8f8b5ac7856028c2828c",
[
"fetch/api/abort/general.any.html",
{
@@ -566676,7 +567467,7 @@
]
},
"response-body-read-task-handling.html": [
- "c2c90eaa8bd951cf7d5168e7796dd1cb8dcf9cde",
+ "64b0755666168d7cac9808fe1593a01889a19bff",
[
null,
{}
@@ -574699,8 +575490,8 @@
{}
]
],
- "element-request-fullscreen-options.tentative.html": [
- "875431698f7a9212a40d444ddc10627defaf7b11",
+ "element-request-fullscreen-options.tentative.https.html": [
+ "871c917dcc878d4ae1a177997483c1ac820c2dd0",
[
null,
{
@@ -575370,6 +576161,17 @@
]
]
},
+ "graphics-aria": {
+ "graphics-roles.html": [
+ "159190ed833398d2410c5f4f2224f0b3a7dfd0a8",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ },
"gyroscope": {
"Gyroscope-disabled-by-feature-policy.https.html": [
"02cc44ec78b0c6ebeea657b8d0921943aa01028f",
@@ -577632,8 +578434,8 @@
{}
]
],
- "document-state.tentative.https.html": [
- "d0e629f63124579a2f4360403119dcd9fcb31190",
+ "document-state.https.html": [
+ "609ce9b850369fae857c3e407cfbbaccaf381067",
[
null,
{}
@@ -605139,7 +605941,7 @@
]
],
"access-reporting-post-message.https.html": [
- "4c8e96f57933f74d0ff3f76cafe498c20bef7353",
+ "5bc718e2a89a28a6867e83c0d85bc0cedefe39f6",
[
null,
{}
@@ -605378,8 +606180,17 @@
}
]
],
+ "reporting-bcg-reuse.https.html": [
+ "9bc171a269c5284de80cad871baafd58fb297da0",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"reporting-from-rp-ro.https.html": [
- "60322bffe7a1c7d8d536b35504e925b09ff0c6bd",
+ "b1da8cf77cefba3ab3ebaa5261dcc1c0b5583470",
[
null,
{
@@ -605388,7 +606199,7 @@
]
],
"reporting-from-rp.https.html": [
- "5deb115d94ef2894e6551ca89f8d4966d2d438df",
+ "a8c11d7a4a89f6885e73422510c9046e9faab7a5",
[
null,
{
@@ -605397,7 +606208,7 @@
]
],
"reporting-to-rp-ro.https.html": [
- "cf1385e766374d7fafae07eed9a857d8b9c381a3",
+ "eb80842863425fd60d04206354e60942c59232e1",
[
null,
{
@@ -605406,7 +606217,7 @@
]
],
"reporting-to-rp.https.html": [
- "9ff374c1c787348115e5d10d624be64ea4040323",
+ "ad57afccf8fa4703434d39e070cce7744f65600d",
[
null,
{
@@ -606143,7 +606954,7 @@
]
},
"name-content-attribute-and-property.html": [
- "3319c1875bf36c2cf6173ea606ecca0b74e0f1f1",
+ "082ed281fef888ddca0e6a743e9a8ba41c3816e7",
[
null,
{}
@@ -606216,7 +607027,7 @@
]
],
"idlharness.https.html": [
- "4e9e25fd5df7221b4c99fd49c8fe0bb3753c549c",
+ "7d693d3c0a273ff2df256850baaeeb9203e54ba2",
[
"html/dom/idlharness.https.html?exclude=(Document|Window|HTML.*)",
{
@@ -606237,7 +607048,7 @@
]
],
"idlharness.worker.js": [
- "16f6e85ce7c619e454d5657ca2978067785b0cff",
+ "88942ddfea13a10a14c4ceed360c9a7a9963e62e",
[
"html/dom/idlharness.worker.html",
{}
@@ -606880,7 +607691,7 @@
"focus": {
"sequential-focus-navigation-and-the-tabindex-attribute": {
"focus-tabindex-event.html": [
- "8ff5843c866b62a040fce3133470fc48ffe7819e",
+ "55619661acc8721ec693fc89f78e5af5339c0b5a",
[
null,
{
@@ -615644,21 +616455,28 @@
"forms": {
"attributes-common-to-form-controls": {
"dirname-ltr.html": [
- "9d1c9eb77e9fdef844689bb71b44c8c2271e6ba4",
+ "cbdbb72c674eec63e262957937f251fc557d9a6d",
+ [
+ null,
+ {}
+ ]
+ ],
+ "dirname-only-if-applies.html": [
+ "7d542111896e68e7df0b271b247126b99b3c1972",
[
null,
{}
]
],
"dirname-rtl-auto.html": [
- "6368a26fafd74105428969660fec3d29bbcb4dce",
+ "072b85086857ba9d018895dfbc29a66a69b2dbc0",
[
null,
{}
]
],
"dirname-rtl-inherited.html": [
- "1e6967d914a34de49033b1ea358b4093f11baf97",
+ "e7b07288d6b7ab0e0c2f4ce419dc6681760f8ab6",
[
null,
{}
@@ -616002,6 +616820,13 @@
{}
]
],
+ "form-double-submit-requestsubmit.html": [
+ "b4028784edd933e64fd8d4c1c86cda694fc3b312",
+ [
+ null,
+ {}
+ ]
+ ],
"form-double-submit-to-different-origin-frame.html": [
"00a46bfd4326fc2d35d50bfc4a2f68890a5594bb",
[
@@ -616276,7 +617101,7 @@
]
],
"select-event.html": [
- "854b1f480460d61a77788cc7773c24a37b530cb2",
+ "d1b46a22d8621586be46ba6a535ab9467b1aed2d",
[
null,
{
@@ -618194,6 +619019,13 @@
{}
]
],
+ "name-attribute.tentative.html": [
+ "9aa5ce42e8e5ada6eeddfd4b8c2cff7359402157",
+ [
+ null,
+ {}
+ ]
+ ],
"toggleEvent.html": [
"8ad60de5d9b52ec5f22e6232d4ec8650fff5ec0c",
[
@@ -618361,6 +619193,13 @@
{}
]
],
+ "dialog-focus-previous-outside.html": [
+ "efd242c57694b8f8cc88c6974ef5236cca400200",
+ [
+ null,
+ {}
+ ]
+ ],
"dialog-focus-shadow-double-nested.html": [
"2cd63eb796b38f6a272aeb9eff13e5974705236b",
[
@@ -618428,6 +619267,13 @@
}
]
],
+ "dialog-no-throw-requested-state.html": [
+ "c86cbe84a62294b2d4ce949bd3e9d6af6623c8dc",
+ [
+ null,
+ {}
+ ]
+ ],
"dialog-open-2.html": [
"79120d07ebdca3625cce5925fc8ede3a528e9e53",
[
@@ -618967,7 +619813,7 @@
]
],
"popover-attribute-basic.html": [
- "eab61407c8b38772059fb9dae2dfe33308138a1e",
+ "32d3deb3848c22ee48403e40c17038f1cc8e2f59",
[
null,
{
@@ -619032,8 +619878,38 @@
}
]
],
- "popover-hover-hide.tentative.html": [
- "ed647a7d7d8f9c2598cf2c69c21f84ec455f5994",
+ "popover-hover-hide-hide.tentative.html": [
+ "57ca5723de562cc97b886e1410119596eefee313",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
+ "popover-hover-hide-hover.tentative.html": [
+ "d0036c0fe7b14b619a0c6562caf53713a478f6a7",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
+ "popover-hover-hide-show.tentative.html": [
+ "7b3fa2b30238df6e5f464b39bb246e7bef6ac241",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
+ "popover-hover-hide-toggle.tentative.html": [
+ "d6d4079e7e02be9cf6f6efde435fe4f1d0678d57",
[
null,
{
@@ -619069,7 +619945,7 @@
]
],
"popover-light-dismiss.html": [
- "d7d1edd3a4b1fa655f971c69cf4d77b64926dc1b",
+ "4b888169e1becc6daca007a6d6e71df0004e8049",
[
null,
{
@@ -619079,7 +619955,7 @@
]
],
"popover-move-documents.html": [
- "9feaa4b2bf8756aa1774cfa973327912d534ffac",
+ "11f52c2f2f0d14c74649cc7c52ac6e5ac68058b1",
[
null,
{}
@@ -628116,6 +628992,31 @@
]
],
"integration-with-the-javascript-agent-formalism": {
+ "atomics-wait-async.https.any.js": [
+ "3a3ea40d773f9b36314e714a17212f8ceed1f660",
+ [
+ "html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker"
+ ]
+ ]
+ }
+ ]
+ ],
"requires-failure.https.any.js": [
"fddf85dbede1a36d4f161b638f19c39f8300ac47",
[
@@ -636976,7 +637877,7 @@
]
],
"MediaRecorder-error.html": [
- "97e781054f33b1eaabb6433ad41f703b0806cc36",
+ "39e8676d19f886254a7b5387ee98fc153a41a1b6",
[
null,
{}
@@ -637037,6 +637938,13 @@
{}
]
],
+ "MediaRecorder-video-key-frame-distance.html": [
+ "b986b3075ff6d9e71ff83033dadf96ca0d8037c0",
+ [
+ null,
+ {}
+ ]
+ ],
"idlharness.window.js": [
"99e884530c0f42ba8f42e6c51dcddb13cae45681",
[
@@ -644426,7 +645334,7 @@
},
"performance-timeline": {
"back-forward-cache-restoration.tentative.html": [
- "733642fd03225a0877b93e8dcc09ec24e097935a",
+ "c673e09cb461e094d5616b7a43154fe2cffb12bd",
[
null,
{}
@@ -644595,7 +645503,7 @@
]
],
"navigation-id-element-timing.tentative.html": [
- "bc52f208b0726421f1d36cdc6b737030c0760c1d",
+ "7ff415530bc69d6feb4a8800892a3b2eb06a8e8a",
[
null,
{
@@ -644604,7 +645512,7 @@
]
],
"navigation-id-initial-load.tentative.html": [
- "3228e12778b5d510dedcdd15977e2b021473f097",
+ "93ddcff062e726ea60a4f6041f6a6bfb23f6fc72",
[
null,
{
@@ -644613,7 +645521,7 @@
]
],
"navigation-id-long-task-task-attribution.tentative.html": [
- "662e17508b26dc671bf4ed25618a3b9ed9b0cac1",
+ "e1da9100aeee55f0f2ecfda6afb4993079a3585a",
[
null,
{
@@ -644622,7 +645530,7 @@
]
],
"navigation-id-mark-measure.tentative.html": [
- "42795f94a98cd07aee3c13dab7d33bbd2743848e",
+ "30613ebb980eb01e1e273513e5e5ce90fb2c6931",
[
null,
{
@@ -644631,7 +645539,7 @@
]
],
"navigation-id-reset.tentative.html": [
- "7386331d26e918ebe06b15207f92f7c60a372409",
+ "f5a2428e5f568ab2bac64797fdc3a52fb0829386",
[
null,
{
@@ -644640,7 +645548,7 @@
]
],
"navigation-id-resource-timing.tentative.html": [
- "1ec906ebbbba4a8118f746ac94c52aa399556f05",
+ "6d0614a6e23940cc003aa21a7ddf1b166b7a1ea7",
[
null,
{
@@ -644648,6 +645556,13 @@
}
]
],
+ "navigation-id-worker-created-entries.html": [
+ "96fc57be1d426c9c364fe20359dafebf60380fd8",
+ [
+ null,
+ {}
+ ]
+ ],
"not-clonable.html": [
"d651776e5f4b945328e9de2651b8a59f11b53426",
[
@@ -646842,7 +647757,7 @@
]
],
"pointerevent_auxclick_is_a_pointerevent.html": [
- "b3b7481d6ab19cc81688ed6819d81aa16ead35f0",
+ "5ec1bab1649effa65bd8c6dd579a003ea815085c",
[
"pointerevents/pointerevent_auxclick_is_a_pointerevent.html?mouse",
{
@@ -646923,7 +647838,7 @@
]
],
"pointerevent_click_is_a_pointerevent.html": [
- "9e4b023a25af7551e3737eb0d43df4a81b6c1510",
+ "2571c9c9034200e03bf2ad904cd859da9ccf6ddf",
[
"pointerevents/pointerevent_click_is_a_pointerevent.html?mouse",
{
@@ -646972,7 +647887,7 @@
]
],
"pointerevent_contextmenu_is_a_pointerevent.html": [
- "fe3a69942ef6338561041d3fdf640dae76958d25",
+ "d951be542a367cd0e30a6b169bded298de365984",
[
"pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?mouse",
{
@@ -648423,8 +649338,22 @@
{}
]
],
+ "modulepreload-as.html": [
+ "dd946e454a1fe1833dbe37164105f028795facba",
+ [
+ null,
+ {}
+ ]
+ ],
+ "modulepreload-sri.html": [
+ "ea32a6a302525240573deb75b6e3f16b96b5e1eb",
+ [
+ null,
+ {}
+ ]
+ ],
"modulepreload.html": [
- "0e4b6923e32e83ac3b8f3018537352aa120df6c5",
+ "4764b58261995cc617c4a8cca0daaf2ab78e66fb",
[
null,
{}
@@ -664882,105 +665811,105 @@
"scroll-animations": {
"css": {
"animation-duration-auto.tentative.html": [
- "375489c26a4f49aa3f8bb1f3b4f24d19654ab549",
+ "cfb7cf2c1e4aad9ba103833199a4440e9381bc74",
[
null,
{}
]
],
"animation-range-ignored.html": [
- "f08659635ea77263aded03ee66a4a4c8c4702862",
+ "dabb4ec5a60427b8137f02441feec0f7bf68658a",
[
null,
{}
]
],
"animation-range-normal-matches-cover.html": [
- "44b08cab969dd2423fba21a95008e0b4384c2d67",
+ "a91e3d3e29a09c43a5e3fd61365ef803a1a47814",
[
null,
{}
]
],
"animation-shorthand.html": [
- "7bd17b9919070006824fee9e77ec5b20e464315b",
+ "a17dd431264453f52f69fb8d3f55a1413f0680ba",
[
null,
{}
]
],
"animation-timeline-computed.html": [
- "7759e799c62987817c2aa797fb0a8b802916abaa",
+ "1e621eee531c22e80d98fb3dc30517cf4153ce07",
[
null,
{}
]
],
"animation-timeline-ignored.tentative.html": [
- "0ac7a9d63e819588ed375e151b17a364a458ff9f",
+ "8992cdc174fbcacc78476013536c31f30154a03c",
[
null,
{}
]
],
"animation-timeline-in-keyframe.html": [
- "75483331390d9fb6571307c3158cc37adcd893ee",
+ "04b430c324231011cc883e359a1ffb12ca5741da",
[
null,
{}
]
],
"animation-timeline-multiple.html": [
- "50a829c5b6bd50fad40414cb29de1e926ebbe905",
+ "e812c7d67ea3771c5c0355fa0eb57526d2209fb0",
[
null,
{}
]
],
"animation-timeline-named-scroll-progress-timeline.tentative.html": [
- "ed2c32d31e97bfbe8e5836a382a3a5b116c5ce29",
+ "71df9ceda873e29146259d696c5ca9cc6d34fd06",
[
null,
{}
]
],
"animation-timeline-none.html": [
- "a8e07a44d6de1337005bc64bf41f5acbaf026ad4",
+ "7092523c489603dbfd12452318cacec4aaf85421",
[
null,
{}
]
],
"animation-timeline-parsing.html": [
- "4916f7726f910d56fad5c33dba7d1b6421fb6468",
+ "f0061c5705dd78484133968c414bfea9103ff6f1",
[
null,
{}
]
],
"animation-timeline-scroll-functional-notation.tentative.html": [
- "09917b4ba56c80179f42b68648edd38f6cd2ec03",
+ "0bba4a03f402c18741a62046c785fa20b46227d8",
[
null,
{}
]
],
"animation-timeline-view-functional-notation.tentative.html": [
- "745d76c72943b4316fd074d8537e41ea82b3d0e2",
+ "8a62199b524862b7feee1cfa577275c3490e03a2",
[
null,
{}
]
],
"get-animations-inactive-timeline.html": [
- "10bf00fbbc06a18b47deab2eaad69ba516b9ff42",
+ "d3048913cef2229e27d54d19d3e014adfbb7b670",
[
null,
{}
]
],
"merge-timeline-offset-keyframes.html": [
- "c6d384fce546d132e11b43d786c17fe46a9fcd04",
+ "e5d5037d622605176b70f1d7a2a9211f67514201",
[
null,
{}
@@ -665001,7 +665930,7 @@
]
],
"progress-based-animation-timeline.html": [
- "eeb1e548e52a3df81df4c3f660c8d362fe1bea76",
+ "bbc60e3fbddf6f298ca3c3e3fcbff628d3a9baa5",
[
null,
{}
@@ -665022,28 +665951,28 @@
]
],
"scroll-timeline-attachment.html": [
- "96033859e29ed624921361110fc2fdbaa546179c",
+ "c924302b224acfb351d55b8047f47f5915f4f33b",
[
null,
{}
]
],
"scroll-timeline-axis-computed.html": [
- "b971aba6c0f8a5bd5a6e18ddbef1cc296263c305",
+ "c942fb40932433dd4daf7dbb68557488bebb14e8",
[
null,
{}
]
],
"scroll-timeline-axis-parsing.html": [
- "25f48f0c70ab57359e291ac65f7c37436bd97425",
+ "a9a760a54a44c8a64cacfa25d155339f962b3c89",
[
null,
{}
]
],
"scroll-timeline-axis-writing-mode.html": [
- "958ce4964e844bcf8d94699b4a8bbc5e29df8e2f",
+ "872dc1b2b93fe4236f76a78321be7edb10f32a14",
[
null,
{}
@@ -665057,49 +665986,49 @@
]
],
"scroll-timeline-dynamic.tentative.html": [
- "0d951e7b139c1d219284398c386e81a2753a281a",
+ "57c666e2412cb0e7316a78da83980ce608b92bf8",
[
null,
{}
]
],
"scroll-timeline-in-container-query.html": [
- "38b8ffdc15aed7875bc13d25e13bc5a501b298bb",
+ "742c35b258004930833ae6ea504082e7c615d6b1",
[
null,
{}
]
],
"scroll-timeline-inactive.html": [
- "0953f1b389406dffb80fb9b599eef7f1fbe24c07",
+ "eedc8e3958ade809be1832619ab12684e2e12922",
[
null,
{}
]
],
"scroll-timeline-multi-pass.tentative.html": [
- "651ba212ded9d0e64e8eb706f2af59c832d1fadc",
+ "7e0c1339b261bdaa9b59a2a9c76451fd1574fe86",
[
null,
{}
]
],
"scroll-timeline-name-computed.html": [
- "bfffafc652319721a56aea35757124b03d716e3a",
+ "b803ee8212b25ea20f314b5e76fa795b2792d700",
[
null,
{}
]
],
"scroll-timeline-name-parsing.html": [
- "0fb271250ad9ab12dd022579b016b4e4a1c50323",
+ "d38b9640af91b87b48838c95481ccf38afd2731d",
[
null,
{}
]
],
"scroll-timeline-name-shadow.html": [
- "f5cd2ce47d707811287ab03cb4ea815c33cea599",
+ "f2bea29dd3c874718fa413f6d4294324921c5835",
[
null,
{}
@@ -665113,7 +666042,7 @@
]
],
"scroll-timeline-nearest-with-absolute-positioned-element.html": [
- "7fe2d12be30cdcfadfa5f6f30cb324a31565f390",
+ "57a1a947126c86d8fdbdf7f6d1a7ced740ecf172",
[
null,
{}
@@ -665141,21 +666070,14 @@
]
],
"scroll-timeline-sampling.html": [
- "51b60e73ce6a5c4542cc2fe67131533696807f5f",
+ "f77c5082200f6fbafa1201e5f315157409e82daf",
[
null,
{}
]
],
"scroll-timeline-shorthand.tentative.html": [
- "68e1cc955f5239075cf283ceac3938c42143a9e4",
- [
- null,
- {}
- ]
- ],
- "scroll-timeline-sibling-gcs.html": [
- "6062e795f43e3057f8fd580e9b949c91bee567fa",
+ "7a6d9cdf4ae0771700984ddedd41070e85f4caa4",
[
null,
{}
@@ -665169,14 +666091,14 @@
]
],
"timeline-offset-in-keyframe-change-timeline.tentative.html": [
- "eeb13150aa1277490f913a5733ce1012c8d19725",
+ "311b2c8929a112940e80371ea3be8e85b6792991",
[
null,
{}
]
],
"timeline-offset-keyframes-hidden-subject.html": [
- "93ef7ffa1eb18ed16cb6edfe0caf35bb70b8d624",
+ "10934347821b05331cf59bf27b103aecbf979556",
[
null,
{}
@@ -665190,21 +666112,42 @@
]
],
"timeline-range-name-offset-in-keyframes.tentative.html": [
- "54467bc83b18146c4a0adcd2dffde44bfd352df9",
+ "cee90f3b1b0112206b9b2522400af0155ec365fd",
+ [
+ null,
+ {}
+ ]
+ ],
+ "timeline-scope-computed.tentative.html": [
+ "814933f726658493581a00157a660417ebf367c0",
+ [
+ null,
+ {}
+ ]
+ ],
+ "timeline-scope-parsing.tentative.html": [
+ "2885cb758ded6f4ad95f2f0603a977970b519ac7",
+ [
+ null,
+ {}
+ ]
+ ],
+ "timeline-scope.html": [
+ "985e694bfdc89077ba0075bb16cea1772e003c2f",
[
null,
{}
]
],
"view-timeline-animation-range-update.tentative.html": [
- "6c2a792aeec0c0baf4998423a9e4750a1de2af4e",
+ "552461c9b6c24870972b96281ab42cdf63b06ca2",
[
null,
{}
]
],
"view-timeline-animation.html": [
- "a367ef9dd879544e1fc0ad6f850661c86d2ea8e2",
+ "9f8ffd176e34e723b465218474be69d0e1ada27b",
[
null,
{}
@@ -665225,35 +666168,35 @@
]
],
"view-timeline-attachment.html": [
- "ff98ed78258c47f58678f3f00f5fb04eb3678f82",
+ "a91ae13d64a2c98323adac1defbb1ab741bc0b0d",
[
null,
{}
]
],
"view-timeline-axis-computed.html": [
- "f4649dab0404a49be5014e2df7475fd151c44342",
+ "30b2a1ae051bf3c20fc2b4eb6b008d696e21272a",
[
null,
{}
]
],
"view-timeline-axis-parsing.html": [
- "ffcc36c32086d9720bd0b5b2d9f8542cee02769f",
+ "1ebe4410a9547b8255a6c6696afc60462aafc04e",
[
null,
{}
]
],
"view-timeline-dynamic.html": [
- "207c8c4e22379e19cf2f557d89295e34178e0a5b",
+ "9e042b774b9e992fb707d7a27ad5e96940aa80bc",
[
null,
{}
]
],
"view-timeline-inset-animation.html": [
- "a7e807c2e819dd0678178171816af5569b3aadff",
+ "9ba88fde507aceae168e1c0b31d38f90ebe6c7f3",
[
null,
{}
@@ -665274,63 +666217,63 @@
]
],
"view-timeline-keyframe-boundary-interpolation.html": [
- "04eb648949057b6452d96b2f4ba55a1cb9f467e2",
+ "011f03cb5dbb9ccded90e743201b6ceaafb4a8df",
[
null,
{}
]
],
"view-timeline-lookup.html": [
- "6cead9dc586697428c21d1f3fcca9c7b047f4a7d",
+ "ea9acd22ba70baa8e028790dfa0177640718e2b9",
[
null,
{}
]
],
"view-timeline-name-computed.html": [
- "5657dc781784ad838a8d09712bc108d5d36f188e",
+ "3304723f43fa1880e5f1095739087e9612b1ac68",
[
null,
{}
]
],
"view-timeline-name-parsing.html": [
- "3878d5c58347c83532292d2a565e2988e71ac6be",
+ "2b22cbe036e605633e1e72a160acd92172b3610d",
[
null,
{}
]
],
"view-timeline-name-shadow.html": [
- "55240efcfb5a0528fe2f5faff7769770e51995c0",
+ "bb14618c00ad4350bf4716802da649e0567d9951",
[
null,
{}
]
],
"view-timeline-range-animation.html": [
- "3d7593823dbc6864c054c518ff9e630d1dc8290d",
+ "1c657e40cebf0853a14151e9f46be0fa19c33839",
[
null,
{}
]
],
"view-timeline-shorthand.tentative.html": [
- "f19b9e6ac21bd0a825f7e944ec9eea747897d09a",
+ "fd00acc73ab17ed7642d9c332d6e50aff4b63203",
[
null,
{}
]
],
"view-timeline-used-values.html": [
- "6627eeb9988096f136a85408093e1b76fc4a06f2",
+ "1bd6f0468c3db67b2ec48d2727121f8a87ebd522",
[
null,
{}
]
],
"view-timeline-with-delay-and-range.tentative.html": [
- "e8f537b188c1aff82c6a9e8015f56cd632379246",
+ "db260f15f07000045fa92068f7aaf1dfa39c4429",
[
null,
{}
@@ -665360,7 +666303,7 @@
]
],
"constructor.html": [
- "8e211efa11a6ca8eb2ff606cbff683203e608702",
+ "88c6a453ec972fe492d54f316105621c0717a81b",
[
null,
{}
@@ -665381,7 +666324,7 @@
]
],
"current-time-writing-modes.html": [
- "d18abcd48f5d4088089adda7ac9709f4db32b2ab",
+ "748cda2f894f28096204526797f0e3a259e333d0",
[
null,
{}
@@ -665561,7 +666504,7 @@
]
],
"change-animation-range-updates-play-state.html": [
- "53330d32f1f4b8a14a72b652ae9c486d1368c5da",
+ "16b9c30141761fadaba5d9652114838a22d1f20c",
[
null,
{}
@@ -665659,14 +666602,14 @@
]
],
"view-timeline-subject-size-changes.html": [
- "9ae4b1df775a7b16b4493dbd10aac849d4c63104",
+ "ee7ce906783c10c2b5e9b9734f14de906c122542",
[
null,
{}
]
],
"zero-intrinsic-iteration-duration.tentative.html": [
- "e77cf4629cb0f4a9af5436c7b0e44de9bee5389f",
+ "4eec5d8f13ab75de299e1efa6eefd9eeaede0d8d",
[
null,
{}
@@ -670228,7 +671171,7 @@
]
],
"partitioned-cookies.tentative.https.html": [
- "ab667013a2b7f5fa71a575e985a3c54b9ae4cc93",
+ "5f6371cb428335bc33f3ed2220473a1a48fad85c",
[
null,
{
@@ -675027,10 +675970,43 @@
},
"storage": {
"buckets": {
- "buckets_storage_policy.tentative.https.any.js": [
- "a66fd81cd4394209d1c534322b2b150cac35adf6",
+ "bucket-quota-indexeddb.tentative.https.any.js": [
+ "ba82edb72ec6fc1656be169a14c3a025e1ab6a23",
+ [
+ "storage/buckets/bucket-quota-indexeddb.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Bucket quota enforcement for indexeddb"
+ ],
+ [
+ "script",
+ "/storage/buckets/resources/util.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "storage/buckets/bucket-quota-indexeddb.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Bucket quota enforcement for indexeddb"
+ ],
+ [
+ "script",
+ "/storage/buckets/resources/util.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "bucket-storage-policy.tentative.https.any.js": [
+ "d6dce3675d0bca18a379518c6ecf2c7ec1310930",
[
- "storage/buckets/buckets_storage_policy.tentative.https.any.html",
+ "storage/buckets/bucket-storage-policy.tentative.https.any.html",
{
"script_metadata": [
[
@@ -675049,7 +676025,7 @@
}
],
[
- "storage/buckets/buckets_storage_policy.tentative.https.any.serviceworker.html",
+ "storage/buckets/bucket-storage-policy.tentative.https.any.serviceworker.html",
{
"script_metadata": [
[
@@ -675068,7 +676044,7 @@
}
],
[
- "storage/buckets/buckets_storage_policy.tentative.https.any.sharedworker.html",
+ "storage/buckets/bucket-storage-policy.tentative.https.any.sharedworker.html",
{
"script_metadata": [
[
@@ -675087,7 +676063,7 @@
}
],
[
- "storage/buckets/buckets_storage_policy.tentative.https.any.worker.html",
+ "storage/buckets/bucket-storage-policy.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -678033,6 +679009,243 @@
{}
]
],
+ "owning-type-message-port.any.js": [
+ "e9961ce042256acad6ac94cb558d57e7dd3464d5",
+ [
+ "streams/readable-streams/owning-type-message-port.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type-message-port.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type-message-port.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type-message-port.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "owning-type-video-frame.any.js": [
+ "ec01fda0b3c737326e8ca7cd78101ca062eab58b",
+ [
+ "streams/readable-streams/owning-type-video-frame.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type-video-frame.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type-video-frame.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type-video-frame.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "owning-type.any.js": [
+ "27a3dda894e4d6e2b71524f1f6ae87a71fbdfdcd",
+ [
+ "streams/readable-streams/owning-type.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/readable-streams/owning-type.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "../resources/test-utils.js"
+ ],
+ [
+ "script",
+ "../resources/rs-utils.js"
+ ]
+ ]
+ }
+ ]
+ ],
"patched-global.any.js": [
"a64a054a97f1f5f133ec961a02f75207b2cb4eee",
[
@@ -678080,6 +679293,20 @@
}
]
],
+ "read-task-handling.window.js": [
+ "2edc0ddddfe692c79474c8570d433ced8df90276",
+ [
+ "streams/readable-streams/read-task-handling.window.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ]
+ ]
+ }
+ ]
+ ],
"reentrant-strategies.any.js": [
"b4988bc2433fd56c6527f0546ab47fa14b4c9f54",
[
@@ -678425,6 +679652,17 @@
{}
]
],
+ "transform-stream-members.any.js": [
+ "fca060b0c05fa3b4015688c20c13a0423365c9f7",
+ [
+ "streams/transferable/transform-stream-members.any.html",
+ {}
+ ],
+ [
+ "streams/transferable/transform-stream-members.any.worker.html",
+ {}
+ ]
+ ],
"transform-stream.html": [
"355d5d807433d75c02adff23e228d050b7772c0f",
[
@@ -679996,7 +681234,7 @@
},
"subapps": {
"add-error.tentative.https.html": [
- "2cbf50836df093ee12e0157d5db6dfa0cc59706e",
+ "defe4743c6ab290683af9b57f193508c5743c4e0",
[
null,
{
@@ -680005,7 +681243,7 @@
]
],
"add-success.tentative.https.html": [
- "2453fdbdecd39cfadf142b5ecf34d35a9eaef5ca",
+ "a9a439b36ac9a9095be58eef3767136d402d9071",
[
null,
{
@@ -680046,21 +681284,21 @@
]
],
"list-success.tentative.https.html": [
- "c1d281abc530f16f60c0af6548d36a35710fd4dd",
+ "ea4f96124a912f361abb1a9ca73bd08aa77776ad",
[
null,
{}
]
],
"remove-error.tentative.https.html": [
- "917c3b4d022d446488ac14c45fff114e34a95c5d",
+ "a7271905dc7d19b4778d59e7f2c59274b4f7b813",
[
null,
{}
]
],
"remove-success.tentative.https.html": [
- "6fd4305b4340a036ddba6084d9f6c5b929254f2e",
+ "ad60d6398dd848e935898810673d3aac3eba0333",
[
null,
{}
@@ -688502,6 +689740,15 @@
]
],
"role": {
+ "abstract-roles.html": [
+ "8a98ba74ead17698a48957c88e98601925f4e8e0",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"basic.html": [
"5cb838647015de9ea295e60184b2300bbb718bfe",
[
@@ -688511,6 +689758,33 @@
}
]
],
+ "fallback-roles.html": [
+ "5242a02deec006b6dcfc152c7d5963c0bb85cdbe",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "form-roles.html": [
+ "935899c583be85b4a8593567a94e87c826dc0d87",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "invalid-roles.html": [
+ "e7d38dc8c950c53a9f15610a1f8eff64f177d8c4",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"list-roles.html": [
"5d9787f04bfdcbdb236e38583b01401269419b9a",
[
@@ -688529,8 +689803,17 @@
}
]
],
+ "role_none_conflict_resolution.html": [
+ "efb247fc77cfe217a5856f0b2c031eaefedb5e98",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"roles.html": [
- "71946cbffa50de3c09eaa6a449657476a9aae597",
+ "72c9cdd0cd35eb063491dd93801d6c2b5eb55fac",
[
null,
{
@@ -697032,7 +698315,7 @@
]
],
"public-key-credential-to-json.https.window.js": [
- "339f16df838b156760711e40c0f0574452cbfb70",
+ "8de3b8c3cd09ac92fc2f1ade93e3ab7888cddc72",
[
"webauthn/public-key-credential-to-json.https.window.html",
{
@@ -705294,6 +706577,13 @@
{}
]
],
+ "RTCRtpParameters-codec.html": [
+ "5c81349b1528aaa17f8b17920c15e6664f9709e3",
+ [
+ null,
+ {}
+ ]
+ ],
"RTCRtpParameters-maxFramerate.html": [
"3e348f0d147bdb6cd0583d4f5596feb30f86cb52",
[
@@ -715519,7 +716809,16 @@
null,
{}
]
- ]
+ ],
+ "url-parsing": {
+ "url-parsing.html": [
+ "21ef6cd3a95487b99c732f0ff300722ebf3defe3",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
},
"opening-handshake": {
"001.html": [
@@ -717753,7 +719052,7 @@
]
],
"datagrams.https.any.js": [
- "dc7133bb867e203ee651d887b64e48782dc3c58b",
+ "d5b8e3bbda158707bb5273628ec1abea7206d1ac",
[
"webtransport/datagrams.https.any.html",
{
@@ -749061,7 +750360,7 @@
},
"back": {
"back.py": [
- "21e8498ccd57da9b101055f39fedab02ef2f2fcb",
+ "62434323e0ad5339a861d0752d29f7d1f95c81cc",
[
null,
{}
@@ -749481,7 +750780,7 @@
]
],
"event_buffer.py": [
- "69c96c8c545a4192b1b85b3af4de3bd283c5ad40",
+ "99a95df104951a2760d5a6a2f13e887d277f25aa",
[
null,
{}
@@ -749509,7 +750808,7 @@
]
],
"subscription.py": [
- "d23a4cf83e5ef701280dd92c148e40651482eb4a",
+ "4d604f6877e04ead8d666423cbb3d0c1fdf9ce4e",
[
null,
{}
@@ -749602,7 +750901,7 @@
},
"call_function": {
"arguments.py": [
- "ea85b2c6c94fffd24b6ca6794910e9fb1270a7fd",
+ "0cb571038b76242f6b2e33b787217eba36dd78fe",
[
null,
{}
@@ -749923,7 +751222,7 @@
]
],
"invalid.py": [
- "1dd6cd0aadf79c00f5e1e1770a03d7c12bf319c0",
+ "005574b03ca265a73e5569c27d08f9f456347b5b",
[
null,
{}
@@ -750091,7 +751390,7 @@
]
],
"navigate.py": [
- "bada57942b4807e4b151f80514bf8598ac359262",
+ "492718292a178e5bfe242d75acad4b6efc3cbf71",
[
null,
{}
@@ -750439,7 +751738,7 @@
},
"forward": {
"forward.py": [
- "61c66e201b9e9898cec78c86c37fbf894b48c457",
+ "f27be403f9e95bd2359d5ae6224f6ae2708ff7c8",
[
null,
{}
@@ -750921,7 +752220,7 @@
]
],
"navigate.py": [
- "a367fc105e126aba603a2c426f2bfe823ccad950",
+ "d61377af275902c48083d3d84b35c3bba30bc34e",
[
null,
{}
diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini
new file mode 100644
index 00000000000..58e4780d677
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-background-repaint-parent.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini
new file mode 100644
index 00000000000..ae7e0461e5b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-background-repaint.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-background-repaint.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini
new file mode 100644
index 00000000000..a6f5e206966
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-outline-repaint-parent.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini
new file mode 100644
index 00000000000..e7b7f5a85d4
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html.ini
@@ -0,0 +1,2 @@
+[color-mix-currentcolor-outline-repaint.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-color/parsing/color-mix-out-of-gamut.html.ini b/tests/wpt/metadata/css/css-color/parsing/color-mix-out-of-gamut.html.ini
new file mode 100644
index 00000000000..f1ebf996f5f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-color/parsing/color-mix-out-of-gamut.html.ini
@@ -0,0 +1,54 @@
+[color-mix-out-of-gamut.html]
+ [Property color value 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
+
+ [Property color value 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)']
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-conditional/at-supports-selector-file-selector-button.html.ini b/tests/wpt/metadata/css/css-conditional/at-supports-selector-file-selector-button.html.ini
new file mode 100644
index 00000000000..92d21eff876
--- /dev/null
+++ b/tests/wpt/metadata/css/css-conditional/at-supports-selector-file-selector-button.html.ini
@@ -0,0 +1,2 @@
+[at-supports-selector-file-selector-button.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/percentage-padding-004.html.ini b/tests/wpt/metadata/css/css-flexbox/percentage-padding-004.html.ini
new file mode 100644
index 00000000000..e025cd0107b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/percentage-padding-004.html.ini
@@ -0,0 +1,2 @@
+[percentage-padding-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-composition.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-composition.html.ini
new file mode 100644
index 00000000000..b0985b5f3e5
--- /dev/null
+++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-composition.html.ini
@@ -0,0 +1,750 @@
+[font-size-adjust-composition.html]
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (-0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (0.5) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (1) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [none\] to add [2.0\] at (1.5) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (0) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (0.5) should be [1.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (1) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to add [2.0\] at (1.5) should be [3.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (0) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (0.5) should be [1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (1) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [0.0\] to add [2.0\] at (1.5) should be [3.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (0) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (0.5) should be [1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (1) should be [2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [0.0\] to replace [2.0\] at (1.5) should be [2.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (-0.5) should be [2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (0) should be [2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [2.0\] to add [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (-0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (0.5) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (1) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [none\] to add [ex-height 2.0\] at (1.5) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (0) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (0.5) should be [1.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (1) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to add [ex-height 2.0\] at (1.5) should be [3.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (0) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (0.5) should be [1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (1) should be [2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 0\] to add [ex-height 2.0\] at (1.5) should be [3.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (0) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (0.5) should be [1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (1) should be [2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from add [ex-height 0\] to replace [ex-height 2.0\] at (1.5) should be [2.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (-0.5) should be [2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (0) should be [2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ex-height 0.5\] from replace [ex-height 2.0\] to add [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (-0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (0.5) should be [cap-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (1) should be [cap-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [none\] to add [cap-height 2.0\] at (1.5) should be [cap-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (-0.5) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (0) should be [cap-height 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 1.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 3.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (-0.5) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (0) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 3.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (-0.5) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (0) should be [cap-height 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (0.5) should be [cap-height 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (1) should be [cap-height 2\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from add [cap-height 0.0\] to replace [cap-height 2.0\] at (1.5) should be [cap-height 2.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (-0.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (0) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [cap-height 0.5\] from replace [cap-height 2.0\] to add [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (-0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (0.5) should be [ch-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (1) should be [ch-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [none\] to add [ch-width 2.0\] at (1.5) should be [ch-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (-0.5) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (0) should be [ch-width 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 1.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 3.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (-0.5) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (0) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 3.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (-0.5) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (0) should be [ch-width 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (0.5) should be [ch-width 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (1) should be [ch-width 2\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from add [ch-width 0\] to replace [ch-width 2.0\] at (1.5) should be [ch-width 2.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (-0.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (0) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ch-width 0.5\] from replace [ch-width 2.0\] to add [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (-0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (0.5) should be [ic-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (1) should be [ic-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [none\] to add [ic-width 2.0\] at (1.5) should be [ic-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (-0.5) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (0) should be [ic-width 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 1.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 3.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (-0.5) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (0) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 3.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (-0.5) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (0) should be [ic-width 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (0.5) should be [ic-width 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (1) should be [ic-width 2\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from add [ic-width 0\] to replace [ic-width 2.0\] at (1.5) should be [ic-width 2.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (-0.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (0) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-width 0.5\] from replace [ic-width 2.0\] to add [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (-0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (0.5) should be [ic-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (1) should be [ic-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [none\] to add [ic-height 2.0\] at (1.5) should be [ic-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (-0.5) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (0) should be [ic-height 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 1.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 3.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (-0.5) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (0) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 3.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (-0.5) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (0) should be [ic-height 0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (0.5) should be [ic-height 1.25\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (1) should be [ic-height 2\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from add [ic-height 0\] to replace [ic-height 2.0\] at (1.5) should be [ic-height 2.75\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (-0.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (0) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [ic-height 0.5\] from replace [ic-height 2.0\] to add [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (-0.5) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (0) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0.0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (0) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (1) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0.0\] to replace [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (-0.5) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (0) should be [0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (1) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ex-height 0\] to add [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (-0.5) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (0) should be [0.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (0.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (1) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ex-height 0\] to replace [cap-height 2.0\] at (1.5) should be [cap-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (-0.5) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (0) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0.0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (-0.5) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (0) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (1) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0.0\] to replace [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (-0.5) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (0) should be [cap-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (1) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [cap-height 0\] to add [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (-0.5) should be [cap-height 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (0) should be [cap-height 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (0.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (1) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [cap-height 0\] to replace [ch-width 2.0\] at (1.5) should be [ch-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (-0.5) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (0) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0.0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (-0.5) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (0) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (1) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0.0\] to replace [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (-0.5) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (0) should be [ch-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (1) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ch-width 0\] to add [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (-0.5) should be [ch-width 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (0) should be [ch-width 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (0.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (1) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ch-width 0\] to replace [ic-width 2.0\] at (1.5) should be [ic-width 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (-0.5) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (0) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0.0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (-0.5) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (0) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (1) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0.0\] to replace [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (-0.5) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (0) should be [ic-width 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (1) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-width 0\] to add [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (-0.5) should be [ic-width 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (0) should be [ic-width 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (0.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (1) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-width 0\] to replace [ic-height 2.0\] at (1.5) should be [ic-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (-0.5) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (0) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (0.5) should be [ex-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (1) should be [ex-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0.0\] to add [ex-height 2.0\] at (1.5) should be [ex-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (-0.5) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (0) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (0.5) should be [ex-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (1) should be [ex-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0.0\] to replace [ex-height 2.0\] at (1.5) should be [ex-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (-0.5) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (0) should be [ic-height 0.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (0.5) should be [ex-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (1) should be [ex-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from replace [ic-height 0\] to add [ex-height 2.0\] at (1.5) should be [ex-height 2.5\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (-0.5) should be [ic-height 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (0) should be [ic-height 0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (0.5) should be [ex-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (1) should be [ex-height 2.0\]]
+ expected: FAIL
+
+ [Compositing: property <font-size-adjust> underlying [0.5\] from add [ic-height 0\] to replace [ex-height 2.0\] at (1.5) should be [ex-height 2.0\]]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-position/overlay/animation/overlay-interpolation.html.ini b/tests/wpt/metadata/css/css-position/overlay/animation/overlay-interpolation.html.ini
new file mode 100644
index 00000000000..0327458e15a
--- /dev/null
+++ b/tests/wpt/metadata/css/css-position/overlay/animation/overlay-interpolation.html.ini
@@ -0,0 +1,264 @@
+[overlay-interpolation.html]
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (0.9) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (0.1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (0.9) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (-1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (0) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (0.5) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (1) should be [auto\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [auto\] to [auto\] at (1.5) should be [auto\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [CSS Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (-1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (0) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (0.5) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (1) should be [none\]]
+ expected: FAIL
+
+ [Web Animations: property <overlay> from [none\] to [none\] at (1.5) should be [none\]]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom/idlharness.html.ini b/tests/wpt/metadata/css/cssom/idlharness.html.ini
index 1289e66d132..1398814cee8 100644
--- a/tests/wpt/metadata/css/cssom/idlharness.html.ini
+++ b/tests/wpt/metadata/css/cssom/idlharness.html.ini
@@ -535,3 +535,15 @@
[ShadowRoot interface: attribute adoptedStyleSheets]
expected: FAIL
+
+ [CSSImportRule interface: attribute layerName]
+ expected: FAIL
+
+ [CSSImportRule interface: attribute supportsText]
+ expected: FAIL
+
+ [CSSImportRule interface: sheet.cssRules[0\] must inherit property "layerName" with the proper type]
+ expected: FAIL
+
+ [CSSImportRule interface: sheet.cssRules[0\] must inherit property "supportsText" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/response/response-body-read-task-handling.html.ini b/tests/wpt/metadata/fetch/api/response/response-body-read-task-handling.html.ini
new file mode 100644
index 00000000000..30dbc35c06a
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/response/response-body-read-task-handling.html.ini
@@ -0,0 +1,3 @@
+[response-body-read-task-handling.html]
+ [piping from a body stream to a JS-written WritableStream should occur in a microtask scope]
+ expected: FAIL
diff --git a/tests/wpt/metadata/fetch/data-urls/navigate.window.js.ini b/tests/wpt/metadata/fetch/data-urls/navigate.window.js.ini
deleted file mode 100644
index d3c0ec7eb61..00000000000
--- a/tests/wpt/metadata/fetch/data-urls/navigate.window.js.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[navigate.window.html]
- [Nothing fancy]
- expected: FAIL
-
- [base64]
- expected: FAIL
diff --git a/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini b/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini
index 5b0348afa74..361838941f2 100644
--- a/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini
+++ b/tests/wpt/metadata/fetch/local-network-access/iframe.tentative.https.window.js.ini
@@ -1,4 +1,5 @@
[iframe.tentative.https.window.html]
+ expected: TIMEOUT
[private to local: failed preflight.]
expected: FAIL
@@ -33,4 +34,4 @@
expected: FAIL
[public to local, grandparent navigates: success.]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini b/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini
index 09aa994d7e1..907ee959867 100644
--- a/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini
+++ b/tests/wpt/metadata/fetch/local-network-access/worker-blob-fetch.window.js.ini
@@ -23,9 +23,6 @@
[treat-as-public to private: failure.]
expected: FAIL
- [local https to local https: success.]
- expected: FAIL
-
[private https to local https: failure.]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini
index 9749a4fccd5..36a410bfecb 100644
--- a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini
+++ b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini
@@ -147,5 +147,5 @@
[list-style-image sec-fetch-site - HTTPS downgrade-upgrade]
expected: FAIL
- [border-image sec-fetch-dest - Not sent to non-trustworthy cross-site destination]
+ [border-image sec-fetch-site - HTTPS downgrade (header not sent)]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.https.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.https.html.ini
new file mode 100644
index 00000000000..2f7885994ac
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.https.html.ini
@@ -0,0 +1,6 @@
+[document-state.https.html]
+ [A navigation's initiator origin and referrer are stored in the document state and used in the document repopulation case]
+ expected: FAIL
+
+ [A navigation's initiator origin and referrer are stored in the document state and used on location.reload()]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html.ini
deleted file mode 100644
index 58bb2d39c3b..00000000000
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[document-state.tentative.https.html]
- [A navigation's initiator origin and referrer are stored in the document state]
- expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini
index 6e9f7acf151..c8a3c8f9e68 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini
@@ -1,6 +1,6 @@
[scroll-restoration-fragment-scrolling-cross-origin.html]
type: testharness
- expected: TIMEOUT
+ expected: ERROR
[Manual scroll restoration should take precedent over scrolling to fragment in cross origin navigation]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
index c5fc1407992..530635e744f 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
@@ -1,10 +1,6 @@
[iframe-src-aboutblank-navigate-immediately.html]
- expected: TIMEOUT
[Navigating to a different document with window.open]
expected: FAIL
[Navigating to a different document with link click]
expected: FAIL
-
- [Navigating to a different document with form submission]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
index 149bcb4ff8c..b8fd22e2b81 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
@@ -10,3 +10,6 @@
[load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank']
expected: FAIL
+
+ [load & pageshow events do not fire on contentWindow of <iframe> element created with src='']
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini
index bcda478adb1..5a245d61359 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-referrer.window.js.ini
@@ -1,10 +1,6 @@
[javascript-url-referrer.window.html]
- expected: TIMEOUT
[unsafe-url referrer policy used to create the starting page]
expected: FAIL
[origin referrer policy used to create the starting page]
expected: FAIL
-
- [no-referrer referrer policy used to create the starting page]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
index 78240a2f463..8ae58f9f1e2 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
@@ -16,3 +16,6 @@
[D83D DE0D set in href="" targeting a frame and clicked]
expected: FAIL
+
+ [DE0D 0041 set in href="" targeting a frame and clicked]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini
index d77d78be5ae..2701c1818a5 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html.ini
@@ -1,3 +1,4 @@
[javascript-url-security-check-same-origin-domain.sub.html]
+ expected: TIMEOUT
[javascript: URL security check for same-origin-domain but not same-origin]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini
index 9eb22957864..27889a98fb5 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini
@@ -1,7 +1,6 @@
[navigate-to-unparseable-url.html]
- expected: TIMEOUT
[location.href setter throws a SyntaxError DOMException for unparseable URLs]
- expected: TIMEOUT
+ expected: FAIL
[<a> tag navigate fails for unparseable URLs]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini
new file mode 100644
index 00000000000..4ecd6d9f753
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini
@@ -0,0 +1,3 @@
+[navigation-unload-cross-origin.sub.window.html]
+ [Cross-origin navigation started from unload handler must be ignored]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini
index 0e40ffc0656..9f7f24f662e 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini
@@ -1,4 +1,3 @@
[nav-cancelation-2.sub.html]
- expected: TIMEOUT
[grandparent cancels a pending navigation in a cross-origin grandchild]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse-during-unload.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse-during-unload.html.ini
new file mode 100644
index 00000000000..f5b7b25324f
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse-during-unload.html.ini
@@ -0,0 +1,4 @@
+[traverse-during-unload.html]
+ expected: TIMEOUT
+ [Traversing the history during unload]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
new file mode 100644
index 00000000000..5d17a8e9419
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
@@ -0,0 +1,3 @@
+[traverse_the_history_2.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html.ini b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html.ini
new file mode 100644
index 00000000000..e8075a662b2
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.requestAnimationFrame.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html.ini b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html.ini
new file mode 100644
index 00000000000..7278d75d305
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.toBlob.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini
index 5cdcce07c65..2a54f2f8814 100644
--- a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini
+++ b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini
@@ -1,2 +1,2 @@
[canvas.2d.disconnected.html]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html.ini
new file mode 100644
index 00000000000..ae2e171e5b1
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.convertToBlob.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html.ini
new file mode 100644
index 00000000000..9c825a33c04
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.convertToBlob.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html.ini
new file mode 100644
index 00000000000..21eb320f9cc
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.createImageBitmap.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html.ini
new file mode 100644
index 00000000000..3bf42dfd1d9
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.createImageBitmap.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html.ini
new file mode 100644
index 00000000000..9e6d59e328a
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.drawImage.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html.ini
new file mode 100644
index 00000000000..ae30aba4a29
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.drawImage.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html.ini
new file mode 100644
index 00000000000..5f3d19041e4
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.getImageData.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html.ini
new file mode 100644
index 00000000000..3b219b04a18
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.getImageData.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html.ini
new file mode 100644
index 00000000000..fe0c3e0eb4a
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.putImageData.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html.ini
new file mode 100644
index 00000000000..39248753058
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.putImageData.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html.ini
new file mode 100644
index 00000000000..93d97a15ac9
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.render-opportunities.transferToImageBitmap.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.html.ini
new file mode 100644
index 00000000000..378b96580e8
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.unclosed.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.w.html.ini b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.w.html.ini
new file mode 100644
index 00000000000..7e1b1ae3d76
--- /dev/null
+++ b/tests/wpt/metadata/html/canvas/offscreen/layers/2d.layer.unclosed.w.html.ini
@@ -0,0 +1,2 @@
+[2d.layer.unclosed.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini
index 50e9a6ac04a..108d8331261 100644
--- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini
@@ -1640,6 +1640,36 @@
[SVGElement interface: attribute onbeforetoggle]
expected: FAIL
+ [VisibilityStateEntry interface: existence and properties of interface object]
+ expected: FAIL
+
+ [VisibilityStateEntry interface object length]
+ expected: FAIL
+
+ [VisibilityStateEntry interface object name]
+ expected: FAIL
+
+ [VisibilityStateEntry interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [VisibilityStateEntry interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [VisibilityStateEntry interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [VisibilityStateEntry interface: attribute name]
+ expected: FAIL
+
+ [VisibilityStateEntry interface: attribute entryType]
+ expected: FAIL
+
+ [VisibilityStateEntry interface: attribute startTime]
+ expected: FAIL
+
+ [VisibilityStateEntry interface: attribute duration]
+ expected: FAIL
+
[idlharness.https.html?include=(Document|Window)]
[Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type]
diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini
index 9b27c5c1957..add66c12f92 100644
--- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini
+++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/update-the-rendering.html.ini
@@ -1,7 +1,6 @@
[update-the-rendering.html]
- expected: TIMEOUT
["Flush autofocus candidates" should be happen after the first animation frame callbacks, and before a resize event in the next iteration of window event loop.]
expected: TIMEOUT
["Flush autofocus candidates" should be happen before a scroll event and animation frame callbacks]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
index 2d3fbf0f308..25d9964f057 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
@@ -1,5 +1,4 @@
[iframe_sandbox_popups_escaping-1.html]
type: testharness
- expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index 76e34322dca..6bec7a732b8 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,5 +1,4 @@
[iframe_sandbox_popups_nonescaping-2.html]
type: testharness
- expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html.ini
new file mode 100644
index 00000000000..d3ac84dbc2b
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html.ini
@@ -0,0 +1,12 @@
+[form-double-submit-requestsubmit.html]
+ [test runTest2 with submitterType: input, callRequestSubmit: true, callSubmit: true, preventDefault: false, passSubmitter: true]
+ expected: FAIL
+
+ [test runTest2 with submitterType: input, callRequestSubmit: false, callSubmit: true, preventDefault: false, passSubmitter: true]
+ expected: FAIL
+
+ [test runTest2 with submitterType: button, callRequestSubmit: true, callSubmit: true, preventDefault: false, passSubmitter: true]
+ expected: FAIL
+
+ [test runTest2 with submitterType: button, callRequestSubmit: false, callSubmit: true, preventDefault: false, passSubmitter: true]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini
new file mode 100644
index 00000000000..202f48ceee9
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini
@@ -0,0 +1,9 @@
+[name-attribute.tentative.html]
+ [basic handling of mutually exclusive details]
+ expected: FAIL
+
+ [more complex handling of mutually exclusive details]
+ expected: FAIL
+
+ [mutually exclusive details across multiple names and multiple tree scopes]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini
new file mode 100644
index 00000000000..7e889fccc46
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini
@@ -0,0 +1,2 @@
+[dialog-focus-previous-outside.html]
+ expected: ERROR
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html.ini
new file mode 100644
index 00000000000..d1af0a488be
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html.ini
@@ -0,0 +1,3 @@
+[dialog-no-throw-requested-state.html]
+ [dialog-no-throw-requested-state]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
index 2d44172f4dc..cc18f512574 100644
--- a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
+++ b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
@@ -1,6 +1,5 @@
[htmlanchorelement_noopener.html]
type: testharness
- expected: TIMEOUT
[Check that targeting of rel=noopener with a given name ignores an existing window with that name]
expected: NOTRUN
@@ -8,10 +7,10 @@
expected: FAIL
[Check that rel=noopener with target=_top does a normal load]
- expected: NOTRUN
+ expected: FAIL
[Check that rel=noopener with target=_parent does a normal load]
- expected: NOTRUN
+ expected: FAIL
[Check that rel=noopener with target=_self does a normal load]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini
deleted file mode 100644
index fc0233f5241..00000000000
--- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[module-delayed.html]
- [async document.write in a module]
- expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js.ini
deleted file mode 100644
index 39ffbb01044..00000000000
--- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/reload.window.js.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[reload.window.html]
- expected: TIMEOUT
- [Reloading a document.open()'d page should reload the URL of the entry realm's responsible document]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
index 8845054116d..e55f8f2ce3c 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
@@ -3,3 +3,6 @@
expected: TIMEOUT
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: TIMEOUT
+
+ [The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.ini
new file mode 100644
index 00000000000..b2dab02839a
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.ini
@@ -0,0 +1,14 @@
+[atomics-wait-async.https.any.html]
+ [Atomics.waitAsync timeout in a Window]
+ expected: FAIL
+
+ [Atomics.waitAsync notification in a Window]
+ expected: FAIL
+
+
+[atomics-wait-async.https.any.worker.html]
+ [Atomics.waitAsync timeout in a DedicatedWorkerGlobalScope]
+ expected: FAIL
+
+ [Atomics.waitAsync notification in a DedicatedWorkerGlobalScope]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
index 4a48dd15a9d..1d71471b73c 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
@@ -1,6 +1,7 @@
[promise-rejection-events.html]
+ expected: TIMEOUT
[delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire]
- expected: FAIL
+ expected: TIMEOUT
[unhandledrejection: from createImageBitmap which is UA triggered]
expected: FAIL
diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini
index 0b5d4e5f650..64c04b8a877 100644
--- a/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini
+++ b/tests/wpt/metadata/performance-timeline/navigation-id-element-timing.tentative.html.ini
@@ -1,3 +1,4 @@
[navigation-id-element-timing.tentative.html]
+ expected: TIMEOUT
[Element Timing navigation id test]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini
index 31761973a45..6a863a16256 100644
--- a/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini
+++ b/tests/wpt/metadata/performance-timeline/navigation-id-initial-load.tentative.html.ini
@@ -2,3 +2,6 @@
expected: TIMEOUT
[Navigation Id should be 1 at initial navigations.]
expected: TIMEOUT
+
+ [Navigation Ids should exist and are all the same as the initial navigation.]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini
index d8eca554263..19ca16785b5 100644
--- a/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini
+++ b/tests/wpt/metadata/performance-timeline/navigation-id-long-task-task-attribution.tentative.html.ini
@@ -1,3 +1,4 @@
[navigation-id-long-task-task-attribution.tentative.html]
+ expected: TIMEOUT
[Long Task/Task Attribution navigation id test]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini
index 851caea6c13..74e2fb18b9f 100644
--- a/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini
+++ b/tests/wpt/metadata/performance-timeline/navigation-id-mark-measure.tentative.html.ini
@@ -1,3 +1,4 @@
[navigation-id-mark-measure.tentative.html]
+ expected: TIMEOUT
[Mark/Measure navigation id test]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini
index 393df22f1ba..92aef2f66fa 100644
--- a/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini
+++ b/tests/wpt/metadata/performance-timeline/navigation-id-reset.tentative.html.ini
@@ -1,3 +1,7 @@
[navigation-id-reset.tentative.html]
+ expected: TIMEOUT
[Navigation Id should be reset to 1 after reload.]
expected: FAIL
+
+ [Navigation Id should be re-generated after reload.]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini
index b72950d068f..f2408ea2c08 100644
--- a/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini
+++ b/tests/wpt/metadata/performance-timeline/navigation-id-resource-timing.tentative.html.ini
@@ -1,3 +1,4 @@
[navigation-id-resource-timing.tentative.html]
+ expected: TIMEOUT
[Resource Timing navigation id test]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/performance-timeline/navigation-id-worker-created-entries.html.ini b/tests/wpt/metadata/performance-timeline/navigation-id-worker-created-entries.html.ini
new file mode 100644
index 00000000000..8c5b66ff774
--- /dev/null
+++ b/tests/wpt/metadata/performance-timeline/navigation-id-worker-created-entries.html.ini
@@ -0,0 +1,3 @@
+[navigation-id-worker-created-entries.html]
+ [Navigation id of performance entries created by workers should be empty]
+ expected: FAIL
diff --git a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini
index a96df921c04..cb1495ca247 100644
--- a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini
+++ b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini
@@ -26,6 +26,12 @@
[PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type]
expected: FAIL
+ [PerformanceResourceTiming interface: attribute firstInterimResponseStart]
+ expected: FAIL
+
+ [PerformanceResourceTiming interface: resource must inherit property "firstInterimResponseStart" with the proper type]
+ expected: FAIL
+
[idlharness.any.worker.html]
[PerformanceResourceTiming interface: resource must inherit property "workerStart" with the proper type]
@@ -54,3 +60,9 @@
[PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type]
expected: FAIL
+
+ [PerformanceResourceTiming interface: attribute firstInterimResponseStart]
+ expected: FAIL
+
+ [PerformanceResourceTiming interface: resource must inherit property "firstInterimResponseStart" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini
index 9df96f72c08..23c4be4506a 100644
--- a/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini
+++ b/tests/wpt/metadata/resource-timing/nested-context-navigations-iframe.html.ini
@@ -1,10 +1,25 @@
[nested-context-navigations-iframe.html]
expected: TIMEOUT
[Test that iframe refreshes are not observable by the parent]
- expected: TIMEOUT
+ expected: NOTRUN
[Test that crossorigin iframe refreshes are not observable by the parent]
expected: NOTRUN
[Test that cross-site iframe refreshes are not observable by the parent]
expected: NOTRUN
+
+ [Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent]
+ expected: TIMEOUT
+
+ [Test that cross-site iframe navigations are not observable by the parent, even after history navigations by the parent]
+ expected: NOTRUN
+
+ [Test that iframe navigations are not observable by the parent]
+ expected: NOTRUN
+
+ [Test that crossorigin iframe navigations are not observable by the parent]
+ expected: NOTRUN
+
+ [Test that cross-site iframe navigations are not observable by the parent]
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/streams/readable-streams/owning-type-message-port.any.js.ini b/tests/wpt/metadata/streams/readable-streams/owning-type-message-port.any.js.ini
new file mode 100644
index 00000000000..ce878bde61a
--- /dev/null
+++ b/tests/wpt/metadata/streams/readable-streams/owning-type-message-port.any.js.ini
@@ -0,0 +1,21 @@
+[owning-type-message-port.any.sharedworker.html]
+ expected: ERROR
+
+[owning-type-message-port.any.worker.html]
+ [Transferred MessageChannel works as expected]
+ expected: FAIL
+
+ [Second branch of owning ReadableStream tee should end up into errors with transfer only values]
+ expected: FAIL
+
+
+[owning-type-message-port.any.html]
+ [Transferred MessageChannel works as expected]
+ expected: FAIL
+
+ [Second branch of owning ReadableStream tee should end up into errors with transfer only values]
+ expected: FAIL
+
+
+[owning-type-message-port.any.serviceworker.html]
+ expected: ERROR
diff --git a/tests/wpt/metadata/streams/readable-streams/owning-type-video-frame.any.js.ini b/tests/wpt/metadata/streams/readable-streams/owning-type-video-frame.any.js.ini
new file mode 100644
index 00000000000..283faebc9c8
--- /dev/null
+++ b/tests/wpt/metadata/streams/readable-streams/owning-type-video-frame.any.js.ini
@@ -0,0 +1,38 @@
+[owning-type-video-frame.any.serviceworker.html]
+ expected: ERROR
+
+[owning-type-video-frame.any.sharedworker.html]
+ expected: ERROR
+
+[owning-type-video-frame.any.worker.html]
+ [ReadableStream of type owning should close serialized chunks]
+ expected: FAIL
+
+ [ReadableStream of type owning should transfer JS chunks with transferred values]
+ expected: FAIL
+
+ [ReadableStream of type owning should error when trying to enqueue not serializable values]
+ expected: FAIL
+
+ [ReadableStream of type owning should clone serializable objects when teeing]
+ expected: FAIL
+
+ [ReadableStream of type owning should clone JS Objects with serializables when teeing]
+ expected: FAIL
+
+
+[owning-type-video-frame.any.html]
+ [ReadableStream of type owning should close serialized chunks]
+ expected: FAIL
+
+ [ReadableStream of type owning should transfer JS chunks with transferred values]
+ expected: FAIL
+
+ [ReadableStream of type owning should error when trying to enqueue not serializable values]
+ expected: FAIL
+
+ [ReadableStream of type owning should clone serializable objects when teeing]
+ expected: FAIL
+
+ [ReadableStream of type owning should clone JS Objects with serializables when teeing]
+ expected: FAIL
diff --git a/tests/wpt/metadata/streams/readable-streams/owning-type.any.js.ini b/tests/wpt/metadata/streams/readable-streams/owning-type.any.js.ini
new file mode 100644
index 00000000000..4d1c7f59d60
--- /dev/null
+++ b/tests/wpt/metadata/streams/readable-streams/owning-type.any.js.ini
@@ -0,0 +1,39 @@
+[owning-type.any.html]
+ [ReadableStream can be constructed with owning type]
+ expected: FAIL
+
+ [ReadableStream of type owning should call start with a ReadableStreamDefaultController]
+ expected: FAIL
+
+ [ReadableStream should be able to call enqueue with an empty transfer list]
+ expected: FAIL
+
+ [ReadableStream should check transfer parameter]
+ expected: FAIL
+
+ [ReadableStream of type owning should transfer enqueued chunks]
+ expected: FAIL
+
+
+[owning-type.any.sharedworker.html]
+ expected: ERROR
+
+[owning-type.any.worker.html]
+ [ReadableStream can be constructed with owning type]
+ expected: FAIL
+
+ [ReadableStream of type owning should call start with a ReadableStreamDefaultController]
+ expected: FAIL
+
+ [ReadableStream should be able to call enqueue with an empty transfer list]
+ expected: FAIL
+
+ [ReadableStream should check transfer parameter]
+ expected: FAIL
+
+ [ReadableStream of type owning should transfer enqueued chunks]
+ expected: FAIL
+
+
+[owning-type.any.serviceworker.html]
+ expected: ERROR
diff --git a/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini b/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini
index 04c2032c723..39d039a0132 100644
--- a/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini
+++ b/tests/wpt/metadata/webmessaging/broadcastchannel/cross-partition.https.tentative.html.ini
@@ -1,5 +1,5 @@
[cross-partition.https.tentative.html]
- expected: TIMEOUT
+ expected: CRASH
[BroadcastChannel messages aren't received from a cross-partition iframe]
expected: FAIL
diff --git a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini b/tests/wpt/metadata/webmessaging/without-ports/017.html.ini
new file mode 100644
index 00000000000..c7946fc91b4
--- /dev/null
+++ b/tests/wpt/metadata/webmessaging/without-ports/017.html.ini
@@ -0,0 +1,4 @@
+[017.html]
+ expected: TIMEOUT
+ [origin of the script that invoked the method, about:blank]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini b/tests/wpt/metadata/webmessaging/without-ports/018.html.ini
deleted file mode 100644
index b7b36c1d3a4..00000000000
--- a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[018.html]
- expected: TIMEOUT
- [origin of the script that invoked the method, javascript:]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/websockets/multi-globals/url-parsing/url-parsing.html.ini b/tests/wpt/metadata/websockets/multi-globals/url-parsing/url-parsing.html.ini
new file mode 100644
index 00000000000..b1c9a018c77
--- /dev/null
+++ b/tests/wpt/metadata/websockets/multi-globals/url-parsing/url-parsing.html.ini
@@ -0,0 +1,3 @@
+[url-parsing.html]
+ [Multiple globals for base URL in WebSocket constructor]
+ expected: FAIL
diff --git a/tests/wpt/mozilla/meta/css/stylesheet_media_queries.html.ini b/tests/wpt/mozilla/meta/css/stylesheet_media_queries.html.ini
deleted file mode 100644
index 77ca6b0688d..00000000000
--- a/tests/wpt/mozilla/meta/css/stylesheet_media_queries.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[stylesheet_media_queries.html]
- [Media queries within stylesheets]
- expected: FAIL
diff --git a/tests/wpt/web-platform-tests/.azure-pipelines.yml b/tests/wpt/web-platform-tests/.azure-pipelines.yml
index 7851cd61e1f..a21ebce6bc7 100644
--- a/tests/wpt/web-platform-tests/.azure-pipelines.yml
+++ b/tests/wpt/web-platform-tests/.azure-pipelines.yml
@@ -34,7 +34,7 @@ jobs:
displayName: 'affected tests: Safari Technology Preview'
condition: eq(variables['Build.Reason'], 'PullRequest')
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -51,7 +51,7 @@ jobs:
displayName: 'affected tests without changes: Safari Technology Preview'
condition: eq(variables['Build.Reason'], 'PullRequest')
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -93,7 +93,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_infrastructure']
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -104,6 +104,7 @@ jobs:
packages: virtualenv
- template: tools/ci/azure/install_fonts.yml
- template: tools/ci/azure/install_certs.yml
+ - template: tools/ci/azure/color_profile.yml
- template: tools/ci/azure/install_chrome.yml
- template: tools/ci/azure/install_firefox.yml
- template: tools/ci/azure/install_safari.yml
@@ -138,7 +139,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -154,7 +155,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -170,7 +171,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -186,7 +187,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -202,7 +203,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
# full checkout required
- task: UsePythonVersion@0
@@ -222,7 +223,7 @@ jobs:
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
# full checkout required
- task: UsePythonVersion@0
@@ -477,7 +478,7 @@ jobs:
parallel: 8 # chosen to make runtime ~2h
timeoutInMinutes: 180
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -487,6 +488,7 @@ jobs:
parameters:
packages: virtualenv
- template: tools/ci/azure/install_certs.yml
+ - template: tools/ci/azure/color_profile.yml
- template: tools/ci/azure/install_safari.yml
parameters:
channel: stable
@@ -518,7 +520,7 @@ jobs:
parallel: 8 # chosen to make runtime ~2h
timeoutInMinutes: 180
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -528,6 +530,7 @@ jobs:
parameters:
packages: virtualenv
- template: tools/ci/azure/install_certs.yml
+ - template: tools/ci/azure/color_profile.yml
- template: tools/ci/azure/install_safari.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
@@ -556,7 +559,7 @@ jobs:
parallel: 8 # chosen to make runtime ~2h
timeoutInMinutes: 180
pool:
- vmImage: 'macOS-12'
+ vmImage: 'macOS-13'
steps:
- task: UsePythonVersion@0
inputs:
@@ -566,6 +569,7 @@ jobs:
parameters:
packages: virtualenv
- template: tools/ci/azure/install_certs.yml
+ - template: tools/ci/azure/color_profile.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- script: |
diff --git a/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js b/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js
index d6812121295..4f9dbf7a754 100644
--- a/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js
+++ b/tests/wpt/web-platform-tests/FileAPI/reading-data-section/filereader_readAsDataURL.any.js
@@ -39,4 +39,16 @@ async_test(function(testCase) {
testCase.done();
});
reader.readAsDataURL(blob);
-}, 'readAsDataURL result for Blob with unspecified MIME type'); \ No newline at end of file
+}, 'readAsDataURL result for Blob with unspecified MIME type');
+
+async_test(function(testCase) {
+ var blob = new Blob([]);
+ var reader = new FileReader();
+
+ reader.onload = this.step_func(function() {
+ assert_equals(reader.result,
+ "data:application/octet-stream;base64,");
+ testCase.done();
+ });
+ reader.readAsDataURL(blob);
+}, 'readAsDataURL result for empty Blob'); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html
new file mode 100644
index 00000000000..36eccd6a522
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+// Here's the set-up for this test:
+// Step 1 (top-frame) Embeds a cross-origin iframe.
+// Step 2 (sub-frame) Make a cross-origin POST request.
+// Step 3 (sub-frame) Checks if platform version header is present and alerts top frame.
+// Step 4 (top-frame) Asserts header was present and returns.
+async_test(t => {
+ // Step 4
+ window.addEventListener("message", t.step_func(e => {
+ assert_equals(e.data, "HadPlatformVersion");
+ t.done();
+ }));
+
+ // Step 1
+ let iframe = document.createElement("iframe");
+ iframe.src = "https://{{domains[www1]}}:{{ports[https][0]}}/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html";
+ document.body.appendChild(iframe);
+}, "Accept-CH with wildcard policy and iframe subresource");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html.sub.headers b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html.sub.headers
new file mode 100644
index 00000000000..66ad9243c7d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/accept-ch.wildcard.https.sub.html.sub.headers
@@ -0,0 +1,2 @@
+Accept-CH: sec-ch-ua-platform-version
+Permissions-Policy: ch-ua-platform-version=("https://*.{{domains[]}}:{{ports[https][0]}}") \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html
new file mode 100644
index 00000000000..a7c2ad705db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.no-restart.https.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+promise_test(async t => {
+ var navigationTiming = window.performance.getEntriesByType('navigation')[0];
+ assert_not_equals(navigationTiming, undefined);
+ assert_equals(navigationTiming.criticalCHRestart, 0, "This should be 0 as there was no restart.");
+}, "Critical-CH no-restart navigation timing test");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html
new file mode 100644
index 00000000000..d3a49a2e91e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+promise_test(async t => {
+ var navigationTiming = window.performance.getEntriesByType('navigation')[0];
+ assert_not_equals(navigationTiming, undefined);
+ assert_less_than(navigationTiming.startTime, navigationTiming.criticalCHRestart, "Restarts happen after the beginning of the navigation");
+ assert_less_than(navigationTiming.criticalCHRestart, navigationTiming.fetchStart, "Restarts happen before fetch");
+}, "Critical-CH restart navigation timing test");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers
new file mode 100644
index 00000000000..b221a32886f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/critical-ch/critical-ch.navigation-timing.restart.https.html.headers
@@ -0,0 +1,2 @@
+Accept-CH: sec-ch-device-memory
+Critical-CH: sec-ch-device-memory
diff --git a/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html
new file mode 100644
index 00000000000..250a9d9e224
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<meta charset="utf-8">
+<script>
+// Step 2 (client-hints/accept-ch.wildcard.https.sub.html)
+const xhr = new XMLHttpRequest();
+xhr.open('POST', "https://{{domains[www2]}}:{{ports[https][0]}}/client-hints/resources/echo-ua-client-hints-received.py");
+xhr.onload = function() {
+ // Step 3 (client-hints/accept-ch.wildcard.https.sub.html)
+ if (xhr.getResponseHeader("sec-ch-ua-platform-received") != null) {
+ window.top.postMessage("HadPlatformVersion", "*");
+ } else {
+ window.top.postMessage("MissingPlatformVersion", "*");
+ }
+};
+xhr.send();
+</script>
diff --git a/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html.sub.headers b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html.sub.headers
new file mode 100644
index 00000000000..c1c0fcd5c2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/client-hints/resources/accept-ch.wildcard.iframe.https.sub.html.sub.headers
@@ -0,0 +1 @@
+Permissions-Policy: ch-ua-platform-version=("https://*.{{domains[]}}:{{ports[https][0]}}") \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-write-multiple.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-write-multiple.tentative.https.sub.html
new file mode 100644
index 00000000000..73cdd2f049e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-write-multiple.tentative.https.sub.html
@@ -0,0 +1,106 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Async Clipboard write should cancel the prior pending request</title>
+<link rel="help" href="https://github.com/w3c/clipboard-apis/issues/161">
+<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="resources/user-activation.js"></script>
+
+<iframe width="50" height="50" id="same" src="resources/page.html"></iframe><br>
+<iframe width="50" height="50" id="cross" src="https://{{hosts[alt][]}}:{{ports[https][1]}}/clipboard-apis/resources/page.html"></iframe><br>
+<input value="Test">
+<script>
+"use strict";
+
+// Permissions are required in order to invoke navigator.clipboard functions in
+// an automated test.
+async function getPermissions() {
+ await test_driver.set_permission({name: "clipboard-read"}, "granted");
+ await test_driver.set_permission({name: "clipboard-write"}, "granted");
+ await waitForUserActivation();
+}
+
+function waitForMessage(msg) {
+ return new Promise((resolve) => {
+ window.addEventListener("message", function handler(e) {
+ if (e.data == msg) {
+ window.removeEventListener("message", handler);
+ resolve();
+ }
+ });
+ });
+}
+
+function generateRandomString() {
+ return "random number: " + Math.random();
+}
+
+function testCancelPendingWrite(funcToMakeNewRequest, msg) {
+ promise_test(async t => {
+ await getPermissions();
+
+ // Create a pending write request which should be rejected after a new
+ // request is made.
+ let resolvePendingPromise;
+ let promise = navigator.clipboard.write([
+ new ClipboardItem({
+ "text/plain": new Promise((resolve) => { resolvePendingPromise = resolve; }),
+ }),
+ ]).catch(e => { return e; });
+
+ // Make a new request that should cancel the prior pending request.
+ let str = generateRandomString();
+ await funcToMakeNewRequest(str);
+
+ // Pending request should be rejected with NotAllowedError.
+ let error = await promise;
+ assert_not_equals(error, undefined);
+ assert_equals(error.name, "NotAllowedError");
+
+ // Resolve pending promise.
+ resolvePendingPromise(generateRandomString());
+ // Check clipboard data.
+ assert_equals(await navigator.clipboard.readText(), str);
+ }, msg);
+}
+
+testCancelPendingWrite(async (str) => {
+ // A new write request should cancel the prior pending request.
+ await navigator.clipboard.write([
+ new ClipboardItem({
+ "text/plain": str,
+ }),
+ ]).catch(() => {
+ assert_true(false, "should not fail");
+ });
+}, "clipboard.write() should cancel the prior pending one (same document)");
+
+testCancelPendingWrite(async (str) => {
+ // A new write should cancel the prior pending request.
+ const iframe = document.getElementById("same");
+ iframe.contentWindow.postMessage(["write", str], "*");
+ await waitForMessage("done");
+}, "clipboard.write() should cancel the prior pending one (same-origin iframe)");
+
+testCancelPendingWrite(async (str) => {
+ // A new write should cancel the prior pending request.
+ const iframe = document.getElementById("cross");
+ iframe.contentWindow.postMessage(["write", str], "*");
+ await waitForMessage("done");
+}, "clipboard.write() should cancel the prior pending one (cross-origin iframe)");
+
+testCancelPendingWrite(async (str) => {
+ const input = document.querySelector("input");
+ input.value = str;
+ input.focus();
+ input.select();
+
+ // A new copy action should cancel the prior pending request.
+ const modifier_key = navigator.platform.includes("Mac") ? "\uE03D" : "\uE009";
+ await new test_driver.Actions().keyDown(modifier_key).keyDown("c").send();
+}, "copy action should cancel the prior pending clipboard.write() request");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/resources/page.html b/tests/wpt/web-platform-tests/clipboard-apis/resources/page.html
new file mode 100644
index 00000000000..35bde8e5016
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/resources/page.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-action.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="user-activation.js"></script>
+
+<div style="width: 10px; height: 10px"></div>
+<script>
+window.addEventListener("message", async (e) => {
+ if (e.data && e.data[0] == "write") {
+ test_driver.set_test_context(window.parent);
+ await test_driver.set_permission({name: 'clipboard-read'}, 'granted');
+ await test_driver.set_permission({name: 'clipboard-write'}, 'granted');
+ await waitForUserActivation();
+ await navigator.clipboard.write([
+ new ClipboardItem({
+ "text/plain": e.data[1],
+ }),
+ ]).catch(() => {
+ assert_true(false, `should not fail`);
+ });
+ window.parent.postMessage("done", "*");
+ }
+});
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/common/rendering-utils.js b/tests/wpt/web-platform-tests/common/rendering-utils.js
index 8027cd5f848..46283bd5d07 100644
--- a/tests/wpt/web-platform-tests/common/rendering-utils.js
+++ b/tests/wpt/web-platform-tests/common/rendering-utils.js
@@ -7,14 +7,12 @@
*/
function waitForAtLeastOneFrame() {
return new Promise(resolve => {
- // Different web engines work slightly different on this area but 1) waiting
- // for two requestAnimationFrames() to happen one after another and 2)
- // adding a step_timeout(0) to guarantee events have finished should be
+ // Different web engines work slightly different on this area but waiting
+ // for two requestAnimationFrames() to happen, one after another, should be
// sufficient to ensure at least one frame has been generated anywhere.
- // See https://bugzilla.mozilla.org/show_bug.cgi?id=1785615
window.requestAnimationFrame(() => {
window.requestAnimationFrame(() => {
- setTimeout(resolve, 0);
+ resolve();
});
});
});
diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html
index dd66bb77ac7..b2abcbece0e 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/allow_csp_from-header.html
@@ -85,8 +85,10 @@
tests.forEach(test => {
async_test(t => {
- var url = generateUrlWithAllowCSPFrom(test.origin, test.allow_csp_from);
- assert_iframe_with_csp(t, url, test.csp, test.expected, test.name, test.blockedURI);
+ const url = generateUrlWithAllowCSPFrom(
+ test.origin, test.allow_csp_from);
+ assert_iframe_with_csp(t, url, test.csp, test.expected, test.name,
+ test.blockedURI, /*checkImageLoaded=*/true);
}, test.name);
});
</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
index 4adc5216961..7d2307ebbc9 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
+++ b/tests/wpt/web-platform-tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
@@ -102,14 +102,16 @@ function assert_required_csp(t, url, csp, expected) {
document.body.appendChild(i);
}
-function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI) {
- var i = document.createElement('iframe');
+function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI,
+ checkImageLoaded) {
+ const i = document.createElement('iframe');
url.searchParams.append("id", urlId);
i.src = url.toString();
if (csp != null)
i.csp = csp;
var loaded = {};
+ var onLoadReceived = {};
window.addEventListener("message", function (e) {
if (e.source != i.contentWindow)
return;
@@ -146,24 +148,22 @@ function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI) {
} else {
// Assert iframe loads. Wait for the load event, the postMessage from the
// script and the img load event.
- let postMessage_received = false;
- let img_loaded = false;
+ let img_loaded = !checkImageLoaded;
window.addEventListener('message', t.step_func(e => {
if (e.source != i.contentWindow)
return;
- if (e.data.loaded) {
- assert_true(loaded[urlId]);
- postMessage_received = true;
- } else if (e.data === "img.loaded")
+ if (e.data === "img loaded")
img_loaded = true;
- if (i.onloadReceived && postMessage_received && img_loaded)
+ if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) {
t.done();
+ }
}));
i.onload = t.step_func(function () {
- if (loaded[urlId])
+ onLoadReceived[urlId] = true;
+ if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) {
t.done();
- i.onloadReceived = true;
+ }
});
}
document.body.appendChild(i);
diff --git a/tests/wpt/web-platform-tests/content-security-policy/nonce-hiding/nonce-hiding-move-document.html b/tests/wpt/web-platform-tests/content-security-policy/nonce-hiding/nonce-hiding-move-document.html
new file mode 100644
index 00000000000..49de893ba03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/nonce-hiding/nonce-hiding-move-document.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta http-equiv="Content-Security-Policy" content="style-src 'self' 'nonce-allowme';">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1831328">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<title>Nonce isn't lost on document move</title>
+<style type="text/css" nonce="allowme">
+ p {
+ color: red;
+ }
+</style>
+<p>What color is this?</p>
+<script>
+test(function() {
+ const doc = document.implementation.createDocument("http://www.w3.org/1999/xhtml","html");
+ const style = document.createElement("style");
+ style.setAttribute("nonce", "allowme");
+ style.textContent = "p { color: lime }";
+
+ doc.documentElement.appendChild(style);
+ document.body.appendChild(style);
+ assert_equals(style.nonce, "allowme", "Nonce should not have been lost");
+ assert_equals(getComputedStyle(document.querySelector("p")).color, "rgb(0, 255, 0)", "Style should apply");
+})
+</script>
diff --git a/tests/wpt/web-platform-tests/cookies/resources/list-cookies-for-script.py b/tests/wpt/web-platform-tests/cookies/resources/list-cookies-for-script.py
new file mode 100644
index 00000000000..b325d1f7450
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/resources/list-cookies-for-script.py
@@ -0,0 +1,12 @@
+import json
+from cookies.resources import helpers
+
+from wptserve.utils import isomorphic_decode
+
+def main(request, response):
+ headers = helpers.setNoCacheAndCORSHeaders(request, response)
+ headers[0] = (b"Content-Type", b"text/javascript")
+ cookies = helpers.readCookies(request)
+ decoded_cookies = {isomorphic_decode(key): isomorphic_decode(val) for key, val in cookies.items()}
+ return headers, 'self._cookies = [{}];\n'.format(
+ ', '.join(['"{}"'.format(name) for name in decoded_cookies.keys()]))
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-braillelabel-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-braillelabel-manual.html
new file mode 100644
index 00000000000..a0668e8a501
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-braillelabel-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-braillelabel</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "braillelabel:foobar"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXBrailleLabel",
+ "is",
+ "foobar"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "braillelabel:foobar"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.braillelabel",
+ "is",
+ "foobar"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-braillelabel"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-braillelabel.</p>
+ <button id="test" aria-braillelabel="foobar">
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription-manual.html
new file mode 100644
index 00000000000..e509c88159b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-brailleroledescription</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "brailleroledescription:foobar"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXBrailleRoleDescription",
+ "is",
+ "foobar"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "brailleroledescription:foobar"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.brailleroledescription",
+ "is",
+ "foobar"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-brailleroledescription"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-brailleroledescription.</p>
+ <button id="test" aria-brailleroledescription="foobar">
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription_is_empty-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription_is_empty-manual.html
new file mode 100644
index 00000000000..6d24fe641e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-brailleroledescription_is_empty-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-brailleroledescription is empty</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "brailleroledescription"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "AXBrailleRoleDescription"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "brailleroledescription"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties",
+ "doesNotContain",
+ "brailleroledescription"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-brailleroledescription=''"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-brailleroledescription is empty.</p>
+ <button id="test" aria-brailleroledescription="">
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html
index cbc474343d8..5d071cb82df 100644
--- a/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts-manual.html
@@ -24,6 +24,14 @@
"keyshortcuts:Shift+Space"
]
],
+ "AXAPI" : [
+ [
+ "property",
+ "AXKeyShortcutsValue",
+ "is",
+ "Shift+Space"
+ ]
+ ],
"IAccessible2" : [
[
"property",
diff --git a/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html b/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html
index 97ae290c402..13d6859ec07 100644
--- a/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/blockquote-manual.html
@@ -43,7 +43,7 @@
"property",
"role",
"is",
- "IA2_ROLE_SECTION"
+ "IA2_ROLE_BLOCK_QUOTE"
]
],
"MSAA" : [
diff --git a/tests/wpt/web-platform-tests/core-aam/caption-manual.html b/tests/wpt/web-platform-tests/core-aam/caption-manual.html
index 00afda60ebf..68a1af8553d 100644
--- a/tests/wpt/web-platform-tests/core-aam/caption-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/caption-manual.html
@@ -51,7 +51,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_TEXT"
+ "ROLE_SYSTEM_GROUPING"
]
],
"UIA" : [
diff --git a/tests/wpt/web-platform-tests/core-aam/deletion-manual.html b/tests/wpt/web-platform-tests/core-aam/deletion-manual.html
index 4aed1d3e64b..4f6b0d7feb7 100644
--- a/tests/wpt/web-platform-tests/core-aam/deletion-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/deletion-manual.html
@@ -42,6 +42,12 @@
"AXSubrole",
"is",
"AXDeleteStyleGroup"
+ ],
+ [
+ "result",
+ "AXAttributedStringForTextMarkerRange"
+ "contains",
+ "AXIsSuggestedDeletion"
]
],
"IAccessible2" : [
@@ -63,7 +69,7 @@
"property",
"LocalizedControlType",
"is",
- "del"
+ "deletion"
]
]
},
diff --git a/tests/wpt/web-platform-tests/core-aam/insertion-manual.html b/tests/wpt/web-platform-tests/core-aam/insertion-manual.html
index 86210664ce7..7b5fd809851 100644
--- a/tests/wpt/web-platform-tests/core-aam/insertion-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/insertion-manual.html
@@ -42,6 +42,12 @@
"AXSubrole",
"is",
"AXInsertStyleGroup"
+ ],
+ [
+ "result",
+ "AXAttributedStringForTextMarkerRange"
+ "contains",
+ "AXIsSuggestedInsertion"
]
],
"IAccessible2" : [
@@ -63,7 +69,7 @@
"property",
"LocalizedControlType",
"is",
- "ins"
+ "insertion"
]
]
},
@@ -78,7 +84,9 @@
</script>
</head>
<body>
- <p>This test examines the ARIA properties for insertion.</p>
+ <p>
+ This test examines the ARIA properties for insertion.
+ </p>
<div role="insertion" id="test">content</div>
<div id="manualMode"></div>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/core-aam/mark-manual.html b/tests/wpt/web-platform-tests/core-aam/mark-manual.html
new file mode 100644
index 00000000000..8373fa133da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/mark-manual.html
@@ -0,0 +1,93 @@
+<!doctype html>
+<html>
+ <head>
+ <title>mark</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:mark"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "highlight"
+ ],
+ [
+ "result",
+ "AXAttributedStringForTextMarkerRange"
+ "contains",
+ "AXHighlight"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_MARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:mark"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "mark"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for mark.</p>
+ <div role="mark" id="test">content</div>
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html b/tests/wpt/web-platform-tests/core-aam/menuitem-manual.html
index abb582f5201..49c3cacbe82 100644
--- a/tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/menuitem-manual.html
@@ -1,7 +1,7 @@
<!doctype html>
<html>
<head>
- <title>menuitem not owned by or child of group</title>
+ <title>menuitem</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,14 +59,14 @@
"type" : "test"
}
],
- "title" : "menuitem not owned by or child of group"
+ "title" : "menuitem"
}
) ;
</script>
</head>
<body>
- <p>This test examines the ARIA properties for menuitem not owned by or child of group.</p>
+ <p>This test examines the ARIA properties for menuitem.</p>
<div role='menu'>
<div role='menuitem' id='test'>content</div>
</div>
diff --git a/tests/wpt/web-platform-tests/core-aam/meter-manual.html b/tests/wpt/web-platform-tests/core-aam/meter-manual.html
index 8010322a62c..74c8ba80737 100644
--- a/tests/wpt/web-platform-tests/core-aam/meter-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/meter-manual.html
@@ -41,7 +41,7 @@
"property",
"AXSubrole",
"is",
- "<nil>"
+ "AXMeter"
]
],
"IAccessible2" : [
diff --git a/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html b/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html
index 56a26c8c01a..b79f61e0c6e 100644
--- a/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/paragraph-manual.html
@@ -51,7 +51,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_TEXT"
+ "ROLE_SYSTEM_GROUPING"
]
],
"UIA" : [
diff --git a/tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html b/tests/wpt/web-platform-tests/core-aam/suggestion-manual.html
index c2c3d7ce4b8..f31bcab8def 100644
--- a/tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/suggestion-manual.html
@@ -1,7 +1,7 @@
<!doctype html>
<html>
<head>
- <title>menuitem owned by or child of group</title>
+ <title>suggestion</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -21,7 +21,13 @@
"property",
"role",
"is",
- "ROLE_MENU_ITEM"
+ "ROLE_SUGGESTION"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:suggestion"
]
],
"AXAPI" : [
@@ -29,21 +35,21 @@
"property",
"AXRole",
"is",
- "AXMenuButton"
+ "AXGroup"
],
[
- "property",
- "AXSubrole",
- "is",
- "<nil>"
+ "result",
+ "AXAttributedStringForTextMarkerRange"
+ "contains",
+ "AXIsSuggestion"
]
],
- "MSAA" : [
+ "IAccessible2" : [
[
"property",
"role",
"is",
- "ROLE_SYSTEM_MENUITEM"
+ "IA2_ROLE_SUGGESTION"
]
],
"UIA" : [
@@ -51,7 +57,13 @@
"property",
"ControlType",
"is",
- "MenuItem"
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "suggestion"
]
]
},
@@ -59,21 +71,15 @@
"type" : "test"
}
],
- "title" : "menuitem owned by or child of group"
+ "title" : "suggestion"
}
) ;
</script>
</head>
<body>
- <p>This test examines the ARIA properties for menuitem owned by or child of group.</p>
- <div role='menu'>
- <div role='group'>
- <div role='menuitem' id='test'>content 1</div>
- </div>
- <div role='menuitem'>content 2</div>
- </div>
-
+ <p>This test examines the ARIA properties for suggestion.</p>
+ <div role="suggestion" id="test">content</div>
<div id="manualMode"></div>
<div id="log"></div>
<div id="ATTAmessages"></div>
diff --git a/tests/wpt/web-platform-tests/core-aam/time-manual.html b/tests/wpt/web-platform-tests/core-aam/time-manual.html
index 864cde1df18..542015953b7 100644
--- a/tests/wpt/web-platform-tests/core-aam/time-manual.html
+++ b/tests/wpt/web-platform-tests/core-aam/time-manual.html
@@ -57,7 +57,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_STATICTEXT"
+ "ROLE_SYSTEM_GROUPING"
]
],
"UIA" : [
diff --git a/tests/wpt/web-platform-tests/css/CSS2/floats/float-in-nested-multicol-001.html b/tests/wpt/web-platform-tests/css/CSS2/floats/float-in-nested-multicol-001.html
new file mode 100644
index 00000000000..8e1a257e389
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/floats/float-in-nested-multicol-001.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1833238">
+<!-- Browsers do not agree on the rendering, so we just verify the rendering is *not* blank. -->
+<link rel="mismatch" href="../../reference/blank.html">
+
+<style>
+article {
+ width: 300px;
+ column-count: 2;
+}
+main {
+ column-count: 2;
+}
+</style>
+
+<article>
+ <main>
+ <div>&nbsp;</div>
+ <footer style="float: left">
+ <div style="margin-top: 1em">ABC</div> <!-- This text should appear. -->
+ </footer>
+ </main>
+</article>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html
index a7b4b01ff47..4caf3ee2100 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-001.html
@@ -24,16 +24,16 @@
</style>
<body onload="checkLayoutForAnchorPos('.target')">
<!--
- All targets should find the 10px anchor, because it's the first
+ All targets should find the 30px anchor, because it's the last
one in the pre-order DFS from the `relpos`.
-->
<div class="relpos">
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=30></div>
<div class="anchor1" style="width: 10px">
<div class="anchor1" style="width: 20px"></div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=30></div>
</div>
<div class="anchor1" style="width: 30px"></div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=30></div>
</div>
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html
index 4c14e1d63c9..63b5d66a4e3 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-002.html
@@ -29,20 +29,26 @@
<div class="relpos">
<div>
<div class="relpos">
+ <!-- This target should not find the anchor, because the last containing
+ block has `position: absolute` and is after in tree order. -->
+ <div class="target" data-expected-width=0></div>
<div class="abspos">
<div class="relpos">
- <div class="anchor1" style="position: absolute"></div>
<!-- This target should not find the anchor, because the anchor is
- positioned. -->
+ absolutely positioned after it. -->
<div class="target" data-expected-width=0></div>
+ <div class="anchor1" style="position: absolute"></div>
+ <!-- This target should find the anchor, because the anchor is
+ absolutely positioned before it. -->
+ <div class="target" data-expected-width=10></div>
</div>
<!-- This target should find the anchor, because the last containing
block has `position: relative`. -->
<div class="target" data-expected-width=10></div>
</div>
- <!-- This target should not find the anchor, because the last containing
- block has `position: absolute`. -->
- <div class="target" data-expected-width=0></div>
+ <!-- This target should find the anchor, because the last containing
+ block has `position: absolute` and is before in tree order. -->
+ <div class="target" data-expected-width=10></div>
</div>
</div>
<!-- This target should find the anchor, because the last containing block
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html
index 91ff5bc9065..9ab6b66d944 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-003.html
@@ -29,109 +29,123 @@
<body onload="checkLayoutForAnchorPos('.target')">
<!-- In-flow and out-of-flow boxes in a containing block. -->
<div class="relpos">
+ <div class="target" data-expected-width=30></div>
<div>
+ <div class="target" data-expected-width=30></div>
<div class="relpos">
+ <div class="target" data-expected-width=0></div>
<div class="abspos">
+ <div class="target" data-expected-width=30></div>
<div class="relpos">
- <div class="anchor1" style="position: absolute; width: 10px"></div>
+ <div class="target" data-expected-width=40></div>
<div class="anchor1" style="width: 20px"></div>
- <div class="anchor1" style="position: absolute; width: 30px"></div>
+ <div class="anchor1" style="position: absolute; width: 10px"></div>
<div class="anchor1" style="width: 40px"></div>
- <div class="target" data-expected-width=20></div>
+ <div class="anchor1" style="position: absolute; width: 30px"></div>
+ <div class="target" data-expected-width=30></div>
</div>
- <div class="target" data-expected-width=10></div>
</div>
- <div class="target" data-expected-width=0></div>
+ <div class="target" data-expected-width=30></div>
</div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=30></div>
</div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=30></div>
</div>
<!-- In-flow boxes in ancestors, after the propagated ones. -->
<div class="relpos">
<div>
<div class="relpos">
+ <div class="target" data-expected-width=0></div>
<div class="abspos">
<div class="relpos">
- <div class="anchor1" style="position: absolute; width: 10px"></div>
- <div class="anchor1" style="width: 20px"></div>
<div class="target" data-expected-width=20></div>
+ <div class="anchor1" style="width: 20px"></div>
+ <div class="anchor1" style="position: absolute; width: 10px"></div>
+ <div class="target" data-expected-width=10></div>
</div>
<div class="anchor1" style="width: 50px"></div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=50></div>
</div>
- <div class="target" data-expected-width=0></div>
+ <div class="target" data-expected-width=50></div>
</div>
<div class="anchor1" style="width: 60px"></div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=70></div>
</div>
<div class="anchor1" style="width: 70px"></div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=70></div>
</div>
<!-- Out-of-flow boxes in ancestors, after the propagated ones. -->
<div class="relpos">
<div>
<div class="relpos">
+ <div class="target" data-expected-width=0></div>
<div class="abspos">
<div class="relpos">
- <div class="anchor1" style="position: absolute; width: 10px"></div>
- <div class="anchor1" style="width: 20px"></div>
<div class="target" data-expected-width=20></div>
+ <div class="anchor1" style="width: 20px"></div>
+ <div class="anchor1" style="position: absolute; width: 10px"></div>
+ <div class="target" data-expected-width=10></div>
</div>
<div class="anchor1" style="position: absolute; width: 110px"></div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=110></div>
</div>
- <div class="target" data-expected-width=0></div>
+ <div class="target" data-expected-width=110></div>
</div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=110></div>
</div>
<div class="anchor1" style="position: absolute; width: 100px"></div>
- <div class="target" data-expected-width=10></div>
+ <div class="target" data-expected-width=100></div>
</div>
<!-- In-flow boxes in ancestors, before the propagated ones. -->
<div class="relpos">
- <div class="anchor1" style="width: 100px"></div>
<div>
<div class="relpos">
- <div class="anchor1" style="width: 110px"></div>
<div class="abspos">
- <div class="anchor1" style="width: 120px"></div>
<div class="relpos">
+ <div class="target" data-expected-width=20></div>
<div class="anchor1" style="position: absolute; width: 10px"></div>
<div class="anchor1" style="width: 20px"></div>
<div class="target" data-expected-width=20></div>
</div>
+ <div class="anchor1" style="width: 120px"></div>
<div class="target" data-expected-width=120></div>
</div>
+ <div class="anchor1" style="width: 110px"></div>
<div class="target" data-expected-width=110></div>
</div>
<div class="target" data-expected-width=100></div>
</div>
+ <div class="anchor1" style="width: 100px"></div>
<div class="target" data-expected-width=100></div>
</div>
<!-- Out-of-flow boxes in ancestors, before the propagated ones. -->
<div class="relpos">
+ <div class="target" data-expected-width=10></div>
<div class="anchor1" style="position: absolute; width: 100px"></div>
<div>
+ <div class="target" data-expected-width=10></div>
<div class="relpos">
+ <div class="target" data-expected-width=0></div>
<div class="anchor1" style="position: absolute; width: 110px"></div>
<div class="abspos">
+ <div class="target" data-expected-width=10></div>
<div class="anchor1" style="position: absolute; width: 120px"></div>
<div class="relpos">
- <div class="anchor1" style="position: absolute; width: 10px"></div>
- <div class="anchor1" style="width: 20px"></div>
<div class="target" data-expected-width=20></div>
+ <div class="anchor1" style="width: 20px"></div>
+ <div class="anchor1" style="position: absolute; width: 10px"></div>
+ <div class="target" data-expected-width=10></div>
</div>
<div class="target" data-expected-width=10></div>
</div>
- <div class="target" data-expected-width=0></div>
+ <div class="target" data-expected-width=10></div>
</div>
- <div class="target" data-expected-width=110></div>
+ <div class="target" data-expected-width=10></div>
</div>
- <div class="target" data-expected-width=110></div>
+ <div class="target" data-expected-width=10></div>
</div>
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html
index 70b753cda2d..dba3472f5b1 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-inline-001.html
@@ -42,10 +42,12 @@
<div class="container relpos xcolumns">
<div style="height: 150px"></div>
<div class="relpos">
+ <span class="target" data-expected-width=20></span>
<span class="relpos">
+ <span class="target" data-expected-width=20></span>
<span class="relpos">
- <span class="anchor abspos">123</span>
<span class="anchor">12</span>
+ <span class="anchor abspos">123</span>
<span class="target" data-expected-width=20></span>
</span>
<span class="target" data-expected-width=30></span>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html
index 8b06b4c641c..02fd1c164d6 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-003.html
@@ -43,16 +43,17 @@
}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
+ <!-- All targets should find the abspos anchor -->
<div class="spacer"></div>
<div class="relpos">
<div class="columns relpos">
<div class="relpos">
<div class="relpos">
<div class="spacer"></div>
- <div class="anchor abspos" style="top: 120px; height: 100px"></div>
<div class="anchor" style="height: 60px"></div>
+ <div class="anchor abspos" style="top: 120px; height: 100px"></div>
<div class="target"
- data-expected-width=40 data-expected-height=50></div>
+ data-expected-width=70 data-expected-height=50></div>
</div>
<div class="target"
data-expected-width=70 data-expected-height=50></div>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html
index 881578a4639..fdd1772359f 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-name-multicol-004.html
@@ -43,13 +43,14 @@
}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
+ <!-- All targets should find the static positioned anchor -->
<div class="spacer"></div>
<div class="relpos">
<div class="columns relpos">
<div class="relpos">
<div class="spacer"></div>
- <div class="anchor" style="height: 60px"></div>
<div class="anchor abspos" style="top: 120px; height: 100px"></div>
+ <div class="anchor" style="height: 60px"></div>
<div class="target"
data-expected-width=40 data-expected-height=50></div>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html
index d5263fcddff..c149dd0e110 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-003.html
@@ -30,23 +30,23 @@
}
</style>
<!--
- To determine the target anchor element, find the first element el in tree
- order.
+ To determine the target anchor element, find the last acceptable anchor
+ element el in tree order.
https://drafts.csswg.org/css-anchor-1/#determining
-->
<body onload="checkLayoutForAnchorPos('.target')">
<div class="cb">
<div class="anchor1 size5x7"></div>
<div class="anchor1 size9x11"></div>
- <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div>
+ <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div>
</div>
<div class="cb">
<div class="anchor1 size5x7">
<div class="anchor1 size9x11"></div>
- <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div>
+ <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div>
</div>
- <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div>
+ <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div>
</div>
<div class="cb">
@@ -54,6 +54,6 @@
<div class="anchor1 size9x11"></div>
<div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div>
</div>
- <div class="target" style="left: anchor(--a1 right)" data-offset-x=5></div>
+ <div class="target" style="left: anchor(--a1 right)" data-offset-x=9></div>
</div>
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html
index bf3e48ed207..d23779ad9bf 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-003.html
@@ -40,7 +40,7 @@
<div class="relpos">
<div class="spacer" style="height: 30px"></div>
<div class="anchor1"></div>
- <div class="target" data-expected-height=0></div>
+ <div class="target" data-expected-height=50></div>
</div>
<div class="target" data-expected-height=50></div>
</div>
@@ -56,7 +56,7 @@
<div class="relpos">
<div class="spacer" style="height: 10px"></div>
<div class="anchor1"></div>
- <div class="target" data-expected-height=0></div>
+ <div class="target" data-expected-height=50></div>
</div>
<div class="target" data-expected-height=50></div>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html
index 2be88797541..399494120ea 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-004.html
@@ -54,7 +54,7 @@
}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
- <p>The green box should be a union of blue boxes,
+ <p>The green box should be a union of two blue boxes in the right,
and the purple box should be at the right-bottom of the green box.
</p>
<div class="spacer" style="height: 10px"></div>
@@ -76,9 +76,9 @@
</div>
<div class="target target1"
- data-offset-x=18 data-offset-y=25
- data-expected-width=150 data-expected-height=100></div>
+ data-offset-x=34 data-offset-y=225
+ data-expected-width=130 data-expected-height=100></div>
<div class="target target1-rb"
- data-offset-x=158 data-offset-y=115></div>
+ data-offset-x=154 data-offset-y=315></div>
</div>
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html
index 6fca40dd7e9..b94680816e9 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-position-multicol-fixed-001.html
@@ -35,7 +35,9 @@
}
.fixedpos {
position: fixed;
- margin-left: 20px;
+ margin-left: 0;
+ left: 20px;
+ top: 20px;
width: 20px;
height: 30px;
}
@@ -50,6 +52,7 @@
}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
+ <!-- All targets should find the fixed positioned anchor -->
<div class="transform">
<div class="spacer" style="height: 10px"></div>
<div class="columns">
@@ -57,11 +60,11 @@
<div class="spacer" style="height: 20px"></div>
<div class="transform">
<div class="spacer" style="height: 20px"></div>
- <div class="anchor fixedpos"></div>
<div class="anchor"></div>
+ <div class="anchor fixedpos"></div>
<div class="target"
data-offset-x="10" data-offset-y="20"
- data-expected-width=40 data-expected-height=10></div>
+ data-expected-width=130 data-expected-height=50></div>
</div>
<div class="target"
data-offset-x="20" data-offset-y="0"
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.tentative.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-001.html
index fa42e33d926..fa42e33d926 100644
--- a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.tentative.html
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-001.html
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-002.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-002.html
new file mode 100644
index 00000000000..88e8a754b5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-002.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<title>Tests anchor-scroll resolving name conflicts</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#scroll">
+<link rel="author" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/test-common.js"></script>
+
+<style>
+body {
+ margin: 0;
+}
+
+.scroller {
+ width: 100px;
+ height: 100px;
+ overflow-y: scroll;
+}
+
+.nonpos-cb {
+ transform: scale(1);
+}
+
+.abspos-cb {
+ position: absolute;
+}
+
+.anchor {
+ background: orange;
+ anchor-name: --a1;
+ position: absolute;
+ width: 50px;
+ height: 50px;
+ top: 50px;
+}
+
+.spacer {
+ height: 200px;
+}
+
+.target {
+ background: lime;
+ position: absolute;
+ width: 50px;
+ height: 50px;
+ top: anchor(--a1 top);
+ left: anchor(--a1 right);
+ anchor-scroll: --a1;
+}
+</style>
+
+<div class="abspos-cb" style="width: 300px; height: 400px">
+ <div class="scroller nonpos-cb" id="scroller1">
+ <div class="anchor" id="anchor1"></div>
+ <div class="spacer"></div>
+ </div>
+ <div class="target" id="target1"></div>
+
+ <div class="scroller abspos-cb" style="top: 125px" id="scroller2">
+ <div class="anchor" id="anchor2"></div>
+ <div class="spacer"></div>
+ </div>
+ <div class="target" id="target2"></div>
+
+ <div class="scroller abspos-cb" style="top: 250px" id="scroller3">
+ <div class="anchor" id="anchor3"></div>
+ <div class="spacer"></div>
+ </div>
+ <div class="target" id="target3"></div>
+</div>
+
+<script>
+promise_test(async () => {
+ scroller1.scrollTop = 10;
+ await waitUntilNextAnimationFrame();
+ await waitUntilNextAnimationFrame();
+
+ assert_equals(target1.getBoundingClientRect().top, anchor1.getBoundingClientRect().top);
+ assert_equals(target1.getBoundingClientRect().top, 40);
+}, 'target1 should scroll with anchor1');
+
+promise_test(async () => {
+ scroller2.scrollTop = 20;
+ await waitUntilNextAnimationFrame();
+ await waitUntilNextAnimationFrame();
+
+ assert_equals(target2.getBoundingClientRect().top, anchor2.getBoundingClientRect().top);
+ assert_equals(target2.getBoundingClientRect().top, 155);
+}, 'target2 should scroll with anchor2');
+
+promise_test(async () => {
+ scroller3.scrollTop = 30;
+ await waitUntilNextAnimationFrame();
+ await waitUntilNextAnimationFrame();
+
+ assert_equals(target3.getBoundingClientRect().top, anchor3.getBoundingClientRect().top);
+ assert_equals(target3.getBoundingClientRect().top, 270);
+}, 'target3 should scroll with anchor3');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.html
new file mode 100644
index 00000000000..6b2d96708bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-basics.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>Tests basics of the 'anchor-scroll' property</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#propdef-anchor-scroll">
+<link rel="author" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<div id="container">
+ <div id="target"></div>
+</div>
+
+<script>
+// anchor-scroll: none | default | <anchor-element>
+test_valid_value('anchor-scroll', 'none');
+test_valid_value('anchor-scroll', 'default');
+test_valid_value('anchor-scroll', 'implicit');
+test_valid_value('anchor-scroll', '--foo');
+test_invalid_value('anchor-scroll', 'foo-bar');
+test_invalid_value('anchor-scroll', '--foo --bar')
+test_invalid_value('anchor-scroll', '--foo, --bar')
+test_invalid_value('anchor-scroll', '100px');
+test_invalid_value('anchor-scroll', '100%');
+
+// Computed value: as specified
+test_computed_value('anchor-scroll', 'none');
+test_computed_value('anchor-scroll', 'default');
+test_computed_value('anchor-scroll', 'implicit');
+test_computed_value('anchor-scroll', '--foo');
+
+// Initial: default
+// Inherited: no
+assert_not_inherited('anchor-scroll', 'default', '--foo');
+
+// Animation type: discrete
+test_no_interpolation({
+ property: 'anchor-scroll',
+ from: '--foo',
+ to: 'none',
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht
new file mode 100644
index 00000000000..05a13794482
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-expected.xht
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Reftest Reference</title>
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
+ <style type="text/css"><![CDATA[
+ div
+ {
+ background-color: green;
+ height: 100px;
+ width: 100px;
+ }
+ ]]></style>
+ </head>
+ <body>
+ <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+ <div></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht
new file mode 100644
index 00000000000..05a13794482
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent-expected.xht
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Reftest Reference</title>
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
+ <style type="text/css"><![CDATA[
+ div
+ {
+ background-color: green;
+ height: 100px;
+ width: 100px;
+ }
+ ]]></style>
+ </head>
+ <body>
+ <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+ <div></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html
new file mode 100644
index 00000000000..44399c19886
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>currentColor in color-mix() used in background-color repaints properly when parent color changes</title>
+<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<style>
+ #container {
+ color: red;
+ }
+
+ #container.green {
+ color: green;
+ }
+
+ #target {
+ background-color: color-mix(in hsl, transparent 0%, currentColor 100%);
+ width: 100px;
+ height: 100px;
+ }
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id="container">
+ <div id="target"></div>
+</div>
+
+<script>
+ addEventListener("load", () => {
+ setTimeout(() => {
+ requestAnimationFrame(() => {
+ container.classList.add("green");
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ }, 0);
+ });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint.html
new file mode 100644
index 00000000000..a8f742b6c53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-background-repaint.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>currentColor in color-mix() used in background-color repaints properly when color changes</title>
+<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<style>
+ #target {
+ color: red;
+ background-color: color-mix(in hsl, transparent 0%, currentColor 100%);
+ width: 100px;
+ height: 100px;
+ }
+
+ #target.green {
+ color: green;
+ }
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id="target"></div>
+
+<script>
+ addEventListener("load", () => {
+ setTimeout(() => {
+ requestAnimationFrame(() => {
+ target.classList.add("green");
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ }, 0);
+ });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht
new file mode 100644
index 00000000000..05a13794482
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-expected.xht
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Reftest Reference</title>
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
+ <style type="text/css"><![CDATA[
+ div
+ {
+ background-color: green;
+ height: 100px;
+ width: 100px;
+ }
+ ]]></style>
+ </head>
+ <body>
+ <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+ <div></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht
new file mode 100644
index 00000000000..05a13794482
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent-expected.xht
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Reftest Reference</title>
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
+ <style type="text/css"><![CDATA[
+ div
+ {
+ background-color: green;
+ height: 100px;
+ width: 100px;
+ }
+ ]]></style>
+ </head>
+ <body>
+ <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+ <div></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html
new file mode 100644
index 00000000000..0d434b1d351
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>currentColor in color-mix() used in outline repaints properly when parent color changes</title>
+<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<style>
+ #container {
+ color: red;
+ }
+
+ #container.green {
+ color: green;
+ }
+
+ #target {
+ outline: 50px solid color-mix(in hsl, transparent 0%, currentColor 100%);
+ outline-offset: -50px;
+ width: 100px;
+ height: 100px;
+ }
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id="container">
+ <div id="target"></div>
+</div>
+
+<script>
+ addEventListener("load", () => {
+ setTimeout(() => {
+ requestAnimationFrame(() => {
+ container.classList.add("green");
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ }, 0);
+ });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html
new file mode 100644
index 00000000000..8892d818f9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/color-mix-currentcolor-outline-repaint.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>currentColor in color-mix() used in outline repaints properly when color changes</title>
+<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+<link rel="help" href="https://drafts.csswg.org/css-color/#currentcolor-color">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<style>
+ #target {
+ color: red;
+ outline: 50px solid color-mix(in hsl, transparent 0%, currentColor 100%);
+ outline-offset: -50px;
+ width: 100px;
+ height: 100px;
+ }
+
+ #target.green {
+ color: green;
+ }
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id="target"></div>
+
+<script>
+ addEventListener("load", () => {
+ setTimeout(() => {
+ requestAnimationFrame(() => {
+ target.classList.add("green");
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ }, 0);
+ });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html b/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html
index 8f05a99967c..c1ca47491ff 100644
--- a/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html
+++ b/tests/wpt/web-platform-tests/css/css-color/parsing/color-computed-color-mix-function.html
@@ -26,146 +26,148 @@
return computedValue;
}
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `rgb(84, 92, 61)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))`, `rgb(112, 106, 67)`);
- test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `rgb(112, 106, 67)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `rgb(61, 73, 54)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `rgb(61, 73, 54)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `rgb(112, 106, 67)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)`, `rgb(112, 106, 67)`); // Scale down > 100% sum.
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)`, `rgba(112, 106, 67, 0.5)`); // Scale up < 100% sum, causes alpha multiplication.
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))`, `rgb(133, 102, 71)`);
-
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `rgba(95, 105, 65, 0.6)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))`, `rgba(108, 103, 66, 0.85)`);
- test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `rgba(121, 114, 69, 0.7)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `rgba(68, 84, 59, 0.5)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `rgba(68, 84, 59, 0.5)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `rgba(121, 114, 69, 0.7)`);
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)`, `rgba(121, 114, 69, 0.7)`); // Scale down > 100% sum.
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)`, `rgba(121, 114, 69, 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `rgba(133, 102, 71, 0.8)`);
-
- test_computed_value(`color`, `color-mix(in hsl, transparent, hsl(30deg 30% 40%))`, canonicalize(`hsl(30deg 30% 40% / 0.5)`));
- test_computed_value(`color`, `color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))`, canonicalize(`hsl(30deg 30% 40% / 0.9)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0), hsl(30deg 30% 40%))`, canonicalize(`hsl(75deg 30% 40% / 0.5)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0) 10%, hsl(30deg 30% 40%))`, canonicalize(`hsl(39deg 30% 40% / 0.9)`));
-
- test_computed_value(`color`, `color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`));
-
- test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`));
-
- test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`));
-
- test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`));
-
- test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(230deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, canonicalize(`hsl(190deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, canonicalize(`hsl(350deg 50% 50%)`));
- test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, canonicalize(`hsl(170deg 50% 50%)`));
-
- test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(none none none))`, canonicalize(`hsl(none none none)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))`, canonicalize(`hsl(30deg 40% 80%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))`, canonicalize(`hsl(120deg 20% 40%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))`, canonicalize(`hsl(75deg 30% 60%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))`, canonicalize(`hsl(75deg 20% 40%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))`, canonicalize(`hsl(30deg 20% 60%)`));
-
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))`, canonicalize(`hsl(60deg 40% 40%)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))`, canonicalize(`hsl(60deg 40% 40% / 0.5)`));
- test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))`, canonicalize(`hsl(60deg 40% 40% / none)`));
-
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `rgb(147, 179, 52)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))`, `rgb(166, 153, 64)`);
- test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `rgb(166, 153, 64)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `rgb(96, 191, 39)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `rgb(96, 191, 39)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `rgb(166, 153, 64)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)`, `rgb(166, 153, 64)`); // Scale down > 100% sum.
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)`, `rgba(166, 153, 64, 0.5)`); // Scale up < 100% sum, causes alpha multiplication.
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))`, `rgb(153, 115, 77)`);
-
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `rgba(143, 170, 60, 0.6)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))`, `rgba(160, 149, 70, 0.7)`);
- test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `rgba(160, 149, 70, 0.7)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `rgba(95, 193, 37, 0.95)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `rgba(98, 184, 46, 0.5)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `rgba(160, 149, 70, 0.7)`);
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)`, `rgba(160, 149, 70, 0.7)`); // Scale down > 100% sum.
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)`, `rgba(160, 149, 70, 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `rgba(153, 115, 77, 0.8)`);
-
- test_computed_value(`color`, `color-mix(in hwb, transparent, hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40% / 0.5)`));
- test_computed_value(`color`, `color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40% / 0.9)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0), hwb(30deg 30% 40%))`, canonicalize(`hwb(75deg 30% 40% / 0.5)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0) 10%, hwb(30deg 30% 40%))`, canonicalize(`hwb(39deg 30% 40% / 0.9)`));
-
- test_computed_value(`color`, `color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`));
-
- test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`));
-
- test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`));
-
- test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`));
-
- test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(230deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, canonicalize(`hwb(190deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, canonicalize(`hwb(350deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, canonicalize(`hwb(170deg 30% 40%)`));
-
- test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(none none none))`, canonicalize(`hwb(none none none)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))`, canonicalize(`hwb(120deg 10% 20%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))`, canonicalize(`hwb(75deg 20% 40%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))`, canonicalize(`hwb(75deg 20% 20%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))`, canonicalize(`hwb(30deg 10% 30%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))`, canonicalize(`hwb(75deg 20% 30%)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))`, canonicalize(`hwb(75deg 20% 30% / 0.5)`));
- test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))`, canonicalize(`hwb(75deg 20% 30% / none)`));
+ // hsl()
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color(srgb 0.33 0.36 0.24)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))`, `color(srgb 0.4375 0.415625 0.2625)`);
+ test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color(srgb 0.4375 0.415625 0.2625)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `color(srgb 0.240625 0.2875 0.2125)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `color(srgb 0.240625 0.2875 0.2125)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `color(srgb 0.4375 0.415625 0.2625)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)`, `color(srgb 0.4375 0.415625 0.2625)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)`, `color(srgb 0.4375 0.415625 0.2625 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.4 0.28)`);
+
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color(srgb 0.372222 0.411111 0.255556 / 0.6)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))`, `color(srgb 0.42346 0.402889 0.258893 / 0.85)`);
+ test_computed_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color(srgb 0.472245 0.447041 0.270612 / 0.7)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `color(srgb 0.2674 0.3304 0.2296 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `color(srgb 0.2674 0.3304 0.2296 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `color(srgb 0.472245 0.447041 0.270612 / 0.7)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)`, `color(srgb 0.472245 0.447041 0.270612 / 0.7)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)`, `color(srgb 0.472245 0.447041 0.270612 / 0.35)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `color(srgb 0.52 0.4 0.28 / 0.8)`);
+
+ test_computed_value(`color`, `color-mix(in hsl, transparent, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.4 0.28 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.4 0.28 / 0.9)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0), hsl(30deg 30% 40%))`, `color(srgb 0.46 0.52 0.28 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0) 10%, hsl(30deg 30% 40%))`, `color(srgb 0.52 0.436 0.28 / 0.9)`);
+
+ test_computed_value(`color`, `color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`);
+
+ test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`);
+ test_computed_value(`color`, `color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`);
+
+ test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`);
+ test_computed_value(`color`, `color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`);
+
+ test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`);
+ test_computed_value(`color`, `color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`);
+
+ test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, `color(srgb 0.25 0.333333 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, `color(srgb 0.75 0.666667 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, `color(srgb 0.75 0.333333 0.25)`);
+ test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))`, `color(srgb 0.25 0.666667 0.75)`);
+ test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))`, `color(srgb 0.75 0.25 0.333333)`);
+ test_computed_value(`color`, `color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))`, `color(srgb 0.25 0.75 0.666667)`);
+
+ test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(none none none))`, `color(srgb none none none)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))`, `color(srgb 0.88 0.8 0.72)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))`, `color(srgb 0.32 0.48 0.32)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))`, `color(srgb 0.66 0.72 0.48)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))`, `color(srgb 0.44 0.48 0.32)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))`, `color(srgb 0.68 0.6 0.52)`);
+
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))`, `color(srgb 0.56 0.56 0.24)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))`, `color(srgb 0.56 0.56 0.24 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))`, `color(srgb 0.56 0.56 0.24 / none)`);
+
+ // hwb()
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color(srgb 0.575 0.7 0.2)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))`, `color(srgb 0.65 0.6 0.25)`);
+ test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color(srgb 0.65 0.6 0.25)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `color(srgb 0.375 0.75 0.15)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `color(srgb 0.375 0.75 0.15)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `color(srgb 0.65 0.6 0.25)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)`, `color(srgb 0.65 0.6 0.25)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)`, `color(srgb 0.65 0.6 0.25 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3)`);
+
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color(srgb 0.558333 0.666667 0.233333 / 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`);
+ test_computed_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `color(srgb 0.373026 0.757895 0.142105 / 0.95)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `color(srgb 0.3825 0.72 0.18 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)`, `color(srgb 0.628571 0.583929 0.271429 / 0.7)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)`, `color(srgb 0.628571 0.583929 0.271429 / 0.35)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `color(srgb 0.6 0.45 0.3 / 0.8)`);
+
+ test_computed_value(`color`, `color-mix(in hwb, transparent, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3 / 0.9)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0), hwb(30deg 30% 40%))`, `color(srgb 0.525 0.6 0.3 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0) 10%, hwb(30deg 30% 40%))`, `color(srgb 0.6 0.495 0.3 / 0.9)`);
+
+ test_computed_value(`color`, `color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`);
+
+ test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`);
+ test_computed_value(`color`, `color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`);
+
+ test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`);
+ test_computed_value(`color`, `color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`);
+
+ test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`);
+ test_computed_value(`color`, `color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`);
+
+ test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, `color(srgb 0.3 0.35 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, `color(srgb 0.6 0.55 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, `color(srgb 0.6 0.35 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))`, `color(srgb 0.3 0.55 0.6)`);
+ test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))`, `color(srgb 0.6 0.3 0.35)`);
+ test_computed_value(`color`, `color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))`, `color(srgb 0.3 0.6 0.55)`);
+
+ test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(none none none))`, `color(srgb none none none)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))`, `color(srgb 0.6 0.45 0.3)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))`, `color(srgb 0.1 0.8 0.1)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))`, `color(srgb 0.5 0.6 0.2)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))`, `color(srgb 0.65 0.8 0.2)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))`, `color(srgb 0.7 0.4 0.1)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))`, `color(srgb 0.575 0.7 0.2)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))`, `color(srgb 0.575 0.7 0.2 / 0.5)`);
+ test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))`, `color(srgb 0.575 0.7 0.2 / none)`);
// lch()
test_computed_value(`color`, `color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))`, `lch(30 40 50)`);
diff --git a/tests/wpt/web-platform-tests/css/css-color/parsing/color-mix-out-of-gamut.html b/tests/wpt/web-platform-tests/css/css-color/parsing/color-mix-out-of-gamut.html
new file mode 100644
index 00000000000..1803397f8a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color/parsing/color-mix-out-of-gamut.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Color Level 4: Computation of colors using color-mix() function syntax that result in out-of-gamut sRGB colors</title>
+<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com">
+<link rel="author" title="Aaron Krajeski" href="mailto:aaronhk@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-5/#color-mix">
+<link rel="help" href="https://drafts.csswg.org/css-color-5/#resolving-mix">
+<link rel="help" href="https://drafts.csswg.org/css-color-5/#serial-color-mix">
+<meta name="assert" content="gamut mapping works for computed value of color-mix()">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+ test_computed_value(`color`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color(srgb -0.511814 1.01832 -0.310726)`);
+ test_computed_value(`color`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59343 0.58802 1.40564)`);
+ test_computed_value(`color`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351376 -0.213938 0.299501)`);
+ test_computed_value(`color`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.588284 1.40527)`);
+ test_computed_value(`color`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351307 -0.213865 0.299236)`);
+ test_computed_value(`color`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59295 0.360371 1.38571)`);
+ test_computed_value(`color`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.0763893 -0.0456266 0.0932598)`);
+ test_computed_value(`color`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.358734 1.38664)`);
+ test_computed_value(`color`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.076536 -0.045825 0.0937443)`);
+
+ test_computed_value(`color`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color(srgb -0.511814 1.01832 -0.310726)`);
+ test_computed_value(`color`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59343 0.58802 1.40564)`);
+ test_computed_value(`color`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351376 -0.213938 0.299501)`);
+ test_computed_value(`color`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.588284 1.40527)`);
+ test_computed_value(`color`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.351307 -0.213865 0.299236)`);
+ test_computed_value(`color`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59295 0.360371 1.38571)`);
+ test_computed_value(`color`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.0763893 -0.0456266 0.0932598)`);
+ test_computed_value(`color`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 1.59328 0.358736 1.38664)`);
+ test_computed_value(`color`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color(srgb 0.0765361 -0.045825 0.0937443)`);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-color/parsing/gamut-mapping.html b/tests/wpt/web-platform-tests/css/css-color/parsing/gamut-mapping.html
deleted file mode 100644
index 02133acced2..00000000000
--- a/tests/wpt/web-platform-tests/css/css-color/parsing/gamut-mapping.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>CSS Color Level 5: Computation of colors using color-mix() function syntax that need to be gamut-mapped into the sRGB color space</title>
-<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com">
-<link rel="help" href="https://drafts.csswg.org/css-color-5/#color-mix">
-<link rel="help" href="https://drafts.csswg.org/css-color-5/#resolving-mix">
-<link rel="help" href="https://drafts.csswg.org/css-color-5/#serial-color-mix">
-<meta name="assert" content="gamut mapping works for computed value of color-mix()">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/computed-testcommon.js"></script>
-</head>
-<body>
-<div id="target"></div>
-<script>
- test_computed_value(`color`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 249, 66)`); // Naive clip based mapping would give rgb(0, 255, 0).
- test_computed_value(`color`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255).
- test_computed_value(`color`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black,
- test_computed_value(`color`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255).
- test_computed_value(`color`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black,
- test_computed_value(`color`, `color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 92, 255).
- test_computed_value(`color`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(19, 0, 24).
- test_computed_value(`color`, `color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 91, 255).
- test_computed_value(`color`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(20, 0, 24).
-
- test_computed_value(`color`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 249, 66)`); // Naive clip based mapping would give rgb(0, 255, 0).
- test_computed_value(`color`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255).
- test_computed_value(`color`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black,
- test_computed_value(`color`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 150, 255).
- test_computed_value(`color`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `rgb(42, 0, 34)`); // Naive clip based mapping would give rgb(90, 0, 76). NOTE: 0% lightness in Lab/LCH does not automatically correspond with sRGB black,
- test_computed_value(`color`, `color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 92, 255).
- test_computed_value(`color`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(19, 0, 24).
- test_computed_value(`color`, `color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(255, 255, 255)`); // Naive clip based mapping would give rgb(255, 91, 255).
- test_computed_value(`color`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `rgb(0, 0, 0)`); // Naive clip based mapping would give rgb(20, 0, 24).
-</script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/css-conditional/at-supports-selector-file-selector-button.html b/tests/wpt/web-platform-tests/css/css-conditional/at-supports-selector-file-selector-button.html
new file mode 100644
index 00000000000..a51e503ef69
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-conditional/at-supports-selector-file-selector-button.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<html>
+ <head>
+ <title>CSS Test (Conditional Rules): In @supports, ::file-selector-button can be parsed successfully</title>
+ <link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+ <link rel="help" href="https://drafts.csswg.org/css-conditional-3/#at-supports">
+ <link rel="help" href="https://drafts.csswg.org/css-pseudo/#file-selector-button-pseudo">
+ <link rel="match" href="at-supports-001-ref.html">
+ <style>
+ div {
+ background: red;
+ height: 100px;
+ width: 100px;
+ }
+ @supports selector(input::file-selector-button) {
+ div { background-color:green; }
+ }
+ </style>
+ </head>
+ <body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-contain/container-queries/display-contents-dynamic-style-queries.html b/tests/wpt/web-platform-tests/css/css-contain/container-queries/display-contents-dynamic-style-queries.html
new file mode 100644
index 00000000000..782cf566552
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-contain/container-queries/display-contents-dynamic-style-queries.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<title>CSS Container Queries Test: Invalidate style queries and display:contents</title>
+<link rel="help" href="https://drafts.csswg.org/css-contain-3/#style-container">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/cq-testcommon.js"></script>
+<style>
+ #container.contents {
+ --foo: bar;
+ display: contents;
+ }
+ #target {
+ color: red;
+ }
+ @container style(--foo: bar) {
+ #target {
+ color: green;
+ }
+ }
+</style>
+<div id="container">
+ <div id="target">This should be green</div>
+</div>
+<script>
+ setup(() => assert_implements_container_queries());
+
+ test(() => {
+ assert_equals(getComputedStyle(target).color, "rgb(255, 0, 0)");
+ }, "Initially the color is red");
+
+ test(() => {
+ container.className = "contents";
+ assert_equals(getComputedStyle(target).color, "rgb(0, 128, 0)");
+ }, "After display and --foo changes, style() query causes the color to be green");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/percentage-padding-004.html b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-padding-004.html
new file mode 100644
index 00000000000..ca96e546cc8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-padding-004.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://crbug.com/1445257">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert"
+ content="vertical-rl block's auto height should encompass its column wrap flexbox child and descendants, and the percentage padding should resolve based on that." />
+
+<style>
+ #reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+ }
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.
+</p>
+
+<div id=reference-overlapped-red></div>
+
+<div id="container" style="writing-mode:vertical-rl; width:101px;">
+ <div style="display:flex; flex-flow:column wrap; padding-right:5%;">
+ <div style="writing-mode:horizontal-tb; padding-right:10%;">
+ <div
+ style="width:100px; height:100px; background:green; position:relative; left:15px;">
+ </div>
+ </div>
+ </div>
+</div>
+<script>
+ document.body.offsetTop;
+ container.style.width = "100px";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html
new file mode 100644
index 00000000000..d98b0ffd10e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-composition.html
@@ -0,0 +1,665 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>font-size-adjust composition</title>
+<link rel="author" title="ChangSeok Oh" href="mailto:changseok@webkit.org">
+<link rel="help" href="https://www.w3.org/TR/css-fonts-5/#font-size-adjust-prop">
+<meta name="assert" content="font-size-adjust supports animation with two value font metrics">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body></body>
+
+<script>
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "none",
+ addTo: "2.0",
+}, [
+ {at: -0.5, expect: "none"},
+ {at: 0, expect: "none"},
+ {at: 0.5, expect: "2.5"},
+ {at: 1, expect: "2.5"},
+ {at: 1.5, expect: "2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "0.0",
+ addTo: "2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.5"},
+ {at: 0.5, expect: "1.5"},
+ {at: 1, expect: "2.5"},
+ {at: 1.5, expect: "3.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "0.0",
+ addTo: "2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.0"},
+ {at: 0.5, expect: "1.25"},
+ {at: 1, expect: "2.5"},
+ {at: 1.5, expect: "3.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "0.0",
+ replaceTo: "2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.5"},
+ {at: 0.5, expect: "1.25"},
+ {at: 1, expect: "2.0"},
+ {at: 1.5, expect: "2.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "2.0",
+ addTo: "none",
+}, [
+ {at: -0.5, expect: "2.0"},
+ {at: 0, expect: "2.0"},
+ {at: 0.5, expect: "none"},
+ {at: 1, expect: "none"},
+ {at: 1.5, expect: "none"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ex-height 0.5",
+ replaceFrom: "none",
+ addTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "none"},
+ {at: 0, expect: "none"},
+ {at: 0.5, expect: "2.5"},
+ {at: 1, expect: "2.5"},
+ {at: 1.5, expect: "2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ex-height 0.5",
+ addFrom: "ex-height 0",
+ addTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.5"},
+ {at: 0.5, expect: "1.5"},
+ {at: 1, expect: "2.5"},
+ {at: 1.5, expect: "3.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ex-height 0.5",
+ replaceFrom: "ex-height 0",
+ addTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.0"},
+ {at: 0.5, expect: "1.25"},
+ {at: 1, expect: "2.5"},
+ {at: 1.5, expect: "3.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ex-height 0.5",
+ addFrom: "ex-height 0",
+ replaceTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.5"},
+ {at: 0.5, expect: "1.25"},
+ {at: 1, expect: "2.0"},
+ {at: 1.5, expect: "2.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ex-height 0.5",
+ replaceFrom: "ex-height 2.0",
+ addTo: "none",
+}, [
+ {at: -0.5, expect: "2.0"},
+ {at: 0, expect: "2.0"},
+ {at: 0.5, expect: "none"},
+ {at: 1, expect: "none"},
+ {at: 1.5, expect: "none"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "cap-height 0.5",
+ replaceFrom: "none",
+ addTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "none"},
+ {at: 0, expect: "none"},
+ {at: 0.5, expect: "cap-height 2.5"},
+ {at: 1, expect: "cap-height 2.5"},
+ {at: 1.5, expect: "cap-height 2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "cap-height 0.5",
+ addFrom: "cap-height 0",
+ addTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "cap-height 0.0"},
+ {at: 0, expect: "cap-height 0.5"},
+ {at: 0.5, expect: "cap-height 1.5"},
+ {at: 1, expect: "cap-height 2.5"},
+ {at: 1.5, expect: "cap-height 3.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "cap-height 0.5",
+ replaceFrom: "cap-height 0",
+ addTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "cap-height 0.0"},
+ {at: 0, expect: "cap-height 0.0"},
+ {at: 0.5, expect: "cap-height 1.25"},
+ {at: 1, expect: "cap-height 2.5"},
+ {at: 1.5, expect: "cap-height 3.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "cap-height 0.5",
+ addFrom: "cap-height 0.0",
+ replaceTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "cap-height 0.0"},
+ {at: 0, expect: "cap-height 0.5"},
+ {at: 0.5, expect: "cap-height 1.25"},
+ {at: 1, expect: "cap-height 2"},
+ {at: 1.5, expect: "cap-height 2.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "cap-height 0.5",
+ replaceFrom: "cap-height 2.0",
+ addTo: "none",
+}, [
+ {at: -0.5, expect: "cap-height 2.0"},
+ {at: 0, expect: "cap-height 2.0"},
+ {at: 0.5, expect: "none"},
+ {at: 1, expect: "none"},
+ {at: 1.5, expect: "none"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ch-width 0.5",
+ replaceFrom: "none",
+ addTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "none"},
+ {at: 0, expect: "none"},
+ {at: 0.5, expect: "ch-width 2.5"},
+ {at: 1, expect: "ch-width 2.5"},
+ {at: 1.5, expect: "ch-width 2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ch-width 0.5",
+ addFrom: "ch-width 0",
+ addTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "ch-width 0.0"},
+ {at: 0, expect: "ch-width 0.5"},
+ {at: 0.5, expect: "ch-width 1.5"},
+ {at: 1, expect: "ch-width 2.5"},
+ {at: 1.5, expect: "ch-width 3.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ch-width 0.5",
+ replaceFrom: "ch-width 0",
+ addTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "ch-width 0.0"},
+ {at: 0, expect: "ch-width 0.0"},
+ {at: 0.5, expect: "ch-width 1.25"},
+ {at: 1, expect: "ch-width 2.5"},
+ {at: 1.5, expect: "ch-width 3.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ch-width 0.5",
+ addFrom: "ch-width 0",
+ replaceTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "ch-width 0.0"},
+ {at: 0, expect: "ch-width 0.5"},
+ {at: 0.5, expect: "ch-width 1.25"},
+ {at: 1, expect: "ch-width 2"},
+ {at: 1.5, expect: "ch-width 2.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ch-width 0.5",
+ replaceFrom: "ch-width 2.0",
+ addTo: "none",
+}, [
+ {at: -0.5, expect: "ch-width 2.0"},
+ {at: 0, expect: "ch-width 2.0"},
+ {at: 0.5, expect: "none"},
+ {at: 1, expect: "none"},
+ {at: 1.5, expect: "none"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-width 0.5",
+ replaceFrom: "none",
+ addTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "none"},
+ {at: 0, expect: "none"},
+ {at: 0.5, expect: "ic-width 2.5"},
+ {at: 1, expect: "ic-width 2.5"},
+ {at: 1.5, expect: "ic-width 2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-width 0.5",
+ addFrom: "ic-width 0",
+ addTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "ic-width 0.0"},
+ {at: 0, expect: "ic-width 0.5"},
+ {at: 0.5, expect: "ic-width 1.5"},
+ {at: 1, expect: "ic-width 2.5"},
+ {at: 1.5, expect: "ic-width 3.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-width 0.5",
+ replaceFrom: "ic-width 0",
+ addTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "ic-width 0.0"},
+ {at: 0, expect: "ic-width 0.0"},
+ {at: 0.5, expect: "ic-width 1.25"},
+ {at: 1, expect: "ic-width 2.5"},
+ {at: 1.5, expect: "ic-width 3.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-width 0.5",
+ addFrom: "ic-width 0",
+ replaceTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "ic-width 0.0"},
+ {at: 0, expect: "ic-width 0.5"},
+ {at: 0.5, expect: "ic-width 1.25"},
+ {at: 1, expect: "ic-width 2"},
+ {at: 1.5, expect: "ic-width 2.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-width 0.5",
+ replaceFrom: "ic-width 2.0",
+ addTo: "none",
+}, [
+ {at: -0.5, expect: "ic-width 2.0"},
+ {at: 0, expect: "ic-width 2.0"},
+ {at: 0.5, expect: "none"},
+ {at: 1, expect: "none"},
+ {at: 1.5, expect: "none"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-height 0.5",
+ replaceFrom: "none",
+ addTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "none"},
+ {at: 0, expect: "none"},
+ {at: 0.5, expect: "ic-height 2.5"},
+ {at: 1, expect: "ic-height 2.5"},
+ {at: 1.5, expect: "ic-height 2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-height 0.5",
+ addFrom: "ic-height 0",
+ addTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-height 0.0"},
+ {at: 0, expect: "ic-height 0.5"},
+ {at: 0.5, expect: "ic-height 1.5"},
+ {at: 1, expect: "ic-height 2.5"},
+ {at: 1.5, expect: "ic-height 3.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-height 0.5",
+ replaceFrom: "ic-height 0",
+ addTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-height 0.0"},
+ {at: 0, expect: "ic-height 0.0"},
+ {at: 0.5, expect: "ic-height 1.25"},
+ {at: 1, expect: "ic-height 2.5"},
+ {at: 1.5, expect: "ic-height 3.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-height 0.5",
+ addFrom: "ic-height 0",
+ replaceTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-height 0.0"},
+ {at: 0, expect: "ic-height 0.5"},
+ {at: 0.5, expect: "ic-height 1.25"},
+ {at: 1, expect: "ic-height 2"},
+ {at: 1.5, expect: "ic-height 2.75"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "ic-height 0.5",
+ replaceFrom: "ic-height 2.0",
+ addTo: "none",
+}, [
+ {at: -0.5, expect: "ic-height 2.0"},
+ {at: 0, expect: "ic-height 2.0"},
+ {at: 0.5, expect: "none"},
+ {at: 1, expect: "none"},
+ {at: 1.5, expect: "none"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ex-height 0.0",
+ addTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "0.5"},
+ {at: 0, expect: "0.5"},
+ {at: 0.5, expect: "cap-height 2.0"},
+ {at: 1, expect: "cap-height 2.0"},
+ {at: 1.5, expect: "cap-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ex-height 0.0",
+ replaceTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.0"},
+ {at: 0.5, expect: "cap-height 2.0"},
+ {at: 1, expect: "cap-height 2.0"},
+ {at: 1.5, expect: "cap-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ex-height 0",
+ addTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "0.0"},
+ {at: 0, expect: "0.0"},
+ {at: 0.5, expect: "cap-height 2.0"},
+ {at: 1, expect: "cap-height 2.0"},
+ {at: 1.5, expect: "cap-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ex-height 0",
+ replaceTo: "cap-height 2.0",
+}, [
+ {at: -0.5, expect: "0.5"},
+ {at: 0, expect: "0.5"},
+ {at: 0.5, expect: "cap-height 2.0"},
+ {at: 1, expect: "cap-height 2.0"},
+ {at: 1.5, expect: "cap-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "cap-height 0.0",
+ addTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "cap-height 0.0"},
+ {at: 0, expect: "cap-height 0.0"},
+ {at: 0.5, expect: "ch-width 2.0"},
+ {at: 1, expect: "ch-width 2.0"},
+ {at: 1.5, expect: "ch-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "cap-height 0.0",
+ replaceTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "cap-height 0.0"},
+ {at: 0, expect: "cap-height 0.0"},
+ {at: 0.5, expect: "ch-width 2.0"},
+ {at: 1, expect: "ch-width 2.0"},
+ {at: 1.5, expect: "ch-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "cap-height 0",
+ addTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "cap-height 0.0"},
+ {at: 0, expect: "cap-height 0.0"},
+ {at: 0.5, expect: "ch-width 2.0"},
+ {at: 1, expect: "ch-width 2.0"},
+ {at: 1.5, expect: "ch-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "cap-height 0",
+ replaceTo: "ch-width 2.0",
+}, [
+ {at: -0.5, expect: "cap-height 0"},
+ {at: 0, expect: "cap-height 0"},
+ {at: 0.5, expect: "ch-width 2.0"},
+ {at: 1, expect: "ch-width 2.0"},
+ {at: 1.5, expect: "ch-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ch-width 0.0",
+ addTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "ch-width 0.0"},
+ {at: 0, expect: "ch-width 0.0"},
+ {at: 0.5, expect: "ic-width 2.0"},
+ {at: 1, expect: "ic-width 2.0"},
+ {at: 1.5, expect: "ic-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ch-width 0.0",
+ replaceTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "ch-width 0.0"},
+ {at: 0, expect: "ch-width 0.0"},
+ {at: 0.5, expect: "ic-width 2.0"},
+ {at: 1, expect: "ic-width 2.0"},
+ {at: 1.5, expect: "ic-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ch-width 0",
+ addTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "ch-width 0.0"},
+ {at: 0, expect: "ch-width 0.0"},
+ {at: 0.5, expect: "ic-width 2.0"},
+ {at: 1, expect: "ic-width 2.0"},
+ {at: 1.5, expect: "ic-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ch-width 0",
+ replaceTo: "ic-width 2.0",
+}, [
+ {at: -0.5, expect: "ch-width 0"},
+ {at: 0, expect: "ch-width 0"},
+ {at: 0.5, expect: "ic-width 2.0"},
+ {at: 1, expect: "ic-width 2.0"},
+ {at: 1.5, expect: "ic-width 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ic-width 0.0",
+ addTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-width 0.0"},
+ {at: 0, expect: "ic-width 0.0"},
+ {at: 0.5, expect: "ic-height 2.0"},
+ {at: 1, expect: "ic-height 2.0"},
+ {at: 1.5, expect: "ic-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ic-width 0.0",
+ replaceTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-width 0.0"},
+ {at: 0, expect: "ic-width 0.0"},
+ {at: 0.5, expect: "ic-height 2.0"},
+ {at: 1, expect: "ic-height 2.0"},
+ {at: 1.5, expect: "ic-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ic-width 0",
+ addTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-width 0.0"},
+ {at: 0, expect: "ic-width 0.0"},
+ {at: 0.5, expect: "ic-height 2.0"},
+ {at: 1, expect: "ic-height 2.0"},
+ {at: 1.5, expect: "ic-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ic-width 0",
+ replaceTo: "ic-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-width 0"},
+ {at: 0, expect: "ic-width 0"},
+ {at: 0.5, expect: "ic-height 2.0"},
+ {at: 1, expect: "ic-height 2.0"},
+ {at: 1.5, expect: "ic-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ic-height 0.0",
+ addTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-height 0.0"},
+ {at: 0, expect: "ic-height 0.0"},
+ {at: 0.5, expect: "ex-height 2.5"},
+ {at: 1, expect: "ex-height 2.5"},
+ {at: 1.5, expect: "ex-height 2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ic-height 0.0",
+ replaceTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-height 0.0"},
+ {at: 0, expect: "ic-height 0.0"},
+ {at: 0.5, expect: "ex-height 2.0"},
+ {at: 1, expect: "ex-height 2.0"},
+ {at: 1.5, expect: "ex-height 2.0"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ replaceFrom: "ic-height 0",
+ addTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-height 0.0"},
+ {at: 0, expect: "ic-height 0.0"},
+ {at: 0.5, expect: "ex-height 2.5"},
+ {at: 1, expect: "ex-height 2.5"},
+ {at: 1.5, expect: "ex-height 2.5"},
+]);
+
+test_composition({
+ property: 'font-size-adjust',
+ underlying: "0.5",
+ addFrom: "ic-height 0",
+ replaceTo: "ex-height 2.0",
+}, [
+ {at: -0.5, expect: "ic-height 0"},
+ {at: 0, expect: "ic-height 0"},
+ {at: 0.5, expect: "ex-height 2.0"},
+ {at: 1, expect: "ex-height 2.0"},
+ {at: 1.5, expect: "ex-height 2.0"},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-features-two-stylesheets-crash.html b/tests/wpt/web-platform-tests/css/css-fonts/font-features-two-stylesheets-crash.html
new file mode 100644
index 00000000000..0e6490974c2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts/font-features-two-stylesheets-crash.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>CSS Test: @font-feature-values crashes with two stylesheets</title>
+<link rel="author" href="mailto:sesse@chromium.org">
+<link rel="help" href="https://crbug.com/1444274">
+<meta http-equiv="Content-type" content="text/html; charset=utf-8">
+<style></style><iframe></iframe><style>@font-feature-values x {</style>
+</head>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html
new file mode 100644
index 00000000000..2bf12f083fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006-ref.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+<meta charset="utf-8">
+<title>Reference: Subgridded item sizing with mixed writing modes</title>
+<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+body {
+ background: white;
+ color: black;
+ display: grid;
+ font: 20px/1 Ahem;
+ place-items: start;
+ padding: 0;
+ margin: 0;
+}
+.grid {
+ background: cyan;
+ display: grid;
+ padding: 5px;
+}
+.grid > .grid {
+ background: pink;
+}
+.h { writing-mode: horizontal-tb; }
+.v { writing-mode: vertical-rl; }
+</style>
+</head>
+<body>
+ <div class="grid h">
+ <div class="grid h">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid h">
+ <div class="grid h">
+ <div class="v">1234</div>
+ </div>
+ </div>
+ <div class="grid h">
+ <div class="grid v">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid h">
+ <div class="grid v">
+ <div class="v">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid h">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid h">
+ <div class="v">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid v">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid v">
+ <div class="v">1234</div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006.html
new file mode 100644
index 00000000000..95d12432289
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-006.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Grid Test: Subgridded item sizing with mixed writing modes</title>
+<link rel="author" title="Ethan Jimenez" href="mailto:ethavar@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-2">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="orthogonal-writing-mode-006-ref.html">
+<style>
+body {
+ background: white;
+ color: black;
+ display: grid;
+ font: 20px/1 Ahem;
+ place-items: start;
+ padding: 0;
+ margin: 0;
+}
+.grid {
+ background: cyan;
+ display: grid;
+ padding: 5px;
+}
+.grid > .grid {
+ background: pink;
+ grid-template: subgrid / subgrid;
+}
+.h { writing-mode: horizontal-tb; }
+.v { writing-mode: vertical-rl; }
+</style>
+</head>
+<body>
+ <div class="grid h">
+ <div class="grid h">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid h">
+ <div class="grid h">
+ <div class="v">1234</div>
+ </div>
+ </div>
+ <div class="grid h">
+ <div class="grid v">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid h">
+ <div class="grid v">
+ <div class="v">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid h">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid h">
+ <div class="v">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid v">
+ <div class="h">1234</div>
+ </div>
+ </div>
+ <div class="grid v">
+ <div class="grid v">
+ <div class="v">1234</div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002-ref.html
new file mode 100644
index 00000000000..cd1ee527ab1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002-ref.html
@@ -0,0 +1,96 @@
+<!DOCTYPE HTML>
+<html><head>
+ <meta charset="utf-8">
+ <title>Reference: nested subgrids map margin/border/padding according to writing direction</title>
+ <link rel="author" title="Kurt Catti-Schmidt" href="mailto:kschmi@microsoft.com">
+ <link rel="help" href="https://drafts.csswg.org/css-grid-2">
+ <style>
+html,body {
+ font:12px/1 monospace;
+}
+
+.grid {
+ display: grid;
+ grid: 0.2em 1.4em / repeat(10, auto);
+ border: 1px solid;
+ padding: 0 0 0 0;
+}
+
+div > div {
+ display: grid;
+ grid-column: 1 / span 3;
+ grid: auto / subgrid;
+ border: 1px solid;
+ background: grey;
+}
+
+n {
+ grid-row: 1;
+ counter-increment: n;
+}
+n::before { content: counter(n, decimal); }
+
+x {
+ background: silver;
+}
+
+ </style>
+</head>
+<body>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div style="grid-template-columns: subgrid; padding: 0 0 0 10px;">
+ <div style="grid-template-columns: subgrid; grid-column: 1 /span 3;">
+ <x style="grid-column: 1; ">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div style="grid-template-columns: subgrid;">
+ <div style="grid-template-columns: subgrid; grid-column: 1 /span 3; padding-left: 10px;">
+ <x style="grid-column: 1; ">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div style="grid-template-columns: subgrid; border-right: 20px solid; border-left: 10px solid;">
+ <div style="grid-template-columns: subgrid; grid-column-start:span 3;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div style="grid-template-columns: subgrid;">
+ <div style="grid-template-columns: subgrid; grid-column-start:span 3; border-right: 20px solid; border-left: 10px solid;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div style="grid-template-columns: subgrid; margin: 0 20px 0 0;">
+ <div style="grid-template-columns: subgrid; grid-column-start:span 3;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div style="grid-template-columns: subgrid;">
+ <div style="grid-template-columns: subgrid; grid-column-start:span 3; margin: 0 20px 0 0;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002.html
new file mode 100644
index 00000000000..078d5808b04
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/writing-directions-002.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html><head>
+ <meta charset="utf-8">
+ <title>CSS Grid Test: nested subgrids map margin/border/padding according to writing direction</title>
+ <link rel="author" title="Kurt Catti-Schmidt" href="mailto:kschmi@microsoft.com">
+ <link rel="help" href="https://drafts.csswg.org/css-grid-2">
+ <link rel="match" href="writing-directions-002-ref.html">
+ <style>
+html,body {
+ font:12px/1 monospace;
+}
+
+.grid {
+ display: grid;
+ grid: 0.2em 1.4em / repeat(10, auto);
+ border: 1px solid;
+ padding: 0 0 0 0;
+}
+
+div > div {
+ display: grid;
+ grid-column: 1 / span 3;
+ grid: auto / subgrid;
+ border: 1px solid;
+ background: grey;
+}
+
+n {
+ grid-row: 1;
+ counter-increment: n;
+}
+n::before { content: counter(n, decimal); }
+
+x {
+ background: silver;
+}
+
+.rtl { direction:rtl; }
+.ltr { direction:ltr; }
+
+ </style>
+</head>
+<body>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div class="rtl" style="grid-template-columns: subgrid; padding: 0 0 0 10px;">
+ <div class="ltr" style="grid-template-columns: subgrid;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div class="rtl" style="grid-template-columns: subgrid; ">
+ <div class="ltr" style="grid-template-columns: subgrid; padding: 0 0 0 10px;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div class="rtl" style="grid-template-columns: subgrid; border-right: 20px solid; border-left: 10px solid;">
+ <div class="ltr" style="grid-template-columns: subgrid; ">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div class="rtl" style="grid-template-columns: subgrid;">
+ <div class="ltr" style="grid-template-columns: subgrid; border-right: 20px solid; border-left: 10px solid;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div class="rtl" style="grid-template-columns: subgrid; margin: 0 20px 0 0;">
+ <div class="ltr" style="grid-template-columns: subgrid; ">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+<div class="grid">
+ <n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n><n></n>
+ <div class="rtl" style="grid-template-columns: subgrid;">
+ <div class="ltr" style="grid-template-columns: subgrid; margin: 0 20px 0 0;">
+ <x style="grid-column: 1;">x</x>
+ </div>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html
index 6b91f74ad48..1dbdb5acab0 100644
--- a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-invalid.html
@@ -46,6 +46,8 @@ test_invalid_value("clip-path", "polygon(1%)");
test_invalid_value("clip-path", "unknown-box");
+test_invalid_value("clip-path", 'path(" ")');
+test_invalid_value("clip-path", 'path(evenodd, "")');
test_invalid_value("clip-path", 'path(abc, "m 20 0 h -100 z")');
test_invalid_value("clip-path", 'path(nonzero)');
test_invalid_value("clip-path", 'path("m 20 0 h -100", nonzero)');
diff --git a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html
index ec6ac5ae9bc..895cdfacac6 100644
--- a/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html
+++ b/tests/wpt/web-platform-tests/css/css-masking/parsing/clip-path-valid.html
@@ -49,10 +49,6 @@ test_valid_value("clip-path", 'path(evenodd, "M 20 20 h 60 v 60 h -60 Z M 30 30
test_valid_value("clip-path",
'path(nonzero, "M20,20h60 v60 h-60z M30,30 h40 v40 h-40z")',
'path("M 20 20 h 60 v 60 h -60 Z M 30 30 h 40 v 40 h -40 Z")');
-// See https://github.com/w3c/fxtf-drafts/issues/392. If empty path string,
-// Blink serializes it as none, but Gecko serializes as path("").
-test_valid_value("clip-path", 'path(" ")', ["none", 'path("")']);
-test_valid_value("clip-path", 'path(evenodd, "")', ["none", 'path(evenodd, "")']);
// <geometry-box>
test_valid_value("clip-path", "border-box");
diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/animation/overlay-interpolation.html b/tests/wpt/web-platform-tests/css/css-position/overlay/animation/overlay-interpolation.html
new file mode 100644
index 00000000000..a3034b88c13
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/overlay/animation/overlay-interpolation.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://drafts.csswg.org/css-position-4/#overlay">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+const alwaysAuto = [
+ {at: -1, expect: 'auto'},
+ {at: 0, expect: 'auto'},
+ {at: 0.1, expect: 'auto'},
+ {at: 0.9, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+];
+const alwaysNone = [
+ {at: -1, expect: 'none'},
+ {at: 0, expect: 'none'},
+ {at: 0.1, expect: 'none'},
+ {at: 0.9, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 1.5, expect: 'none'},
+];
+
+test_interpolation({
+ property: 'overlay',
+ from: 'auto',
+ to: 'none',
+ // transition:all is not supposed to allow overlay to be transitioned.
+ 'CSS Transitions with transition: all': alwaysNone,
+}, [
+ {at: -1, expect: 'auto'},
+ {at: 0, expect: 'auto'},
+ {at: 0.1, expect: 'auto'},
+ {at: 0.9, expect: 'auto'},
+ {at: 1, expect: 'none'},
+ {at: 1.5, expect: 'none'},
+]);
+
+test_interpolation({
+ property: 'overlay',
+ from: 'none',
+ to: 'auto',
+ // transition:all is not supposed to allow overlay to be transitioned.
+ 'CSS Transitions with transition: all': alwaysAuto,
+}, [
+ {at: -1, expect: 'none'},
+ {at: 0, expect: 'none'},
+ {at: 0.1, expect: 'auto'},
+ {at: 0.9, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+
+test_interpolation({
+ property: 'overlay',
+ from: 'auto',
+ to: 'auto'
+}, [
+ {at: -1, expect: 'auto'},
+ {at: 0, expect: 'auto'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+
+test_interpolation({
+ property: 'overlay',
+ from: 'none',
+ to: 'none'
+}, [
+ {at: -1, expect: 'none'},
+ {at: 0, expect: 'none'},
+ {at: 0.5, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 1.5, expect: 'none'},
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html
index 949e45d828f..28b45db8469 100644
--- a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html
+++ b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-invalid.html
@@ -15,6 +15,8 @@
// arc path segments must have at least 7 arguments.
// https://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
test_invalid_value("offset-path", 'path("M 20 30 A 60 70 80")');
+test_invalid_value("offset-path", 'path("")');
+test_invalid_value("offset-path", 'path(" ")');
test_invalid_value("offset-path", "ray(0 sides)");
test_invalid_value("offset-path", "ray(closest-side)");
diff --git a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html
index 95a9f8aabbc..59a64b2116d 100644
--- a/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html
+++ b/tests/wpt/web-platform-tests/css/motion/parsing/offset-path-parsing-valid.html
@@ -41,10 +41,6 @@ test_valid_value("offset-path",
' path( "m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50" ) ',
'path("m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50")'
);
-// See https://github.com/w3c/fxtf-drafts/issues/392. If empty path string,
-// Blink serializes it as none, but Gecko serializes as path("").
-test_valid_value("offset-path", 'path("")', ['none', 'path("")']);
-test_valid_value("offset-path", 'path(" ")', ['none', 'path("")']);
test_valid_value("offset-path", 'url("http://www.example.com/index.html#polyline1")');
diff --git a/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-button.tentative.html b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-button.tentative.html
new file mode 100644
index 00000000000..0f399378abf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-button.tentative.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<head>
+<meta charset="utf-8">
+<title>Tests for pressing space in editable button element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+</head>
+<body>
+<button contenteditable>HelloWorld</button>
+<div contenteditable><button>HelloWorld</button></div>
+<button><div contenteditable>HelloWorld</div></button>
+<script>
+"use strict";
+
+promise_test(async () => {
+ await new Promise(resolve => {
+ addEventListener("load", resolve, {once: true});
+ });
+ const button = document.querySelector("button[contenteditable]");
+ getSelection().collapse(button.firstChild, "Hello".length);
+ let clickEvent = null;
+ button.addEventListener("click", event => clickEvent = event, {once: true});
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(button.textContent, "HelloWorld", "The button label shouldn't be changed");
+ assert_not_equals(clickEvent, null, "Click event should be fired on the <button>");
+}, "Type space key in <button contenteditable> should be handled by the <button>");
+
+promise_test(async () => {
+ document.querySelector("div[contenteditable]").focus();
+ const button = document.querySelector("div[contenteditable] > button");
+ getSelection().collapse(button.firstChild, "Hello".length);
+ let clickEvent = null;
+ button.addEventListener("click", event => clickEvent = event, {once: true});
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(button.textContent, "Hello World", "A space should be inserted into the button label");
+ assert_equals(clickEvent, null, "Click event should not be fired on the <button>");
+}, "Type space key in editable <button> shouldn't be handled by the <button> when it's not focused");
+
+promise_test(async () => {
+ const button = document.querySelector("div[contenteditable] > button");
+ button.textContent = "HelloWorld";
+ button.focus();
+ let clickEvent = null;
+ button.addEventListener("click", event => clickEvent = event, {once: true});
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(button.textContent, "HelloWorld", "The button label shouldn't be changed");
+ assert_not_equals(clickEvent, null, "Click event should be fired on the <button>");
+}, "Type space key in editable <button> should be handled by the <button> when it's focused");
+
+promise_test(async () => {
+ const div = document.querySelector("button > div[contenteditable]");
+ div.focus();
+ getSelection().collapse(div.firstChild, "Hello".length);
+ let clickEvent = null;
+ div.parentElement.addEventListener("click", event => clickEvent = event, {once: true});
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(div.textContent, "Hello World", "A space should be inserted into the button label");
+ assert_equals(clickEvent, null, "Click event should not be fired on the <button>");
+}, "Type space key in editable element in <button> shouldn't be handled by the <button>");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-summary.tentative.html b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-summary.tentative.html
new file mode 100644
index 00000000000..30a751d5239
--- /dev/null
+++ b/tests/wpt/web-platform-tests/editing/other/typing-space-in-editable-summary.tentative.html
@@ -0,0 +1,90 @@
+<!doctype html>
+<head>
+<meta charset="utf-8">
+<title>Tests for pressing space in editable summary element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+</head>
+<body>
+<details contenteditable><summary>HelloWorld</summary>Details</details>
+<details><summary contenteditable>HelloWorld</summary>Details</details>
+<details><summary><div contenteditable>HelloWorld</div></summary>Details</details>
+<script>
+"use strict";
+
+promise_test(async () => {
+ const details = document.querySelector("details[contenteditable]");
+ const summary = details.querySelector("summary");
+ getSelection().collapse(summary.firstChild, "Hello".length);
+ summary.focus();
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(
+ details.innerHTML,
+ "<summary>HelloWorld</summary>Details",
+ "A space shouldn't be inserted into the focused <summary>"
+ );
+ assert_true(details.open, "<details> shouldn't keep collapsed");
+}, "Type space key in editable <summary> should be handled by the <summary> when it's focused");
+
+promise_test(async () => {
+ const details = document.querySelector("details[contenteditable]");
+ details.innerHTML = "<summary>HelloWorld</summary>Details";
+ details.open = false;
+ const summary = details.querySelector("summary");
+ getSelection().collapse(summary.firstChild, "Hello".length);
+ details.focus();
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(
+ details.innerHTML,
+ "<summary>Hello World</summary>Details",
+ "A space should be inserted into the <summary>"
+ );
+ assert_false(details.open, "<details> should keep collapsed");
+}, "Type space key in editable <summary> shouldn't be handled by the <summary> when it's not focused");
+
+promise_test(async () => {
+ const details = document.querySelector("details > summary[contenteditable]").parentNode;
+ const summary = details.querySelector("summary");
+ getSelection().collapse(summary.firstChild, "Hello".length);
+ summary.focus();
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(
+ details.innerHTML,
+ '<summary contenteditable="">HelloWorld</summary>Details',
+ "The content of <details> shouldn't be changed"
+ );
+ assert_true(details.open, "<details> shouldn't keep collapsed");
+}, "Type space key in <summary contenteditable> should be handled by the <summary>");
+
+promise_test(async () => {
+ const details = document.querySelector("summary > div[contenteditable]").parentNode.parentNode;
+ const summary = details.querySelector("summary");
+ const editable = summary.querySelector("div[contenteditable]");
+ editable.focus();
+ getSelection().collapse(editable.firstChild, "Hello".length);
+ await new this.window.test_driver.Actions()
+ .keyDown("\uE00D")
+ .keyUp("\uE00D")
+ .send();
+ assert_equals(
+ details.innerHTML,
+ '<summary><div contenteditable="">Hello World</div></summary>Details',
+ "A space should be inserted"
+ );
+ assert_false(details.open, "<details> should keep collapsed");
+}, "Type space key in editable element in <summary> shouldn't be handled by the <summary>");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fenced-frame/automatic-beacon-click-handler.https.html b/tests/wpt/web-platform-tests/fenced-frame/automatic-beacon-click-handler.https.html
new file mode 100644
index 00000000000..505eb6174f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fenced-frame/automatic-beacon-click-handler.https.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<title>Test window.fence.setReportEventDataForAutomaticBeacons</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<body>
+<script>
+promise_test(async(t) => {
+ const actions = new test_driver.Actions();
+ const fencedframe = await attachFencedFrameContext(
+ {generator_api: 'fledge'});
+ const new_url = new URL("resources/dummy.html", location.href);
+ const beacon_data = "This is the beacon data!";
+
+ await fencedframe.execute((new_url, beacon_data) => {
+ addEventListener("click", (event) => {
+ let beacon_event = {
+ eventType: "reserved.top_navigation",
+ eventData: beacon_data,
+ destination: ["buyer"],
+ }
+ window.fence.setReportEventDataForAutomaticBeacons(beacon_event);
+ window.open(new_url, "_blank");
+ });
+ }, [new_url, beacon_data]);
+
+ await actions.pointerMove(0, 0, {origin: fencedframe.element})
+ .pointerDown()
+ .pointerUp()
+ .send();
+
+ const received_beacon_data = await nextAutomaticBeacon();
+ assert_equals(received_beacon_data, beacon_data);
+}, 'Set and trigger an automatic beacon in a click handler');
+
+promise_test(async(t) => {
+ const fencedframe = await attachFencedFrameContext(
+ {generator_api: 'fledge'});
+ const new_url = new URL("resources/dummy.html", location.href);
+ const beacon_data = "This is the beacon data!";
+
+ await fencedframe.execute((new_url, beacon_data) => {
+ const actions = new test_driver.Actions();
+ let a = document.createElement('a');
+ a.textContent = "Click me!";
+ a.href = new_url;
+ a.target = "_blank";
+
+ // When the anchor link is clicked, the click handler will set the data
+ // before the navigation happens. This test checks to make sure that the
+ // data makes it to the correct place by the time the navigation commits.
+ a.onclick = () => {
+ let beacon_event = {
+ eventType: "reserved.top_navigation",
+ eventData: beacon_data,
+ destination: ["buyer"],
+ }
+ window.fence.setReportEventDataForAutomaticBeacons(beacon_event);
+ };
+ document.body.appendChild(a);
+
+ // This will trigger the beacon data storing + navigation.
+ return actions.pointerMove(0, 0, {origin: a})
+ .pointerDown()
+ .pointerUp()
+ .send();
+ }, [new_url, beacon_data]);
+
+ const received_beacon_data = await nextAutomaticBeacon();
+ assert_equals(received_beacon_data, beacon_data);
+}, 'Set and trigger an automatic beacon in an <a> click handler');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/fenced-frame/resources/automatic-beacon-store.py b/tests/wpt/web-platform-tests/fenced-frame/resources/automatic-beacon-store.py
new file mode 100644
index 00000000000..f783c8530c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fenced-frame/resources/automatic-beacon-store.py
@@ -0,0 +1,25 @@
+"""Automatic beacon store server.
+
+- When a request body is not specified, serves a 200 response whose body
+ contains the stored value from the last automatic beacon. If the stored value
+ doesn't exist, serves a 200 response with an empty body.
+- When a request body is specified, stores the data in the body and serves a 200
+ response without body.
+"""
+# Use an arbitrary key since `request.server.stash.put` expects a valid UUID.
+BEACON_KEY = "0c02dba4-f01e-11ed-a05b-0242ac120003"
+
+def main(request, response):
+ # Requests with a body imply they were sent as an automatic beacon for
+ # reserved.top_navigation. Note that this only stores the most recent beacon
+ # that was sent.
+ if request.body:
+ request.server.stash.put(BEACON_KEY, request.body)
+ return (200, [], b"")
+
+ # Requests without a body imply they were sent as the request from
+ # nextAutomaticBeacon().
+ data = request.server.stash.take(BEACON_KEY)
+ if not data and data != "":
+ return (200, [], b"<Not set>")
+ return (200, [], data)
diff --git a/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js b/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js
index c19cc1d0337..ab6685f1842 100644
--- a/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js
+++ b/tests/wpt/web-platform-tests/fenced-frame/resources/fledge-bidding-logic.js
@@ -25,5 +25,10 @@ function generateBid(interestGroup, auctionSignals, perBuyerSignals,
function reportWin(
auctionSignals, perBuyerSignals, sellerSignals, browserSignals) {
+ registerAdBeacon({
+ 'reserved.top_navigation':
+ browserSignals.interestGroupOwner +
+ '/fenced-frame/resources/automatic-beacon-store.py'
+ });
return;
}
diff --git a/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js b/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js
index 2263fc1db18..4638f37cbb1 100644
--- a/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js
+++ b/tests/wpt/web-platform-tests/fenced-frame/resources/utils.js
@@ -1,4 +1,5 @@
const STORE_URL = '/fenced-frame/resources/key-value-store.py';
+const BEACON_URL = '/fenced-frame/resources/automatic-beacon-store.py';
const REMOTE_EXECUTOR_URL = '/fenced-frame/resources/remote-context-executor.https.html';
const FLEDGE_BIDDING_URL = '/fenced-frame/resources/fledge-bidding-logic.js';
const FLEDGE_BIDDING_WITH_SIZE_URL = '/fenced-frame/resources/fledge-bidding-logic-with-size.js';
@@ -417,6 +418,37 @@ async function nextValueFromServer(key) {
}
}
+// Reads the data from the latest automatic beacon sent to the server.
+async function readAutomaticBeaconDataFromServer() {
+ const serverUrl = `${BEACON_URL}`;
+ const response = await fetch(serverUrl);
+ if (!response.ok)
+ throw new Error('An error happened in the server');
+ const value = await response.text();
+
+ // The value is not stored in the server.
+ if (value === "<Not set>")
+ return { status: false };
+
+ return { status: true, value: value };
+}
+
+// Convenience wrapper around the above getter that will wait until a value is
+// available on the server.
+async function nextAutomaticBeacon() {
+ while (true) {
+ // Fetches the test result from the server.
+ const { status, value } = await readAutomaticBeaconDataFromServer();
+ if (!status) {
+ // The test result has not been stored yet. Retry after a while.
+ await new Promise(resolve => setTimeout(resolve, 20));
+ continue;
+ }
+
+ return value;
+ }
+}
+
// Writes `value` for `key` in the key-value store on the server.
async function writeValueToServer(key, value, origin = '') {
// Resolve the key if it is a Promise.
diff --git a/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js b/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js
index 7bf98ba9b24..3727bb42afe 100644
--- a/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js
+++ b/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js
@@ -566,7 +566,7 @@ test(() => {
controller.abort();
- assert_array_equals(log, ['clone-aborted', 'original-aborted'], "Abort events fired in correct order");
+ assert_array_equals(log, ['original-aborted', 'clone-aborted'], "Abort events fired in correct order");
assert_true(request.signal.aborted, 'Signal aborted');
assert_true(clonedRequest.signal.aborted, 'Signal aborted');
}, "Clone aborts with original controller");
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html b/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html
index c2c90eaa8bd..64b07556661 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-body-read-task-handling.html
@@ -35,9 +35,7 @@ promise_test(function() {
// The fulfill handler above shouldn't have run yet. If it has run,
// throw to reject this promise and fail the test.
- if (executed) {
- throw "shouldn't have run microtasks yet";
- }
+ assert_false(executed, "shouldn't have run microtasks yet");
// Otherwise act as if there's no "then" property so the promise
// fulfills and the test passes.
@@ -49,6 +47,40 @@ promise_test(function() {
return response.body.getReader().read();
});
}, "reading from a body stream should occur in a microtask scope");
+
+promise_test(function() {
+ return fetch("../resources/data.json").then(function(response) {
+ // Add a getter for "then" that will incidentally be invoked
+ // during promise resolution.
+ Object.prototype.__defineGetter__('then', () => {
+ // Clean up behind ourselves.
+ delete Object.prototype.then;
+
+ // This promise should (like all promises) be resolved
+ // asynchronously.
+ var executed = false;
+ Promise.resolve().then(_ => { executed = true; });
+
+ // This shouldn't run microtasks! They should only run
+ // after the fetch is resolved.
+ performMicrotaskCheckpoint();
+
+ // The fulfill handler above shouldn't have run yet. If it has run,
+ // throw to reject this promise and fail the test.
+ assert_false(executed, "shouldn't have run microtasks yet");
+
+ // Otherwise act as if there's no "then" property so the promise
+ // fulfills and the test passes.
+ return undefined;
+ });
+
+ // Create a read request, incidentally resolving a promise with an
+ // object value, thereby invoking the getter installed above.
+ return response.body.pipeTo(new WritableStream({
+ write(chunk) {}
+ }))
+ });
+}, "piping from a body stream to a JS-written WritableStream should occur in a microtask scope");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.https.html
index 875431698f7..871c917dcc8 100644
--- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.html
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.https.html
@@ -1,10 +1,10 @@
<!DOCTYPE html>
<title>Element#requestFullscreen({ screen }) tentative support</title>
-<link rel="help" href="https://w3c.github.io/window-placement/" />
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
+<link rel="help" href="https://w3c.github.io/window-management/" />
<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="../trusted-click.js"></script>
<body></body>
<script>
@@ -24,6 +24,6 @@
await trusted_click(document.body);
await document.body.requestFullscreen(options);
- assert_equals(screenGetterInvoked, true);
+ assert_true(screenGetterInvoked);
}, "fullscreenOptions.screen getter is invoked on requestFullscreen");
</script>
diff --git a/tests/wpt/web-platform-tests/graphics-aria/META.yml b/tests/wpt/web-platform-tests/graphics-aria/META.yml
new file mode 100644
index 00000000000..692db91315e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/graphics-aria/META.yml
@@ -0,0 +1,4 @@
+spec: https://w3c.github.io/graphics-aria/
+suggested_reviewers:
+ - cookiecrook
+ - spectranaut
diff --git a/tests/wpt/web-platform-tests/graphics-aria/graphics-roles.html b/tests/wpt/web-platform-tests/graphics-aria/graphics-roles.html
new file mode 100644
index 00000000000..159190ed833
--- /dev/null
+++ b/tests/wpt/web-platform-tests/graphics-aria/graphics-roles.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/wai-aria/scripts/aria-utils.js"></script>
+</head>
+<body>
+
+<div role="graphics-document" data-expectedrole="graphics-document" class="ex">x</div>
+<div role="graphics-object" data-expectedrole="graphics-object" class="ex">x</div>
+<div role="graphics-symbol" data-expectedrole="graphics-symbol" class="ex">x</div>
+
+<script>
+AriaUtils.verifyRolesBySelector(".ex");
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html
index d0e629f6312..609ce9b8503 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.tentative.https.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/document-state.https.html
@@ -86,6 +86,50 @@ promise_test(async t => {
'Same-origin forward history navigation to a document whose original ' +
'initiator was cross-site ends up with document.referrer that is the ' +
'original cross-site initiator');
-}, "A navigation's initiator origin and referrer are stored in the document state");
+}, "A navigation's initiator origin and referrer are stored in the document " +
+ "state and used in the document repopulation case");
+
+// This test is similar to the above, but instead of testing for the true
+// history entry -> document state -> document repopulation case, we stay on [B]
+// (the document who was navigated to from [A]) and run `location.reload()` to
+// confirm that the initiator information from the [A] -> [B] navigation is used
+// when reloading [B], not [B]'s own same-origin information.
+promise_test(async t => {
+ const rcHelper = new RemoteContextHelper();
+ const A = await rcHelper.addWindow();
+
+ const originA = new URL(await A.executeScript(() => location.href)).origin;
+
+ // Create B on a new origin.
+ const B = await A.navigateToNew({
+ origin: 'HTTPS_NOTSAMESITE_ORIGIN',
+ });
+
+ const originB = new URL(await B.executeScript(() => location.href)).origin;
+ assert_not_equals(originA, originB, 'Contexts A and B are cross-origin');
+
+ // Reload B.
+ await B.navigate(() => {
+ location.reload();
+ }, []);
+
+ const secFetchSite = await B.executeScript(() => window.requestHeaders['sec-fetch-site']);
+ const referrer = await B.executeScript(() => window.requestHeaders['referer']);
+ const documentReferrer = await B.executeScript(() => document.referrer);
+
+ assert_equals(secFetchSite, 'cross-site',
+ 'Same-origin forward history navigation to a document whose original ' +
+ 'initiator was cross-site, ends up with Sec-Fetch-Dest: cross-site ' +
+ 'header');
+ assert_equals(referrer, originA + '/',
+ 'Same-origin forward history navigation to a document whose original ' +
+ 'initiator was cross-site ends up with the Referer header that is the ' +
+ 'original cross-site initiator');
+ assert_equals(documentReferrer, originA + '/',
+ 'Same-origin forward history navigation to a document whose original ' +
+ 'initiator was cross-site ends up with document.referrer that is the ' +
+ 'original cross-site initiator');
+}, "A navigation's initiator origin and referrer are stored in the document " +
+ "state and used on location.reload()");
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html
new file mode 100644
index 00000000000..8ce0c51e8e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title>
+<h1>2d.layer.render-opportunities.createImageBitmap</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap.html
new file mode 100644
index 00000000000..4ffcaa3e3c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.createImageBitmap.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.createImageBitmap-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title>
+<h1>2d.layer.render-opportunities.createImageBitmap</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ createImageBitmap(canvas);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html
new file mode 100644
index 00000000000..1ddc6d1b449
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.drawImage</title>
+<h1>2d.layer.render-opportunities.drawImage</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage.html
new file mode 100644
index 00000000000..4eb0b6f721b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.drawImage.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.drawImage-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.drawImage</title>
+<h1>2d.layer.render-opportunities.drawImage</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx2.drawImage(canvas, 0, 0);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html
new file mode 100644
index 00000000000..ea0e78e0f28
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.getImageData</title>
+<h1>2d.layer.render-opportunities.getImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData.html
new file mode 100644
index 00000000000..3cf514a03f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.getImageData.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.getImageData-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.getImageData</title>
+<h1>2d.layer.render-opportunities.getImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ ctx.getImageData(0, 0, 200, 200);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html
new file mode 100644
index 00000000000..3d63bbe7766
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.putImageData</title>
+<h1>2d.layer.render-opportunities.putImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData.html
new file mode 100644
index 00000000000..8da3dafbb7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.putImageData.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.putImageData-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.putImageData</title>
+<h1>2d.layer.render-opportunities.putImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html
new file mode 100644
index 00000000000..138f3a7ccbb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame-expected.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<title>Canvas test: 2d.layer.render-opportunities.requestAnimationFrame</title>
+<h1>2d.layer.render-opportunities.requestAnimationFrame</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script type="module">
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ document.documentElement.classList.remove("reftest-wait");
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html
new file mode 100644
index 00000000000..889ff5ba09c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.requestAnimationFrame.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.requestAnimationFrame-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.requestAnimationFrame</title>
+<h1>2d.layer.render-opportunities.requestAnimationFrame</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script type="module">
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ await new Promise(resolve => requestAnimationFrame(resolve));
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ document.documentElement.classList.remove("reftest-wait");
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html
new file mode 100644
index 00000000000..fda8e8d7c6d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob-expected.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<title>Canvas test: 2d.layer.render-opportunities.toBlob</title>
+<h1>2d.layer.render-opportunities.toBlob</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script type="module">
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ document.documentElement.classList.remove("reftest-wait");
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html
new file mode 100644
index 00000000000..908730424a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toBlob.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.toBlob-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.toBlob</title>
+<h1>2d.layer.render-opportunities.toBlob</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script type="module">
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ await new Promise(resolve => canvas.toBlob(resolve));
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ document.documentElement.classList.remove("reftest-wait");
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html
new file mode 100644
index 00000000000..22a9770331d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.toDataURL</title>
+<h1>2d.layer.render-opportunities.toDataURL</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL.html
new file mode 100644
index 00000000000..152f66a12b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.render-opportunities.toDataURL.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.toDataURL-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.toDataURL</title>
+<h1>2d.layer.render-opportunities.toDataURL</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ canvas.toDataURL();
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed-expected.html
new file mode 100644
index 00000000000..c41b253c95b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed-expected.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.unclosed</title>
+<h1>2d.layer.unclosed</h1>
+<p class="desc">Check that layers are rendered even if not closed.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed.html b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed.html
new file mode 100644
index 00000000000..788889ee7ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/element/layers/2d.layer.unclosed.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.unclosed-expected.html">
+<title>Canvas test: 2d.layer.unclosed</title>
+<h1>2d.layer.unclosed</h1>
+<p class="desc">Check that layers are rendered even if not closed.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
index 55f2d2c24b5..18af95c1eeb 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(520, 420);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(520, 420);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'teal';
ctx.fillRect(0, 0, 520, 50);
@@ -105,6 +105,6 @@
floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 310, 80, 80);
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
index 633d202012c..b94424dd996 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(520, 420);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(520, 420);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'teal';
ctx.fillRect(0, 0, 520, 50);
@@ -107,7 +107,7 @@
floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 310, 80, 80);
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html
index f088c89aa7c..6a0e5cce717 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
ctx.fillRect(60, 60, 75, 50);
@@ -22,6 +22,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html
index 96c80115506..ddb2671aaab 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.alone.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
ctx.fillRect(60, 60, 75, 50);
@@ -24,7 +24,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html
index a87c7364cfa..b204c49e5eb 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
ctx.fillRect(60, 60, 75, 50);
@@ -26,6 +26,6 @@
ctx.fillRect(70, 70, 75, 50);
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html
index 9507809a528..2e1cb62c32a 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.endlayer.unmatched.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
ctx.fillRect(60, 60, 75, 50);
@@ -28,7 +28,7 @@
ctx.fillRect(70, 70, 75, 50);
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html
index bb7dd933372..71414b4b379 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -33,6 +33,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html
index 70b32e43395..551df36b15e 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -36,6 +36,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html
index 45932d4cd5d..6851a4a8468 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -38,7 +38,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html
index ff33fc45052..618480c813f 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.blending.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,7 +35,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html
index 21582189b1d..94fed5752df 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -33,6 +33,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html
index bb3d886b54f..841742ef1e7 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -36,6 +36,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html
index 592f92921b8..ef44257c0ad 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -38,7 +38,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html
index 2359e92790f..d7d2b7a21e2 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.composite.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,7 +35,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html
index 67a8ae60249..63a264e6819 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -32,6 +32,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html
index a67f5872f78..daa788cd150 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,6 +35,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html
index 35df72aabcd..f75db3d2490 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,7 +37,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html
index 2db6b64738c..694f31e208b 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.alpha.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -34,7 +34,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html
index 6bcfd2854a6..6a36bb4ba10 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -32,6 +32,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html
index f1e9b7d23a3..9ad87aa0cd2 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,6 +35,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html
index 1d22e94f6f9..dc52e9e9251 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,7 +37,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html
index 227c72b80ac..8964e97713c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.blending.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -34,7 +34,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html
index 9d4d1dce8a4..84fb4b3d95a 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -32,6 +32,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html
index 9ad39065c6a..2e0883f5af8 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,6 +35,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html
index b45c9d3aadc..66d44050581 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,7 +37,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html
index 66493889b20..b695871fcdc 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.composite.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -34,7 +34,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html
index 37d0e3dd1c5..bf483ccc925 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -36,6 +36,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html
index 93278cb5aa3..d914a70867f 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -39,6 +39,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html
index 783693f2c14..a1acd0d083a 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -41,7 +41,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html
index 53533e4ece6..47503d5478b 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -38,7 +38,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html
index f0af85f8f51..7d4f8ecda52 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -36,6 +36,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html
index 46cd28b6c2b..f75bd251ac4 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -39,6 +39,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html
index 044b75927b3..783a04cafbf 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -41,7 +41,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html
index be25ca66b16..ed8af9a0f1d 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.composite.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -38,7 +38,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html
index 6567094376b..4f8954f978c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,6 +35,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html
index 3059bf306cd..0cfa86a0125 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -38,6 +38,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html
index a481073ccfc..015fe946338 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -40,7 +40,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html
index b5d81078899..4334fd6c1b0 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,7 +37,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html
index a574e829328..7f3d1a2cb3c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,6 +35,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html
index 4bdf80337f8..9b9862e57ff 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -38,6 +38,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html
index 23cd4e834b0..1d7e74b64eb 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -40,7 +40,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html
index bd7a51d8987..f5ccee1d858 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.blending.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,7 +37,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html
index 663a953a29e..2e8272b2bfa 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,6 +35,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html
index 52ad8646f01..077041a2940 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -38,6 +38,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html
index bf7139edce6..b162354da44 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -40,7 +40,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html
index 1f30d1e5644..b4158392660 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.composite.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,7 +37,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html
index 0619faa944f..ccae63a26ab 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -35,6 +35,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html
index 3a716838200..6ce768ad267 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.no-global-states.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,7 +37,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html
index 69120c105e5..9a20e39fd5a 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -37,6 +37,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html
index 8a770b2911e..26bdf755876 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -39,7 +39,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html
index 022736c7b5b..c8a98153816 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -32,6 +32,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html
index 80ed4e4503d..db03a3fd0c3 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.no-global-states.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -34,7 +34,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html
index 6402dc57607..41a832c516e 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -34,6 +34,6 @@
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html
index e41e7aee464..7b78f4b739a 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.global-states.shadow.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
@@ -36,7 +36,7 @@
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html
index 0c168493c21..9e5b7d5826c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.html
@@ -8,8 +8,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
var circle = new Path2D();
circle.arc(90, 90, 40, 0, 2 * Math.PI);
@@ -34,6 +34,6 @@
ctx.endLayer();
ctx.endLayer();
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html
index 3b81691e06b..99e73906096 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.nested.w.html
@@ -10,8 +10,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
var circle = new Path2D();
circle.arc(90, 90, 40, 0, 2 * Math.PI);
@@ -36,7 +36,7 @@
ctx.endLayer();
ctx.endLayer();
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html
new file mode 100644
index 00000000000..1e617751655
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob-expected.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<title>Canvas test: 2d.layer.render-opportunities.convertToBlob</title>
+<h1>2d.layer.render-opportunities.convertToBlob</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script type="module">
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ document.documentElement.classList.remove("reftest-wait");
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html
new file mode 100644
index 00000000000..c1a139a3de8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.convertToBlob-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.convertToBlob</title>
+<h1>2d.layer.render-opportunities.convertToBlob</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script type="module">
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ await canvas.convertToBlob();
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html
new file mode 100644
index 00000000000..404fef3ad6a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.convertToBlob.w.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.convertToBlob-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.convertToBlob</title>
+<h1>2d.layer.render-opportunities.convertToBlob</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = async function(e) {
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ await canvas.convertToBlob();
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html
new file mode 100644
index 00000000000..8ce0c51e8e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title>
+<h1>2d.layer.render-opportunities.createImageBitmap</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html
new file mode 100644
index 00000000000..876b027170e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.createImageBitmap-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title>
+<h1>2d.layer.render-opportunities.createImageBitmap</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ createImageBitmap(canvas);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html
new file mode 100644
index 00000000000..9a89492e399
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.createImageBitmap.w.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.createImageBitmap-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.createImageBitmap</title>
+<h1>2d.layer.render-opportunities.createImageBitmap</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ createImageBitmap(canvas);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html
new file mode 100644
index 00000000000..1ddc6d1b449
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.drawImage</title>
+<h1>2d.layer.render-opportunities.drawImage</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html
new file mode 100644
index 00000000000..dd178206073
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.drawImage-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.drawImage</title>
+<h1>2d.layer.render-opportunities.drawImage</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx2.drawImage(canvas, 0, 0);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html
new file mode 100644
index 00000000000..80fbfbd272e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.drawImage.w.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.drawImage-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.drawImage</title>
+<h1>2d.layer.render-opportunities.drawImage</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx2.drawImage(canvas, 0, 0);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html
new file mode 100644
index 00000000000..ea0e78e0f28
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.getImageData</title>
+<h1>2d.layer.render-opportunities.getImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html
new file mode 100644
index 00000000000..b6f3c1b5626
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.getImageData-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.getImageData</title>
+<h1>2d.layer.render-opportunities.getImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ ctx.getImageData(0, 0, 200, 200);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html
new file mode 100644
index 00000000000..187eb0fce96
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.getImageData.w.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.getImageData-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.getImageData</title>
+<h1>2d.layer.render-opportunities.getImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ ctx.getImageData(0, 0, 200, 200);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html
new file mode 100644
index 00000000000..3d63bbe7766
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData-expected.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.putImageData</title>
+<h1>2d.layer.render-opportunities.putImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html
new file mode 100644
index 00000000000..b4600156136
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.putImageData-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.putImageData</title>
+<h1>2d.layer.render-opportunities.putImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html
new file mode 100644
index 00000000000..9ffac071c36
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.putImageData.w.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.putImageData-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.putImageData</title>
+<h1>2d.layer.render-opportunities.putImageData</h1>
+<p class="desc">Check that layers state stack is flushed and rebuilt on frame renders.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0);
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html
new file mode 100644
index 00000000000..2833849da67
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap-expected.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.render-opportunities.transferToImageBitmap</title>
+<h1>2d.layer.render-opportunities.transferToImageBitmap</h1>
+<p class="desc">Checks that transferToImageBitmap flushes and rebuilds the state stack.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.html
new file mode 100644
index 00000000000..27830644b05
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.render-opportunities.transferToImageBitmap-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.transferToImageBitmap</title>
+<h1>2d.layer.render-opportunities.transferToImageBitmap</h1>
+<p class="desc">Checks that transferToImageBitmap flushes and rebuilds the state stack.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack.
+ // `transferToImageBitmap` clears the frame but preserves render states.
+ canvas.transferToImageBitmap();
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html
new file mode 100644
index 00000000000..06e016020db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.render-opportunities.transferToImageBitmap.w.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.render-opportunities.transferToImageBitmap-expected.html">
+<title>Canvas test: 2d.layer.render-opportunities.transferToImageBitmap</title>
+<h1>2d.layer.render-opportunities.transferToImageBitmap</h1>
+<p class="desc">Checks that transferToImageBitmap flushes and rebuilds the state stack.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack.
+ // `transferToImageBitmap` clears the frame but preserves render states.
+ canvas.transferToImageBitmap();
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html
index 66f99835df4..a3593cd2a82 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.html
@@ -9,8 +9,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(200, 200);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0,0,255,1)';
ctx.fillRect(50, 50, 75, 50);
@@ -23,6 +23,6 @@
ctx.fillRect(70, 70, 75, 50);
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html
index a717a1d3122..a66fc2bc598 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.restore-style.w.html
@@ -11,8 +11,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(200, 200);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0,0,255,1)';
ctx.fillRect(50, 50, 75, 50);
@@ -25,7 +25,7 @@
ctx.fillRect(70, 70, 75, 50);
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html
index 1d50bd4de61..c4b50282805 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.html
@@ -9,8 +9,8 @@
<p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
- const offscreen_canvas = new OffscreenCanvas(500, 500);
- const ctx = offscreen_canvas.getContext('2d');
+ const canvas = new OffscreenCanvas(500, 500);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
ctx.fillRect(50, 50, 95, 70);
@@ -32,6 +32,6 @@
ctx.endLayer();
}
- const canvas = document.getElementById("canvas");
- canvas.getContext('2d').drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html
index 7982a8dbc4f..114c5e06868 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.several-complex.w.html
@@ -11,8 +11,8 @@
</canvas>
<script id='myWorker' type='text/worker'>
self.onmessage = function(e) {
- const oc = new OffscreenCanvas(500, 500);
- const ctx = oc.getContext('2d');
+ const canvas = new OffscreenCanvas(500, 500);
+ const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0, 0, 255, 1)';
ctx.fillRect(50, 50, 95, 70);
@@ -34,7 +34,7 @@
ctx.endLayer();
}
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html
new file mode 100644
index 00000000000..c41b253c95b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed-expected.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.layer.unclosed</title>
+<h1>2d.layer.unclosed</h1>
+<p class="desc">Check that layers are rendered even if not closed.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.html
new file mode 100644
index 00000000000..689ee801cf2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.layer.unclosed-expected.html">
+<title>Canvas test: 2d.layer.unclosed</title>
+<h1>2d.layer.unclosed</h1>
+<p class="desc">Check that layers are rendered even if not closed.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.w.html
new file mode 100644
index 00000000000..0c7812e88c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/layers/2d.layer.unclosed.w.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.layer.unclosed-expected.html">
+<title>Canvas test: 2d.layer.unclosed</title>
+<h1>2d.layer.unclosed</h1>
+<p class="desc">Check that layers are rendered even if not closed.</p>
+<canvas id="canvas" width="200" height="200">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(200, 200);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py b/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py
index e923a0777ba..bf5fdeee506 100644
--- a/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/gentestutilsunion.py
@@ -170,9 +170,18 @@ def _get_test_sub_dir(name: str, name_to_sub_dir: Mapping[str, str]) -> str:
'Test "%s" has no defined target directory mapping' % name)
+def _remove_extra_newlines(text: str) -> str:
+ """Remove newlines if a backslash is found at end of line."""
+ # Lines ending with '\' gets their newline character removed.
+ text = re.sub(r'\\\n', '', text, flags=re.MULTILINE | re.DOTALL)
+
+ # Lines ending with '\-' gets their newline and any leading white spaces on
+ # the following line removed.
+ text = re.sub(r'\\-\n\s*', '', text, flags=re.MULTILINE | re.DOTALL)
+ return text
+
def _expand_test_code(code: str) -> str:
- # Remove newlines if a backslash is found at end of line.
- code = re.sub(r'\\\n\s*', '', code, flags=re.MULTILINE | re.DOTALL)
+ code = _remove_extra_newlines(code)
# Unroll expressions with a cross-product-style parameter expansion.
code = re.sub(r'@unroll ([^;]*;)', lambda m: _unroll(m.group(1)), code)
@@ -287,29 +296,18 @@ def _write_reference_test(is_js_ref: bool, templates: Mapping[str, str],
def _write_testharness_test(templates: Mapping[str, str],
template_params: MutableMapping[str, str],
- test_type: str,
canvas_path: Optional[str],
offscreen_path: Optional[str]):
# Create test cases for canvas and offscreencanvas.
code = template_params['code']
template_params['code'] = textwrap.indent(code, ' ')
if canvas_path:
- template_name = 'element'
- if test_type:
- template_name += '-' + test_type
-
pathlib.Path(f'{canvas_path}.html').write_text(
- templates[template_name] % template_params, 'utf-8')
+ templates['element'] % template_params, 'utf-8')
if offscreen_path:
- offscreen_template_name = 'offscreen'
- worker_template_name = 'worker'
- if test_type:
- offscreen_template_name += '-' + test_type
- worker_template_name += '-' + test_type
-
- offscreen_template = templates[offscreen_template_name]
- worker_template = templates[worker_template_name]
+ offscreen_template = templates['offscreen']
+ worker_template = templates['worker']
if ('then(t_pass, t_fail);' in code):
offscreen_template = offscreen_template.replace('t.done();\n', '')
@@ -321,6 +319,54 @@ def _write_testharness_test(templates: Mapping[str, str],
worker_template % template_params, 'utf-8')
+def _expand_template(template: str, template_params: Mapping[str, str]) -> str:
+ # Remove whole line comments.
+ template = re.sub(r'^ *#.*?\n', '', template, flags=re.MULTILINE)
+ # Remove trailing line comments.
+ template = re.sub(r' *#.*?$', '', template, flags=re.MULTILINE)
+
+ # Unwrap lines ending with a backslash.
+ template = _remove_extra_newlines(template)
+
+ content_without_nested_if = r'((?:(?!{%\s*(?:if|else|endif)[^%]*%}).)*?)'
+
+ # Resolve {% if <cond> %}<content>{% else %}<alternate content>{% endif %}
+ if_else_regex = re.compile(
+ r'{%\s*if\s*([^\s%]+)\s*%}' + # {% if <cond> %}
+ content_without_nested_if + # content
+ r'{%\s*else\s*%}' + # {% else %}
+ content_without_nested_if + # alternate
+ r'{%\s*endif\s*%}', # {% endif %}
+ flags=re.MULTILINE | re.DOTALL)
+ while match := if_else_regex.search(template):
+ condition, content, alternate = match.groups()
+ substitution = content if template_params[condition] else alternate
+ template = (
+ template[:match.start(0)] + substitution + template[match.end(0):])
+
+ # Resolve {% if <cond> %}<content>{% endif %}
+ if_regex = re.compile(
+ r'{%\s*if\s*([^\s%]+)\s*%}' + # {% if <cond> %}
+ content_without_nested_if + # content
+ r'{%\s*endif\s*%}', # {% endif %}
+ flags=re.MULTILINE | re.DOTALL)
+ while match := if_regex.search(template):
+ condition, content = match.groups()
+ substitution = content if template_params[condition] else ''
+ template = (
+ template[:match.start(0)] + substitution + template[match.end(0):])
+
+ return template
+
+
+def _expand_templates(templates: Mapping[str, str],
+ params: Mapping[str, str]) -> Mapping[str, str]:
+ return {
+ name: _expand_template(template, params)
+ for name, template in templates.items()
+ }
+
+
def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str],
sub_dir: str, html_canvas_cfg: TestConfig,
offscreen_canvas_cfg: TestConfig) -> None:
@@ -373,10 +419,10 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str],
notes = '<p class="notes">%s' % test['notes'] if 'notes' in test else ''
- links = f'\n<link rel="match" href="{name}-expected.html">'
- fuzzy = ('\n<meta name=fuzzy content="%s">' %
+ links = f'<link rel="match" href="{name}-expected.html">\n'
+ fuzzy = ('<meta name=fuzzy content="%s">\n' %
test['fuzzy'] if 'fuzzy' in test else '')
- timeout = ('\n<meta name="timeout" content="%s">' %
+ timeout = ('<meta name="timeout" content="%s">\n' %
test['timeout'] if 'timeout' in test else '')
timeout_js = ('// META: timeout=%s\n' % test['timeout']
if 'timeout' in test else '')
@@ -420,6 +466,16 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str],
else:
context_args = "'2d'"
+ is_promise_test = False
+ if 'test_type' in test:
+ if test['test_type'] == 'promise':
+ is_promise_test = True
+ else:
+ raise InvalidTestDefinitionError(
+ f'Test {name}\' test_type is invalid, it only accepts '
+ '"promise" now for creating promise test type in the template '
+ 'file.')
+
template_params = {
'name': name,
'desc': desc,
@@ -439,7 +495,8 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str],
'code': code_canvas,
'fallback': fallback,
'attributes': attributes,
- 'context_args': context_args
+ 'context_args': context_args,
+ 'promise_test': is_promise_test
}
canvas_path = os.path.join(html_canvas_cfg.out_dir, sub_dir, name)
@@ -455,18 +512,7 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str],
f'Test {name} is invalid, "reference" and "html_reference" can\'t '
'both be specified at the same time.')
- test_type = ''
- if 'test_type' in test:
- test_type = test['test_type']
- if test_type != 'promise':
- raise InvalidTestDefinitionError(
- f'Test {name}\' test_type is invalid, it only accepts '
- '"promise" now for creating promise test type in the template '
- 'file.')
- if js_reference is not None or html_reference is not None:
- raise InvalidTestDefinitionError(
- f'Test {name}: promise test type cannot be used together with '
- 'html_reference or js_reference.')
+ templates = _expand_templates(templates, template_params)
ref_code = js_reference or html_reference
if ref_code is not None:
@@ -476,7 +522,7 @@ def _generate_test(test: Mapping[str, Any], templates: Mapping[str, str],
offscreen_path if offscreen_canvas_cfg.enabled else None)
else:
_write_testharness_test(
- templates, template_params, test_type,
+ templates, template_params,
canvas_path if html_canvas_cfg.enabled else None,
offscreen_path if offscreen_canvas_cfg.enabled else None)
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml
index 0940471dd4d..7d8ebfccf56 100644
--- a/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/templates-new.yaml
@@ -1,7 +1,8 @@
offscreen: |
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
- <title>OffscreenCanvas test: %(name)s</title>%(timeout)s
+ <title>OffscreenCanvas test: %(name)s</title>
+ %(timeout)s\
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/html/canvas/resources/canvas-tests.js"></script>
@@ -10,48 +11,40 @@ offscreen: |
<p class="desc">%(desc)s</p>
%(notes)s
- <script>
+ <script>\
+
+ ## Promise vs. async test header:
+ {% if promise_test %}\
+ promise_test(async t => {
+ {% else %}\
var t = async_test("%(escaped_desc)s");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
});
t.step(function() {
+ {% endif %}\
+ ## Test body:
var canvas = new OffscreenCanvas(%(width)s, %(height)s);
var ctx = canvas.getContext(%(context_args)s);
- %(code)s
- t.done();
-
- });
- </script>
-
-offscreen-promise: |
- <!DOCTYPE html>
- <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
- <title>OffscreenCanvas test: %(name)s</title>%(timeout)s
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="/html/canvas/resources/canvas-tests.js"></script>
-
- <h1>%(name)s</h1>
- <p class="desc">%(desc)s</p>
+ %(code)s\
- %(notes)s
- <script>
- promise_test(async t => {
-
- var canvas = new OffscreenCanvas(%(width)s, %(height)s);
- var ctx = canvas.getContext(%(context_args)s);
-
- %(code)s
+ ## Promise vs. async test footer:
+ {% if promise_test %}\
}, "%(desc)s");
+ {% else %}\
+ t.done();
+
+ });
+ {% endif %}\
</script>
worker: |
- %(timeout_js)s// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+ %(timeout_js)s\
+ // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
// OffscreenCanvas test in a worker:%(name)s
// Description:%(desc)s
// Note:%(notes)s
@@ -59,39 +52,31 @@ worker: |
importScripts("/resources/testharness.js");
importScripts("/html/canvas/resources/canvas-tests.js");
+ ## Promise vs. async test header:
+ {% if promise_test %}\
+ promise_test(async t => {
+ {% else %}\
var t = async_test("%(escaped_desc)s");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
});
t.step(function() {
+ {% endif %}\
+ ## Test body:
var canvas = new OffscreenCanvas(%(width)s, %(height)s);
var ctx = canvas.getContext(%(context_args)s);
%(code)s
- t.done();
- });
- done();
-
+ t.done();\
-worker-promise: |
- %(timeout_js)s// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
- // OffscreenCanvas test in a worker:%(name)s
- // Description:%(desc)s
- // Note:%(notes)s
-
- importScripts("/resources/testharness.js");
- importScripts("/html/canvas/resources/canvas-tests.js");
-
- promise_test(async t => {
-
- var canvas = new OffscreenCanvas(%(width)s, %(height)s);
- var ctx = canvas.getContext(%(context_args)s);
-
- %(code)s
- t.done();
+ ## Promise vs. async test footer:
+ {% if promise_test %}\
}, "%(desc)s");
+ {% else %}\
+ });
+ {% endif %}\
done();
element: |
@@ -102,81 +87,84 @@ element: |
<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">
- %(fonts)s<body class="show_output">
+ %(fonts)s\
+ <body class="show_output">
<h1>%(name)s</h1>
<p class="desc">%(desc)s</p>
%(notes)s
- %(fonthack)s<p class="output">Actual output:</p>
- <canvas id="c" class="output" width="%(width)s" height="%(height)s"%(canvas)s>%(fallback)s</canvas>
+ %(fonthack)s\
+ <p class="output">Actual output:</p>
+ <canvas id="c" class="output" width="%(width)s" height="%(height)s"%(canvas)s>\-
+ %(fallback)s\
+ </canvas>
%(expected)s
- <ul id="d"></ul>
- <script>
- var t = async_test("%(escaped_desc)s");
- _addTest(function(canvas, ctx) {
-
- %(code)s
-
- }%(attributes)s);
- </script>
- %(images)s
-
-element-promise: |
- <!DOCTYPE html>
- <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
- <title>Canvas test: %(name)s</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">
- %(fonts)s<body class="show_output">
+ <ul id="d"></ul>\
- <h1>%(name)s</h1>
- <p class="desc">%(desc)s</p>
+ <script>\
- %(notes)s
- %(fonthack)s<p class="output">Actual output:</p>
- <canvas id="c" class="output" width="%(width)s" height="%(height)s"%(canvas)s>%(fallback)s</canvas>
- %(expected)s
- <ul id="d"></ul>
- <script>
+ ## Promise vs. async test header:
+ {% if promise_test %}\
promise_test(async t => {
var canvas = document.getElementById('c');
var ctx = canvas.getContext('2d'%(attributes)s);
+ {% else %}\
+ var t = async_test("%(escaped_desc)s");
+ _addTest(function(canvas, ctx) {
+ {% endif %}\
+ ## Test body:
%(code)s
+ ## Promise vs. async test footer:
+ {% if promise_test %}\
}, "%(desc)s");
+ {% else %}\
+ }%(attributes)s);
+ {% endif %}\
+ \
</script>
%(images)s
offscreen_ref_test: |-
<!DOCTYPE html>
- <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->%(links)s%(fuzzy)s%(timeout)s
+ <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+ {% if promise_test %}\
+ <html class="reftest-wait">
+ {% endif %}\
+ %(links)s\
+ %(fuzzy)s\
+ %(timeout)s\
<title>Canvas test: %(name)s</title>
<h1>%(name)s</h1>
<p class="desc">%(desc)s</p>
%(fonts)s%(fonthack)s%(notes)s<canvas id="canvas" width="%(width)s" height="%(height)s"%(canvas)s>
%(fallback)s
</canvas>
- <script>
- const offscreen_canvas = new OffscreenCanvas(%(width)s, %(height)s);
- const ctx = offscreen_canvas.getContext(%(context_args)s);
+ <script{% if promise_test %} type="module"{% endif %}>
+ const canvas = new OffscreenCanvas(%(width)s, %(height)s);
+ const ctx = canvas.getContext(%(context_args)s);
%(code)s
- const canvas = document.getElementById("canvas");
- canvas.getContext(%(context_args)s).drawImage(offscreen_canvas, 0, 0);
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext(%(context_args)s).drawImage(canvas, 0, 0);
+ {% if promise_test %}\
+ document.documentElement.classList.remove("reftest-wait");
+ {% endif %}\
</script>
- %(images)s
-
+ %(images)s\
+ {% if promise_test %}</html>{% endif %}
worker_ref_test: |
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
- <html class="reftest-wait">%(links)s%(fuzzy)s%(timeout)s
+ <html class="reftest-wait">
+ %(links)s\
+ %(fuzzy)s\
+ %(timeout)s\
<title>Canvas test: %(name)s</title>
<h1>%(name)s</h1>
<p class="desc">%(desc)s</p>
@@ -184,13 +172,13 @@ worker_ref_test: |
%(fallback)s
</canvas>
<script id='myWorker' type='text/worker'>
- self.onmessage = function(e) {
- const oc = new OffscreenCanvas(%(width)s, %(height)s);
- const ctx = oc.getContext('2d');
+ self.onmessage = {% if promise_test %}async {% endif %}function(e) {
+ const canvas = new OffscreenCanvas(%(width)s, %(height)s);
+ const ctx = canvas.getContext('2d');
%(code)s
- const bitmap = oc.transferToImageBitmap();
+ const bitmap = canvas.transferToImageBitmap();
self.postMessage(bitmap, bitmap);
};
</script>
@@ -204,30 +192,43 @@ worker_ref_test: |
});
worker.postMessage(null);
</script>
- %(images)s</html>
-
+ %(images)s\
+ </html>
element_ref_test: |-
<!DOCTYPE html>
- <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->%(links)s%(fuzzy)s%(timeout)s
+ <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+ {% if promise_test %}\
+ <html class="reftest-wait">
+ {% endif %}\
+ %(links)s\
+ %(fuzzy)s\
+ %(timeout)s\
<title>Canvas test: %(name)s</title>
<h1>%(name)s</h1>
<p class="desc">%(desc)s</p>
%(fonts)s%(fonthack)s%(notes)s<canvas id="canvas" width="%(width)s" height="%(height)s"%(canvas)s>
%(fallback)s
</canvas>
- <script>
+ <script{% if promise_test %} type="module"{% endif %}>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext(%(context_args)s);
%(code)s
+ {% if promise_test %}\
+ document.documentElement.classList.remove("reftest-wait");
+ {% endif %}\
</script>
- %(images)s
+ %(images)s\
+ {% if promise_test %}</html>{% endif %}
html_ref_test: |-
<!DOCTYPE html>
- <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->%(links)s%(fuzzy)s%(timeout)s
+ <!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+ %(links)s\
+ %(fuzzy)s\
+ %(timeout)s\
<title>Canvas test: %(name)s</title>
<h1>%(name)s</h1>
<p class="desc">%(desc)s</p>
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml
index 292dfcc0ec7..dd84f913f9b 100644
--- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml
@@ -500,34 +500,34 @@
- name: 2d.filter.canvasFilterObject.dropShadow.exceptions.tentative
desc: Test exceptions on CanvasFilter() dropShadow object
code: |
- @unroll @assert new CanvasFilter({\
- filter: 'dropShadow', \
- <dx | dy | floodOpacity>: \
+ @unroll @assert new CanvasFilter({\-
+ filter: 'dropShadow', \-
+ <dx | dy | floodOpacity>: \-
<10 | -1 | 0.5 | null | true | false | [] | [20] | '30'>});
- @unroll @assert new CanvasFilter({\
- filter: 'dropShadow', \
- <stdDeviation>: \
- <10 | -1 | 0.5 | null | true | false | [] | [20] | '30' | \
- [10, -1] | [0.5, null] | [true, false] | [[], [20]] | \
+ @unroll @assert new CanvasFilter({\-
+ filter: 'dropShadow', \-
+ <stdDeviation>: \-
+ <10 | -1 | 0.5 | null | true | false | [] | [20] | '30' | \-
+ [10, -1] | [0.5, null] | [true, false] | [[], [20]] | \-
['30', ['40']]>});
- @unroll @assert new CanvasFilter({\
- filter: 'dropShadow', \
- <floodColor>: \
+ @unroll @assert new CanvasFilter({\-
+ filter: 'dropShadow', \-
+ <floodColor>: \-
<'red' | 'canvas' | 'rgba(4, -3, 0.5, 1)' | '#aabbccdd' | '#abcd'>});
- @unroll @assert throws TypeError new CanvasFilter({\
- filter: 'dropShadow', \
- <dx | dy | floodOpacity>: \
+ @unroll @assert throws TypeError new CanvasFilter({\-
+ filter: 'dropShadow', \-
+ <dx | dy | floodOpacity>: \-
<NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2]>});
- @unroll @assert throws TypeError new CanvasFilter({\
- filter: 'dropShadow', \
- <stdDeviation>: \
- <NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2, 3] | \
- [1, NaN] | [1, Infinity] | [1, -Infinity] | [1, undefined] | \
+ @unroll @assert throws TypeError new CanvasFilter({\-
+ filter: 'dropShadow', \-
+ <stdDeviation>: \-
+ <NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2, 3] | \-
+ [1, NaN] | [1, Infinity] | [1, -Infinity] | [1, undefined] | \-
[1, 'test'] | [1, {}] | [1, [2, 3]]>});
- @unroll @assert throws TypeError new CanvasFilter({\
- filter: 'dropShadow', \
- <floodColor>: \
+ @unroll @assert throws TypeError new CanvasFilter({\-
+ filter: 'dropShadow', \-
+ <floodColor>: \-
<'test' | 'rgba(NaN, 3, 2, 1)' | 10 | undefined | null | NaN>});
- name: 2d.filter.canvasFilterObject.turbulence.inputTypes.tentative
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml
index d398ef2b5a2..fe1902c61b7 100644
--- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/layers.yaml
@@ -247,6 +247,146 @@
ctx.fillRect(70, 70, 75, 50);
+- name: 2d.layer.unclosed
+ desc: Check that layers are rendered even if not closed.
+ size: 200, 200
+ code: |
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ reference: |
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+
+- name: 2d.layer.render-opportunities
+ desc: Check that layers state stack is flushed and rebuilt on frame renders.
+ size: 200, 200
+ code: |
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack:
+ %(flush_canvas)s
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ reference: |
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+ ctx.endLayer();
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ variants:
+ convertToBlob:
+ test_type: "promise"
+ canvasType: ['OffscreenCanvas']
+ flush_canvas: |-
+ await canvas.convertToBlob();
+ createImageBitmap:
+ flush_canvas: createImageBitmap(canvas);
+ drawImage:
+ flush_canvas: |-
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx2.drawImage(canvas, 0, 0);
+ getImageData:
+ flush_canvas: ctx.getImageData(0, 0, 200, 200);
+ requestAnimationFrame:
+ canvasType: ['HTMLCanvas']
+ test_type: "promise"
+ flush_canvas: |-
+ await new Promise(resolve => requestAnimationFrame(resolve));
+ putImageData:
+ flush_canvas: |-
+ const canvas2 = new OffscreenCanvas(200, 200);
+ const ctx2 = canvas2.getContext('2d');
+ ctx.putImageData(ctx2.getImageData(0, 0, 1, 1), 0, 0);
+ toBlob:
+ test_type: "promise"
+ canvasType: ['HTMLCanvas']
+ flush_canvas: |-
+ await new Promise(resolve => canvas.toBlob(resolve));
+ toDataURL:
+ canvasType: ['HTMLCanvas']
+ flush_canvas: canvas.toDataURL();
+
+
+- name: 2d.layer.render-opportunities.transferToImageBitmap
+ desc: Checks that transferToImageBitmap flushes and rebuilds the state stack.
+ size: 200, 200
+ canvasType: ['OffscreenCanvas']
+ code: |
+ ctx.fillStyle = 'purple';
+ ctx.fillRect(60, 60, 75, 50);
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillRect(40, 40, 75, 50);
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(50, 50, 75, 50);
+
+ // Force a flush and restoration of the state stack.
+ // `transferToImageBitmap` clears the frame but preserves render states.
+ canvas.transferToImageBitmap();
+
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+ reference: |
+ ctx.fillStyle = 'purple';
+ ctx.globalAlpha = 0.5;
+
+ ctx.beginLayer({filter: 'dropShadow', dx: -2, dy: 2});
+ ctx.fillStyle = 'grey';
+ ctx.fillRect(70, 70, 75, 50);
+ ctx.fillStyle = 'orange';
+ ctx.fillRect(80, 80, 75, 50);
+ ctx.endLayer();
+
+ ctx.fillRect(80, 40, 75, 50);
+
+
- name: 2d.layer.several-complex
desc: >-
Test to ensure beginlayer works for filter, alpha and shadow, even with
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js
index a18688caf78..f788cbd1ebd 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/iframe-test.js
@@ -166,8 +166,8 @@ function iframe_test(description, iframe_origin, popup_origin, headers,
await evaluate(popup_token, 'opener != null'), "true",
'Popup has an opener?');
assert_equals(
- await evaluate(popup_token, `name === '${popup_token}'`), "true",
- 'Popup has a name?');
+ await evaluate(popup_token, `name === ''`), "true",
+ 'Popup name is cleared?');
// When the popup was created using window.open, we've kept a handle
// and we can do extra verifications.
@@ -194,8 +194,8 @@ function iframe_test(description, iframe_origin, popup_origin, headers,
assert_equals(await evaluate(popup_token, 'opener != null'), "false",
'Popup has an opener?');
assert_equals(
- await evaluate(popup_token, `name === '${popup_token}'`), "false",
- 'Popup has a name?');
+ await evaluate(popup_token, `name === ''`), "true",
+ 'Popup name is cleared?');
// When the popup was created using window.open, we've kept a handle
// and we can do extra verifications.
@@ -213,8 +213,8 @@ function iframe_test(description, iframe_origin, popup_origin, headers,
assert_equals(await evaluate(popup_token, 'opener != null'), "false",
'Popup has an opener?');
assert_equals(
- await evaluate(popup_token, `name === '${popup_token}'`), "false",
- 'Popup has a name?');
+ await evaluate(popup_token, `name === ''`), "true",
+ 'Popup name is cleared?');
// When the popup was created using window.open, we've kept a handle
// and we can do extra verifications.
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html
index 4c8e96f5793..5bc718e2a89 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html
@@ -10,15 +10,8 @@
<script>
testAccessProperty(
- "postMessage single arg",
- w => w.postMessage(""),
- expectReport = false,
- use_restrict_properties = true
-);
-
-testAccessProperty(
- "postMessage double arg",
- w => w.postMessage("", ""),
+ "postMessage",
+ w => w.postMessage("message", "*"),
expectReport = false,
use_restrict_properties = true
);
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html
new file mode 100644
index 00000000000..9bc171a269c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<title>
+ Verify that we consider browsing context group reuse for COOP reporting.
+</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script>
+<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
+<script
+ src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=f1e361ab5854f2dcfe0224b19bc53199&report_only_id=b6fe666b74547291d52d72790adde05c"></script>
+<script>
+
+const same_origin = get_host_info().HTTPS_ORIGIN;
+const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
+
+promise_test(async test => {
+ // To receive reports use the same hard-coded value as the one passed in the
+ // headers and to "reporting-common.js".
+ const report_token = "b6fe666b74547291d52d72790adde05c";
+ const reportTo = reportToHeaders(report_token);
+
+ // 1. Open a popup without any COOP. It should be in a
+ // different virtual browsing context group.
+ const opener_token = token(); // For this window.
+ const initial_openee_token = token();
+ const initial_openee_url = cross_origin + executor_path +
+ `&uuid=${initial_openee_token}`;
+ let openee = window.open(initial_openee_url);
+
+ // 2. Navigate the openee to a COOP-RO: restrict-properties page. If the
+ // policy was enforced, it would live in the same browsing context group as
+ // this page. The virtual browsing context group should similarly be equal.
+ // Note: We omit the reporting endpoint header, because it is not possible to
+ // easily escape it. Since it is not necessary in this test, we skip it.
+ const final_openee_token = token();
+ const final_openee_url = same_origin + executor_path +
+ reportTo.coopReportOnlyRestrictPropertiesHeader +
+ `&uuid=${final_openee_token}`;
+
+ send(initial_openee_token, `location.href = '${final_openee_url}';`);
+ test.add_cleanup(() => send(final_openee_token, "window.close()"));
+
+ // Wait for the final openee to load.
+ send(final_openee_token,
+ `send("${opener_token}", "Ready");
+ `);
+ assert_equals(await receive(opener_token), "Ready");
+
+ // 3. Try to access the openee from the opener. No report should be sent.
+ tryAccess(openee);
+
+ let report =
+ await receiveReport(report_token, "access-from-coop-page-to-openee")
+ assert_equals(report, "timeout");
+
+}, "access-reporting-browsing-context-group-reuse");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers
new file mode 100644
index 00000000000..33abadd83dd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers
@@ -0,0 +1,2 @@
+Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint"
+Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=f1e361ab5854f2dcfe0224b19bc53199", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b6fe666b74547291d52d72790adde05c"
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html
index 60322bffe7a..b1da8cf77ce 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html
@@ -8,7 +8,7 @@
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=4f545c5dbcce012cd30af173b08dcdfb&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script>
+ src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=fb054dadb3a9ec17b5cd5c0152d2a7dd&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script>
<script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers
index 424ad3e8de0..07ecad96f24 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers
@@ -1,2 +1,2 @@
Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=4f545c5dbcce012cd30af173b08dcdfb", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2"
+Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fb054dadb3a9ec17b5cd5c0152d2a7dd", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2"
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html
index 5deb115d94e..a8c11d7a4a8 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html
@@ -8,7 +8,7 @@
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=c265b07fbb3bffa2cd2a5179d686ced2&report_only_id=b4ea2bc3c537541b4fd408dc8f2b5c39"></script>
+ src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=ed5a8be35e4e21c2ba960e6574e0a32c&report_only_id=fa22ddc676642edae42c75defb82ba2e"></script>
<script>
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers
index 6339ea34c70..a61e2919c8a 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers
@@ -1,2 +1,2 @@
Cross-Origin-Opener-Policy: restrict-properties; report-to="coop-report-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=d9fe7e0e1a72f4ff2c4ea6d9dd44b5f1", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b4ea2bc3c537541b4fd408dc8f2b5c39"
+Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=ed5a8be35e4e21c2ba960e6574e0a32c", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fa22ddc676642edae42c75defb82ba2e"
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html
index cf1385e7663..eb808428634 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html
@@ -55,7 +55,7 @@ let tests = [
"body": {
"disposition": "reporting",
"effectivePolicy": "restrict-properties",
- "previousResponseURL": `${location.href}`,
+ "previousResponseURL": "",
"referrer": `${location.origin}/`,
"type": "navigation-to-response"
},
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html
index 9ff374c1c78..ad57afccf8f 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html
@@ -55,7 +55,7 @@ let tests = [
"body": {
"disposition": "enforce",
"effectivePolicy": "restrict-properties",
- "previousResponseURL": `${location.href}`,
+ "previousResponseURL": "",
"referrer": `${location.origin}/`,
"type": "navigation-to-response"
},
diff --git a/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html b/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html
index 3319c1875bf..082ed281fef 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html
+++ b/tests/wpt/web-platform-tests/html/dom/elements/name-content-attribute-and-property.html
@@ -26,7 +26,20 @@
"iframe", "img", "input", "map", "meta", "object", "output",
"param", "select", "slot", "textarea",
];
+
+ // Optionally add "details" to reflectingTagNames since Chromium is
+ // prototyping the proposal at
+ // https://open-ui.org/components/accordion.explainer that adds this
+ // reflection to "details" as well.
+ // TODO(https://crbug.com/1444057): This runtime check should eventually be
+ // removed, and depending on the outcome of the proposal details should
+ // possibly be added to reflectingTagNames unconditionally.
+ if ("name" in HTMLDetailsElement.prototype) {
+ reflectingTagNames.push("details");
+ }
+
const old_and_new_elements = [...HTML5_ELEMENTS, ...HTML5_DEPRECATED_ELEMENTS];
+
const nonReflectingTagNames = old_and_new_elements.filter(x => !reflectingTagNames.includes(x));
reflectingTagNames.forEach(function(tagName) {
diff --git a/tests/wpt/web-platform-tests/html/dom/idlharness.https.html b/tests/wpt/web-platform-tests/html/dom/idlharness.https.html
index 4e9e25fd5df..7d693d3c0a2 100644
--- a/tests/wpt/web-platform-tests/html/dom/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/html/dom/idlharness.https.html
@@ -38,7 +38,7 @@ const waitForLoad = new Promise(resolve => { addEventListener('load', resolve);
idl_test(
['html'],
- ['wai-aria', 'SVG', 'cssom', 'touch-events', 'uievents', 'dom', 'xhr', 'FileAPI', 'mediacapture-streams'],
+ ['wai-aria', 'SVG', 'cssom', 'touch-events', 'uievents', 'dom', 'xhr', 'FileAPI', 'mediacapture-streams', 'performance-timeline'],
async idlArray => {
self.documentWithHandlers = new Document();
const handler = function(e) {};
diff --git a/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js b/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js
index 16f6e85ce7c..88942ddfea1 100644
--- a/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js
+++ b/tests/wpt/web-platform-tests/html/dom/idlharness.worker.js
@@ -5,7 +5,7 @@ importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js");
idl_test(
["html"],
- ["wai-aria", "dom", "cssom", "touch-events", "uievents"],
+ ["wai-aria", "dom", "cssom", "touch-events", "uievents", "performance-timeline"],
idlArray => {
idlArray.add_untested_idls('typedef Window WindowProxy;');
idlArray.add_objects({
diff --git a/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html b/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html
index 8ff5843c866..55619661acc 100644
--- a/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html
+++ b/tests/wpt/web-platform-tests/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-event.html
@@ -20,25 +20,19 @@ setup({explicit_done: true});
setup({explicit_timeout: true});
promise_test(async t => {
- let button = document.querySelector("button");
- let focused = false;
-
- on_event(button, "focus", () => {
- focused = !focused;
- });
-
- on_event(button, "click", () => {
- test(() => {
- assert_true(focused, "Focus on the button by Tab key");
- }, "Check if click event will be fired when press the 'enter' key while the element is focused");
- done();
- });
-
- const altKey = '\uE004';
- const enterKey = '\uE007';
- await test_driver.send_keys(button, altKey);
- await test_driver.send_keys(button, enterKey);
-
+ const button = document.querySelector("button");
+ on_event(button, "click", () => {
+ test(() => {
+ assert_true(document.activeElement == button, "Focus on the button by Tab key");
+ }, "Check if click event will be fired when press the 'enter' key while the element is focused");
+ done();
+ });
+
+ window.focus();
+ document.activeElement?.blur();
+ getSelection().collapse(document.querySelector("p"), 0);
+ const enterKey = '\uE007';
+ await test_driver.send_keys(button, enterKey);
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html
index 9d1c9eb77e9..cbdbb72c674 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr.html
@@ -5,32 +5,19 @@
<link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="resources/dirname.js"></script>
<div id="log"></div>
-<form action="dirname-ltr-iframe.html" method=get target="iframe">
+<form action="resources/dirname-iframe.html" method=get target="iframe">
<p><label>Comment: <input type=text name="comment" dirname="comment.dir" required></label></p>
<p><button type=submit>Post Comment</button></p>
</form>
<iframe name="iframe"></iframe>
<script>
- function getParameterByName(name) {
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
- var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
- results = regex.exec(document.querySelector("iframe").contentWindow.location.search);
- return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
- }
-
var t = async_test("submit element directionality");
document.querySelector("input").value = "foobar";
document.querySelector("button").click();
- var iframe = document.querySelector("iframe");
- iframe.onload = t.step_func(function() {
- // The initial about:blank load event can be fired before the form navigation occurs.
- // See https://github.com/whatwg/html/issues/490 for more information.
- if(iframe.contentWindow.location.href == "about:blank") { return; }
-
- assert_equals(getParameterByName("comment.dir"), "ltr");
-
- t.done();
+ onIframeLoadedDone(t, function(params) {
+ assert_equals(params.get("comment.dir"), "ltr");
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-only-if-applies.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-only-if-applies.html
new file mode 100644
index 00000000000..7d542111896
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-only-if-applies.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Submitting element directionality: the dirname attribute</title>
+ <link rel="author" title="Vincent Hilla" href="mailto:vhilla@mozilla.com">
+ <link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/dirname.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <form action="resources/dirname-iframe.html" method=get target="iframe">
+ <textarea name="textarea" dirname="textarea.dir"></textarea>
+ <p><button id="btn-submit" type=submit>Submit</button></p>
+ </form>
+ <iframe name="iframe"></iframe>
+
+ <script>
+ const types_applies = ["text", "search"];
+ const types_not = [
+ "hidden", "tel", "url", "email", "password", "date", "month", "week", "time",
+ "datetime-local", "number", "range", "color", "checkbox", "radio", "file", "submit",
+ "image", "reset", "button"
+ ];
+ const types = [...types_applies, ...types_not];
+ let form = document.querySelector("form");
+ for (const type of types) {
+ let p = document.createElement("p");
+ let lbl = document.createElement("label");
+ let txt = document.createTextNode(type + ": ");
+ let inp = document.createElement("input");
+ inp.type = type;
+ inp.name = type;
+ inp.dirName = type + ".dir";
+ inp.id = "testelement." + type
+ lbl.appendChild(txt);
+ lbl.appendChild(inp);
+ p.appendChild(lbl);
+ form.appendChild(p);
+ }
+ // Avoid continue in https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#constructing-form-data-set:attr-fe-dirname
+ document.getElementById("testelement.checkbox").checked = true;
+ document.getElementById("testelement.radio").checked = true;
+
+ function assertInputSubmission(data) {
+ for (const type of types_applies) {
+ assert_equals(data.get(type + ".dir"), "ltr", "Submit ltr for input type=" + type);
+ }
+ for (const type of types_not) {
+ assert_false(data.has(type + ".dir"), "Do not submit dir for input type=" + type);
+ }
+ }
+
+ const data = new FormData(form);
+ test(function() {
+ assertInputSubmission(data);
+ }, "Submit input element directionality to FormData, if dirname applies.");
+ test(function() {
+ assert_equals(data.get("textarea.dir"), "ltr", "Submit ltr for textarea");
+ }, "Submit textarea element directionality to FormData.");
+
+ document.getElementById("btn-submit").click();
+ const t_inp = async_test("Submit input element directionality, if dirname applies.");
+ onIframeLoadedDone(t_inp, function(params) {
+ assertInputSubmission(params);
+ });
+ const t_ta = async_test("Submit textarea element directionality.");
+ onIframeLoadedDone(t_ta, function(params) {
+ assert_equals(params.get("textarea.dir"), "ltr", "Submit ltr for textarea");
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html
index 6368a26fafd..072b8508685 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-auto.html
@@ -5,33 +5,20 @@
<link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="resources/dirname.js"></script>
<div id="log"></div>
-<form action="dirname-ltr-iframe.html" method=get target="iframe">
+<form action="resources/dirname-iframe.html" method=get target="iframe">
<p><label>Comment: <input type=text name="comment" dir="auto" dirname="comment.dir" required/></label></p>
<p><button type=submit>Post Comment</button></p>
</form>
<iframe name="iframe"></iframe>
<script>
- function getParameterByName(name) {
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
- var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
- results = regex.exec(document.querySelector("iframe").contentWindow.location.search);
- return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
- }
-
var t = async_test("submit element directionality");
var rtlValue = "مرحبا";
document.querySelector("input").value = rtlValue;
document.querySelector("button").click();
- var iframe = document.querySelector("iframe");
- iframe.onload = t.step_func(function() {
- // The initial about:blank load event can be fired before the form navigation occurs.
- // See https://github.com/whatwg/html/issues/490 for more information.
- if(iframe.contentWindow.location.href == "about:blank") { return; }
-
- assert_equals(getParameterByName("comment.dir"), "rtl");
-
- t.done();
+ onIframeLoadedDone(t, function(params) {
+ assert_equals(params.get("comment.dir"), "rtl");
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html
index 1e6967d914a..e7b07288d6b 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-inherited.html
@@ -5,34 +5,21 @@
<link rel=help href="https://html.spec.whatwg.org/multipage/#submitting-element-directionality:-the-dirname-attribute">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="resources/dirname.js"></script>
<div id="log"></div>
<div dir="rtl">
- <form action="dirname-ltr-iframe.html" method=get target="iframe">
+ <form action="resources/dirname-iframe.html" method=get target="iframe">
<p><label>Comment: <input type=text name="comment" dirname="comment.dir" required/></label></p>
<p><button type=submit>Post Comment</button></p>
</form>
</div>
<iframe name="iframe"></iframe>
<script>
- function getParameterByName(name) {
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
- var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
- results = regex.exec(document.querySelector("iframe").contentWindow.location.search);
- return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
- }
-
var t = async_test("submit element directionality");
document.querySelector("input").value = "foobar";
document.querySelector("button").click();
- var iframe = document.querySelector("iframe");
- iframe.onload = t.step_func(function() {
- // The initial about:blank load event can be fired before the form navigation occurs.
- // See https://github.com/whatwg/html/issues/490 for more information.
- if(iframe.contentWindow.location.href == "about:blank") { return; }
-
- assert_equals(getParameterByName("comment.dir"), "rtl");
-
- t.done();
+ onIframeLoadedDone(t, function(params) {
+ assert_equals(params.get("comment.dir"), "rtl");
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr-iframe.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname-iframe.html
index b5ed7e3d9a7..b5ed7e3d9a7 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/dirname-ltr-iframe.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname-iframe.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname.js b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname.js
new file mode 100644
index 00000000000..f0e97bc3014
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/resources/dirname.js
@@ -0,0 +1,12 @@
+function onIframeLoadedDone(t, cb, selector="iframe") {
+ const iframe = document.querySelector(selector);
+ iframe.addEventListener("load", function() {
+ // The initial about:blank load event can be fired before the form navigation occurs.
+ // See https://github.com/whatwg/html/issues/490 for more information.
+ if(iframe.contentWindow.location.href == "about:blank") { return; }
+
+ const params = new URLSearchParams(iframe.contentWindow.location.search);
+ t.step(() => cb(params))
+ t.done();
+ });
+}
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html
new file mode 100644
index 00000000000..b4028784edd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="help"
+ href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#form-submission-algorithm">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/targetted-form.js"></script>
+
+<!-- The onclick requestSubmit() should get superseded by the default
+ action submit, which isn't preventDefaulted by onclick here.
+ This is per the Form Submission Algorithm [1], which
+ says that new planned navigations replace old planned navigations.
+ [1] https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#planned-navigation
+ -->
+
+<body>
+ <script>
+ function runTest({ submitterType, preventDefaultSubmitButton, preventDefaultRequestSubmit, passSubmitter, testName }) {
+ if (preventDefaultRequestSubmit && preventDefaultSubmitButton) {
+ // In this case, no submit action will take place.
+ return;
+ }
+
+ promise_test(async () => {
+ const form = populateForm(`<input name=n1 value=v1><${submitterType} type=submit name=n2 value=v2>${submitterType == 'button' ? '</button>' : ''}`);
+ const input = form.elements[0];
+ const submitter = form.elements[1];
+ submitter.addEventListener('click', e => {
+ form.addEventListener('submit', e => {
+ submitter.value = 'v3';
+ if (preventDefaultRequestSubmit) {
+ e.preventDefault();
+ }
+ }, { once: true });
+
+ form.requestSubmit(passSubmitter ? submitter : null);
+ input.value = 'v2';
+
+ form.addEventListener('submit', e => {
+ submitter.value = 'v4';
+ if (preventDefaultSubmitButton) {
+ e.preventDefault();
+ }
+ }, { once: true });
+ });
+
+ let formDataInEvent;
+ form.addEventListener('formdata', e => {
+ formDataInEvent = e.formData;
+ });
+
+ submitter.click();
+ assert_equals(formDataInEvent.get('n1'), preventDefaultSubmitButton ? 'v1' : 'v2');
+ if (preventDefaultSubmitButton && !passSubmitter) {
+ assert_false(formDataInEvent.has('n2'));
+ } else {
+ assert_equals(formDataInEvent.get('n2'),
+ preventDefaultSubmitButton && passSubmitter ? 'v3' : 'v4')
+ }
+
+ let iframe = form.previousSibling;
+ await loadPromise(iframe);
+ assert_equals(getParamValue(iframe, 'n1'), preventDefaultSubmitButton ? 'v1' : 'v2');
+ if (preventDefaultSubmitButton && !passSubmitter) {
+ assert_equals(getParamValue(iframe, 'n2'), null);
+ } else {
+ assert_equals(getParamValue(iframe, 'n2'),
+ preventDefaultSubmitButton && passSubmitter ? 'v3' : 'v4');
+ }
+ }, testName);
+ }
+
+ function runTest2({ submitterType, callRequestSubmit, callSubmit, preventDefault, passSubmitter, testName }) {
+ if (!callSubmit && preventDefault) {
+ // Without callSubmit, preventDefault will cause the form to not get
+ // submitted.
+ return;
+ }
+
+ promise_test(async () => {
+ const form = populateForm(`<input name=n1 value=v1><${submitterType} type=submit name=n2 value=v3>${submitterType == 'button' ? '</button>' : ''}`);
+ const input = form.elements[0];
+ const submitter = form.elements[1];
+
+ form.addEventListener('submit', e => {
+ if (callRequestSubmit) {
+ form.requestSubmit(passSubmitter ? submitter : null);
+ input.value = 'v2';
+ }
+ if (callSubmit) {
+ form.submit();
+ }
+ if (preventDefault) {
+ e.preventDefault();
+ }
+ });
+
+ form.requestSubmit(passSubmitter ? submitter : null);
+ let iframe = form.previousSibling;
+ await loadPromise(iframe);
+
+ assert_equals(getParamValue(iframe, 'n1'), callRequestSubmit ? 'v2' : 'v1');
+ if (callSubmit || !passSubmitter) {
+ assert_equals(getParamValue(iframe, 'n2'), null);
+ } else {
+ assert_equals(getParamValue(iframe, 'n2'), 'v3')
+ }
+ }, testName);
+ }
+
+ function callWithArgs(test, argsLeft, args) {
+ if (argsLeft.length == 0) {
+ args.testName = 'test ' + test.name + ' with ' + Object.entries(args).map(([key, value]) => `${key}: ${value}`).join(', ');
+ test(args);
+ return;
+ }
+
+ let [name, values] = argsLeft[0];
+ for (let value of values) {
+ callWithArgs(test, argsLeft.slice(1), { ...args, [name]: value })
+ }
+ }
+
+ let args = {
+ submitterType: ['input', 'button'],
+ preventDefaultRequestSubmit: [true, false],
+ preventDefaultSubmitButton: [true, false],
+ passSubmitter: [true, false],
+ };
+ callWithArgs(runTest, Object.entries(args), {});
+
+ args = {
+ submitterType: ['input', 'button'],
+ callRequestSubmit: [true, false],
+ callSubmit: [true, false],
+ preventDefault: [true, false],
+ passSubmitter: [true, false],
+ };
+ callWithArgs(runTest2, Object.entries(args), {});
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html
index 854b1f48046..d1b46a22d86 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/select-event.html
@@ -6,7 +6,6 @@
<link rel=help href="https://html.spec.whatwg.org/multipage/#textFieldSelection">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<script src="/common/rendering-utils.js"></script>
<div id="log"></div>
<textarea>foobar</textarea>
@@ -60,10 +59,25 @@ const actions = [
}
];
+function waitForEvents() {
+ // Engines differ in when these events are sent (see:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1785615) so wait for both a
+ // frame to be rendered, and a timeout.
+ return new Promise(resolve => {
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ setTimeout(() => {
+ resolve();
+ });
+ });
+ });
+ });
+}
+
function initialize(el) {
el.setRangeText("foobar", 0, el.value.length, "start");
// Make sure to flush async dispatches
- return waitForAtLeastOneFrame();
+ return waitForEvents();
}
els.forEach((el) => {
@@ -93,7 +107,7 @@ els.forEach((el) => {
action.action(el);
- await waitForAtLeastOneFrame();
+ await waitForEvents();
el.onselect = null;
}, `${elLabel}: ${action.label} a second time (must not fire select)`);
@@ -104,7 +118,7 @@ els.forEach((el) => {
action.action(element);
- await waitForAtLeastOneFrame();
+ await waitForEvents();
assert_true(fired, "event didn't fire");
}, `${elLabel}: ${action.label} disconnected node`);
@@ -119,7 +133,7 @@ els.forEach((el) => {
action.action(element);
assert_false(fired, "the select event must not fire synchronously");
- await waitForAtLeastOneFrame();
+ await waitForEvents();
assert_true(fired, "event didn't fire");
}, `${elLabel}: ${action.label} event queue`);
@@ -132,7 +146,7 @@ els.forEach((el) => {
action.action(element);
action.action(element);
- await waitForAtLeastOneFrame();
+ await waitForEvents();
assert_equals(selectCount, 1, "the select event must not fire twice");
}, `${elLabel}: ${action.label} twice in disconnected node (must fire select only once)`);
});
diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html
new file mode 100644
index 00000000000..9aa5ce42e8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html
@@ -0,0 +1,197 @@
+<!DOCTYPE HTML>
+<meta charset=UTF-8>
+<title>Test for the name attribute creating exclusive accordions from details elements</title>
+<link rel="author" title="L. David Baron" href="https://dbaron.org/">
+<link rel="author" title="Google" href="http://www.google.com/">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-details-element">
+<link rel="help" href="https://open-ui.org/components/accordion.explainer">
+<link rel="help" href="https://github.com/openui/open-ui/issues/725">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1444057">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="container">
+</div>
+
+<script>
+
+function assert_element_states(elements, expectations, description) {
+ assert_array_equals(elements.map(e => Number(e.open)), expectations, description);
+}
+
+let container = document.getElementById("container");
+
+promise_test(async t => {
+ container.innerHTML = `
+ <details name="a">
+ <summary>1</summary>
+ This is the first item.
+ </details>
+
+ <details name="a">
+ <summary>2</summary>
+ This is the second item.
+ </details>
+ `;
+ let first = container.firstElementChild;
+ let second = first.nextElementSibling;
+ assert_false(first.open);
+ assert_false(second.open);
+ first.open = true;
+ assert_true(first.open);
+ assert_false(second.open);
+ second.open = true;
+ assert_false(first.open);
+ assert_true(second.open);
+ second.open = true;
+ assert_false(first.open);
+ assert_true(second.open);
+ second.open = false;
+ assert_false(first.open);
+ assert_false(second.open);
+}, "basic handling of mutually exclusive details");
+
+promise_test(async t => {
+ container.innerHTML = `
+ <details name="a" open>
+ <summary>1</summary>
+ This is the first item.
+ </details>
+
+ <details name="a">
+ <summary>2</summary>
+ This is the second item.
+ </details>
+
+ <details name="a" open>
+ <summary>3</summary>
+ This is the third item.
+ </details>
+ `;
+ let first = container.firstElementChild;
+ let second = first.nextElementSibling;
+ let third = second.nextElementSibling;
+ function assert_states(expected_first, expected_second, expected_third, description) {
+ assert_array_equals([first.open, second.open, third.open], [expected_first, expected_second, expected_third], description);
+ }
+
+ assert_states(true, false, true, "initial states from open attribute");
+ first.open = true;
+ assert_states(true, false, true, "non-mutation doesn't change state");
+ second.open = true;
+ assert_states(false, true, false, "mutation closes multiple open elements");
+ third.setAttribute("open", "");
+ assert_states(false, false, true, "setAttribute closes other open element");
+}, "more complex handling of mutually exclusive details");
+
+promise_test(async t => {
+ let details_elements_string = `
+ <details name="a"></details>
+ <details name="a" open></details>
+ <details name="b"></details>
+ <details name="b"></details>
+ `;
+ container.innerHTML = `
+ ${details_elements_string}
+ <div id="shadow_host"></div>
+ `;
+ let shadow_root = document.getElementById("shadow_host").attachShadow({ mode: "open" });
+ shadow_root.innerHTML = details_elements_string;
+ let elements = Array.from(container.querySelectorAll("details")).concat(Array.from(shadow_root.querySelectorAll("details")));
+
+ assert_element_states(elements, [0, 1, 0, 0, 0, 1, 0, 0], "initial states from open attribute");
+ elements[4].open = true;
+ assert_element_states(elements, [0, 1, 0, 0, 1, 0, 0, 0], "after mutation in shadow tree");
+ for (let i = 0; i < 8; ++i) {
+ elements[i].open = true;
+ }
+ assert_element_states(elements, [0, 1, 0, 1, 0, 1, 0, 1], "after setting all elements open");
+ elements[0].open = true;
+ assert_element_states(elements, [1, 0, 0, 1, 0, 1, 0, 1], "after final mutation");
+}, "mutually exclusive details across multiple names and multiple tree scopes");
+
+// The next two tests test characteristics of the design that are only
+// exposed via mutation events. If mutation events (for attribute
+// addition/removal) are removed from the web, these tests could be
+// removed, and some small simplifications could be made to the code
+// implementing this feature.
+function mutation_events_for_attribute_removal_supported() {
+ container.innerHTML = `<div id="event-removal-test"></div>`;
+ let element = container.firstChild;
+ let event_fired = false;
+ element.addEventListener("DOMSubtreeModified", event => event_fired = true);
+ element.removeAttribute("id");
+ return event_fired;
+}
+
+promise_test(async t => {
+ if (!mutation_events_for_attribute_removal_supported()) {
+ return;
+ }
+ container.innerHTML = `
+ <details name="a" id="e0" open></details>
+ <details name="a" id="e1"></details>
+ <details name="a" id="e3" open></details>
+ `;
+ let e2 = document.createElement("details");
+ e2.id = "e2";
+ e2.name = "a";
+ e2.open = true;
+ let elements = [ document.getElementById("e0"),
+ document.getElementById("e1"),
+ e2,
+ document.getElementById("e3") ];
+ container.insertBefore(e2, elements[3]);
+
+ let received_ids = [];
+ let listener = event => {
+ assert_equals(event.type, "DOMSubtreeModified");
+ assert_equals(event.target.nodeType, Node.ELEMENT_NODE);
+ let element = event.target;
+ assert_equals(element.localName, "details");
+ received_ids.push(element.id);
+ };
+ for (let element of elements) {
+ element.addEventListener("DOMSubtreeModified", listener);
+ }
+ assert_array_equals(received_ids, []);
+ assert_element_states(elements, [1, 0, 1, 1], "states before mutation");
+ elements[1].open = true;
+ assert_array_equals(received_ids, ["e0", "e3", "e2", "e1"],
+ "removal events received in node insertion order, followed by addition event");
+ assert_element_states(elements, [0, 1, 0, 0], "states after mutation");
+}, "mutation event order matches order of insertion in set of named elements");
+
+promise_test(async t => {
+ if (!mutation_events_for_attribute_removal_supported()) {
+ return;
+ }
+ container.innerHTML = `
+ <details name="a" id="e0" open></details>
+ <details name="a" id="e1"></details>
+ <details name="a" id="e2" open></details>
+ `;
+ let elements = [ document.getElementById("e0"),
+ document.getElementById("e1"),
+ document.getElementById("e2") ];
+
+ let received_ids = [];
+ let listener = event => {
+ received_ids.push(event.target.id);
+ let i = 0;
+ for (let element of elements) {
+ element.setAttribute("name", `b${i++}`);
+ }
+ };
+ for (let element of elements) {
+ element.addEventListener("DOMSubtreeModified", listener);
+ }
+ assert_array_equals(received_ids, []);
+ assert_element_states(elements, [1, 0, 1], "states before mutation");
+ elements[1].open = true;
+ assert_array_equals(received_ids, ["e0", "e2", "e1"],
+ "removal events received in node insertion order, followed by addition event, despite changes to name during mutation event");
+ assert_element_states(elements, [0, 1, 0], "states after mutation");
+}, "interaction of open attribute changes with mutation events");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html
new file mode 100644
index 00000000000..efd242c5769
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/issues/8904">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/declarative-shadow-dom-polyfill.js"></script>
+
+<button id=b1>button 1</button>
+<button id=b2>button 2</button>
+<div id=host>
+ <template shadowrootmode=open>
+ <button>button in shadowroot outside dialog</button>
+ </template>
+</div>
+<dialog id=mydialog>
+ <button id=b3>button in dialog</button>
+ <div id=dialoghost>
+ <template shadowrootmode=open>
+ <button>button in shadowroot in dialog</button>
+ </template>
+ </div>
+</dialog>
+
+<div id=host2>
+ <template shadowrootmode=open>
+ <dialog>
+ <slot></slot>
+ </dialog>
+ </template>
+ <button id=host2button>button</button>
+</div>
+
+<script>
+polyfill_declarative_shadow_dom(document);
+
+test(() => {
+ b1.focus();
+ mydialog.show();
+ b2.focus();
+ mydialog.close();
+ assert_equals(document.activeElement, b2);
+}, 'Focus should not be restored if the currently focused element is not inside the dialog.');
+
+test(() => {
+ const shadowbutton = host.shadowRoot.querySelector('button');
+ b2.focus();
+ mydialog.show();
+ shadowbutton.focus();
+ mydialog.close();
+ assert_equals(document.activeElement, host, 'document.activeElement should point at the shadow host.');
+ assert_equals(host.shadowRoot.activeElement, shadowbutton, 'The button in the shadowroot should remain focused.');
+}, 'Focus restore should not occur when the focused element is in a shadowroot outside of the dialog.');
+
+test(() => {
+ const shadowbutton = dialoghost.shadowRoot.querySelector('button');
+ b2.focus();
+ mydialog.show();
+ shadowbutton.focus();
+ mydialog.close();
+ assert_equals(document.activeElement, b2);
+}, 'Focus restore should occur when the focused element is in a shadowroot inside the dialog.');
+
+test(() => {
+ const dialog = host2.shadowRoot.querySelector('dialog');
+ b2.focus();
+ dialog.show();
+ host2button.focus();
+ dialog.close();
+ assert_equals(document.activeElement, b2);
+}, 'Focus restore should occur when the focused element is slotted into a dialog.');
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html
new file mode 100644
index 00000000000..c86cbe84a62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-no-throw-requested-state.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/pull/9142">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<dialog>hello</dialog>
+
+<script>
+test(() => {
+ const dialog = document.querySelector('dialog');
+
+ // calling close() on a dialog that is already closed should not throw.
+ dialog.close();
+
+ dialog.show();
+ // calling show() on a dialog that is already showing non-modal should not throw.
+ dialog.show();
+ assert_throws_dom('InvalidStateError', () => dialog.showModal(),
+ 'Calling showModal() on a dialog that is already showing non-modal should throw.');
+ dialog.close();
+
+ dialog.showModal();
+ assert_throws_dom('InvalidStateError', () => dialog.show(),
+ 'Calling show() on a dialog that is already showing modal should throw.');
+ // calling showModal() on a dialog that is already showing modal should not throw.
+ dialog.showModal();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html
index eab61407c8b..32d3deb3848 100644
--- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-attribute-basic.html
@@ -254,11 +254,21 @@ window.onload = () => {
},{once: true});
assert_true(popover.matches(':popover-open'));
assert_true(other_popover.matches(':popover-open'));
- assert_throws_dom('InvalidStateError', () => popover.hidePopover());
+ popover.hidePopover(); // Calling hidePopover on a hidden popover should not throw.
assert_false(other_popover.matches(':popover-open'),'unrelated popover is hidden');
assert_false(popover.matches(':popover-open'),'popover is still hidden if its type changed during hide event');
- assert_throws_dom("InvalidStateError",() => other_popover.hidePopover(),'Nested popover should already be hidden');
- },`Changing the popover type in a "beforetoggle" event handler should throw an exception (during hidePopover())`);
+ other_popover.hidePopover(); // Calling hidePopover on a hidden popover should not throw.
+ },`Changing the popover type in a "beforetoggle" event handler during hidePopover() should not throw an exception`);
+
+ test(t => {
+ const popover = document.createElement('div');
+ assert_throws_dom('NotSupportedError', () => popover.hidePopover(),
+ 'Calling hidePopover on an element without a popover attribute should throw.');
+ popover.setAttribute('popover', 'auto');
+ popover.hidePopover(); // Calling hidePopover on a disconnected popover should not throw.
+ assert_throws_dom('InvalidStateError', () => popover.showPopover(),
+ 'Calling showPopover on a disconnected popover should throw.');
+ },'Calling hidePopover on a disconnected popover should not throw.');
function interpretedType(typeString,method) {
if (validTypes.includes(typeString))
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hide.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hide.tentative.html
new file mode 100644
index 00000000000..57ca5723de5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hide.tentative.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>The popover-hide-delay CSS property</title>
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel=help href="https://open-ui.org/components/popover.research.explainer">
+<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-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/popover-utils.js"></script>
+
+<body>
+<script src="resources/popover-hover-hide-common.js"></script>
+<script>
+
+// See popover-hover-hide-common.js for documentation.
+runHoverHideTestsForInvokerAction('hide');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hover.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hover.tentative.html
new file mode 100644
index 00000000000..d0036c0fe7b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-hover.tentative.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>The popover-hide-delay CSS property</title>
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel=help href="https://open-ui.org/components/popover.research.explainer">
+<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-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/popover-utils.js"></script>
+
+<body>
+<script src="resources/popover-hover-hide-common.js"></script>
+<script>
+
+// See popover-hover-hide-common.js for documentation.
+runHoverHideTestsForInvokerAction('hover');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-show.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-show.tentative.html
new file mode 100644
index 00000000000..7b3fa2b3023
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-show.tentative.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>The popover-hide-delay CSS property</title>
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel=help href="https://open-ui.org/components/popover.research.explainer">
+<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-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/popover-utils.js"></script>
+
+<body>
+<script src="resources/popover-hover-hide-common.js"></script>
+<script>
+
+// See popover-hover-hide-common.js for documentation.
+runHoverHideTestsForInvokerAction('show');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-toggle.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-toggle.tentative.html
new file mode 100644
index 00000000000..d6d4079e7e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide-toggle.tentative.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>The popover-hide-delay CSS property</title>
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel=help href="https://open-ui.org/components/popover.research.explainer">
+<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-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/popover-utils.js"></script>
+
+<body>
+<script src="resources/popover-hover-hide-common.js"></script>
+<script>
+
+// See popover-hover-hide-common.js for documentation.
+runHoverHideTestsForInvokerAction('toggle');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide.tentative.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide.tentative.html
deleted file mode 100644
index ed647a7d7d8..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-hover-hide.tentative.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8" />
-<title>The popover-hide-delay CSS property</title>
-<link rel="author" href="mailto:masonf@chromium.org">
-<link rel=help href="https://open-ui.org/components/popover.research.explainer">
-<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-actions.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="resources/popover-utils.js"></script>
-
-<style>
- [popover] {
- top:100px;
- popover-hide-delay: 100ms;
- }
- [popovertargetaction=hover] {
- top:200px;
- popover-show-delay: 100ms;
- }
- #unrelated {top: 300px;}
- div {
- /* Fixed position everything to ensure nothing overlaps */
- position: fixed;
- }
-</style>
-<div id=unrelated>Unrelated element</div>
-
-<div popover id=example1>Popover</div>
-<button popovertarget=example1 popovertargetaction=hover id=invoker1>Hover me</button>
-
-<script>
-const hoverDelays = 100; // This needs to match the style block above.
-const hoverWaitTime = 200; // How long to wait to cover the delay for sure.
-
-// NOTE about testing methodology:
-// This test checks whether popovers are hidden *after* the appropriate de-hover
-// delay. The delay used for testing is kept low, to avoid this test taking too
-// long, but that means that sometimes on a slow bot/client, the delay can
-// elapse before we are able to check the popover status. And that can make this
-// test flaky. To avoid that, the msSinceMouseOver() function is used to check
-// that not-too-much time has passed, and if it has, the test is simply skipped.
-
-const unrelated = document.getElementById('unrelated');
-
-function getComputedStyleTimeMs(element,property) {
- // Times are in seconds, so just strip off the 's'.
- return Number(getComputedStyle(element)[property].slice(0,-1))*1000;
-}
-
-promise_test(async (t) => {
- await mouseOver(unrelated);
- const popover = document.getElementById('example1');
- assert_false(popover.matches(':popover-open'));
- popover.showPopover();
- assert_true(popover.matches(':popover-open'));
- await waitForHoverTime(hoverWaitTime);
- assert_false(popover.matches(':popover-open'));
- assert_true(msSinceMouseOver() >= hoverWaitTime,'waitForHoverTime should wait the specified time');
- assert_true(hoverWaitTime > hoverDelays,'hoverDelays is the value from CSS, hoverWaitTime should be longer than that');
- assert_equals(getComputedStyleTimeMs(invoker1,'popoverShowDelay'),hoverDelays,'popover-show-delay is incorrect');
- assert_equals(getComputedStyleTimeMs(popover,'popoverHideDelay'),hoverDelays,'popover-hide-delay is incorrect');
-},`The popover-hide-delay causes a popover to be hidden after a delay`);
-
-promise_test(async (t) => {
- await mouseOver(unrelated);
- const popover = document.getElementById('example1');
- assert_false(popover.matches(':popover-open'));
- popover.showPopover();
- await mouseOver(popover);
- await waitForHoverTime(hoverWaitTime);
- assert_true(popover.matches(':popover-open'),'hovering the popover should keep it showing');
- await mouseOver(unrelated);
- let showing = popover.matches(':popover-open');
- if (msSinceMouseOver() >= hoverDelays)
- return; // The WPT runner was too slow.
- assert_true(showing,'hovering unrelated element shouldn\'t immediately hide the popover');
- await waitForHoverTime(hoverWaitTime);
- assert_false(popover.matches(':popover-open'),'hovering unrelated element should hide popover after delay');
-},`hovering the popover keeps it from being hidden`);
-
-promise_test(async (t) => {
- await mouseOver(unrelated);
- const popover = document.getElementById('example1');
- const invoker = document.getElementById('invoker1');
- assert_false(popover.matches(':popover-open'));
- await mouseOver(invoker);
- await waitForHoverTime(hoverWaitTime);
- assert_true(popover.matches(':popover-open'));
- await waitForHoverTime(hoverWaitTime);
- assert_true(popover.matches(':popover-open'),'While still hovering the invoker, popover should not be hidden');
- await mouseOver(popover);
- await waitForHoverTime(hoverWaitTime);
- await mouseOver(invoker);
- await waitForHoverTime(hoverWaitTime);
- assert_true(popover.matches(':popover-open'),'Moving hover between invoker and popover should keep popover from being hidden');
- await mouseOver(unrelated);
- await waitForHoverTime(hoverWaitTime);
- assert_false(popover.matches(':popover-open'),'Moving hover to unrelated should finally hide the popover');
-},`hovering a popovertargetaction=hover invoking element keeps the popover from being hidden`);
-</script>
-
-
-<div popover id=example2>Popover</div>
-<button popovertarget=example2 popovertargetaction=toggle><span><span data-note=nested_element id=invoker2>Click me</span></span></button>
-
-<script>
-promise_test(async (t) => {
- await mouseOver(unrelated);
- const popover = document.getElementById('example2');
- const invoker = document.getElementById('invoker2');
- assert_equals(getComputedStyleTimeMs(popover,'popoverHideDelay'),hoverDelays,'popover-hide-delay is incorrect');
- assert_false(popover.matches(':popover-open'));
- await mouseOver(invoker);
- popover.showPopover();
- await waitForHoverTime(hoverWaitTime);
- assert_true(popover.matches(':popover-open'),'While hovering an invoker element, popover should not be hidden');
- await mouseOver(popover);
- await waitForHoverTime(hoverWaitTime);
- await mouseOver(invoker);
- await waitForHoverTime(hoverWaitTime);
- assert_true(popover.matches(':popover-open'),'Moving hover between invoker and popover should keep popover from being hidden');
- await mouseOver(unrelated);
- await waitForHoverTime(hoverWaitTime);
- assert_false(popover.matches(':popover-open'),'Moving hover to unrelated should finally hide the popover');
-},`hovering a popovertargetaction=toggle invoking element keeps the popover from being hidden`);
-</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html
index d7d1edd3a4b..4b888169e1b 100644
--- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-light-dismiss.html
@@ -532,7 +532,7 @@ promise_test(async () => {
p14.hidePopover();
},{once:true});
assert_true(p13.matches(':popover-open') && p14.matches(':popover-open') && p15.matches(':popover-open'),'all three should be open');
- assert_throws_dom('InvalidStateError',() => p14.hidePopover(),'should throw because the event listener has already hidden the popover');
+ p14.hidePopover();
assert_true(p13.matches(':popover-open'),'p13 should still be open');
assert_false(p14.matches(':popover-open'));
assert_false(p15.matches(':popover-open'));
@@ -579,10 +579,7 @@ promise_test(async () => {
p20.showPopover();
});
p20.addEventListener('beforetoggle', logEvents);
- // Because the `beforetoggle` handler shows a different popover,
- // and that action closes the p19 popover, the call to hidePopover()
- // will result in an exception.
- assert_throws_dom('InvalidStateError',() => p19.hidePopover());
+ p19.hidePopover();
assert_array_equals(events,['hide p19','show p20'],'There should not be a second hide event for 19');
assert_false(p19.matches(':popover-open'));
assert_true(p20.matches(':popover-open'));
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html
index 9feaa4b2bf8..11f52c2f2f0 100644
--- a/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/popover-move-documents.html
@@ -4,10 +4,30 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script>
+async function iframeLoaded(iframe) {
+ return new Promise(resolve => {
+ if (iframe.contentWindow.document.readyState == 'complete') {
+ resolve();
+ } else {
+ iframe.onload = resolve;
+ }
+ });
+}
+</script>
+
<iframe id=myframe srcdoc="<p>iframe</p>"></iframe>
<div id=p1 popover=auto>p1</div>
<script>
-test(() => {
+promise_test(async () => {
+ await iframeLoaded(myframe);
+ await new Promise(resolve => {
+ if (myframe.contentWindow.document.readyState == 'complete') {
+ resolve();
+ } else {
+
+ }
+ });
p1.addEventListener('beforetoggle', () => {
myframe.contentWindow.document.body.appendChild(p1);
});
@@ -18,7 +38,8 @@ test(() => {
<iframe id=myframe2 srcdoc="<p>iframe</p>"></iframe>
<div id=p2 popover=auto>p2</div>
<script>
-test(() => {
+promise_test(async () => {
+ await iframeLoaded(myframe2);
const p2 = document.getElementById('p2');
p2.showPopover();
p2.addEventListener('beforetoggle', () => {
@@ -27,10 +48,7 @@ test(() => {
assert_true(p2.matches(':popover-open'),
'The popover should be open after calling showPopover()');
- // Because the `beforetoggle` handler changes the document,
- // and that action closes the popover, the call to hidePopover()
- // will result in an exception.
- assert_throws_dom('InvalidStateError',() => p2.hidePopover());
+ p2.hidePopover();
assert_false(p2.matches(':popover-open'),
'The popover should be closed after moving it between documents.');
}, 'Moving popovers between documents while hiding should not throw an exception.');
@@ -43,7 +61,8 @@ test(() => {
<div id=p5 popover=auto>p5</div>
</div>
<script>
-test(() => {
+promise_test(async () => {
+ await iframeLoaded(myframe3);
p3.showPopover();
p4.showPopover();
p4.addEventListener('beforetoggle', event => {
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-hover-hide-common.js b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-hover-hide-common.js
new file mode 100644
index 00000000000..9f407ef157d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-hover-hide-common.js
@@ -0,0 +1,139 @@
+// NOTE about testing methodology:
+// This test checks whether popovers are hidden *after* the appropriate de-hover
+// delay. The delay used for testing is kept low, to avoid this test taking too
+// long, but that means that sometimes on a slow bot/client, the delay can
+// elapse before we are able to check the popover status. And that can make this
+// test flaky. To avoid that, the msSinceMouseOver() function is used to check
+// that not-too-much time has passed, and if it has, the test is simply skipped.
+
+const hoverDelays = 100; // This needs to match the style block below.
+const hoverWaitTime = 200; // How long to wait to cover the delay for sure.
+
+async function initialPopoverShow(invoker) {
+ const popover = invoker.popoverTargetElement;
+ assert_false(popover.matches(':popover-open'));
+ await mouseOver(invoker); // Always start with the mouse over the invoker
+ popover.showPopover();
+ assert_true(popover.matches(':popover-open'));
+}
+
+function runHoverHideTest(popoverType, invokerType, invokerAction) {
+ const descr = `popover=${popoverType}, invoker=${invokerType}, popovertargetaction=${invokerAction}`;
+ promise_test(async (t) => {
+ const {popover,invoker} = makeTestParts(t, popoverType, invokerType, invokerAction);
+ await initialPopoverShow(invoker);
+ await mouseOver(unrelated);
+ let showing = popover.matches(':popover-open');
+ if (msSinceMouseOver() >= hoverDelays)
+ return; // The WPT runner was too slow.
+ assert_true(showing,'popover shouldn\'t immediately hide');
+ await mouseHover(unrelated,hoverWaitTime);
+ assert_false(popover.matches(':popover-open'),'popover should hide after delay');
+ },`The popover-hide-delay causes a popover to be hidden after a delay, ${descr}`);
+
+ promise_test(async (t) => {
+ const {popover,invoker} = makeTestParts(t, popoverType, invokerType, invokerAction);
+ await initialPopoverShow(invoker);
+ await mouseHover(popover,hoverWaitTime);
+ assert_true(popover.matches(':popover-open'),'hovering the popover should keep it showing');
+ await mouseOver(unrelated);
+ let showing = popover.matches(':popover-open');
+ if (msSinceMouseOver() >= hoverDelays)
+ return; // The WPT runner was too slow.
+ assert_true(showing,'subsequently hovering unrelated element shouldn\'t immediately hide the popover');
+ await mouseHover(unrelated,hoverWaitTime);
+ assert_false(popover.matches(':popover-open'),'hovering unrelated element should hide popover after delay');
+ },`hovering the popover keeps it from being hidden, ${descr}`);
+
+ promise_test(async (t) => {
+ const {popover,invoker,mouseOverInvoker} = makeTestParts(t, popoverType, invokerType, invokerAction);
+ await initialPopoverShow(invoker);
+ assert_true(popover.matches(':popover-open'));
+ await mouseHover(popover,hoverWaitTime);
+ await mouseHover(mouseOverInvoker,hoverWaitTime);
+ assert_true(popover.matches(':popover-open'),'Moving hover between invoker and popover should keep popover from being hidden');
+ await mouseHover(unrelated,hoverWaitTime);
+ assert_false(popover.matches(':popover-open'),'Moving hover to unrelated should finally hide the popover');
+ },`hovering an invoking element keeps the popover from being hidden, ${descr}`);
+}
+
+function runHoverHideTestsForInvokerAction(invokerAction) {
+ promise_test(async (t) => {
+ const {popover,invoker} = makeTestParts(t, 'auto', 'button', 'show');
+ assert_false(popover.matches(':popover-open'));
+ assert_true(invoker.matches('[popovertarget]'),'invoker needs to match [popovertarget]');
+ assert_equals(invoker.popoverTargetElement,popover,'invoker should point to popover');
+ await mouseHover(invoker,hoverWaitTime);
+ assert_true(msSinceMouseOver() >= hoverWaitTime,'waitForHoverTime should wait the specified time');
+ assert_true(hoverWaitTime > hoverDelays,'hoverDelays is the value from CSS, hoverWaitTime should be longer than that');
+ assert_equals(getComputedStyleTimeMs(invoker,'popoverShowDelay'),hoverDelays,'popover-show-delay is incorrect');
+ assert_equals(getComputedStyleTimeMs(popover,'popoverHideDelay'),hoverDelays,'popover-hide-delay is incorrect');
+ },'Test the harness');
+
+ // Run for all invoker and popover types.
+ ["button","input"].forEach(invokerType => {
+ ["auto","hint","manual"].forEach(popoverType => {
+ runHoverHideTest(popoverType, invokerType, invokerAction);
+ });
+ });
+}
+
+// Setup stuff
+const unrelated = document.createElement('div');
+unrelated.id = 'unrelated';
+unrelated.textContent = 'Unrelated element';
+const style = document.createElement('style');
+document.body.append(unrelated,style);
+style.textContent = `
+ div, button, input {
+ /* Fixed position everything to ensure nothing overlaps */
+ position: fixed;
+ max-height: 100px;
+ }
+ #unrelated {top: 100px;}
+ [popovertarget] {
+ top:200px;
+ popover-show-delay: 100ms;
+ }
+ [popover] {
+ width: 200px;
+ height: 100px;
+ top:300px;
+ popover-hide-delay: 100ms;
+ }
+`;
+
+function makeTestParts(t,popoverType,invokerType,invokerAction) {
+ const popover = document.createElement('div');
+ popover.id = `popover-${popoverType}-${invokerType}-${invokerAction}`;
+ document.body.appendChild(popover);
+ popover.popover = popoverType;
+ assert_equals(popover.popover, popoverType, `Type ${popoverType} not supported`);
+ const invoker = document.createElement(invokerType);
+ document.body.appendChild(invoker);
+ invoker.popoverTargetElement = popover;
+ invoker.popoverTargetAction = invokerAction;
+ assert_equals(invoker.popoverTargetAction, invokerAction, `Invoker action ${invokerAction} not supported`);
+ let mouseOverInvoker;
+ switch (invokerType) {
+ case 'button':
+ invoker.innerHTML = '<span><span data-note=nested_element>Click me</span></span>';
+ mouseOverInvoker = invoker.firstElementChild.firstElementChild;
+ assert_true(!!mouseOverInvoker);
+ break;
+ case 'input':
+ invoker.type = 'button';
+ mouseOverInvoker = invoker;
+ break;
+ default:
+ assert_unreached('Invalid invokerType ' + invokerType);
+ break;
+ }
+ t.add_cleanup(() => {popover.remove(); invoker.remove();});
+ return {popover, invoker, mouseOverInvoker};
+}
+
+function getComputedStyleTimeMs(element,property) {
+ // Times are in seconds, so just strip off the 's'.
+ return Number(getComputedStyle(element)[property].slice(0,-1))*1000;
+}
diff --git a/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js
index aa69b7d41ae..4dc4d8138d8 100644
--- a/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js
+++ b/tests/wpt/web-platform-tests/html/semantics/popovers/resources/popover-utils.js
@@ -67,20 +67,35 @@ async function finishAnimations(popover) {
popover.getAnimations({subtree: true}).forEach(animation => animation.finish());
await waitForRender();
}
-let mouseOverStarted;
+let mousemoveInfo;
function mouseOver(element) {
- mouseOverStarted = performance.now();
+ mousemoveInfo?.controller?.abort();
+ const controller = new AbortController();
+ mousemoveInfo = {element, controller, moved: false, started: performance.now()};
return (new test_driver.Actions())
.pointerMove(0, 0, {origin: element})
- .send();
+ .send()
+ .then(() => {
+ document.addEventListener("mousemove", (e) => {mousemoveInfo.moved = true;}, {signal: controller.signal});
+ })
}
function msSinceMouseOver() {
- return performance.now() - mouseOverStarted;
+ return performance.now() - mousemoveInfo.started;
+}
+function assertMouseStillOver(element) {
+ assert_equals(mousemoveInfo.element, element, 'Broken test harness');
+ assert_false(mousemoveInfo.moved,'Broken test harness');
}
async function waitForHoverTime(hoverWaitTimeMs) {
await new Promise(resolve => step_timeout(resolve,hoverWaitTimeMs));
await waitForRender();
};
+async function mouseHover(element,hoverWaitTimeMs) {
+ await mouseOver(element);
+ await waitForHoverTime(hoverWaitTimeMs);
+ assertMouseStillOver(element);
+}
+
async function blessTopLayer(visibleElement) {
// The normal "bless" function doesn't work well when there are top layer
// elements blocking clicks. Additionally, since the normal test_driver.bless
@@ -153,10 +168,10 @@ function assertIsFunctionalPopover(popover, checkVisibility) {
assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/false, 'A popover should start out hidden');
popover.showPopover();
if (checkVisibility) assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/true, 'After showPopover(), a popover should be visible');
- assert_throws_dom("InvalidStateError",() => popover.showPopover(),'Calling showPopover on a showing popover should throw InvalidStateError');
+ popover.showPopover(); // Calling showPopover on a showing popover should not throw.
popover.hidePopover();
if (checkVisibility) assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/false, 'After hidePopover(), a popover should be hidden');
- assert_throws_dom("InvalidStateError",() => popover.hidePopover(),'Calling hidePopover on a hidden popover should throw InvalidStateError');
+ popover.hidePopover(); // Calling hidePopover on a hidden popover should not throw.
popover.togglePopover();
if (checkVisibility) assertPopoverVisibility(popover, /*isPopover*/true, /*expectedVisibility*/true, 'After togglePopover() on hidden popover, it should be visible');
popover.togglePopover();
@@ -172,7 +187,7 @@ function assertIsFunctionalPopover(popover, checkVisibility) {
const parent = popover.parentElement;
popover.remove();
assert_throws_dom("InvalidStateError",() => popover.showPopover(),'Calling showPopover on a disconnected popover should throw InvalidStateError');
- assert_throws_dom("InvalidStateError",() => popover.hidePopover(),'Calling hidePopover on a disconnected popover should throw InvalidStateError');
+ popover.hidePopover(); // Calling hidePopover on a disconnected popover should not throw.
assert_throws_dom("InvalidStateError",() => popover.togglePopover(),'Calling hidePopover on a disconnected popover should throw InvalidStateError');
parent.appendChild(popover);
}
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js
new file mode 100644
index 00000000000..3a3ea40d773
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js
@@ -0,0 +1,25 @@
+// META: global=window,dedicatedworker
+
+promise_test(async () => {
+ const sab = new SharedArrayBuffer(64);
+ const ta = new Int32Array(sab);
+
+ const waitAsyncObj = Atomics.waitAsync(ta, 0, 0, 10);
+ assert_equals(waitAsyncObj.async, true);
+ const v = await waitAsyncObj.value;
+ assert_equals(v, "timed-out");
+}, `Atomics.waitAsync timeout in a ${self.constructor.name}`);
+
+promise_test(async () => {
+ const sab = new SharedArrayBuffer(64);
+ const ta = new Int32Array(sab);
+
+ const waitAsyncObj = Atomics.waitAsync(ta, 0, 0);
+ assert_equals(waitAsyncObj.async, true);
+
+ const worker = new Worker("resources/notify-worker.js");
+ worker.postMessage(sab);
+
+ const v = await waitAsyncObj.value;
+ assert_equals(v, "ok");
+}, `Atomics.waitAsync notification in a ${self.constructor.name}`);
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.headers b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.headers
new file mode 100644
index 00000000000..5f8621ef836
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/atomics-wait-async.https.any.js.headers
@@ -0,0 +1,2 @@
+Cross-Origin-Embedder-Policy: require-corp
+Cross-Origin-Opener-Policy: same-origin
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js
new file mode 100644
index 00000000000..2780e5bc34e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js
@@ -0,0 +1,5 @@
+onmessage = (e) => {
+ const sab = e.data;
+ const ta = new Int32Array(sab);
+ Atomics.notify(ta, 0);
+};
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js.headers b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js.headers
new file mode 100644
index 00000000000..6604450991a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/resources/notify-worker.js.headers
@@ -0,0 +1 @@
+Cross-Origin-Embedder-Policy: require-corp
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/reporterror-in-detached-window-crash.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/reporterror-in-detached-window-crash.html
new file mode 100644
index 00000000000..33662caa4d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/reporterror-in-detached-window-crash.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<title>window.reportError() doesn't crash when window is detached</title>
+<link rel="help" href="https://crbug.com/1445375">
+<body>
+<script>
+let i = document.createElement("iframe");
+document.body.appendChild(i);
+let i_win = i.contentWindow;
+i.remove();
+i_win.reportError("an error");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/structured-clone/structured-clone-detached-window-crash.html b/tests/wpt/web-platform-tests/html/webappapis/structured-clone/structured-clone-detached-window-crash.html
new file mode 100644
index 00000000000..75971023d2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/structured-clone/structured-clone-detached-window-crash.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<title>window.structuredClone() doesn't crash when window is detached</title>
+<link rel="help" href="https://crbug.com/1445375">
+<body>
+<script>
+let i = document.createElement("iframe");
+document.body.appendChild(i);
+let i_win = i.contentWindow;
+i.remove();
+i_win.structuredClone("some data");
+</script>
diff --git a/tests/wpt/web-platform-tests/infrastructure/README.md b/tests/wpt/web-platform-tests/infrastructure/README.md
index 82138a300b8..7d0ec556aa4 100644
--- a/tests/wpt/web-platform-tests/infrastructure/README.md
+++ b/tests/wpt/web-platform-tests/infrastructure/README.md
@@ -7,3 +7,8 @@ infrastructure is operating correctly:
* The tests in server/ are designed to test the WPT server configuration
* The tests in expected-fail/ should all fail.
+
+To update the expectations stored in metadata/, you want to use the `wpt`
+tool with an invocation such as `./wpt update-expectations --metadata
+infrastructure/metadata --manifest MANIFEST.json [wptreport.json]` with one
+or more wptreport.json files.
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini
index e2bfbf8fb8f..26ffac48154 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini
@@ -1,4 +1,6 @@
[file_upload.sub.html]
+ expected:
+ if product == "safari": [OK, TIMEOUT]
[File upload using testdriver]
expected:
- if product == "epiphany" or product == "webkit": FAIL
+ if (product == "epiphany") or (product == "webkit"): FAIL
diff --git a/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl b/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl
index 76640f54c8d..ed4497b56ff 100644
--- a/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl
+++ b/tests/wpt/web-platform-tests/interfaces/attribution-reporting-api.idl
@@ -4,9 +4,23 @@
// Source: Attribution Reporting (https://wicg.github.io/attribution-reporting-api/)
interface mixin HTMLAttributionSrcElementUtils {
- [CEReactions] attribute USVString attributionSrc;
+ [CEReactions, SecureContext] attribute USVString attributionSrc;
};
HTMLAnchorElement includes HTMLAttributionSrcElementUtils;
HTMLImageElement includes HTMLAttributionSrcElementUtils;
HTMLScriptElement includes HTMLAttributionSrcElementUtils;
+
+dictionary AttributionReportingRequestOptions {
+ required boolean eventSourceEligible;
+ required boolean triggerEligible;
+};
+
+partial dictionary RequestInit {
+ AttributionReportingRequestOptions attributionReporting;
+};
+
+partial interface XMLHttpRequest {
+ [SecureContext]
+ undefined setAttributionReporting(AttributionReportingRequestOptions options);
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl
index 37cdfb82930..3bdf6ba3a6b 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl
@@ -5,6 +5,6 @@
[Exposed=Window]
interface CSSScopeRule : CSSGroupingRule {
- readonly attribute CSSOMString start;
- readonly attribute CSSOMString end;
+ readonly attribute CSSOMString? start;
+ readonly attribute CSSOMString? end;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/css-cascade.idl b/tests/wpt/web-platform-tests/interfaces/css-cascade.idl
index 9011dc7fd9e..0dd9969f6eb 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-cascade.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-cascade.idl
@@ -3,10 +3,6 @@
// (https://github.com/w3c/webref)
// Source: CSS Cascading and Inheritance Level 5 (https://drafts.csswg.org/css-cascade-5/)
-partial interface CSSImportRule {
- readonly attribute CSSOMString? layerName;
-};
-
[Exposed=Window]
interface CSSLayerBlockRule : CSSGroupingRule {
readonly attribute CSSOMString name;
diff --git a/tests/wpt/web-platform-tests/interfaces/cssom.idl b/tests/wpt/web-platform-tests/interfaces/cssom.idl
index 222b3dc09ec..7f5bf171398 100644
--- a/tests/wpt/web-platform-tests/interfaces/cssom.idl
+++ b/tests/wpt/web-platform-tests/interfaces/cssom.idl
@@ -106,7 +106,9 @@ interface CSSStyleRule : CSSRule {
interface CSSImportRule : CSSRule {
readonly attribute USVString href;
[SameObject, PutForwards=mediaText] readonly attribute MediaList media;
- [SameObject] readonly attribute CSSStyleSheet styleSheet;
+ [SameObject] readonly attribute CSSStyleSheet? styleSheet;
+ readonly attribute CSSOMString? layerName;
+ readonly attribute CSSOMString? supportsText;
};
[Exposed=Window]
diff --git a/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl
index 2869b95e6bb..6b0734d1f7b 100644
--- a/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl
+++ b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl
@@ -10,19 +10,23 @@ interface HTMLFencedFrameElement : HTMLElement {
[CEReactions] attribute FencedFrameConfig? config;
[CEReactions] attribute DOMString width;
[CEReactions] attribute DOMString height;
+ [CEReactions] attribute DOMString allow;
};
enum OpaqueProperty {"opaque"};
typedef (unsigned long or OpaqueProperty) FencedFrameConfigSize;
-typedef (USVString or OpaqueProperty) FencedFrameConfigURL;
+typedef USVString FencedFrameConfigURL;
[Exposed=Window]
interface FencedFrameConfig {
- constructor(USVString url);
readonly attribute FencedFrameConfigURL? url;
- readonly attribute FencedFrameConfigSize? width;
- readonly attribute FencedFrameConfigSize? height;
+ readonly attribute FencedFrameConfigSize? containerWidth;
+ readonly attribute FencedFrameConfigSize? containerHeight;
+ readonly attribute FencedFrameConfigSize? contentWidth;
+ readonly attribute FencedFrameConfigSize? contentHeight;
+
+ undefined setSharedStorageContext(DOMString contextString);
};
enum FenceReportingDestination {
diff --git a/tests/wpt/web-platform-tests/interfaces/fs.idl b/tests/wpt/web-platform-tests/interfaces/fs.idl
index e2474132abf..e341ab387d9 100644
--- a/tests/wpt/web-platform-tests/interfaces/fs.idl
+++ b/tests/wpt/web-platform-tests/interfaces/fs.idl
@@ -15,6 +15,7 @@ interface FileSystemHandle {
Promise<boolean> isSameEntry(FileSystemHandle other);
};
+
dictionary FileSystemCreateWritableOptions {
boolean keepExistingData = false;
};
@@ -26,6 +27,7 @@ interface FileSystemFileHandle : FileSystemHandle {
[Exposed=DedicatedWorker]
Promise<FileSystemSyncAccessHandle> createSyncAccessHandle();
};
+
dictionary FileSystemGetFileOptions {
boolean create = false;
};
@@ -49,6 +51,7 @@ interface FileSystemDirectoryHandle : FileSystemHandle {
Promise<sequence<USVString>?> resolve(FileSystemHandle possibleDescendant);
};
+
enum WriteCommandType {
"write",
"seek",
@@ -70,6 +73,7 @@ interface FileSystemWritableFileStream : WritableStream {
Promise<undefined> seek(unsigned long long position);
Promise<undefined> truncate(unsigned long long size);
};
+
dictionary FileSystemReadWriteOptions {
[EnforceRange] unsigned long long at;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl
index 33d4de0db97..99b33705b39 100644
--- a/tests/wpt/web-platform-tests/interfaces/html.idl
+++ b/tests/wpt/web-platform-tests/interfaces/html.idl
@@ -1643,6 +1643,14 @@ dictionary ValidityStateFlags {
boolean customError = false;
};
+[Exposed=(Window)]
+interface VisibilityStateEntry : PerformanceEntry {
+ readonly attribute DOMString name; // shadows inherited name
+ readonly attribute DOMString entryType; // shadows inherited entryType
+ readonly attribute DOMHighResTimeStamp startTime; // shadows inherited startTime
+ readonly attribute unsigned long duration; // shadows inherited duration
+};
+
[Exposed=Window]
interface UserActivation {
readonly attribute boolean hasBeenActive;
diff --git a/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl b/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl
index 99f30282333..496bfcf2e27 100644
--- a/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl
+++ b/tests/wpt/web-platform-tests/interfaces/mediastream-recording.idl
@@ -34,6 +34,8 @@ dictionary MediaRecorderOptions {
unsigned long videoBitsPerSecond;
unsigned long bitsPerSecond;
BitrateMode audioBitrateMode = "variable";
+ DOMHighResTimeStamp videoKeyFrameIntervalDuration;
+ unsigned long videoKeyFrameIntervalCount;
};
enum BitrateMode {
diff --git a/tests/wpt/web-platform-tests/interfaces/real-world-meshing.idl b/tests/wpt/web-platform-tests/interfaces/real-world-meshing.idl
new file mode 100644
index 00000000000..38fe71f6c66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/real-world-meshing.idl
@@ -0,0 +1,21 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: WebXR Mesh Detection Module (https://immersive-web.github.io/real-world-meshing/)
+
+[Exposed=Window] interface XRMesh {
+ [SameObject] readonly attribute XRSpace meshSpace;
+
+ readonly attribute FrozenArray<Float32Array> vertices;
+ readonly attribute Uint32Array indices;
+ readonly attribute DOMHighResTimeStamp lastChangedTime;
+ readonly attribute DOMString? semanticLabel;
+};
+
+[Exposed=Window] interface XRMeshSet {
+ readonly setlike<XRMesh>;
+};
+
+partial interface XRFrame {
+ readonly attribute XRMeshSet detectedMeshs;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl
index 151e5d46d84..aa17003493e 100644
--- a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl
+++ b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl
@@ -18,6 +18,7 @@ interface PerformanceResourceTiming : PerformanceEntry {
readonly attribute DOMHighResTimeStamp connectEnd;
readonly attribute DOMHighResTimeStamp secureConnectionStart;
readonly attribute DOMHighResTimeStamp requestStart;
+ readonly attribute DOMHighResTimeStamp firstInterimResponseStart;
readonly attribute DOMHighResTimeStamp responseStart;
readonly attribute DOMHighResTimeStamp responseEnd;
readonly attribute unsigned long long transferSize;
diff --git a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl
index 14215509c9f..31b3746e9d4 100644
--- a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl
+++ b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl
@@ -36,7 +36,11 @@ interface ViewTimeline : ScrollTimeline {
readonly attribute CSSNumericValue endOffset;
};
+dictionary AnimationTimeOptions {
+ DOMString? range;
+};
+
[Exposed=Window]
partial interface AnimationTimeline {
- CSSNumericValue? getCurrentTime(optional CSSOMString rangeName);
+ CSSNumericValue? getCurrentTime(optional AnimationTimeOptions options = {});
};
diff --git a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl
index 9061b243477..08ec8065c53 100644
--- a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl
+++ b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl
@@ -15,6 +15,7 @@ dictionary SecurePaymentConfirmationRequest {
sequence<USVString> locale;
boolean showOptOut;
};
+
partial dictionary AuthenticationExtensionsClientInputs {
AuthenticationExtensionsPaymentInputs payment;
};
@@ -30,9 +31,11 @@ dictionary AuthenticationExtensionsPaymentInputs {
PaymentCurrencyAmount total;
PaymentCredentialInstrument instrument;
};
+
dictionary CollectedClientPaymentData : CollectedClientData {
required CollectedClientAdditionalPaymentData payment;
};
+
dictionary CollectedClientAdditionalPaymentData {
required USVString rpId;
required USVString topOrigin;
@@ -41,6 +44,7 @@ dictionary CollectedClientAdditionalPaymentData {
required PaymentCurrencyAmount total;
required PaymentCredentialInstrument instrument;
};
+
dictionary PaymentCredentialInstrument {
required USVString displayName;
required USVString icon;
diff --git a/tests/wpt/web-platform-tests/interfaces/shared-storage.idl b/tests/wpt/web-platform-tests/interfaces/shared-storage.idl
new file mode 100644
index 00000000000..eb5806f9a6d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/shared-storage.idl
@@ -0,0 +1,80 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Shared Storage API (https://wicg.github.io/shared-storage/)
+
+[Exposed=(Window)]
+interface SharedStorageWorklet : Worklet {
+};
+
+[Exposed=SharedStorageWorklet, Global=SharedStorageWorklet]
+interface SharedStorageWorkletGlobalScope : WorkletGlobalScope {
+ undefined register(DOMString name,
+ SharedStorageOperationConstructor operationCtor);
+};
+
+callback SharedStorageOperationConstructor =
+ SharedStorageOperation(optional SharedStorageRunOperationMethodOptions options);
+
+[Exposed=SharedStorageWorklet]
+interface SharedStorageOperation {
+};
+
+dictionary SharedStorageRunOperationMethodOptions {
+ object data;
+ boolean resolveToConfig = false;
+ boolean keepAlive = false;
+};
+
+[Exposed=SharedStorageWorklet]
+interface SharedStorageRunOperation : SharedStorageOperation {
+ Promise<undefined> run(object data);
+};
+
+[Exposed=SharedStorageWorklet]
+interface SharedStorageSelectURLOperation : SharedStorageOperation {
+ Promise<long> run(object data,
+ FrozenArray<SharedStorageUrlWithMetadata> urls);
+};
+
+[Exposed=(Window,SharedStorageWorklet)]
+interface SharedStorage {
+ Promise<any> set(DOMString key,
+ DOMString value,
+ optional SharedStorageSetMethodOptions options = {});
+ Promise<any> append(DOMString key,
+ DOMString value);
+ Promise<any> delete(DOMString key);
+ Promise<any> clear();
+};
+
+dictionary SharedStorageSetMethodOptions {
+ boolean ignoreIfPresent = false;
+};
+
+typedef (USVString or FencedFrameConfig) SharedStorageResponse;
+
+[Exposed=(Window)]
+interface WindowSharedStorage : SharedStorage {
+ Promise<any> run(DOMString name,
+ optional SharedStorageRunOperationMethodOptions options = {});
+ Promise<SharedStorageResponse> selectURL(DOMString name,
+ FrozenArray<SharedStorageUrlWithMetadata> urls,
+ optional SharedStorageRunOperationMethodOptions options = {});
+
+ readonly attribute SharedStorageWorklet worklet;
+};
+
+dictionary SharedStorageUrlWithMetadata {
+ required USVString url;
+ object reportingMetadata;
+};
+
+[Exposed=(SharedStorageWorklet)]
+interface WorkletSharedStorage : SharedStorage {
+ Promise<DOMString> get(DOMString key);
+ Promise<unsigned long> length();
+ Promise<double> remainingBudget();
+
+ async iterable<DOMString, DOMString>;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/storage-buckets.idl b/tests/wpt/web-platform-tests/interfaces/storage-buckets.idl
new file mode 100644
index 00000000000..f3d500a5711
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/storage-buckets.idl
@@ -0,0 +1,53 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Storage Buckets API (https://wicg.github.io/storage-buckets/)
+
+[SecureContext]
+interface mixin NavigatorStorageBuckets {
+ [SameObject] readonly attribute StorageBucketManager storageBuckets;
+};
+Navigator includes NavigatorStorageBuckets;
+WorkerNavigator includes NavigatorStorageBuckets;
+
+[Exposed=(Window,Worker),
+ SecureContext]
+interface StorageBucketManager {
+ Promise<StorageBucket> open(DOMString name, optional StorageBucketOptions options = {});
+ Promise<sequence<DOMString>> keys();
+ Promise<undefined> delete(DOMString name);
+};
+
+enum StorageBucketDurability {
+ "strict",
+ "relaxed"
+};
+
+dictionary StorageBucketOptions {
+ boolean? persisted = null;
+ StorageBucketDurability? durability = null;
+ unsigned long long? quota = null;
+ DOMHighResTimeStamp? expires = null;
+};
+
+[Exposed=(Window,Worker),
+ SecureContext]
+interface StorageBucket {
+ readonly attribute DOMString name;
+
+ [Exposed=Window] Promise<boolean> persist();
+ Promise<boolean> persisted();
+
+ Promise<StorageEstimate> estimate();
+
+ Promise<StorageBucketDurability> durability();
+
+ Promise<undefined> setExpires(DOMHighResTimeStamp expires);
+ Promise<DOMHighResTimeStamp?> expires();
+
+ [SameObject] readonly attribute IDBFactory indexedDB;
+
+ [SameObject] readonly attribute CacheStorage caches;
+
+ Promise<FileSystemDirectoryHandle> getDirectory();
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl
index ee339590827..f521acea1f5 100644
--- a/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl
+++ b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl
@@ -5,14 +5,11 @@
enum RefreshPolicy { "none", "refresh" };
-enum TokenType { "private-state-token" };
-
enum TokenVersion { "1" };
enum OperationType { "token-request", "send-redemption-record", "token-redemption" };
dictionary PrivateToken {
- required TokenType type;
required TokenVersion version;
required OperationType operation;
RefreshPolicy refreshPolicy = "none";
@@ -24,6 +21,6 @@ partial dictionary RequestInit {
};
partial interface Document {
- Promise<boolean> hasPrivateTokens(USVString issuer, USVString type);
- Promise<boolean> hasRedemptionRecord(USVString issuer, USVString type);
+ Promise<boolean> hasPrivateTokens(USVString issuer);
+ Promise<boolean> hasRedemptionRecord(USVString issuer);
};
diff --git a/tests/wpt/web-platform-tests/interfaces/turtledove.idl b/tests/wpt/web-platform-tests/interfaces/turtledove.idl
index cd81a3d87ef..8add667b575 100644
--- a/tests/wpt/web-platform-tests/interfaces/turtledove.idl
+++ b/tests/wpt/web-platform-tests/interfaces/turtledove.idl
@@ -1,7 +1,7 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
-// Source: FLEDGE (https://wicg.github.io/turtledove/)
+// Source: Protected Audience (formerly FLEDGE) (https://wicg.github.io/turtledove/)
[SecureContext]
partial interface Navigator {
@@ -25,7 +25,7 @@ dictionary AuctionAdInterestGroup {
DOMString executionMode = "compatibility";
USVString biddingLogicURL;
USVString biddingWasmHelperURL;
- USVString dailyUpdateURL;
+ USVString updateURL;
USVString trustedBiddingSignalsURL;
sequence<USVString> trustedBiddingSignalsKeys;
any userBiddingSignals;
@@ -67,9 +67,15 @@ dictionary AuctionAdConfig {
AbortSignal? signal;
};
+[Exposed=InterestGroupScriptRunnerGlobalScope]
+interface InterestGroupScriptRunnerGlobalScope {
+};
+
[Exposed=InterestGroupBiddingScriptRunnerGlobalScope,
-Global=InterestGroupBiddingScriptRunnerGlobalScope]
-interface InterestGroupBiddingScriptRunnerGlobalScope {
+ Global=(InterestGroupScriptRunnerGlobalScope,
+ InterestGroupBiddingScriptRunnerGlobalScope)]
+interface InterestGroupBiddingScriptRunnerGlobalScope
+ : InterestGroupScriptRunnerGlobalScope {
boolean setBid();
boolean setBid(GenerateBidOutput generateBidOutput);
undefined setPriority(double priority);
@@ -77,13 +83,17 @@ interface InterestGroupBiddingScriptRunnerGlobalScope {
};
[Exposed=InterestGroupScoringScriptRunnerGlobalScope,
-Global=InterestGroupScoringScriptRunnerGlobalScope]
-interface InterestGroupScoringScriptRunnerGlobalScope {
+ Global=(InterestGroupScriptRunnerGlobalScope,
+ InterestGroupScoringScriptRunnerGlobalScope)]
+interface InterestGroupScoringScriptRunnerGlobalScope
+ : InterestGroupScriptRunnerGlobalScope {
};
[Exposed=InterestGroupReportingScriptRunnerGlobalScope,
-Global=InterestGroupReportingScriptRunnerGlobalScope]
-interface InterestGroupReportingScriptRunnerGlobalScope {
+ Global=(InterestGroupScriptRunnerGlobalScope,
+ InterestGroupReportingScriptRunnerGlobalScope)]
+interface InterestGroupReportingScriptRunnerGlobalScope
+ : InterestGroupScriptRunnerGlobalScope {
undefined sendReportTo(DOMString url);
};
@@ -96,7 +106,7 @@ dictionary AdRender {
dictionary GenerateBidOutput {
required double bid;
required (DOMString or AdRender) adRender;
- DOMString ad;
+ any ad;
sequence<(DOMString or AdRender)> adComponents;
double adCost;
double modelingSignals;
diff --git a/tests/wpt/web-platform-tests/interfaces/url.idl b/tests/wpt/web-platform-tests/interfaces/url.idl
index 6549e45f419..a5e4d1eb492 100644
--- a/tests/wpt/web-platform-tests/interfaces/url.idl
+++ b/tests/wpt/web-platform-tests/interfaces/url.idl
@@ -33,10 +33,10 @@ interface URLSearchParams {
readonly attribute unsigned long size;
undefined append(USVString name, USVString value);
- undefined delete(USVString name);
+ undefined delete(USVString name, optional USVString value);
USVString? get(USVString name);
sequence<USVString> getAll(USVString name);
- boolean has(USVString name);
+ boolean has(USVString name, optional USVString value);
undefined set(USVString name, USVString value);
undefined sort();
diff --git a/tests/wpt/web-platform-tests/interfaces/webauthn.idl b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
index 58a9e285232..c7f72eacfd0 100644
--- a/tests/wpt/web-platform-tests/interfaces/webauthn.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
@@ -12,6 +12,7 @@ interface PublicKeyCredential : Credential {
static Promise<boolean> isConditionalMediationAvailable();
PublicKeyCredentialJSON toJSON();
};
+
typedef DOMString Base64URLString;
typedef (RegistrationResponseJSON or AuthenticationResponseJSON) PublicKeyCredentialJSON;
@@ -48,15 +49,19 @@ dictionary AuthenticatorAssertionResponseJSON {
dictionary AuthenticationExtensionsClientOutputsJSON {
};
+
partial dictionary CredentialCreationOptions {
PublicKeyCredentialCreationOptions publicKey;
};
+
partial dictionary CredentialRequestOptions {
PublicKeyCredentialRequestOptions publicKey;
};
+
partial interface PublicKeyCredential {
static Promise<boolean> isUserVerifyingPlatformAuthenticatorAvailable();
};
+
partial interface PublicKeyCredential {
static PublicKeyCredentialCreationOptions parseCreationOptionsFromJSON(PublicKeyCredentialCreationOptionsJSON options);
};
@@ -87,6 +92,7 @@ dictionary PublicKeyCredentialDescriptorJSON {
dictionary AuthenticationExtensionsClientInputsJSON {
};
+
partial interface PublicKeyCredential {
static PublicKeyCredentialRequestOptions parseRequestOptionsFromJSON(PublicKeyCredentialRequestOptionsJSON options);
};
@@ -99,10 +105,12 @@ dictionary PublicKeyCredentialRequestOptionsJSON {
DOMString userVerification = "preferred";
AuthenticationExtensionsClientInputsJSON extensions;
};
+
[SecureContext, Exposed=Window]
interface AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer clientDataJSON;
};
+
[SecureContext, Exposed=Window]
interface AuthenticatorAttestationResponse : AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer attestationObject;
@@ -111,6 +119,7 @@ interface AuthenticatorAttestationResponse : AuthenticatorResponse {
ArrayBuffer? getPublicKey();
COSEAlgorithmIdentifier getPublicKeyAlgorithm();
};
+
[SecureContext, Exposed=Window]
interface AuthenticatorAssertionResponse : AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer authenticatorData;
@@ -118,10 +127,12 @@ interface AuthenticatorAssertionResponse : AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer? userHandle;
[SameObject] readonly attribute ArrayBuffer? attestationObject;
};
+
dictionary PublicKeyCredentialParameters {
required DOMString type;
required COSEAlgorithmIdentifier alg;
};
+
dictionary PublicKeyCredentialCreationOptions {
required PublicKeyCredentialRpEntity rp;
required PublicKeyCredentialUserEntity user;
@@ -136,37 +147,45 @@ dictionary PublicKeyCredentialCreationOptions {
sequence<DOMString> attestationFormats = [];
AuthenticationExtensionsClientInputs extensions;
};
+
dictionary PublicKeyCredentialEntity {
required DOMString name;
};
+
dictionary PublicKeyCredentialRpEntity : PublicKeyCredentialEntity {
DOMString id;
};
+
dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity {
required BufferSource id;
required DOMString displayName;
};
+
dictionary AuthenticatorSelectionCriteria {
DOMString authenticatorAttachment;
DOMString residentKey;
boolean requireResidentKey = false;
DOMString userVerification = "preferred";
};
+
enum AuthenticatorAttachment {
"platform",
"cross-platform"
};
+
enum ResidentKeyRequirement {
"discouraged",
"preferred",
"required"
};
+
enum AttestationConveyancePreference {
"none",
"indirect",
"direct",
"enterprise"
};
+
dictionary PublicKeyCredentialRequestOptions {
required BufferSource challenge;
unsigned long timeout;
@@ -177,10 +196,13 @@ dictionary PublicKeyCredentialRequestOptions {
sequence<DOMString> attestationFormats = [];
AuthenticationExtensionsClientInputs extensions;
};
+
dictionary AuthenticationExtensionsClientInputs {
};
+
dictionary AuthenticationExtensionsClientOutputs {
};
+
dictionary CollectedClientData {
required DOMString type;
required DOMString challenge;
@@ -195,42 +217,54 @@ dictionary TokenBinding {
};
enum TokenBindingStatus { "present", "supported" };
+
enum PublicKeyCredentialType {
"public-key"
};
+
dictionary PublicKeyCredentialDescriptor {
required DOMString type;
required BufferSource id;
sequence<DOMString> transports;
};
+
enum AuthenticatorTransport {
"usb",
"nfc",
"ble",
+ "smart-card",
"hybrid",
"internal"
};
+
typedef long COSEAlgorithmIdentifier;
+
enum UserVerificationRequirement {
"required",
"preferred",
"discouraged"
};
+
partial dictionary AuthenticationExtensionsClientInputs {
USVString appid;
};
+
partial dictionary AuthenticationExtensionsClientOutputs {
boolean appid;
};
+
partial dictionary AuthenticationExtensionsClientInputs {
USVString appidExclude;
};
+
partial dictionary AuthenticationExtensionsClientOutputs {
boolean appidExclude;
};
+
partial dictionary AuthenticationExtensionsClientInputs {
boolean credProps;
};
+
dictionary CredentialPropertiesOutput {
boolean rk;
};
@@ -238,6 +272,7 @@ dictionary CredentialPropertiesOutput {
partial dictionary AuthenticationExtensionsClientOutputs {
CredentialPropertiesOutput credProps;
};
+
dictionary AuthenticationExtensionsPRFValues {
required BufferSource first;
BufferSource second;
@@ -289,12 +324,14 @@ dictionary AuthenticationExtensionsLargeBlobOutputs {
partial dictionary AuthenticationExtensionsClientInputs {
boolean uvm;
};
+
typedef sequence<unsigned long> UvmEntry;
typedef sequence<UvmEntry> UvmEntries;
partial dictionary AuthenticationExtensionsClientOutputs {
UvmEntries uvm;
};
+
dictionary AuthenticationExtensionsDevicePublicKeyInputs {
DOMString attestation = "none";
sequence<DOMString> attestationFormats = [];
diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl
index 00e4493d3c0..ab20879728d 100644
--- a/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl
@@ -3,6 +3,14 @@
// (https://github.com/w3c/webref)
// Source: AV1 WebCodecs Registration (https://w3c.github.io/webcodecs/av1_codec_registration.html)
+partial dictionary VideoEncoderConfig {
+ AV1EncoderConfig av1;
+};
+
+dictionary AV1EncoderConfig {
+ boolean forceScreenContentTools = false;
+};
+
partial dictionary VideoEncoderEncodeOptions {
VideoEncoderEncodeOptionsForAv1 av1;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl
index d4074f647da..2b952c22194 100644
--- a/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-avc-codec-registration.idl
@@ -15,3 +15,11 @@ enum AvcBitstreamFormat {
"annexb",
"avc",
};
+
+partial dictionary VideoEncoderEncodeOptions {
+ VideoEncoderEncodeOptionsForAvc avc;
+};
+
+dictionary VideoEncoderEncodeOptionsForAvc {
+ unsigned short? quantizer;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl
index 77649029db6..0b95dc8b757 100644
--- a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl
@@ -161,6 +161,7 @@ dictionary AudioEncoderConfig {
[EnforceRange] unsigned long sampleRate;
[EnforceRange] unsigned long numberOfChannels;
[EnforceRange] unsigned long long bitrate;
+ BitrateMode bitrateMode;
};
dictionary VideoEncoderConfig {
diff --git a/tests/wpt/web-platform-tests/interfaces/webgpu.idl b/tests/wpt/web-platform-tests/interfaces/webgpu.idl
index 284327a5789..34f78a1d8cd 100644
--- a/tests/wpt/web-platform-tests/interfaces/webgpu.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webgpu.idl
@@ -18,6 +18,7 @@ interface GPUSupportedLimits {
readonly attribute unsigned long maxTextureDimension3D;
readonly attribute unsigned long maxTextureArrayLayers;
readonly attribute unsigned long maxBindGroups;
+ readonly attribute unsigned long maxBindGroupsPlusVertexBuffers;
readonly attribute unsigned long maxBindingsPerBindGroup;
readonly attribute unsigned long maxDynamicUniformBuffersPerPipelineLayout;
readonly attribute unsigned long maxDynamicStorageBuffersPerPipelineLayout;
@@ -26,7 +27,6 @@ interface GPUSupportedLimits {
readonly attribute unsigned long maxStorageBuffersPerShaderStage;
readonly attribute unsigned long maxStorageTexturesPerShaderStage;
readonly attribute unsigned long maxUniformBuffersPerShaderStage;
- readonly attribute unsigned long maxFragmentCombinedOutputResources;
readonly attribute unsigned long long maxUniformBufferBindingSize;
readonly attribute unsigned long long maxStorageBufferBindingSize;
readonly attribute unsigned long minUniformBufferOffsetAlignment;
@@ -85,7 +85,7 @@ dictionary GPURequestAdapterOptions {
enum GPUPowerPreference {
"low-power",
- "high-performance"
+ "high-performance",
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -98,7 +98,8 @@ interface GPUAdapter {
Promise<GPUAdapterInfo> requestAdapterInfo(optional sequence<DOMString> unmaskHints = []);
};
-dictionary GPUDeviceDescriptor : GPUObjectDescriptorBase {
+dictionary GPUDeviceDescriptor
+ : GPUObjectDescriptorBase {
sequence<GPUFeatureName> requiredFeatures = [];
record<DOMString, GPUSize64> requiredLimits = {};
GPUQueueDescriptor defaultQueue = {};
@@ -115,7 +116,7 @@ enum GPUFeatureName {
"shader-f16",
"rg11b10ufloat-renderable",
"bgra8unorm-storage",
- "float32-filterable"
+ "float32-filterable",
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -167,10 +168,11 @@ GPUBuffer includes GPUObjectBase;
enum GPUBufferMapState {
"unmapped",
"pending",
- "mapped"
+ "mapped",
};
-dictionary GPUBufferDescriptor : GPUObjectDescriptorBase {
+dictionary GPUBufferDescriptor
+ : GPUObjectDescriptorBase {
required GPUSize64 size;
required GPUBufferUsageFlags usage;
boolean mappedAtCreation = false;
@@ -215,7 +217,8 @@ interface GPUTexture {
};
GPUTexture includes GPUObjectBase;
-dictionary GPUTextureDescriptor : GPUObjectDescriptorBase {
+dictionary GPUTextureDescriptor
+ : GPUObjectDescriptorBase {
required GPUExtent3D size;
GPUIntegerCoordinate mipLevelCount = 1;
GPUSize32 sampleCount = 1;
@@ -228,7 +231,7 @@ dictionary GPUTextureDescriptor : GPUObjectDescriptorBase {
enum GPUTextureDimension {
"1d",
"2d",
- "3d"
+ "3d",
};
typedef [EnforceRange] unsigned long GPUTextureUsageFlags;
@@ -246,7 +249,8 @@ interface GPUTextureView {
};
GPUTextureView includes GPUObjectBase;
-dictionary GPUTextureViewDescriptor : GPUObjectDescriptorBase {
+dictionary GPUTextureViewDescriptor
+ : GPUObjectDescriptorBase {
GPUTextureFormat format;
GPUTextureViewDimension dimension;
GPUTextureAspect aspect = "all";
@@ -262,13 +266,13 @@ enum GPUTextureViewDimension {
"2d-array",
"cube",
"cube-array",
- "3d"
+ "3d",
};
enum GPUTextureAspect {
"all",
"stencil-only",
- "depth-only"
+ "depth-only",
};
enum GPUTextureFormat {
@@ -388,7 +392,7 @@ enum GPUTextureFormat {
"astc-12x10-unorm",
"astc-12x10-unorm-srgb",
"astc-12x12-unorm",
- "astc-12x12-unorm-srgb"
+ "astc-12x12-unorm-srgb",
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -396,8 +400,9 @@ interface GPUExternalTexture {
};
GPUExternalTexture includes GPUObjectBase;
-dictionary GPUExternalTextureDescriptor : GPUObjectDescriptorBase {
- required HTMLVideoElement source;
+dictionary GPUExternalTextureDescriptor
+ : GPUObjectDescriptorBase {
+ required (HTMLVideoElement or VideoFrame) source;
PredefinedColorSpace colorSpace = "srgb";
};
@@ -406,7 +411,8 @@ interface GPUSampler {
};
GPUSampler includes GPUObjectBase;
-dictionary GPUSamplerDescriptor : GPUObjectDescriptorBase {
+dictionary GPUSamplerDescriptor
+ : GPUObjectDescriptorBase {
GPUAddressMode addressModeU = "clamp-to-edge";
GPUAddressMode addressModeV = "clamp-to-edge";
GPUAddressMode addressModeW = "clamp-to-edge";
@@ -422,17 +428,17 @@ dictionary GPUSamplerDescriptor : GPUObjectDescriptorBase {
enum GPUAddressMode {
"clamp-to-edge",
"repeat",
- "mirror-repeat"
+ "mirror-repeat",
};
enum GPUFilterMode {
"nearest",
- "linear"
+ "linear",
};
enum GPUMipmapFilterMode {
"nearest",
- "linear"
+ "linear",
};
enum GPUCompareFunction {
@@ -443,7 +449,7 @@ enum GPUCompareFunction {
"greater",
"not-equal",
"greater-equal",
- "always"
+ "always",
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -451,7 +457,8 @@ interface GPUBindGroupLayout {
};
GPUBindGroupLayout includes GPUObjectBase;
-dictionary GPUBindGroupLayoutDescriptor : GPUObjectDescriptorBase {
+dictionary GPUBindGroupLayoutDescriptor
+ : GPUObjectDescriptorBase {
required sequence<GPUBindGroupLayoutEntry> entries;
};
@@ -477,7 +484,7 @@ namespace GPUShaderStage {
enum GPUBufferBindingType {
"uniform",
"storage",
- "read-only-storage"
+ "read-only-storage",
};
dictionary GPUBufferBindingLayout {
@@ -489,7 +496,7 @@ dictionary GPUBufferBindingLayout {
enum GPUSamplerBindingType {
"filtering",
"non-filtering",
- "comparison"
+ "comparison",
};
dictionary GPUSamplerBindingLayout {
@@ -501,7 +508,7 @@ enum GPUTextureSampleType {
"unfilterable-float",
"depth",
"sint",
- "uint"
+ "uint",
};
dictionary GPUTextureBindingLayout {
@@ -511,7 +518,7 @@ dictionary GPUTextureBindingLayout {
};
enum GPUStorageTextureAccess {
- "write-only"
+ "write-only",
};
dictionary GPUStorageTextureBindingLayout {
@@ -528,7 +535,8 @@ interface GPUBindGroup {
};
GPUBindGroup includes GPUObjectBase;
-dictionary GPUBindGroupDescriptor : GPUObjectDescriptorBase {
+dictionary GPUBindGroupDescriptor
+ : GPUObjectDescriptorBase {
required GPUBindGroupLayout layout;
required sequence<GPUBindGroupEntry> entries;
};
@@ -551,7 +559,8 @@ interface GPUPipelineLayout {
};
GPUPipelineLayout includes GPUObjectBase;
-dictionary GPUPipelineLayoutDescriptor : GPUObjectDescriptorBase {
+dictionary GPUPipelineLayoutDescriptor
+ : GPUObjectDescriptorBase {
required sequence<GPUBindGroupLayout> bindGroupLayouts;
};
@@ -561,7 +570,8 @@ interface GPUShaderModule {
};
GPUShaderModule includes GPUObjectBase;
-dictionary GPUShaderModuleDescriptor : GPUObjectDescriptorBase {
+dictionary GPUShaderModuleDescriptor
+ : GPUObjectDescriptorBase {
required USVString code;
object sourceMap;
record<USVString, GPUShaderModuleCompilationHint> hints;
@@ -574,7 +584,7 @@ dictionary GPUShaderModuleCompilationHint {
enum GPUCompilationMessageType {
"error",
"warning",
- "info"
+ "info",
};
[Exposed=(Window, DedicatedWorker), Serializable, SecureContext]
@@ -604,14 +614,15 @@ dictionary GPUPipelineErrorInit {
enum GPUPipelineErrorReason {
"validation",
- "internal"
+ "internal",
};
enum GPUAutoLayoutMode {
- "auto"
+ "auto",
};
-dictionary GPUPipelineDescriptorBase : GPUObjectDescriptorBase {
+dictionary GPUPipelineDescriptorBase
+ : GPUObjectDescriptorBase {
required (GPUPipelineLayout or GPUAutoLayoutMode) layout;
};
@@ -633,7 +644,8 @@ interface GPUComputePipeline {
GPUComputePipeline includes GPUObjectBase;
GPUComputePipeline includes GPUPipelineBase;
-dictionary GPUComputePipelineDescriptor : GPUPipelineDescriptorBase {
+dictionary GPUComputePipelineDescriptor
+ : GPUPipelineDescriptorBase {
required GPUProgrammableStage compute;
};
@@ -643,7 +655,8 @@ interface GPURenderPipeline {
GPURenderPipeline includes GPUObjectBase;
GPURenderPipeline includes GPUPipelineBase;
-dictionary GPURenderPipelineDescriptor : GPUPipelineDescriptorBase {
+dictionary GPURenderPipelineDescriptor
+ : GPUPipelineDescriptorBase {
required GPUVertexState vertex;
GPUPrimitiveState primitive = {};
GPUDepthStencilState depthStencil;
@@ -666,18 +679,18 @@ enum GPUPrimitiveTopology {
"line-list",
"line-strip",
"triangle-list",
- "triangle-strip"
+ "triangle-strip",
};
enum GPUFrontFace {
"ccw",
- "cw"
+ "cw",
};
enum GPUCullMode {
"none",
"front",
- "back"
+ "back",
};
dictionary GPUMultisampleState {
@@ -686,7 +699,8 @@ dictionary GPUMultisampleState {
boolean alphaToCoverageEnabled = false;
};
-dictionary GPUFragmentState : GPUProgrammableStage {
+dictionary GPUFragmentState
+ : GPUProgrammableStage {
required sequence<GPUColorTargetState?> targets;
};
@@ -731,7 +745,7 @@ enum GPUBlendFactor {
"one-minus-dst-alpha",
"src-alpha-saturated",
"constant",
- "one-minus-constant"
+ "one-minus-constant",
};
enum GPUBlendOperation {
@@ -739,7 +753,7 @@ enum GPUBlendOperation {
"subtract",
"reverse-subtract",
"min",
- "max"
+ "max",
};
dictionary GPUDepthStencilState {
@@ -774,12 +788,12 @@ enum GPUStencilOperation {
"increment-clamp",
"decrement-clamp",
"increment-wrap",
- "decrement-wrap"
+ "decrement-wrap",
};
enum GPUIndexFormat {
"uint16",
- "uint32"
+ "uint32",
};
enum GPUVertexFormat {
@@ -812,15 +826,16 @@ enum GPUVertexFormat {
"sint32",
"sint32x2",
"sint32x3",
- "sint32x4"
+ "sint32x4",
};
enum GPUVertexStepMode {
"vertex",
- "instance"
+ "instance",
};
-dictionary GPUVertexState : GPUProgrammableStage {
+dictionary GPUVertexState
+ : GPUProgrammableStage {
sequence<GPUVertexBufferLayout?> buffers = [];
};
@@ -837,17 +852,43 @@ dictionary GPUVertexAttribute {
required GPUIndex32 shaderLocation;
};
-dictionary GPUImageDataLayout { GPUSize64 offset = 0; GPUSize32 bytesPerRow; GPUSize32 rowsPerImage;};
-dictionary GPUImageCopyBuffer : GPUImageDataLayout { required GPUBuffer buffer;};
-dictionary GPUImageCopyTexture { required GPUTexture texture; GPUIntegerCoordinate mipLevel = 0; GPUOrigin3D origin = {}; GPUTextureAspect aspect = "all";};
-dictionary GPUImageCopyTextureTagged : GPUImageCopyTexture { PredefinedColorSpace colorSpace = "srgb"; boolean premultipliedAlpha = false;};
-dictionary GPUImageCopyExternalImage { required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source; GPUOrigin2D origin = {}; boolean flipY = false;};
+dictionary GPUImageDataLayout {
+ GPUSize64 offset = 0;
+ GPUSize32 bytesPerRow;
+ GPUSize32 rowsPerImage;
+};
+
+dictionary GPUImageCopyBuffer
+ : GPUImageDataLayout {
+ required GPUBuffer buffer;
+};
+
+dictionary GPUImageCopyTexture {
+ required GPUTexture texture;
+ GPUIntegerCoordinate mipLevel = 0;
+ GPUOrigin3D origin = {};
+ GPUTextureAspect aspect = "all";
+};
+
+dictionary GPUImageCopyTextureTagged
+ : GPUImageCopyTexture {
+ PredefinedColorSpace colorSpace = "srgb";
+ boolean premultipliedAlpha = false;
+};
+
+dictionary GPUImageCopyExternalImage {
+ required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source;
+ GPUOrigin2D origin = {};
+ boolean flipY = false;
+};
+
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUCommandBuffer {
};
GPUCommandBuffer includes GPUObjectBase;
-dictionary GPUCommandBufferDescriptor : GPUObjectDescriptorBase {
+dictionary GPUCommandBufferDescriptor
+ : GPUObjectDescriptorBase {
};
interface mixin GPUCommandsMixin {
@@ -900,14 +941,15 @@ GPUCommandEncoder includes GPUObjectBase;
GPUCommandEncoder includes GPUCommandsMixin;
GPUCommandEncoder includes GPUDebugCommandsMixin;
-dictionary GPUCommandEncoderDescriptor : GPUObjectDescriptorBase {
+dictionary GPUCommandEncoderDescriptor
+ : GPUObjectDescriptorBase {
};
interface mixin GPUBindingCommandsMixin {
- undefined setBindGroup(GPUIndex32 index, GPUBindGroup bindGroup,
+ undefined setBindGroup(GPUIndex32 index, GPUBindGroup? bindGroup,
optional sequence<GPUBufferDynamicOffset> dynamicOffsets = []);
- undefined setBindGroup(GPUIndex32 index, GPUBindGroup bindGroup,
+ undefined setBindGroup(GPUIndex32 index, GPUBindGroup? bindGroup,
Uint32Array dynamicOffsetsData,
GPUSize64 dynamicOffsetsDataStart,
GPUSize32 dynamicOffsetsDataLength);
@@ -932,21 +974,15 @@ GPUComputePassEncoder includes GPUCommandsMixin;
GPUComputePassEncoder includes GPUDebugCommandsMixin;
GPUComputePassEncoder includes GPUBindingCommandsMixin;
-enum GPUComputePassTimestampLocation {
- "beginning",
- "end"
-};
-
-dictionary GPUComputePassTimestampWrite {
+dictionary GPUComputePassTimestampWrites {
required GPUQuerySet querySet;
- required GPUSize32 queryIndex;
- required GPUComputePassTimestampLocation location;
+ GPUSize32 beginningOfPassWriteIndex;
+ GPUSize32 endOfPassWriteIndex;
};
-typedef sequence<GPUComputePassTimestampWrite> GPUComputePassTimestampWrites;
-
-dictionary GPUComputePassDescriptor : GPUObjectDescriptorBase {
- GPUComputePassTimestampWrites timestampWrites = [];
+dictionary GPUComputePassDescriptor
+ : GPUObjectDescriptorBase {
+ GPUComputePassTimestampWrites timestampWrites;
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -973,24 +1009,18 @@ GPURenderPassEncoder includes GPUDebugCommandsMixin;
GPURenderPassEncoder includes GPUBindingCommandsMixin;
GPURenderPassEncoder includes GPURenderCommandsMixin;
-enum GPURenderPassTimestampLocation {
- "beginning",
- "end"
-};
-
-dictionary GPURenderPassTimestampWrite {
+dictionary GPURenderPassTimestampWrites {
required GPUQuerySet querySet;
- required GPUSize32 queryIndex;
- required GPURenderPassTimestampLocation location;
+ GPUSize32 beginningOfPassWriteIndex;
+ GPUSize32 endOfPassWriteIndex;
};
-typedef sequence<GPURenderPassTimestampWrite> GPURenderPassTimestampWrites;
-
-dictionary GPURenderPassDescriptor : GPUObjectDescriptorBase {
+dictionary GPURenderPassDescriptor
+ : GPUObjectDescriptorBase {
required sequence<GPURenderPassColorAttachment?> colorAttachments;
GPURenderPassDepthStencilAttachment depthStencilAttachment;
GPUQuerySet occlusionQuerySet;
- GPURenderPassTimestampWrites timestampWrites = [];
+ GPURenderPassTimestampWrites timestampWrites;
GPUSize64 maxDrawCount = 50000000;
};
@@ -1019,15 +1049,16 @@ dictionary GPURenderPassDepthStencilAttachment {
enum GPULoadOp {
"load",
- "clear"
+ "clear",
};
enum GPUStoreOp {
"store",
- "discard"
+ "discard",
};
-dictionary GPURenderPassLayout : GPUObjectDescriptorBase {
+dictionary GPURenderPassLayout
+ : GPUObjectDescriptorBase {
required sequence<GPUTextureFormat?> colorFormats;
GPUTextureFormat depthStencilFormat;
GPUSize32 sampleCount = 1;
@@ -1037,7 +1068,7 @@ interface mixin GPURenderCommandsMixin {
undefined setPipeline(GPURenderPipeline pipeline);
undefined setIndexBuffer(GPUBuffer buffer, GPUIndexFormat indexFormat, optional GPUSize64 offset = 0, optional GPUSize64 size);
- undefined setVertexBuffer(GPUIndex32 slot, GPUBuffer buffer, optional GPUSize64 offset = 0, optional GPUSize64 size);
+ undefined setVertexBuffer(GPUIndex32 slot, GPUBuffer? buffer, optional GPUSize64 offset = 0, optional GPUSize64 size);
undefined draw(GPUSize32 vertexCount, optional GPUSize32 instanceCount = 1,
optional GPUSize32 firstVertex = 0, optional GPUSize32 firstInstance = 0);
@@ -1055,7 +1086,8 @@ interface GPURenderBundle {
};
GPURenderBundle includes GPUObjectBase;
-dictionary GPURenderBundleDescriptor : GPUObjectDescriptorBase {
+dictionary GPURenderBundleDescriptor
+ : GPUObjectDescriptorBase {
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -1068,12 +1100,14 @@ GPURenderBundleEncoder includes GPUDebugCommandsMixin;
GPURenderBundleEncoder includes GPUBindingCommandsMixin;
GPURenderBundleEncoder includes GPURenderCommandsMixin;
-dictionary GPURenderBundleEncoderDescriptor : GPURenderPassLayout {
+dictionary GPURenderBundleEncoderDescriptor
+ : GPURenderPassLayout {
boolean depthReadOnly = false;
boolean stencilReadOnly = false;
};
-dictionary GPUQueueDescriptor : GPUObjectDescriptorBase {
+dictionary GPUQueueDescriptor
+ : GPUObjectDescriptorBase {
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -1111,14 +1145,15 @@ interface GPUQuerySet {
};
GPUQuerySet includes GPUObjectBase;
-dictionary GPUQuerySetDescriptor : GPUObjectDescriptorBase {
+dictionary GPUQuerySetDescriptor
+ : GPUObjectDescriptorBase {
required GPUQueryType type;
required GPUSize32 count;
};
enum GPUQueryType {
"occlusion",
- "timestamp"
+ "timestamp",
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -1133,7 +1168,7 @@ interface GPUCanvasContext {
enum GPUCanvasAlphaMode {
"opaque",
- "premultiplied"
+ "premultiplied",
};
dictionary GPUCanvasConfiguration {
@@ -1147,7 +1182,7 @@ dictionary GPUCanvasConfiguration {
enum GPUDeviceLostReason {
"unknown",
- "destroyed"
+ "destroyed",
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -1166,24 +1201,27 @@ interface GPUError {
};
[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUValidationError : GPUError {
+interface GPUValidationError
+ : GPUError {
constructor(DOMString message);
};
[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUOutOfMemoryError : GPUError {
+interface GPUOutOfMemoryError
+ : GPUError {
constructor(DOMString message);
};
[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUInternalError : GPUError {
+interface GPUInternalError
+ : GPUError {
constructor(DOMString message);
};
enum GPUErrorFilter {
"validation",
"out-of-memory",
- "internal"
+ "internal",
};
partial interface GPUDevice {
diff --git a/tests/wpt/web-platform-tests/interfaces/webnn.idl b/tests/wpt/web-platform-tests/interfaces/webnn.idl
index 2c2ab35e909..d2b973a624b 100644
--- a/tests/wpt/web-platform-tests/interfaces/webnn.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webnn.idl
@@ -489,13 +489,8 @@ partial interface MLGraphBuilder {
MLActivation sigmoid();
};
-dictionary MLSliceOptions {
- sequence<unsigned long> axes;
-};
-
partial interface MLGraphBuilder {
- MLOperand slice(MLOperand input, sequence<long> starts, sequence<long> sizes,
- optional MLSliceOptions options = {});
+ MLOperand slice(MLOperand input, sequence<unsigned long> starts, sequence<unsigned long> sizes);
};
partial interface MLGraphBuilder {
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl
index e48f1080c41..59710bf46c2 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl
@@ -72,7 +72,8 @@ dictionary RTCEncodedVideoFrameMetadata {
unsigned long temporalIndex;
unsigned long synchronizationSource;
octet payloadType;
- sequence<unsigned long> contributingSources;
+ sequence<unsigned long> contributingSources;
+ long long timestamp; // microseconds
};
// New interfaces to define encoded video and audio frames. Will eventually
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
index 7e820a26df4..a5fb3294b7e 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
@@ -94,6 +94,8 @@ dictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats {
boolean powerEfficientDecoder;
unsigned long framesAssembledFromMultiplePackets;
double totalAssemblyTime;
+ unsigned long long retransmittedPacketsReceived;
+ unsigned long long retransmittedBytesReceived;
};
dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats {
diff --git a/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl b/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl
index e182f47b9c5..c8b3a71c699 100644
--- a/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webxrlayers.idl
@@ -11,6 +11,12 @@ enum XRLayerLayout {
"stereo-top-bottom"
};
+enum XRLayerQuality {
+ "default",
+ "text-optimized",
+ "graphics-optimized"
+};
+
[Exposed=Window] interface XRCompositionLayer : XRLayer {
readonly attribute XRLayerLayout layout;
@@ -18,6 +24,7 @@ enum XRLayerLayout {
attribute boolean forceMonoPresentation;
attribute float opacity;
readonly attribute unsigned long mipLevels;
+ attribute XRLayerQuality quality;
readonly attribute boolean needsRedraw;
@@ -106,6 +113,7 @@ dictionary XRProjectionLayerInit {
GLenum colorFormat = 0x1908; // RGBA
GLenum depthFormat = 0x1902; // DEPTH_COMPONENT
double scaleFactor = 1.0;
+ boolean clearOnAccess = true;
};
dictionary XRLayerInit {
@@ -117,6 +125,7 @@ dictionary XRLayerInit {
required unsigned long viewPixelHeight;
XRLayerLayout layout = "mono";
boolean isStatic = false;
+ boolean clearOnAccess = true;
};
dictionary XRQuadLayerInit : XRLayerInit {
diff --git a/tests/wpt/web-platform-tests/lint.ignore b/tests/wpt/web-platform-tests/lint.ignore
index 7118adb1611..1672f3b52e7 100644
--- a/tests/wpt/web-platform-tests/lint.ignore
+++ b/tests/wpt/web-platform-tests/lint.ignore
@@ -362,7 +362,6 @@ SET TIMEOUT: speculation-rules/prerender/resources/media-autoplay-attribute.html
SET TIMEOUT: speculation-rules/prerender/resources/media-play.html
SET TIMEOUT: html/browsers/browsing-the-web/back-forward-cache/timers.html
SET TIMEOUT: dom/abort/crashtests/timeout-close.html
-SET TIMEOUT: common/rendering-utils.js
# setTimeout use in reftests
SET TIMEOUT: acid/acid3/test.html
@@ -428,8 +427,12 @@ TRAILING WHITESPACE: css/css-fonts/support/fonts/gsubtest-lookup3.ufo/features.f
SET TIMEOUT: css/compositing/mix-blend-mode/mix-blend-mode-parent-with-3D-transform-and-transition.html
SET TIMEOUT: css/compositing/mix-blend-mode/mix-blend-mode-sibling-with-3D-transform-and-transition.html
+SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html
+SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-background-repaint.html
SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-border-repaint-parent.html
SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-border-repaint.html
+SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html
+SET TIMEOUT: css/css-backgrounds/color-mix-currentcolor-outline-repaint.html
SET TIMEOUT: css/css-backgrounds/currentcolor-border-repaint-parent.html
SET TIMEOUT: css/css-transitions/events-007.html
SET TIMEOUT: css/css-transitions/support/generalParallelTest.js
diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html
index 97e781054f3..39e8676d19f 100644
--- a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html
+++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-error.html
@@ -57,6 +57,15 @@
recorder.start();
});
}, "MediaRecorder cannot start recording when MediaRecorder' state is not inactive and an InvalidStateError should be thrown");
+ test(t => {
+ const { stream: video } = createVideoStream(t);
+ assert_throws_dom("NotSupportedError", function () {
+ new MediaRecorder(video, {
+ videoKeyFrameIntervalDuration: 10,
+ videoKeyFrameIntervalCount: 10,
+ });
+ });
+ }, "MediaRecorder throws NotSupportedError when given both videoKeyFrameIntervalDuration and videoKeyFrameIntervalCount");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-video-key-frame-distance.html b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-video-key-frame-distance.html
new file mode 100644
index 00000000000..b986b3075ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-record/MediaRecorder-video-key-frame-distance.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<html>
+<head>
+ <title>MediaRecorder Stop</title>
+ <link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#mediarecorder">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="utils/sources.js"></script>
+</head>
+<body>
+<script>
+ promise_test(async t => {
+ const {stream: video} = createVideoStream(t);
+ let videoKeyFrameIntervalDurationUsed = false;
+ var options = {
+ get videoKeyFrameIntervalDuration() {
+ videoKeyFrameIntervalDurationUsed = true;
+ return 1000;
+ }
+ }
+ const recorder = new MediaRecorder(video, options);
+ assert_true(videoKeyFrameIntervalDurationUsed);
+ }, "MediaRecorder interprets videoKeyFrameIntervalDuration");
+
+ promise_test(async t => {
+ const {stream: video} = createVideoStream(t);
+ let videoKeyFrameIntervalCountUsed = false;
+ var options = {
+ get videoKeyFrameIntervalCount() {
+ videoKeyFrameIntervalCountUsed = true;
+ return 5;
+ }
+ }
+ const recorder = new MediaRecorder(video, options);
+ assert_true(videoKeyFrameIntervalCountUsed);
+ }, "MediaRecorder interprets videoKeyFrameIntervalCount");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html
index 733642fd032..c673e09cb46 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/back-forward-cache-restoration.tentative.html
@@ -14,6 +14,12 @@
const BackForwardCacheRestorationName = '';
const BackForwardCacheRestorationType = 'back-forward-cache-restoration';
+ let getNavigationId = (i) => {
+ let identifier = 'mark' + i;
+ performance.mark(identifier);
+ return window.performance.getEntriesByName(identifier)[0].navigationId;
+ }
+
let getNumberofBackForwardCacheRestorationEntries = (BackForwardCacheRestorationType) => {
return window.performance.getEntriesByType(BackForwardCacheRestorationType).length;
}
@@ -40,10 +46,10 @@
return await p;
}
- let checkEntry = (entry, expectedNavigationId) => {
+ let checkEntry = (entry, previousNavigationId) => {
assert_equals(entry.name, BackForwardCacheRestorationName);
assert_equals(entry.entryType, BackForwardCacheRestorationType);
- assert_equals(entry.navigationId, expectedNavigationId);
+ assert_not_equals(entry.navigationId, previousNavigationId);
assert_true(entry.pageshowEventStart > entry.startTime);
assert_true(entry.pageshowEventEnd >= entry.pageshowEventStart);
}
@@ -64,18 +70,23 @@
let entry;
for (i = 0; i < 2; i++) {
+ let curr_nav_id = await pageA.execute_script(getNavigationId, [i]);
+
// Navigate away to url B and back.
await navigateAndThenBack(pageA, pageB, urlB);
// Assert Performance Observer API supports BackForwardCacheRestoration.
entry = await pageA.execute_script(getBackForwardCacheRestorationByPerformanceObserverBuffered, [BackForwardCacheRestorationType]);
- checkEntry(entry, i + 2); // The expected navigation id of the entry created at i-th navigating away and back is i+2 because navigation id starts from 1 and increments before an instance of BackForwardRestoration is created.
+ // The navigation id after a bfcache restoration should be different
+ // from that before.
+ checkEntry(entry, curr_nav_id);
+
// Assert Performance Timeline API supports BackForwardCacheRestoration.
entry = await pageA.execute_script(getBackForwardCacheRestorationByType, [BackForwardCacheRestorationType]);
- checkEntry(entry, i + 2);
+ checkEntry(entry, curr_nav_id);
entry = await pageA.execute_script(getBackForwardCacheRestorationByGetAllAndFilter, [BackForwardCacheRestorationType]);
- checkEntry(entry, i + 2);
+ checkEntry(entry, curr_nav_id);
}
}, 'Performance API for the back forward cache restoration entry.');
</script>
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html
index bc52f208b07..7ff415530bc 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-element-timing.tentative.html
@@ -8,7 +8,7 @@
<script src="navigation-id.helper.js"></script>
<script>
runNavigationIdTest({
- navigationTimes: 4,
+ navigationTimes: 3,
testName: 'element_timing',
}, "Element Timing navigation id test");
</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html
index 3228e12778b..93ddcff062e 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-initial-load.tentative.html
@@ -20,24 +20,30 @@ navigation id, not the increment.
}
promise_test(async t => {
- // Assert navigation id exists in LCP entries and is the default value 1.
- const navigationIds = await NavigationIdsFromLCP();
- assert_true(navigationIds.every(e => e.navigationId == 1), 'Navigation Id\
- of LCP entries should be default value 1 at initial navigations');
+ // Assert navigation id exists in LCP entries and and are all the same.
+ const navigationIdsOfLCP = (await NavigationIdsFromLCP()).map(e => e.navigationId);
+ assert_true(navigationIdsOfLCP.every(e => e == navigationIdsOfLCP[0]),
+ 'Navigation Ids of LCP entries should be the same at initial navigation');
- // Assert navigation id exists in a NavigationTiming entry and is the
- // default value 1.
- const navigationId = performance.getEntriesByType('navigation')[0].navigationId;
- assert_equals(navigationId, 1, 'Navigation Id of an navigation timing\
- entry should be default value 1 at initial navigations');
+ // Assert navigation id exists in a NavigationTiming entry.
+ const navigationIdOfNavigationTiming =
+ performance.getEntriesByType('navigation')[0].navigationId;
+ assert_not_equals(navigationIdOfNavigationTiming, null,
+ 'Navigation Id of a navigation timing entry should exist at initial navigation');
- // Assert navigation id exists in PaintTiming entries and is the default
- // value 1.
- assert_true(performance.getEntriesByType('paint').every(e =>
- e.navigationId == 1),
- 'Navigation Id of PaintTiming entries should be default value 1 at\
- initial navigations.');
+ // Assert navigation id exists in PaintTiming entries and are all the same.
+ const navigationIdsOfPaintTiming =
+ performance.getEntriesByType('paint').map(e => e.navigationId);
+ assert_true(navigationIdsOfPaintTiming.every(e =>
+ e == navigationIdsOfPaintTiming[0]),
+ 'Navigation Id of PaintTiming entries should be the same as the initial navigation.');
- }, 'Navigation Id should be 1 at initial navigations.');
+ // Assert navigation ids are all the same.
+ const navigationIdsOfAll =
+ navigationIdsOfLCP.concat(navigationIdsOfPaintTiming, navigationIdOfNavigationTiming);
+ assert_true(navigationIdsOfAll.every(e => e == navigationIdsOfAll[0]),
+ 'Navigation Id of all entries should be the same as the initial navigation.');
+
+ }, 'Navigation Ids should exist and are all the same as the initial navigation.');
</script>
-</body>
+</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html
index 662e17508b2..e1da9100aee 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-long-task-task-attribution.tentative.html
@@ -8,7 +8,7 @@
<script src="navigation-id.helper.js"></script>
<script>
runNavigationIdTest({
- navigationTimes: 4,
+ navigationTimes: 3,
testName: 'long_task_task_attribution',
}, "Long Task/Task Attribution navigation id test");
</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html
index 42795f94a98..30613ebb980 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-mark-measure.tentative.html
@@ -8,7 +8,7 @@
<script src="navigation-id.helper.js"></script>
<script>
runNavigationIdTest({
- navigationTimes: 4,
+ navigationTimes: 3,
testName: 'mark_measure',
}, "Mark/Measure navigation id test");
</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html
index 7386331d26e..f5a2428e5f5 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-reset.tentative.html
@@ -26,24 +26,28 @@
window.open(urlA, '_blank', 'noopener')
await pageA.execute_script(waitForPageShow);
- // Assert navigation id is 1 when the document is loaded first time.
-
- let navigationId = await pageA.execute_script(getNavigationId);
- assert_equals(navigationId, 1, 'Navigation Id should be 1 initially.');
+ let navigationIdInitial = await pageA.execute_script(getNavigationId);
// Navigate away to url B and back.
await navigateAndThenBack(pageA, pageB, urlB);
- // Assert navigation id increments to 2 when the document is load from bfcache.
- navigationId = await pageA.execute_script(getNavigationId);
- assert_equals(navigationId, 2, 'Navigation Id should be 2 after increment.');
+ // Assert navigation id is re-generated and thus different when the
+ // document is load from bfcache.
+ navigationIdAfterBFCacheNav = await pageA.execute_script(getNavigationId);
+ assert_not_equals(navigationIdInitial, navigationIdAfterBFCacheNav, 'Navigation Id should be \
+ re-generated and different from the previous one after back-forward-cache navigation.');
// Reload page.
await pageA.execute_script(reload);
await pageA.execute_script(waitForPageShow);
- // Assert navigation id is reset to 1 after reload.
- navigationId = await pageA.execute_script(getNavigationId);
- assert_equals(navigationId, 1, 'Navigation Id should be 1 after reload.');
- }, 'Navigation Id should be reset to 1 after reload.');
+ navigationIdAfterReset = await pageA.execute_script(getNavigationId);
+
+ assert_not_equals(navigationIdAfterReset, navigationIdAfterBFCacheNav, 'Navigation Id should\
+ be re-generated after reload which is different from the previous one.');
+
+ assert_not_equals(navigationIdAfterReset, navigationIdInitial, 'Navigation Id should\
+ be re-generated after reload which is different from the one of the initial load.');
+
+ }, 'Navigation Id should be re-generated after reload.');
</script>
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html
index 1ec906ebbbb..6d0614a6e23 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-resource-timing.tentative.html
@@ -8,7 +8,7 @@
<script src="navigation-id.helper.js"></script>
<script>
runNavigationIdTest({
- navigationTimes: 4,
+ navigationTimes: 3,
testName: 'resource_timing',
}, "Resource Timing navigation id test");
</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id-worker-created-entries.html b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-worker-created-entries.html
new file mode 100644
index 00000000000..96fc57be1d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id-worker-created-entries.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<html>
+
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+
+<body>
+ <script>
+ promise_test(async () => {
+ const worker = new Worker("resources/worker-navigation-id.js");
+
+ const navigationId = await new Promise(resolve => {
+ worker.onmessage = (e) => {
+ resolve(e.data);
+ };
+ worker.postMessage('');
+ });
+
+ assert_equals(navigationId.length, 0,
+ 'Navigation id of performance entries created by a worker should be empty.');
+ }, 'Navigation id of performance entries created by workers should be empty');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js b/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js
index 53099cadb25..1b72fe9908d 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js
+++ b/tests/wpt/web-platform-tests/performance-timeline/navigation-id.helper.js
@@ -9,10 +9,10 @@ let testInitial = () => {
return window.performance.getEntries().map(e => e.navigationId);
}
-let testMarkMeasure = (expectedNavigationId, markName, MeasureName) => {
+let testMarkMeasure = (markId, markName, MeasureName) => {
const markName1 = 'test-mark';
- const markName2 = 'test-mark' + expectedNavigationId;
- const measureName = 'test-measure' + expectedNavigationId;
+ const markName2 = 'test-mark' + markId;
+ const measureName = 'test-measure' + markId;
window.performance.mark(markName1);
window.performance.mark(markName2);
@@ -21,12 +21,13 @@ let testMarkMeasure = (expectedNavigationId, markName, MeasureName) => {
window.performance.getEntriesByName(measureName)).map(e => e.navigationId);
}
-let testResourceTiming = async (expectedNavigationId) => {
- let navigationId = -1;
+let testResourceTiming = async (resourceTimingEntryId) => {
+ let navigationId;
let p = new Promise(resolve => {
new PerformanceObserver((list) => {
- const entry = list.getEntries().find(e => e.name.includes('json_resource') && e.navigationId == expectedNavigationId);
+ const entry = list.getEntries().find(
+ e => e.name.includes('json_resource' + resourceTimingEntryId));
if (entry) {
navigationId = entry.navigationId;
resolve();
@@ -34,16 +35,18 @@ let testResourceTiming = async (expectedNavigationId) => {
}).observe({ type: 'resource' });
});
- const resp = await fetch('/performance-timeline/resources/json_resource.json');
+ const resp = await fetch(
+ '/performance-timeline/resources/json_resource' + resourceTimingEntryId + '.json');
await p;
return [navigationId];
}
-let testElementTiming = async (expectedNavigationId) => {
- let navigationId = -1;
+let testElementTiming = async (elementTimingEntryId) => {
+ let navigationId;
let p = new Promise(resolve => {
new PerformanceObserver((list) => {
- const entry = list.getEntries().find(e => e.entryType === 'element' && e.identifier === 'test-element-timing' + expectedNavigationId);
+ const entry = list.getEntries().find(
+ e => e.entryType === 'element' && e.identifier === 'test-element-timing' + elementTimingEntryId);
if (entry) {
navigationId = entry.navigationId;
resolve();
@@ -52,7 +55,7 @@ let testElementTiming = async (expectedNavigationId) => {
});
let el = document.createElement('p');
- el.setAttribute('elementtiming', 'test-element-timing' + expectedNavigationId);
+ el.setAttribute('elementtiming', 'test-element-timing' + elementTimingEntryId);
el.textContent = 'test element timing text';
document.body.appendChild(el);
await p;
@@ -110,21 +113,32 @@ function runNavigationIdTest(params, description) {
params.openFunc(urlA);
await pageA.execute_script(waitForPageShow);
- // Assert navigation id is 1 when the document is loaded first time.
+ // Assert navigation ids of all performance entries are the same.
let navigationIds = await pageA.execute_script(testInitial);
assert_true(
- navigationIds.every(t => t === 1), 'All Navigation Ids should be 1.');
+ navigationIds.every(t => t === navigationIds[0]),
+ 'Navigation Ids should be the same as the initial load.');
for (i = 1; i <= params.navigationTimes; i++) {
// Navigate away to url B and back.
await navigateAndThenBack(pageA, pageB, urlB);
- // Assert navigation id increments when the document is load from bfcache.
- navigationIds = await pageA.execute_script(
+ // Assert new navigation ids are generated when the document is load from bfcache.
+ let nextNavigationIds = await pageA.execute_script(
testFunctionMap[params.testName], [i + 1]);
+
+ // Assert navigation ids of all performance entries are the same.
+ assert_true(
+ nextNavigationIds.every(t => t === nextNavigationIds[0]),
+ 'All Navigation Ids should be same after bfcache navigation.');
+
+ // Assert navigation ids after bfcache navigation are different from those before.
assert_true(
- navigationIds.every(t => t === (i + 1)),
- params.testName + ' Navigation Id should all be ' + (i + 1) + '.');
+ navigationIds[0] !== nextNavigationIds[0],
+ params.testName +
+ ' Navigation Ids should be re-generated and different from the previous ones.');
+
+ navigationIds = nextNavigationIds;
}
}, description);
-}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/performance-timeline/resources/worker-navigation-id.js b/tests/wpt/web-platform-tests/performance-timeline/resources/worker-navigation-id.js
new file mode 100644
index 00000000000..3a2740d0675
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/resources/worker-navigation-id.js
@@ -0,0 +1,6 @@
+self.onmessage = () => {
+ const mark_name = 'user_timig_mark';
+ performance.mark(mark_name);
+ postMessage(performance.getEntriesByName(mark_name)[0].navigationId);
+ self.close();
+}
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html
index b3b7481d6ab..5ec1bab1649 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_auxclick_is_a_pointerevent.html
@@ -26,10 +26,15 @@ target.addEventListener("pointerdown", (e)=>{
function testFunction(test){
return test.step_func(e=>{
- assert_equals(e.constructor, window.PointerEvent, "auxclick should use a PointerEvent constructor");
- assert_true(e instanceof PointerEvent, "auxclick should be a PointerEvent");
- assert_equals(e.pointerId, pointerId, "auxclick's pointerId should match the pointerId of the pointer event that triggers it");
- assert_equals(e.pointerType, pointerType, "axclick's pointerType should match the pointerType of the pointer event that triggers it");
+ assert_equals(e.constructor, window.PointerEvent,
+ "auxclick should use a PointerEvent constructor");
+ assert_true(e instanceof PointerEvent,
+ "auxclick should be a PointerEvent");
+ assert_equals(e.pointerId, pointerId,
+ "auxclick's pointerId should match the pointerId of the pointer event that triggers it");
+ assert_equals(e.pointerType, pointerType,
+ "auxclick's pointerType should match the pointerType of the pointer event that triggers it");
+ assert_equals(e.composed, true, "auxclick.composed should be true");
});
}
@@ -51,10 +56,15 @@ function run_test(pointerType){
.pointerMove(0,0, {origin:target, sourceName:testPointer})
.pointerDown({button:actions.ButtonType.MIDDLE, sourceName:testPointer})
.pointerUp({button:actions.ButtonType.MIDDLE, sourceName:testPointer});
- Promise.all([pointerDownPrevented, eventWatcher.wait_for("auxclick"), actions.send()]).then(()=>resolve());
+ Promise.all([
+ pointerDownPrevented,
+ eventWatcher.wait_for("auxclick"),
+ actions.send()
+ ]).then(()=>resolve());
}), "auxclick using " + pointerType + " is a PointerEvent");
}
run_test(inputSource);
-// TODO(crbug.com/1150441): Add test for auxclick from touch.Note: Calling run_test("touch") here times out.
+// TODO(crbug.com/1150441): Add test for auxclick from touch. Note: Calling
+// run_test("touch") here times out.
</script>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html
index 9e4b023a25a..2571c9c9034 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_click_is_a_pointerevent.html
@@ -25,6 +25,7 @@ function assert_click_construction(click_event, window_object) {
"click should use a PointerEvent constructor");
assert_true(click_event instanceof window_object.PointerEvent,
"click should be a PointerEvent instance");
+ assert_equals(click_event.composed, true, "click.composed should be true");
}
function assert_click_attributes(click_event, pointerdown_event, pointerup_event) {
@@ -36,7 +37,7 @@ function assert_click_attributes(click_event, pointerdown_event, pointerup_event
assert_equals(click_event.pointerId, pointerup_event.pointerId,
"click.pointerId should match the pointerId of the triggering pointerup");
assert_equals(click_event.pointerType, pointerup_event.pointerType,
- "click.pointerType should match the pointerType of the triggering pointerup");
+ "click.pointerType should match the pointerType of the triggering pointerup");
}
promise_test(async () => {
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html
index fe3a69942ef..d951be542a3 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html
@@ -20,10 +20,15 @@ let pointerdownPointerId, pointerdownPointerType;
let inputSource = location.search.substring(1);
target.addEventListener("contextmenu", contextmenuTest.step_func((e)=>{
- assert_equals(e.constructor, window.PointerEvent, "contextmenu should use a PointerEvent constructor");
- assert_true(e instanceof PointerEvent, "contextmenu should be a PointerEvent");
- assert_equals(e.pointerId, pointerdownPointerId, "contextmenu's pointerId should match the pointerId of the pointer event that triggers it");
- assert_equals(e.pointerType, pointerdownPointerType, "contextmenu's pointerType should match the pointerType of the pointer event that triggers it");
+ assert_equals(e.constructor, window.PointerEvent,
+ "contextmenu should use a PointerEvent constructor");
+ assert_true(e instanceof PointerEvent,
+ "contextmenu should be a PointerEvent");
+ assert_equals(e.pointerId, pointerdownPointerId,
+ "contextmenu's pointerId should match the pointerId of the pointer event that triggers it");
+ assert_equals(e.pointerType, pointerdownPointerType,
+ "contextmenu's pointerType should match the pointerType of the pointer event that triggers it");
+ assert_equals(e.composed, true, "contextmenu.composed should be true");
}));
target.addEventListener("pointerdown", e=>{
pointerdownPointerId = e.pointerId;
diff --git a/tests/wpt/web-platform-tests/preload/modulepreload-as.html b/tests/wpt/web-platform-tests/preload/modulepreload-as.html
new file mode 100644
index 00000000000..dd946e454a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/modulepreload-as.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="modulepreload" href="resources/module1.js?empty-string" as="" data-as="">
+<link rel="modulepreload" href="resources/module1.js?audio" as="audio" data-as="audio">
+<link rel="modulepreload" href="resources/module1.js?audioworklet" as="audioworklet" data-as="audioworklet">
+<link rel="modulepreload" href="resources/module1.js?document" as="document" data-as="document">
+<link rel="modulepreload" href="resources/module1.js?embed" as="embed" data-as="embed">
+<link rel="modulepreload" href="resources/module1.js?font" as="font" data-as="font">
+<link rel="modulepreload" href="resources/module1.js?frame" as="frame" data-as="frame">
+<link rel="modulepreload" href="resources/module1.js?iframe" as="iframe" data-as="iframe">
+<link rel="modulepreload" href="resources/module1.js?image" as="image" data-as="image">
+<link rel="modulepreload" href="resources/module1.js?manifest" as="manifest" data-as="manifest">
+<link rel="modulepreload" href="resources/module1.js?object" as="object" data-as="object">
+<link rel="modulepreload" href="resources/module1.js?paintworklet" as="paintworklet" data-as="paintworklet">
+<link rel="modulepreload" href="resources/module1.js?report" as="report" data-as="report">
+<link rel="modulepreload" href="resources/module1.js?script" as="script" data-as="script">
+<link rel="modulepreload" href="resources/module1.js?serviceworker" as="serviceworker" data-as="serviceworker">
+<link rel="modulepreload" href="resources/module1.js?sharedworker" as="sharedworker" data-as="sharedworker">
+<link rel="modulepreload" href="resources/module1.js?style" as="style" data-as="style">
+<link rel="modulepreload" href="resources/module1.js?track" as="track" data-as="track">
+<link rel="modulepreload" href="resources/module1.js?video" as="video" data-as="video">
+<link rel="modulepreload" href="resources/module1.js?webidentity" as="webidentity" data-as="webidentity">
+<link rel="modulepreload" href="resources/module1.js?worker" as="worker" data-as="worker">
+<link rel="modulepreload" href="resources/module1.js?xslt" as="xslt" data-as="xslt">
+<link rel="modulepreload" href="resources/module1.js?fetch" as="fetch" data-as="fetch">
+<link rel="modulepreload" href="resources/module1.js?invalid-dest" as="invalid-dest" data-as="invalid-dest">
+<link rel="modulepreload" href="resources/module1.js?iMaGe" as="iMaGe" data-as="iMaGe">
+<link rel="modulepreload" href="resources/module1.js?sCrIpT" as="sCrIpT" data-as="sCrIpT">
+<body>
+<script>
+ // compared to modulepreload.html, this tests behavior when elements are
+ // initially on an HTML page instead of being added by JS
+
+ const scriptLikes = [
+ 'audioworklet',
+ 'paintworklet',
+ 'script',
+ 'serviceworker',
+ 'sharedworker',
+ 'worker',
+ ];
+
+ const goodAsValues = ['', 'invalid-dest', 'sCrIpT', ...scriptLikes];
+
+ for (const link of document.querySelectorAll('link')) {
+ const asValue = link.dataset.as; // don't depend on "as" attribute reflection
+ const good = goodAsValues.includes(asValue);
+
+ // promise tests are queued sequentially, so create the promise here to
+ // ensure we don't miss the error event
+ const promise = new Promise((resolve, reject) => {
+ link.onload = good ? resolve : reject;
+ link.onerror = good ? reject : resolve;
+ });
+
+ promise_test(() => promise.then(() => {
+ const downloads = performance
+ .getEntriesByName(new URL(link.href, location.href))
+ .filter(entry => entry.transferSize > 0)
+ .length;
+ assert_equals(downloads, good ? 1 : 0);
+
+ }), `Modulepreload with as="${asValue}"`);
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/preload/modulepreload-sri.html b/tests/wpt/web-platform-tests/preload/modulepreload-sri.html
new file mode 100644
index 00000000000..ea32a6a3025
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/modulepreload-sri.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="modulepreload" href="resources/module1.js" integrity="sha384-invalid">
+<script type="module" src="resources/module1.js" id="myscript"></script>
+<body>
+<script>
+ // compared to modulepreload.html, this tests behavior when elements are
+ // initially on an HTML page instead of being added by JS
+ promise_test(() => {
+ return new Promise((resolve, reject) => {
+ let myscript = document.querySelector('#myscript');
+ myscript.onerror = resolve;
+ myscript.onload = reject;
+ });
+ }, "Script should not be loaded if modulepreload's integrity is invalid");
+</script>
diff --git a/tests/wpt/web-platform-tests/preload/modulepreload.html b/tests/wpt/web-platform-tests/preload/modulepreload.html
index 0e4b6923e32..4764b582619 100644
--- a/tests/wpt/web-platform-tests/preload/modulepreload.html
+++ b/tests/wpt/web-platform-tests/preload/modulepreload.html
@@ -33,6 +33,15 @@ function attachAndWaitForError(element) {
});
}
+function attachAndWaitForTimeout(element, t) {
+ return new Promise((resolve, reject) => {
+ element.onload = reject;
+ element.onerror = reject;
+ t.step_timeout(resolve, 1000);
+ document.body.appendChild(element);
+ });
+}
+
promise_test(function(t) {
var link = document.createElement('link');
link.rel = 'modulepreload';
@@ -58,7 +67,7 @@ promise_test(function(t) {
document.cookie = 'same=1';
var link = document.createElement('link');
link.rel = 'modulepreload';
- link.crossorigin = 'anonymous';
+ link.crossOrigin = 'anonymous';
link.href = 'resources/dummy.js?sameOriginAnonymous';
return attachAndWaitForLoad(link).then(() => {
verifyNumberOfDownloads('resources/dummy.js?sameOriginAnonymous', 1);
@@ -66,7 +75,7 @@ promise_test(function(t) {
// Verify that <script> doesn't fetch the module again.
var script = document.createElement('script');
script.type = 'module';
- script.crossorigin = 'anonymous';
+ script.crossOrigin = 'anonymous';
script.src = 'resources/dummy.js?sameOriginAnonymous';
return attachAndWaitForLoad(script);
}).then(() => {
@@ -77,7 +86,7 @@ promise_test(function(t) {
promise_test(function(t) {
var link = document.createElement('link');
link.rel = 'modulepreload';
- link.crossorigin = 'use-credentials';
+ link.crossOrigin = 'use-credentials';
link.href = 'resources/dummy.js?sameOriginUseCredentials';
return attachAndWaitForLoad(link).then(() => {
verifyNumberOfDownloads('resources/dummy.js?sameOriginUseCredentials', 1);
@@ -85,7 +94,7 @@ promise_test(function(t) {
// Verify that <script> doesn't fetch the module again.
var script = document.createElement('script');
script.type = 'module';
- script.crossorigin = 'use-credentials';
+ script.crossOrigin = 'use-credentials';
script.src = 'resources/dummy.js?sameOriginUseCredentials';
return attachAndWaitForLoad(script);
}).then(() => {
@@ -122,7 +131,7 @@ promise_test(function(t) {
promise_test(function(t) {
var link = document.createElement('link');
link.rel = 'modulepreload';
- link.crossorigin = 'anonymous';
+ link.crossOrigin = 'anonymous';
link.href = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`;
return attachAndWaitForLoad(link).then(() => {
verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`, 1, true);
@@ -130,7 +139,7 @@ promise_test(function(t) {
// Verify that <script> doesn't fetch the module again.
var script = document.createElement('script');
script.type = 'module';
- script.crossorigin = 'anonymous';
+ script.crossOrigin = 'anonymous';
script.src = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`;
return attachAndWaitForLoad(script);
}).then(() => {
@@ -141,7 +150,7 @@ promise_test(function(t) {
promise_test(function(t) {
var link = document.createElement('link');
link.rel = 'modulepreload';
- link.crossorigin = 'use-credentials';
+ link.crossOrigin = 'use-credentials';
link.href = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`;
return attachAndWaitForLoad(link).then(() => {
verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`, 1, true);
@@ -149,7 +158,7 @@ promise_test(function(t) {
// Verify that <script> doesn't fetch the module again.
var script = document.createElement('script');
script.type = 'module';
- script.crossorigin = 'use-credentials';
+ script.crossOrigin = 'use-credentials';
script.src = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`;
return attachAndWaitForLoad(script);
}).then(() => {
@@ -214,13 +223,21 @@ promise_test(function(t) {
link.href = 'resources/module1.js?as-image';
link.as = 'image'
return attachAndWaitForError(link);
-}, 'link rel=modulepreload with invalid as= value');
+}, 'link rel=modulepreload with non-script-like as= value (image)');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = 'resources/module1.js?as-xslt';
+ link.as = 'xslt'
+ return attachAndWaitForError(link);
+}, 'link rel=modulepreload with non-script-like as= value (xslt)');
promise_test(function(t) {
var link = document.createElement('link');
link.rel = 'modulepreload';
link.href = 'resources/module1.js?integrity-match';
- link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc=%'
+ link.integrity = 'sha256-+Ks3iNIiTq2ujlWhvB056cmXobrCFpU9hd60xZ1WCaA='
return attachAndWaitForLoad(link);
}, 'link rel=modulepreload with integrity match');
@@ -228,7 +245,7 @@ promise_test(function(t) {
var link = document.createElement('link');
link.rel = 'modulepreload';
link.href = 'resources/module1.mjs?integrity-match';
- link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc=%'
+ link.integrity = 'sha256-+Ks3iNIiTq2ujlWhvB056cmXobrCFpU9hd60xZ1WCaA='
return attachAndWaitForLoad(link);
}, 'link rel=modulepreload with integrity match2');
@@ -240,5 +257,127 @@ promise_test(function(t) {
return attachAndWaitForError(link);
}, 'link rel=modulepreload with integrity mismatch');
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = 'resources/module1.mjs?integrity-doesnotmatch';
+ link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc='
+ return attachAndWaitForError(link);
+}, 'link rel=modulepreload with integrity mismatch2');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = 'resources/module1.mjs?integrity-invalid';
+ link.integrity = 'sha256-dOxReWMnMSPfUvxEbBqIrjNh8ZN8n05j7h3JmhF8gQc=%'
+ return attachAndWaitForError(link);
+}, 'link rel=modulepreload with integrity mismatch3');
+
+promise_test(function(t) {
+ var link1 = document.createElement('link');
+ var link2 = document.createElement('link');
+ link1.rel = 'modulepreload';
+ link2.rel = 'modulepreload';
+ link1.href = 'resources/module1.js?same-url';
+ link2.href = 'resources/module1.js?same-url';
+ return Promise.all([
+ attachAndWaitForLoad(link1),
+ attachAndWaitForLoad(link2),
+ ]);
+}, 'multiple link rel=modulepreload with same href');
+
+promise_test(function(t) {
+ var link1 = document.createElement('link');
+ var link2 = document.createElement('link');
+ link1.rel = 'modulepreload';
+ link2.rel = 'modulepreload';
+ link1.href = 'resources/module2.js?child-before';
+ link2.href = 'resources/module1.js?child-before';
+ return attachAndWaitForLoad(link1)
+ .then(() => attachAndWaitForLoad(link2))
+ .then(() => new Promise(r => t.step_timeout(r, 1000)))
+ .then(() => {
+ verifyNumberOfDownloads('resources/module2.js?child-before', 1);
+ });
+
+}, 'multiple link rel=modulepreload with child module before parent');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = 'resources/module1.mjs?matching-media';
+ link.media = 'all';
+ return attachAndWaitForLoad(link);
+}, 'link rel=modulepreload with matching media');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = 'resources/module1.mjs?non-matching-media';
+ link.media = 'not all';
+ return attachAndWaitForTimeout(link, t);
+}, 'link rel=modulepreload with non-matching media');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = 'resources/module1.mjs?empty-media';
+ link.media = '';
+ return attachAndWaitForLoad(link);
+}, 'link rel=modulepreload with empty media');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = '';
+ return attachAndWaitForTimeout(link, t);
+}, 'link rel=modulepreload with empty href');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ link.rel = 'modulepreload';
+ link.href = '';
+ link.as = 'fetch';
+ return attachAndWaitForTimeout(link, t);
+}, 'link rel=modulepreload with empty href and invalid as= value');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ var script = document.createElement('script');
+ link.rel = 'modulepreload';
+ script.type = 'module';
+ link.href = 'resources/module1.mjs?non-matching-crossorigin';
+ script.src = link.href;
+ script.crossOrigin = 'anonymous';
+ document.body.append(link);
+ return attachAndWaitForLoad(script);
+}, 'link rel=modulepreload and script with non-matching crossorigin values');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ var script = document.createElement('script');
+ link.rel = 'modulepreload';
+ script.type = 'module';
+ link.href = 'resources/module1.mjs?non-matching-crossorigin';
+ script.src = link.href;
+ link.crossOrigin = 'anonymous';
+ script.crossOrigin = 'use-credentials';
+ document.body.append(link);
+ return attachAndWaitForLoad(script);
+}, 'link rel=modulepreload and script with non-matching crossorigin values2');
+
+promise_test(function(t) {
+ var link = document.createElement('link');
+ var moduleScript = document.createElement('script');
+ var classicScript = document.createElement('script');
+ link.rel = 'modulepreload';
+ moduleScript.type = 'module';
+ link.href = 'resources/dummy.js?non-module script';
+ classicScript.src = link.href;
+ moduleScript.src = link.href;
+ document.body.append(link);
+ document.body.append(classicScript);
+ return attachAndWaitForLoad(moduleScript);
+}, 'link rel=modulepreload and non-module script');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html
index 375489c26a4..cfb7cf2c1e4 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html
@@ -24,14 +24,14 @@
}
#scroller {
- scroll-timeline: timeline;
+ scroll-timeline: --timeline;
}
#element {
z-index: -1;
animation-name: anim;
animation-duration: auto;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
</style>
<main>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html
index f08659635ea..dabb4ec5a60 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-ignored.html
@@ -32,8 +32,8 @@
}
.animate {
animation: anim auto linear;
- view-timeline: timeline;
- animation-timeline: timeline;
+ view-timeline: --timeline;
+ animation-timeline: --timeline;
animation-range-start: entry 0%;
animation-range-end: entry 100%;
}
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html
index 44b08cab969..a91e3d3e29a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-normal-matches-cover.html
@@ -37,8 +37,8 @@
background-color: green;
animation: anim-1 auto linear, anim-2 auto linear;
animation-range: normal, cover;
- view-timeline: t1;
- animation-timeline: t1, t1;
+ view-timeline: --t1;
+ animation-timeline: --t1, --t1;
}
</style>
<body>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test-ref.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test-ref.html
new file mode 100644
index 00000000000..c246f7f1b0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test-ref.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#named-timeline-range">
+<link rel="stylesheet" href="support/animation-range.css">
+<style>
+.meter {
+ animation: active-interval linear 100s paused;
+ animation-timeline: auto;
+}
+
+.bar {
+ animation: slide-in linear 100s paused;
+ animation-timeline: auto;
+}
+</style>
+</head>
+<body>
+<h3>View timeline</h3>
+<template id="meters">
+ <div class="meters">
+ <div class="cover"><div class="meter"><div class="bar"></div></div><div>Cover</div></div>
+ <div class="contain"><div class="meter"><div class="bar"></div></div><div>Contain</div></div>
+ <div class="entry"><div class="meter"><div class="bar"></div></div><div>Entry</div></div>
+ <div class="exit"><div class="meter"><div class="bar"></div></div><div>Exit</div></div>
+ </div>
+</template>
+<div class="flex">
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: 90px;" data-progress=".08333,-1,.5,-1"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: 70px;" data-progress=".25,.125,2,-1"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: 10px;" data-progress=".75,.875,2,-1"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: -10px;" data-progress=".91667,2,2,.5"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+</div>
+</body>
+<script>
+ let template = document.querySelector('#meters');
+ let subjects = document.querySelectorAll('.subject');
+ for (let i = 0; i < subjects.length; i++) {
+ let clone = template.content.cloneNode(true);
+ let meters = clone.querySelectorAll('.meter');
+ let progress = subjects[i].getAttribute('data-progress').split(',').map(s => parseFloat(s));
+ for (let meter of meters) {
+ let bar = meter.querySelector('.bar');
+ let startTime = -progress.splice(0, 1)[0] * 100;
+ meter.style.animationDelay = `${startTime}s`;
+ bar.style.animationDelay = `${startTime}s`;
+ }
+ subjects[i].appendChild(clone);
+ }
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test.html
new file mode 100644
index 00000000000..f675f5108ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-range-visual-test.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#named-timeline-range">
+<link rel="match" href="animation-range-visual-test-ref.html">
+<link rel="stylesheet" href="support/animation-range.css">
+<script src="/common/reftest-wait.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+</head>
+<body>
+<h3>View timeline</h3>
+<template id="meters">
+ <div class="meters">
+ <div class="cover"><div class="meter"><div class="bar"></div></div><div>Cover</div></div>
+ <div class="contain"><div class="meter"><div class="bar"></div></div><div>Contain</div></div>
+ <div class="entry"><div class="meter"><div class="bar"></div></div><div>Entry</div></div>
+ <div class="exit"><div class="meter"><div class="bar"></div></div><div>Exit</div></div>
+ </div>
+</template>
+<div class="flex">
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: 90px;"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: 70px;"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: 10px;"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+ <div>
+ <div class="scroller">
+ <div class="subject" style="margin-top: -10px;"></div>
+ <div class="spacer"></div>
+ </div>
+ </div>
+</div>
+</body>
+<script>
+ let template = document.querySelector('#meters');
+ let subjects = document.querySelectorAll('.subject');
+ for (let i = 0; i < subjects.length; i++) {
+ subjects[i].appendChild(template.content.cloneNode(true));
+ }
+ waitForCompositorReady().then(takeScreenshot);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html
index 7bd17b99190..a17dd431264 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-shorthand.html
@@ -49,7 +49,7 @@ test((t) => {
});
target.style.animation = 'anim 1s';
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline';
assert_equals(target.style.animation, '');
assert_equals(target.style.animationName, 'anim');
assert_equals(target.style.animationDuration, '1s');
@@ -61,7 +61,7 @@ test((t) => {
});
target.style.animation = 'anim 1s';
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline';
assert_equals(getComputedStyle(target).animation, '');
assert_equals(getComputedStyle(target).animationName, 'anim');
assert_equals(getComputedStyle(target).animationDuration, '1s');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html
index 7759e799c62..1e621eee531 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-computed.html
@@ -5,15 +5,15 @@
<script src="/css/support/computed-testcommon.js"></script>
</head>
<style>
- #outer { animation-timeline: foo; }
- #target { animation-timeline: bar; }
+ #outer { animation-timeline: --foo; }
+ #target { animation-timeline: --bar; }
</style>
<div id="outer">
<div id="target"></div>
</div>
<script>
test_computed_value('animation-timeline', 'initial', 'auto');
-test_computed_value('animation-timeline', 'inherit', 'foo');
+test_computed_value('animation-timeline', 'inherit', '--foo');
test_computed_value('animation-timeline', 'unset', 'auto');
test_computed_value('animation-timeline', 'revert', 'auto');
test_computed_value('animation-timeline', 'auto');
@@ -22,9 +22,9 @@ test_computed_value('animation-timeline', 'auto, auto');
test_computed_value('animation-timeline', 'none, none');
test_computed_value('animation-timeline', 'auto, none');
test_computed_value('animation-timeline', 'none, auto');
-test_computed_value('animation-timeline', 'test');
-test_computed_value('animation-timeline', 'test1, test2');
-test_computed_value('animation-timeline', 'test1, test2, none, test3, auto', 'test1, test2, none, test3, auto');
+test_computed_value('animation-timeline', '--test');
+test_computed_value('animation-timeline', '--test1, --test2');
+test_computed_value('animation-timeline', '--test1, --test2, none, --test3, auto');
test(() => {
let style = getComputedStyle(document.getElementById('target'));
@@ -39,13 +39,13 @@ test(() => {
// https://drafts.csswg.org/scroll-animations-1/#scroll-notation
//
// animation-timeline: scroll(<axis>? <scroller>?);
-// <axis> = block | inline | vertical | horizontal
+// <axis> = block | inline | x | y
// <scroller> = root | nearest | self
test_computed_value('animation-timeline', 'scroll()');
test_computed_value('animation-timeline', 'scroll(block)', 'scroll()');
test_computed_value('animation-timeline', 'scroll(inline)');
-test_computed_value('animation-timeline', 'scroll(horizontal)');
-test_computed_value('animation-timeline', 'scroll(vertical)');
+test_computed_value('animation-timeline', 'scroll(x)');
+test_computed_value('animation-timeline', 'scroll(y)');
test_computed_value('animation-timeline', 'scroll(root)');
test_computed_value('animation-timeline', 'scroll(nearest)', 'scroll()');
test_computed_value('animation-timeline', 'scroll(self)');
@@ -54,20 +54,20 @@ test_computed_value('animation-timeline', 'scroll(inline nearest)', 'scroll(inli
test_computed_value('animation-timeline', 'scroll(nearest inline)', 'scroll(inline)');
test_computed_value('animation-timeline', 'scroll(block self)', 'scroll(self)');
test_computed_value('animation-timeline', 'scroll(self block)', 'scroll(self)');
-test_computed_value('animation-timeline', 'scroll(vertical root)', 'scroll(root vertical)');
+test_computed_value('animation-timeline', 'scroll(y root)', 'scroll(root y)');
// https://drafts.csswg.org/scroll-animations-1/#view-notation
test_computed_value('animation-timeline', 'view()');
test_computed_value('animation-timeline', 'view(block)', 'view()');
test_computed_value('animation-timeline', 'view(inline)', 'view(inline)');
-test_computed_value('animation-timeline', 'view(horizontal)', 'view(horizontal)');
-test_computed_value('animation-timeline', 'view(vertical)', 'view(vertical)');
-test_computed_value('animation-timeline', 'view(vertical 1px)');
+test_computed_value('animation-timeline', 'view(x)', 'view(x)');
+test_computed_value('animation-timeline', 'view(y)', 'view(y)');
+test_computed_value('animation-timeline', 'view(y 1px)');
test_computed_value('animation-timeline', 'view(1px auto)');
test_computed_value('animation-timeline', 'view(auto 1px)');
-test_computed_value('animation-timeline', 'view(vertical 1px auto)');
-test_computed_value('animation-timeline', 'view(1px vertical)', 'view(vertical 1px)');
-test_computed_value('animation-timeline', 'view(vertical auto)', 'view(vertical)');
-test_computed_value('animation-timeline', 'view(vertical auto auto)', 'view(vertical)');
+test_computed_value('animation-timeline', 'view(y 1px auto)');
+test_computed_value('animation-timeline', 'view(1px y)', 'view(y 1px)');
+test_computed_value('animation-timeline', 'view(y auto)', 'view(y)');
+test_computed_value('animation-timeline', 'view(y auto auto)', 'view(y)');
</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html
index 0ac7a9d63e8..8992cdc174f 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-ignored.tentative.html
@@ -8,7 +8,7 @@
overflow: hidden;
height: 0px;
scroll-timeline-attachment: defer;
- scroll-timeline-name: timeline1, timeline2, timeline3;
+ scroll-timeline-name: --timeline1, --timeline2, --timeline3;
}
.scroller {
overflow: hidden;
@@ -24,13 +24,13 @@
to { width: 200px; }
}
#scroller1 {
- scroll-timeline-name: timeline1;
+ scroll-timeline-name: --timeline1;
}
#scroller2 {
- scroll-timeline-name: timeline2;
+ scroll-timeline-name: --timeline2;
}
#scroller3 {
- scroll-timeline-name: timeline3;
+ scroll-timeline-name: --timeline3;
}
#element {
width: 0px;
@@ -38,10 +38,10 @@
animation-name: expand;
animation-duration: 1000s;
animation-timing-function: linear;
- animation-timeline: timeline1;
+ animation-timeline: --timeline1;
}
/* Ensure stable expectations if feature is not supported */
- @supports not (animation-timeline:foo) {
+ @supports not (animation-timeline:--foo) {
#element { animation-play-state: paused; }
}
</style>
@@ -82,7 +82,7 @@
test_animation_timeline(async () => {
await waitForNextFrame();
assert_equals(getComputedStyle(element).width, '120px');
- element.style = 'animation-timeline:timeline2';
+ element.style = 'animation-timeline:--timeline2';
assert_equals(getComputedStyle(element).width, '140px');
}, 'Changing animation-timeline changes the timeline (sanity check)');
@@ -100,7 +100,7 @@
assert_equals(getComputedStyle(element).width, '180px');
// Changing the animation-timeline property should have no effect.
- element.style = 'animation-timeline:timeline2';
+ element.style = 'animation-timeline:--timeline2';
assert_equals(getComputedStyle(element).width, '180px');
}, 'animation-timeline ignored after setting timeline with JS (ScrollTimeline from JS)');
@@ -110,14 +110,14 @@
let animation = element.getAnimations()[0];
let timeline1 = animation.timeline;
- element.style = 'animation-timeline:timeline2';
+ element.style = 'animation-timeline:--timeline2';
assert_equals(getComputedStyle(element).width, '140px');
animation.timeline = timeline1;
assert_equals(getComputedStyle(element).width, '120px');
// Should have no effect.
- element.style = 'animation-timeline:timeline3';
+ element.style = 'animation-timeline:--timeline3';
assert_equals(getComputedStyle(element).width, '120px');
}, 'animation-timeline ignored after setting timeline with JS (ScrollTimeline from CSS)');
@@ -130,7 +130,7 @@
assert_equals(getComputedStyle(element).width, '120px');
// Changing the animation-timeline property should have no effect.
- element.style = 'animation-timeline:timeline2';
+ element.style = 'animation-timeline:--timeline2';
assert_equals(getComputedStyle(element).width, '120px');
}, 'animation-timeline ignored after setting timeline with JS (document timeline)');
@@ -141,7 +141,7 @@
assert_equals(getComputedStyle(element).width, '120px');
// Changing the animation-timeline property should have no effect.
- element.style = 'animation-timeline:timeline2';
+ element.style = 'animation-timeline:--timeline2';
assert_equals(getComputedStyle(element).width, '120px');
}, 'animation-timeline ignored after setting timeline with JS (null)');
</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html
index 75483331390..04b430c3242 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-in-keyframe.html
@@ -6,8 +6,8 @@
</head>
<style>
@keyframes test {
- from { width: 100px; animation-timeline: foo; }
- to { width: 100px; animation-timeline: foo; }
+ from { width: 100px; animation-timeline: --foo; }
+ to { width: 100px; animation-timeline: --foo; }
}
#target {
width: 50px;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html
index 50a829c5b6b..e812c7d67ea 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-multiple.html
@@ -7,7 +7,7 @@
<style>
main {
scroll-timeline-attachment: defer;
- scroll-timeline-name: top_timeline, bottom_timeline, left_timeline, right_timeline;
+ scroll-timeline-name: --top_timeline, --bottom_timeline, --left_timeline, --right_timeline;
}
.scroller {
@@ -39,19 +39,19 @@
}
#top_scroller {
- scroll-timeline-name: top_timeline;
+ scroll-timeline-name: --top_timeline;
scroll-timeline-axis: block;
}
#bottom_scroller {
- scroll-timeline-name: bottom_timeline;
+ scroll-timeline-name: --bottom_timeline;
scroll-timeline-axis: inline;
}
#left_scroller {
- scroll-timeline-name: left_timeline;
+ scroll-timeline-name: --left_timeline;
scroll-timeline-axis: block;
}
#right_scroller {
- scroll-timeline-name: right_timeline;
+ scroll-timeline-name: --right_timeline;
scroll-timeline-axis: inline;
}
@@ -59,10 +59,10 @@
animation-name: top, bottom, left, right;
animation-duration: 10s;
animation-timing-function: linear;
- animation-timeline: top_timeline, bottom_timeline, left_timeline, right_timeline;
+ animation-timeline: --top_timeline, --bottom_timeline, --left_timeline, --right_timeline;
}
/* Ensure stable expectations if feature is not supported */
- @supports not (animation-timeline:foo) {
+ @supports not (animation-timeline:--foo) {
#element { animation-play-state: paused; }
}
</style>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html
index ed2c32d31e9..71df9ceda87 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-named-scroll-progress-timeline.tentative.html
@@ -13,6 +13,11 @@
from { translate: 50px; }
to { translate: 150px; }
}
+ @keyframes anim-2 {
+ from { z-index: 0; }
+ to { z-index: 100; }
+ }
+
#target {
width: 100px;
height: 100px;
@@ -74,6 +79,18 @@ function createScrollerAndTarget(t, scrollerSizeClass) {
return [createScroller(t, scrollerSizeClass), createTarget(t)];
}
+async function waitForScrollTop(scroller, percentage) {
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ scroller.scrollTop = maxScroll * percentage / 100;
+ return waitForNextFrame();
+}
+
+async function waitForScrollLeft(scroller, percentage) {
+ const maxScroll = scroller.scrollWidth - scroller.clientWidth;
+ scroller.scrollLeft = maxScroll * percentage / 100;
+ return waitForNextFrame();
+}
+
// -------------------------
// Test scroll-timeline-name
// -------------------------
@@ -91,11 +108,11 @@ promise_test(async t => {
document.body.appendChild(target);
target.appendChild(content);
- target.style.scrollTimelineName = 'timeline';
+ target.style.scrollTimelineName = '--timeline';
target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline';
- target.scrollTop = 50; // 50%, in [0, 100].
+ target.scrollTop = 50; // 50%
await waitForNextFrame();
assert_equals(getComputedStyle(target).translate, '100px');
@@ -114,16 +131,17 @@ promise_test(async t => {
document.body.appendChild(parent);
parent.insertBefore(target, parent.firstElementChild);
- parent.style.scrollTimelineName = 'timeline';
+ parent.style.scrollTimelineName = '--timeline';
target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline';
- parent.scrollTop = 100; // 50%, in [0, 200].
+ parent.scrollTop = 100; // 50%
await waitForNextFrame();
assert_equals(getComputedStyle(target).translate, '100px');
}, "scroll-timeline-name is referenceable in animation-timeline on that " +
"element's descendants");
+// See https://github.com/w3c/csswg-drafts/issues/7047
promise_test(async t => {
let [sibling, target] = createScrollerAndTarget(t);
@@ -132,281 +150,58 @@ promise_test(async t => {
document.body.appendChild(sibling);
document.body.appendChild(target);
- sibling.style.scrollTimelineName = 'timeline';
+ // Resolvable if using a deferred timeline, but otherwise can only resolve
+ // if an ancestor container of the target element.
+ sibling.style.scrollTimelineName = '--timeline';
target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline';
- sibling.scrollTop = 50; // 50%, in [0, 100].
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
-}, "scroll-timeline-name is referenceable in animation-timeline on that " +
- "element's following siblings");
-
-promise_test(async t => {
- let [sibling, target] = createScrollerAndTarget(t);
- let parent = document.createElement('div');
-
- // <div id='sibling' class='scroller'> ... </div>
- // <div id='parent'>
- // <div id='target'></div>
- // </div>
- document.body.appendChild(sibling);
- document.body.appendChild(parent);
- parent.appendChild(target);
-
- sibling.style.scrollTimelineName = 'timeline';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
-
- sibling.scrollTop = 50; // 50%, in [0, 100].
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
-
- parent.remove();
-}, "scroll-timeline-name is referenceable in animation-timeline on that " +
- "element's following siblings' descendants");
-
-// FIXME: We may use global scope for scroll-timeline-name.
-// See https://github.com/w3c/csswg-drafts/issues/7047
-promise_test(async t => {
- let [sibling, target] = createScrollerAndTarget(t);
-
- // <div id='target'></div>
- // <div id='sibling' class='scroller'> ... </div>
- document.body.appendChild(target);
- document.body.appendChild(sibling);
-
- sibling.style.scrollTimelineName = 'timeline';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
-
- sibling.scrollTop = 50; // 50%, in [0, 100].
+ sibling.scrollTop = 50; // 50%
await waitForNextFrame();
assert_equals(getComputedStyle(target).translate, '50px',
'Animation with unknown timeline name holds current time at zero');
}, "scroll-timeline-name is not referenceable in animation-timeline on that " +
- "element's previous siblings");
+ "element's siblings");
promise_test(async t => {
- let [sibling, target] = createScrollerAndTarget(t);
let parent = document.createElement('div');
- parent.className = 'scroller square-container';
- let content = document.createElement('div');
- content.className = 'content';
+ parent.className = 'square';
+ parent.style.overflowX = 'clip'; // This makes overflow-y be clip as well.
+ let target = document.createElement('div');
+ target.id = 'target';
- // <div id='parent' class='scroller'>
- // <div id='sibling' class='scroller'> ... </div>
+ // <div id='parent' style='overflow-x: clip'>...
// <div id='target'></div>
- // <div id='content'></div>
// </div>
document.body.appendChild(parent);
- parent.appendChild(sibling);
parent.appendChild(target);
- parent.appendChild(content);
-
- parent.style.scrollTimelineName = 'timeline';
- parent.style.scrollTimelineAxis = 'inline';
- sibling.style.scrollTimelineName = 'timeline';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
-
- parent.scrollTop = 50; // 25%, in [0, 200].
- sibling.scrollTop = 50; // 50%, in [0, 100].
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
-
- content.remove();
- parent.remove();
-}, 'scroll-timeline-name is matched based on tree order, which considers ' +
- 'siblings closer than parents');
-
-promise_test(async t => {
- let sibling = document.createElement('div');
- sibling.className = 'square';
- sibling.style.overflowX = 'clip'; // This makes overflow-y be clip as well.
- let target = document.createElement('div');
- target.id = 'target';
-
- // <div id='sibling' style='overflow-x: clip'></div>
- // <div id='target'></div>
- document.body.appendChild(sibling);
- document.body.appendChild(target);
- sibling.style.scrollTimelineName = 'timeline';
+ parent.style.scrollTimelineName = '--timeline';
target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline';
- sibling.scrollTop = 50; // 50%, in [0, 100].
await waitForNextFrame();
assert_equals(getComputedStyle(target).translate, 'none',
'Animation with an unresolved current time');
target.remove();
- sibling.remove();
+ parent.remove();
}, 'scroll-timeline-name on an element which is not a scroll-container');
promise_test(async t => {
- let [sibling, target] = createScrollerAndTarget(t);
- let main = document.createElement('div');
- main.id = 'name';
+ let [scroller, target] = createScrollerAndTarget(t);
- // <div id='main'>
- // <div id='sibling' class='scroller'> ... </div>
+ // <div id='scroller' class='scroller'> ...
// <div id='target'></div>
// </div>
- document.body.appendChild(main);
- main.appendChild(sibling);
- main.appendChild(target);
-
- target.style.animation = 'anim 10s linear';
- target.style.animationTimeline = 'timeline';
- sibling.scrollTop = 50; // 50%, in [50, 150].
- await waitForNextFrame();
-
- // Unknown animation-timeline, current time held at zero.
- assert_equals(getComputedStyle(target).translate, '50px');
-
- // Ensure that #main (an ancestor of the scroller) needs style recalc.
- main.style.background = 'lightgray';
- sibling.style.scrollTimelineName = 'timeline';
- await waitForCSSScrollTimelineStyle();
- assert_equals(getComputedStyle(target).translate, '100px');
-
- main.remove();
-}, 'scroll-timeline-name affects subsequent siblings when changed');
-
-promise_test(async t => {
- let target = createTarget(t);
-
- // <div id='target'></div>
- document.body.appendChild(target);
-
- target.style.animation = 'anim 10s linear';
- target.style.animationTimeline = 'timeline';
-
- // Unknown animation-timeline, current time held at zero.
- assert_equals(getComputedStyle(target).translate, '50px');
-
- let scroller = createScroller(t);
- // <div class='scroller'> ... </div>
- // <div id='target'></div>
- document.body.insertBefore(scroller, target);
- scroller.style.scrollTimelineName = 'timeline';
-
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '50px');
-
- // Ensure that time is not just held at zero.
- scroller.scrollTop = 50; // 50%, in [50, 150].
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
-}, 'scroll-timeline-name on inserted element affects subsequent siblings');
-
-promise_test(async t => {
- let [scroller, target] = createScrollerAndTarget(t);
-
- // <div class='scroller'> ... </div>
- // <div id='target'></div>
- document.body.appendChild(scroller);
- document.body.appendChild(target);
-
- scroller.scrollTop = 50; // 50%, in [50, 150].
- await waitForNextFrame();
-
- scroller.style.scrollTimelineName = 'timeline';
- target.style.animation = 'anim 10s linear';
- target.style.animationTimeline = 'timeline';
- await waitForCSSScrollTimelineStyle();
-
- assert_equals(getComputedStyle(target).translate, '100px');
- const anim = target.getAnimations()[0];
- assert_percents_equal(anim.startTime, 0);
- assert_percents_equal(anim.currentTime, 50);
-
- // This effectively removes the CSS-created ScrollTimeline on this element,
- // thus invoking "setting the timeline of an animation" [1] with a null-
- // timeline on affected elements. This in turn runs the procedure to set the
- // current time to previous progress * end time. Ultimately, this sets the
- // hold time of the animation.
-
- // [1] https://www.w3.org/TR/web-animations-2/#setting-the-timeline
- // [2] https://www.w3.org/TR/web-animations-2/
- // #setting-the-current-time-of-an-animation
- scroller.remove();
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
- assert_equals(anim.startTime, null);
- assert_times_equal(anim.currentTime, 5000);
-}, 'scroll-timeline-name on removed element affects subsequent siblings');
-
-promise_test(async t => {
- let [scroller, target] = createScrollerAndTarget(t);
-
- // <div class='scroller' style='display:none'> ... </div>
- // <div id='target'></div>
- scroller.style.display = 'none';
- document.body.appendChild(scroller);
- document.body.appendChild(target);
-
- scroller.style.scrollTimelineName = 'timeline';
- target.style.animation = 'anim 10s linear';
- target.style.animationTimeline = 'timeline';
-
- // Unknown animation-timeline, current time held at zero.
- assert_equals(getComputedStyle(target).translate, '50px');
-
- scroller.style.display = 'block';
- scroller.scrollTop = 50; // 50%, in [50, 150].
- await waitForNextFrame();
-
- assert_equals(getComputedStyle(target).translate, '100px');
-}, 'scroll-timeline-name on element leaving display:none affects subsequent siblings');
-
-promise_test(async t => {
- let [scroller, target] = createScrollerAndTarget(t);
- // <div class='scroller'> ... </div>
- // <div id='target'></div>
document.body.appendChild(scroller);
- document.body.appendChild(target);
+ scroller.appendChild(target);
- scroller.scrollTop = 50; // 50%, in [50, 150].
- await waitForNextFrame();
-
- scroller.style.scrollTimelineName = 'timeline';
- target.style.animation = 'anim 10s linear';
- target.style.animationTimeline = 'timeline';
- await waitForCSSScrollTimelineStyle();
-
- assert_equals(getComputedStyle(target).translate, '100px');
- const anim = target.getAnimations()[0];
- assert_percents_equal(anim.startTime, 0);
- assert_percents_equal(anim.currentTime, 50);
-
- // See comment in the test "scroll-timeline-name on removed element ..." for
- // an explantation of this result. (Setting display:none is similar to
- // removing the element).
- scroller.style.display = 'none';
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
- assert_equals(anim.startTime, null);
- assert_times_equal(anim.currentTime, 5000);
-
-}, 'scroll-timeline-name on element becoming display:none affects subsequent siblings');
-
-promise_test(async t => {
- let [scroller, target] = createScrollerAndTarget(t);
-
- // <div id='scroller' class='scroller'> ... </div>
- // <div id='target'></div>
-
- document.body.appendChild(scroller);
- document.body.appendChild(target);
-
- scroller.style.scrollTimelineName = 'timeline';
- scroller.style.display = 'none';
+ scroller.style.scrollTimelineName = '--timeline-A';
+ scroller.scrollTop = 50; // 25%
target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline-B';
await waitForNextFrame();
@@ -416,75 +211,45 @@ promise_test(async t => {
// Hold time of animation is zero.
assert_equals(getComputedStyle(target).translate, '50px');
- scroller.style.display = 'block';
- scroller.scrollTop = 50;
+ scroller.style.scrollTimelineName = '--timeline-B';
await waitForNextFrame();
assert_true(!!anim.timeline, 'Failed to create timeline');
- assert_equals(getComputedStyle(target).translate, '100px');
-
-}, 'scroll-timeline-name on element not resolved until element becomes visible');
-
-promise_test(async t => {
- let [scroller, target] = createScrollerAndTarget(t);
-
- // <div id='scroller' class='scroller'> ... </div>
- // <div id='target'></div>
-
- document.body.appendChild(scroller);
- document.body.appendChild(target);
-
- scroller.style.scrollTimelineName = 'timeline-A';
- scroller.scrollTop = 50;
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline-B';
-
- await waitForNextFrame();
-
- const anim = target.getAnimations()[0];
- assert_true(!!anim, 'Failed to create animation');
- assert_equals(anim.timeline, null);
- // Hold time of animation is zero.
- assert_equals(getComputedStyle(target).translate, '50px');
-
- scroller.style.scrollTimelineName = 'timeline-B';
- await waitForNextFrame();
-
- assert_true(!!anim.timeline, 'Failed to create timeline');
- assert_equals(getComputedStyle(target).translate, '100px');
-
+ assert_equals(getComputedStyle(target).translate, '75px');
}, 'Change in scroll-timeline-name to match animation timeline updates animation.');
promise_test(async t => {
let [scroller, target] = createScrollerAndTarget(t);
- // <div id='scroller' class='scroller'> ... </div>
- // <div id='target'></div>
+ // <div id='scroller' class='scroller'> ...
+ // <div id='target'></div>
+ // </div>
document.body.appendChild(scroller);
- document.body.appendChild(target);
+ scroller.appendChild(target);
- scroller.style.scrollTimelineName = 'timeline-A';
- scroller.scrollTop = 50;
+ scroller.style.scrollTimelineName = '--timeline-A';
+ scroller.scrollTop = 50; // 25%
target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline-A';
+ target.style.animationTimeline = '--timeline-A';
await waitForNextFrame();
const anim = target.getAnimations()[0];
assert_true(!!anim, 'Failed to create animation');
assert_true(!!anim.timeline, 'Failed to create timeline');
- assert_equals(getComputedStyle(target).translate, '100px');
+ assert_equals(getComputedStyle(target).translate, '75px');
assert_percents_equal(anim.startTime, 0);
- assert_percents_equal(anim.currentTime, 50);
+ assert_percents_equal(anim.currentTime, 25);
- scroller.style.scrollTimelineName = 'timeline-B';
+ scroller.style.scrollTimelineName = '--timeline-B';
await waitForNextFrame();
+ // Switching to a null timeline pauses the animation.
assert_equals(anim.timeline, null, 'Failed to remove timeline');
- assert_equals(getComputedStyle(target).translate, '100px');
+ assert_equals(getComputedStyle(target).translate, '75px');
assert_equals(anim.startTime, null);
- assert_times_equal(anim.currentTime, 5000);
+ assert_times_equal(anim.currentTime, 2500);
}, 'Change in scroll-timeline-name to no longer match animation timeline updates animation.');
promise_test(async t => {
@@ -493,55 +258,23 @@ promise_test(async t => {
let scroller2 = createScroller(t);
target.style.animation = 'anim 10s linear';
- target.style.animationTimeline = 'timeline';
- scroller1.style.scrollTimelineName = 'timeline';
- scroller2.style.scrollTimelineName = 'timeline';
+ target.style.animationTimeline = '--timeline';
+ scroller1.style.scrollTimelineName = '--timeline';
scroller1.id = 'A';
scroller2.id = 'B';
- // <div class='scroller' id='A'> ... </div> (scroller1)
- // <div class='scroller' id="B"> ... </div> (scroller2)
- // <div id='target'></div>
- document.body.appendChild(scroller1);
- document.body.appendChild(scroller2);
- document.body.append(target);
-
- scroller1.scrollTop = 10; // 10%, in [50, 150].
- scroller2.scrollTop = 50; // 50%, in [50, 150].
- await waitForNextFrame();
-
-
- // The named timeline lookup should select scroller2.
- let anim = target.getAnimations()[0];
- assert_true(!!anim, 'Failed to fetch animation');
- assert_equals(anim.timeline.source.id, 'B');
- assert_equals(getComputedStyle(target).translate, '100px');
-
- scroller2.remove();
-
- // Now it should select scroller1.
- anim = target.getAnimations()[0];
- assert_true(!!anim, 'Failed to fetch animation after update');
- assert_true(!!anim.timeline, 'Animation no longer has a timeline');
- assert_equals(anim.timeline.source.id, 'A', 'Timeline not updated');
- assert_equals(getComputedStyle(target).translate, '60px');
-}, 'Timeline lookup finds next candidate when element is removed');
-
-promise_test(async t => {
- let target = createTarget(t);
- let scroller1 = createScroller(t);
-
- target.style.animation = 'anim 10s linear';
- target.style.animationTimeline = 'timeline';
- scroller1.style.scrollTimelineName = 'timeline';
- scroller1.id = 'A';
-
- // <div class='scroller' id='A'> ... </div> (scroller1)
- // <div id='target'></div>
+ // <div class='scroller' id='A'> ...
+ // <div class='scroller' id='B'> ...
+ // <div id='target'></div>
+ // </div>
+ // </div>
document.body.appendChild(scroller1);
- document.body.append(target);
+ scroller1.appendChild(scroller2);
+ scroller2.appendChild(target);
- scroller1.scrollTop = 10; // 10%, in [50, 150].
+ scroller1.style.scrollTimelineName = '--timeline';
+ scroller1.scrollTop = 50; // 25%
+ scroller2.scrollTop = 100; // 50%
await waitForNextFrame();
@@ -549,21 +282,9 @@ promise_test(async t => {
assert_true(!!anim.timeline, 'Failed to retrieve animation');
assert_equals(anim.timeline.source.id, 'A');
- assert_equals(getComputedStyle(target).translate, '60px');
-
- await waitForNextFrame();
-
- let scroller2 = createScroller(t);
- scroller2.style.scrollTimelineName = 'timeline';
- scroller2.id = 'B';
-
- // <div class='scroller' id="A"> ... </div> (scroller1)
- // <div class='scroller' id="B"> ... </div> (scroller2)
- // <div id='target'></div>
- document.body.insertBefore(scroller2, target);
-
- scroller2.scrollTop = 50; // 50%, in [50, 150].
+ assert_equals(getComputedStyle(target).translate, '75px');
+ scroller2.style.scrollTimelineName = '--timeline';
await waitForNextFrame();
// The timeline should be updated to scroller2.
@@ -573,12 +294,17 @@ promise_test(async t => {
}, 'Timeline lookup updates candidate when closer match available.');
promise_test(async t => {
+ let wrapper = createScroller(t);
+ wrapper.classList.remove('scroller');
let target = createTarget(t);
- // <div id='target'></div>
- document.body.append(target);
+ // <div id='wrapper'> ...
+ // <div id='target'></div>
+ // </div>
+ document.body.appendChild(wrapper);
+ wrapper.appendChild(target);
target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ target.style.animationTimeline = '--timeline';
await waitForNextFrame();
@@ -589,21 +315,20 @@ promise_test(async t => {
await waitForNextFrame();
- let scroller = createScroller(t);
- scroller.style.scrollTimelineName = 'timeline';
-
- // <div class='scroller'> ... </div> (scroller1)
- // <div id='target'></div>
- document.body.insertBefore(scroller, target);
-
- scroller.scrollTop = 50; // 50%, in [50, 150].
+ wrapper.classList.add('scroller');
+ wrapper.style.scrollTimelineName = '--timeline';
+ // <div id='wrapper' class="scroller"> ...
+ // <div id='target'></div>
+ // </div>
+ wrapper.scrollTop = 50; // 25%
await waitForNextFrame();
// The timeline should be updated to scroller.
- assert_equals(getComputedStyle(target).translate, '100px');
+ assert_equals(getComputedStyle(target).translate, '75px');
}, 'Timeline lookup updates candidate when match becomes available.');
+
// -------------------------
// Test scroll-timeline-axis
// -------------------------
@@ -612,84 +337,94 @@ promise_test(async t => {
let [scroller, target] = createScrollerAndTarget(t);
scroller.style.writingMode = 'vertical-lr';
+ // <div id='scroller' class='scroller'> ...
+ // <div id='target'></div>
+ // </div>
document.body.appendChild(scroller);
- document.body.appendChild(target);
+ scroller.appendChild(target);
- scroller.style.scrollTimeline = 'timeline block';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ scroller.style.scrollTimeline = '--timeline block';
+ target.style.animation = "anim-2 10s linear";
+ target.style.animationTimeline = '--timeline';
- scroller.scrollLeft = 50;
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
+ await waitForScrollLeft(scroller, 50);
+ assert_equals(getComputedStyle(target).zIndex, '50');
}, 'scroll-timeline-axis is block');
promise_test(async t => {
let [scroller, target] = createScrollerAndTarget(t);
scroller.style.writingMode = 'vertical-lr';
+ // <div id='scroller' class='scroller'> ...
+ // <div id='target'></div>
+ // </div>
document.body.appendChild(scroller);
- document.body.appendChild(target);
+ scroller.appendChild(target);
- scroller.style.scrollTimeline = 'timeline inline';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ scroller.style.scrollTimeline = '--timeline inline';
+ target.style.animation = "anim-2 10s linear";
+ target.style.animationTimeline = '--timeline';
- scroller.scrollTop = 50;
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
+ await waitForScrollTop(scroller, 50);
+ assert_equals(getComputedStyle(target).zIndex, '50');
}, 'scroll-timeline-axis is inline');
promise_test(async t => {
let [scroller, target] = createScrollerAndTarget(t);
scroller.style.writingMode = 'vertical-lr';
+ // <div id='scroller' class='scroller'> ...
+ // <div id='target'></div>
+ // </div>
document.body.appendChild(scroller);
- document.body.appendChild(target);
+ scroller.appendChild(target);
- scroller.style.scrollTimeline = 'timeline horizontal';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ scroller.style.scrollTimeline = '--timeline x';
+ target.style.animation = "anim-2 10s linear";
+ target.style.animationTimeline = '--timeline';
- scroller.scrollLeft = 50;
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
-}, 'scroll-timeline-axis is horizontal');
+ await waitForScrollLeft(scroller, 50);
+ assert_equals(getComputedStyle(target).zIndex, '50');
+}, 'scroll-timeline-axis is x');
promise_test(async t => {
let [scroller, target] = createScrollerAndTarget(t);
scroller.style.writingMode = 'vertical-lr';
+ // <div id='scroller' class='scroller'> ...
+ // <div id='target'></div>
+ // </div>
document.body.appendChild(scroller);
- document.body.appendChild(target);
+ scroller.appendChild(target);
- scroller.style.scrollTimeline = 'timeline vertical';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ scroller.style.scrollTimeline = '--timeline y';
+ target.style.animation = "anim-2 10s linear";
+ target.style.animationTimeline = '--timeline';
- scroller.scrollTop = 50;
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
-}, 'scroll-timeline-axis is vertical');
+ await waitForScrollTop(scroller, 50);
+ assert_equals(getComputedStyle(target).zIndex, '50');
+}, 'scroll-timeline-axis is y');
promise_test(async t => {
let [scroller, target] = createScrollerAndTarget(t);
+ // <div id='scroller' class='scroller'> ...
+ // <div id='target'></div>
+ // </div>
document.body.appendChild(scroller);
- document.body.appendChild(target);
+ scroller.appendChild(target);
- scroller.style.scrollTimeline = 'timeline block';
- target.style.animation = "anim 10s linear";
- target.style.animationTimeline = 'timeline';
+ scroller.style.scrollTimeline = '--timeline block';
+ target.style.animation = "anim-2 10s linear";
+ target.style.animationTimeline = '--timeline';
- scroller.scrollTop = 50;
- scroller.scrollLeft = 25;
- await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '100px');
+ await waitForScrollTop(scroller, 25);
+ await waitForScrollLeft(scroller, 75);
+ assert_equals(getComputedStyle(target).zIndex, '25');
scroller.style.scrollTimelineAxis = 'inline';
await waitForNextFrame();
- assert_equals(getComputedStyle(target).translate, '75px');
+ assert_equals(getComputedStyle(target).zIndex, '75');
}, 'scroll-timeline-axis is mutated');
</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html
index a8e07a44d6d..7092523c489 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-none.html
@@ -20,7 +20,7 @@
animation-timeline: none;
}
#element_unknown_timeline {
- animation-timeline: unknown_timeline;
+ animation-timeline: --unknown_timeline;
}
</style>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html
index 4916f7726f9..f0061c5705d 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-parsing.html
@@ -16,10 +16,11 @@ test_valid_value('animation-timeline', 'auto, auto');
test_valid_value('animation-timeline', 'none, none');
test_valid_value('animation-timeline', 'auto, none');
test_valid_value('animation-timeline', 'none, auto');
-test_valid_value('animation-timeline', 'test');
-test_valid_value('animation-timeline', 'test1, test2');
-test_valid_value('animation-timeline', 'test1, test2, none, test3, auto', ["test1, test2, none, test3, auto", 'test1, test2, none, test3, auto']);
+test_valid_value('animation-timeline', '--test');
+test_valid_value('animation-timeline', '--test1, --test2');
+test_valid_value('animation-timeline', '--test1, --test2, none, --test3, auto');
+test_invalid_value('animation-timeline', 'test1');
test_invalid_value('animation-timeline', '10px');
test_invalid_value('animation-timeline', 'auto auto');
test_invalid_value('animation-timeline', 'none none');
@@ -32,13 +33,13 @@ test_invalid_value('animation-timeline', '"test"');
// https://drafts.csswg.org/scroll-animations-1/#scroll-notation
//
// animation-timeline: scroll(<axis>? <scroller>?);
-// <axis> = block | inline | vertical | horizontal
+// <axis> = block | inline | x | y
// <scroller> = root | nearest | self
test_valid_value('animation-timeline', 'scroll()');
test_valid_value('animation-timeline', 'scroll(block)', 'scroll()');
test_valid_value('animation-timeline', 'scroll(inline)');
-test_valid_value('animation-timeline', 'scroll(horizontal)');
-test_valid_value('animation-timeline', 'scroll(vertical)');
+test_valid_value('animation-timeline', 'scroll(x)');
+test_valid_value('animation-timeline', 'scroll(y)');
test_valid_value('animation-timeline', 'scroll(root)');
test_valid_value('animation-timeline', 'scroll(nearest)', 'scroll()');
test_valid_value('animation-timeline', 'scroll(self)');
@@ -46,27 +47,27 @@ test_valid_value('animation-timeline', 'scroll(inline nearest)', 'scroll(inline)
test_valid_value('animation-timeline', 'scroll(nearest inline)', 'scroll(inline)');
test_valid_value('animation-timeline', 'scroll(block self)', 'scroll(self)');
test_valid_value('animation-timeline', 'scroll(self block)', 'scroll(self)');
-test_valid_value('animation-timeline', 'scroll(vertical root)', 'scroll(root vertical)');
+test_valid_value('animation-timeline', 'scroll(y root)', 'scroll(root y)');
test_invalid_value('animation-timeline', 'scroll(abc root)');
test_invalid_value('animation-timeline', 'scroll(abc)');
-test_invalid_value('animation-timeline', 'scroll(vertical abc)');
+test_invalid_value('animation-timeline', 'scroll(y abc)');
test_invalid_value('animation-timeline', 'scroll("string")');
// https://drafts.csswg.org/scroll-animations-1/#view-notation
test_valid_value('animation-timeline', 'view()');
test_valid_value('animation-timeline', 'view(block)', 'view()');
test_valid_value('animation-timeline', 'view(inline)');
-test_valid_value('animation-timeline', 'view(horizontal)');
-test_valid_value('animation-timeline', 'view(vertical)');
-test_valid_value('animation-timeline', 'view(vertical 1px 2px)');
-test_valid_value('animation-timeline', 'view(vertical 1px)');
-test_valid_value('animation-timeline', 'view(vertical auto)', 'view(vertical)');
-test_valid_value('animation-timeline', 'view(vertical auto auto)', 'view(vertical)');
-test_valid_value('animation-timeline', 'view(vertical auto 1px)');
-test_valid_value('animation-timeline', 'view(1px 2px vertical)', 'view(vertical 1px 2px)');
-test_valid_value('animation-timeline', 'view(1px vertical)', 'view(vertical 1px)');
-test_valid_value('animation-timeline', 'view(auto horizontal)', 'view(horizontal)');
+test_valid_value('animation-timeline', 'view(x)');
+test_valid_value('animation-timeline', 'view(y)');
+test_valid_value('animation-timeline', 'view(y 1px 2px)');
+test_valid_value('animation-timeline', 'view(y 1px)');
+test_valid_value('animation-timeline', 'view(y auto)', 'view(y)');
+test_valid_value('animation-timeline', 'view(y auto auto)', 'view(y)');
+test_valid_value('animation-timeline', 'view(y auto 1px)');
+test_valid_value('animation-timeline', 'view(1px 2px y)', 'view(y 1px 2px)');
+test_valid_value('animation-timeline', 'view(1px y)', 'view(y 1px)');
+test_valid_value('animation-timeline', 'view(auto x)', 'view(x)');
test_valid_value('animation-timeline', 'view(1px 2px)');
test_valid_value('animation-timeline', 'view(1px)');
test_valid_value('animation-timeline', 'view(1px 1px)', 'view(1px)');
@@ -75,11 +76,11 @@ test_valid_value('animation-timeline', 'view(auto calc(1% + 1px))');
test_valid_value('animation-timeline', 'view(auto)', 'view()');
test_valid_value('animation-timeline', 'view(auto auto)', 'view()');
-test_invalid_value('animation-timeline', 'view(vertical 1px 2px 3px)');
-test_invalid_value('animation-timeline', 'view(1px vertical 3px)');
+test_invalid_value('animation-timeline', 'view(y 1px 2px 3px)');
+test_invalid_value('animation-timeline', 'view(1px y 3px)');
test_invalid_value('animation-timeline', 'view(1px 2px 3px)');
test_invalid_value('animation-timeline', 'view(abc block)');
test_invalid_value('animation-timeline', 'view(abc)');
-test_invalid_value('animation-timeline', 'view(vertical abc)');
+test_invalid_value('animation-timeline', 'view(y abc)');
test_invalid_value('animation-timeline', 'view("string")');
</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html
index 09917b4ba56..0bba4a03f40 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-scroll-functional-notation.tentative.html
@@ -143,21 +143,21 @@ promise_test(async t => {
let [container, div] = createTargetWithStuff(t, 'block-content');
container.style.writingMode = 'vertical-lr';
div.style.animation = "anim 10s linear";
- div.style.animationTimeline = "scroll(horizontal)";
+ div.style.animationTimeline = "scroll(x)";
await scrollLeft(container, 50);
assert_equals(getComputedStyle(div).translate, '100px');
-}, 'animation-timeline: scroll(horizontal)');
+}, 'animation-timeline: scroll(x)');
promise_test(async t => {
let [container, div] = createTargetWithStuff(t, 'inline-content');
container.style.writingMode = 'vertical-lr';
div.style.animation = "anim 10s linear";
- div.style.animationTimeline = "scroll(vertical)";
+ div.style.animationTimeline = "scroll(y)";
await scrollTop(container, 50);
assert_equals(getComputedStyle(div).translate, '100px');
-}, 'animation-timeline: scroll(vertical)');
+}, 'animation-timeline: scroll(y)');
// TODO: Add more tests which change the overflow property of the container for
// scroll(nearest)
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html
index 745d76c7294..8a62199b524 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html
@@ -202,7 +202,7 @@ promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
container.style.overflow = 'hidden';
div.style.animation = "fade-out-without-timeline-range 1s linear";
- div.style.animationTimeline = "view(horizontal)";
+ div.style.animationTimeline = "view(x)";
// So the range is [-200px, 100px], but it is impossible to scroll to the
// negative part.
@@ -214,12 +214,12 @@ promise_test(async t => {
assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%');
await scrollLeft(container, 100);
assert_equals(getComputedStyle(div).opacity, '0', 'At 100%');
-}, 'animation-timeline: view(horizontal) without timeline range name');
+}, 'animation-timeline: view(x) without timeline range name');
promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
div.style.animation = "fade-out-without-timeline-range 1s linear";
- div.style.animationTimeline = "view(vertical)";
+ div.style.animationTimeline = "view(y)";
// So the range is [-200px, 100px], but it is impossible to scroll to the
// negative part.
@@ -231,13 +231,13 @@ promise_test(async t => {
assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%');
await scrollTop(container, 100);
assert_equals(getComputedStyle(div).opacity, '0', 'At 100%');
-}, 'animation-timeline: view(vertical) without timeline range name');
+}, 'animation-timeline: view(y) without timeline range name');
promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
container.style.overflow = 'hidden';
div.style.animation = "fade-out-without-timeline-range 1s linear";
- div.style.animationTimeline = "view(horizontal 50px)";
+ div.style.animationTimeline = "view(x 50px)";
// So the range is [-150px, 50px], but it is impossible to scroll to the
// negative part.
@@ -248,7 +248,7 @@ promise_test(async t => {
assert_equals(getComputedStyle(div).opacity, '0.2', 'At 80%');
await scrollLeft(container, 50);
assert_equals(getComputedStyle(div).opacity, '0', 'At 100%');
-}, 'animation-timeline: view(horizontal 50px) without timeline range name');
+}, 'animation-timeline: view(x 50px) without timeline range name');
promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
@@ -384,7 +384,7 @@ promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
container.style.overflow = 'scroll';
div.style.animation = "fade-out 1s linear";
- div.style.animationTimeline = "view(horizontal)";
+ div.style.animationTimeline = "view(x)";
await scrollLeft(container, 0);
assert_equals(getComputedStyle(div).opacity, '1', 'At exit 0%');
@@ -392,13 +392,13 @@ promise_test(async t => {
assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%');
await scrollLeft(container, 100);
assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%');
-}, 'animation-timeline: view(horizontal)');
+}, 'animation-timeline: view(x)');
promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
container.style.overflow = 'scroll';
div.style.animation = "fade-out 1s linear";
- div.style.animationTimeline = "view(vertical)";
+ div.style.animationTimeline = "view(y)";
await scrollTop(container, 0);
assert_equals(getComputedStyle(div).opacity, '1', 'At exit 0%');
@@ -406,20 +406,20 @@ promise_test(async t => {
assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%');
await scrollTop(container, 100);
assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%');
-}, 'animation-timeline: view(vertical)');
+}, 'animation-timeline: view(y)');
promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
container.style.overflowY = 'hidden';
container.style.overflowX = 'scroll';
div.style.animation = "fade-out 1s linear";
- div.style.animationTimeline = "view(horizontal 50px)";
+ div.style.animationTimeline = "view(x 50px)";
await scrollLeft(container, 0);
assert_equals(getComputedStyle(div).opacity, '0.5', 'At exit 50%');
await scrollLeft(container, 50);
assert_equals(getComputedStyle(div).opacity, '0', 'At exit 100%');
-}, 'animation-timeline: view(horizontal 50px)');
+}, 'animation-timeline: view(x 50px)');
promise_test(async t => {
let [container, div] = createTargetWithStuff(t, ['target', 'content']);
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html
index 10bf00fbbc0..d3048913cef 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/get-animations-inactive-timeline.html
@@ -18,7 +18,7 @@
overflow-x: scroll;
height: 200px;
width: 200px;
- scroll-timeline-name: timeline;
+ scroll-timeline-name: --timeline;
}
#spacer {
height: 200vh;
@@ -28,7 +28,7 @@
height: 100px;
width: 100px;
animation: slide 1s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
</style>
<body>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html b/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html
index c6d384fce54..e5d5037d622 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/merge-timeline-offset-keyframes.html
@@ -42,8 +42,8 @@
animation-duration: auto;
animation-fill-mode: both;
animation-timing-function: linear;
- view-timeline: target;
- animation-timeline: target;
+ view-timeline: --target;
+ animation-timeline: --target;
}
#target.anim-1 {
animation-name: anim-1;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html
index 3939a1df48d..c37c1b95ef5 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html
@@ -12,7 +12,7 @@
}
#scroller {
- scroll-timeline: timeline;
+ scroll-timeline: --timeline;
overflow: scroll;
width: 100px;
height: 100px;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
index 05fab3e46ad..dd4add49b0f 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
@@ -13,7 +13,7 @@
}
#scroller {
- scroll-timeline: timeline;
+ scroll-timeline: --timeline;
overflow: scroll;
width: 100px;
height: 100px;
@@ -29,10 +29,10 @@
height: 100px;
background-color: green;
animation: anim 1s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
- @supports not (animation-timeline:timeline) {
+ @supports not (animation-timeline:--timeline) {
#box {
animation-play-state: paused;
}
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html
index eeb1e548e52..bbc60e3fbdd 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html
@@ -21,18 +21,18 @@
}
#scroller1 {
- scroll-timeline: top_timeline;
+ scroll-timeline: --top_timeline;
}
#element {
animation-name: top;
animation-duration: 10s;
animation-timing-function: linear;
- animation-timeline: top_timeline;
+ animation-timeline: --top_timeline;
position: absolute;
}
/* Ensure stable expectations if feature is not supported */
- @supports not (animation-timeline:foo) {
+ @supports not (animation-timeline:--foo) {
#element { animation-play-state: paused; }
}
</style>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html
index 96033859e29..c924302b224 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html
@@ -39,10 +39,10 @@
background-color: coral;
width: 0px;
animation: anim auto linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
.timeline {
- scroll-timeline-name: t1;
+ scroll-timeline-name: --t1;
}
.local {
scroll-timeline-attachment: local;
@@ -96,6 +96,25 @@
}, 'Deferred timeline with no attachments');
</script>
+<template id=scroll_timeline_defer_no_attach_to_prev_sibling>
+ <div class="timeline defer">
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ <div class=target>Test</div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_defer_no_attach_to_prev_sibling);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Deferred timeline with no attachments to previous sibling');
+</script>
+
<template id=scroll_timeline_local_ancestor>
<div class="scroller timeline local">
<div class=content>
@@ -142,7 +161,7 @@
<template id=scroll_timeline_defer_axis>
<div class="timeline defer" style="scroll-timeline-axis:inline">
<div class=target>Test</div>
- <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical">
+ <div class="scroller timeline ancestor" style="scroll-timeline-axis:y">
<div class=content></div>
</div>
</div>
@@ -154,7 +173,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Axis of deferred timeline is taken from attached timeline');
</script>
@@ -162,7 +181,7 @@
<template id=scroll_timeline_defer_axis_multiple>
<div class="timeline defer" style="scroll-timeline-axis:inline">
<div class=target>Test</div>
- <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical">
+ <div class="scroller timeline ancestor" style="scroll-timeline-axis:y">
<div class=content></div>
</div>
<!-- Extra attachment -->
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html
index b971aba6c0f..c942fb40932 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-computed.html
@@ -5,7 +5,7 @@
<script src="/css/support/computed-testcommon.js"></script>
<style>
#outer { scroll-timeline-axis: inline; }
- #target { scroll-timeline-axis: vertical; }
+ #target { scroll-timeline-axis: y; }
</style>
<div id="outer">
<div id="target"></div>
@@ -17,11 +17,11 @@ test_computed_value('scroll-timeline-axis', 'unset', 'block');
test_computed_value('scroll-timeline-axis', 'revert', 'block');
test_computed_value('scroll-timeline-axis', 'block');
test_computed_value('scroll-timeline-axis', 'inline');
-test_computed_value('scroll-timeline-axis', 'vertical');
-test_computed_value('scroll-timeline-axis', 'horizontal');
+test_computed_value('scroll-timeline-axis', 'y');
+test_computed_value('scroll-timeline-axis', 'x');
test_computed_value('scroll-timeline-axis', 'block, inline');
test_computed_value('scroll-timeline-axis', 'inline, block');
-test_computed_value('scroll-timeline-axis', 'block, vertical, horizontal, inline');
+test_computed_value('scroll-timeline-axis', 'block, y, x, inline');
test_computed_value('scroll-timeline-axis', 'inline, inline, inline, inline');
test(() => {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html
index 25f48f0c70a..a9a760a54a4 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-parsing.html
@@ -14,11 +14,11 @@ test_valid_value('scroll-timeline-axis', 'revert');
test_valid_value('scroll-timeline-axis', 'block');
test_valid_value('scroll-timeline-axis', 'inline');
-test_valid_value('scroll-timeline-axis', 'vertical');
-test_valid_value('scroll-timeline-axis', 'horizontal');
+test_valid_value('scroll-timeline-axis', 'y');
+test_valid_value('scroll-timeline-axis', 'x');
test_valid_value('scroll-timeline-axis', 'block, inline');
test_valid_value('scroll-timeline-axis', 'inline, block');
-test_valid_value('scroll-timeline-axis', 'block, vertical, horizontal, inline');
+test_valid_value('scroll-timeline-axis', 'block, y, x, inline');
test_valid_value('scroll-timeline-axis', 'inline, inline, inline, inline');
test_invalid_value('scroll-timeline-axis', 'abc');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html
index 958ce4964e8..872dc1b2b93 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html
@@ -19,26 +19,26 @@
to { width: 200px; }
}
#timeline_initial_axis {
- scroll-timeline: timeline_initial_axis;
+ scroll-timeline: --timeline_initial_axis;
}
- #timeline_vertical {
- scroll-timeline: timeline_vertical vertical;
+ #timeline_y {
+ scroll-timeline: --timeline_y y;
}
- #timeline_horizontal {
- scroll-timeline: timeline_horizontal horizontal;
+ #timeline_x {
+ scroll-timeline: --timeline_x x;
}
#timeline_block_in_horizontal {
- scroll-timeline: timeline_block_in_horizontal block;
+ scroll-timeline: --timeline_block_in_horizontal block;
}
#timeline_inline_in_horizontal {
- scroll-timeline: timeline_inline_in_horizontal inline;
+ scroll-timeline: --timeline_inline_in_horizontal inline;
}
#timeline_block_in_vertical {
- scroll-timeline: timeline_block_in_vertical block;
+ scroll-timeline: --timeline_block_in_vertical block;
writing-mode: vertical-lr;
}
#timeline_inline_in_vertical {
- scroll-timeline: timeline_inline_in_vertical inline;
+ scroll-timeline: --timeline_inline_in_vertical inline;
writing-mode: vertical-lr;
}
.target {
@@ -49,28 +49,28 @@
position: absolute;
}
/* Ensure stable expectations if feature is not supported */
- @supports not (animation-timeline:foo) {
+ @supports not (animation-timeline:--foo) {
.target { animation-play-state: paused; }
}
- #element_initial_axis { animation-timeline: timeline_initial_axis; }
- #element_vertical { animation-timeline: timeline_vertical; }
- #element_horizontal { animation-timeline: timeline_horizontal; }
- #element_block_in_horizontal { animation-timeline: timeline_block_in_horizontal; }
- #element_inline_in_horizontal { animation-timeline: timeline_inline_in_horizontal; }
- #element_block_in_vertical { animation-timeline: timeline_block_in_vertical; }
- #element_inline_in_vertical { animation-timeline: timeline_inline_in_vertical; }
+ #element_initial_axis { animation-timeline: --timeline_initial_axis; }
+ #element_y { animation-timeline: --timeline_y; }
+ #element_x { animation-timeline: --timeline_x; }
+ #element_block_in_horizontal { animation-timeline: --timeline_block_in_horizontal; }
+ #element_inline_in_horizontal { animation-timeline: --timeline_inline_in_horizontal; }
+ #element_block_in_vertical { animation-timeline: --timeline_block_in_vertical; }
+ #element_inline_in_vertical { animation-timeline: --timeline_inline_in_vertical; }
</style>
<div class=scroller id=timeline_initial_axis>
<div class=contents></div>
<div class=target id=element_initial_axis></div>
</div>
-<div class=scroller id=timeline_vertical>
+<div class=scroller id=timeline_y>
<div class=contents></div>
- <div class=target id=element_vertical></div>
+ <div class=target id=element_y></div>
</div>
-<div class=scroller id=timeline_horizontal>
+<div class=scroller id=timeline_x>
<div class=contents></div>
- <div class=target id=element_horizontal></div>
+ <div class=target id=element_x></div>
</div>
<div class=scroller id=timeline_block_in_horizontal>
<div class=contents></div>
@@ -91,11 +91,11 @@
<script>
// Animations linked to vertical scroll-timelines are at 75% progress.
timeline_initial_axis.scrollTop = 75;
- timeline_vertical.scrollTop = 75;
+ timeline_y.scrollTop = 75;
timeline_block_in_horizontal.scrollTop = 75;
timeline_inline_in_vertical.scrollTop = 75;
// Animations linked to horizontal scroll-timelines are at 25% progress.
- timeline_horizontal.scrollLeft = 25;
+ timeline_x.scrollLeft = 25;
timeline_block_in_vertical.scrollLeft = 25;
timeline_inline_in_horizontal.scrollLeft = 25;
@@ -106,12 +106,12 @@
promise_test(async (t) => {
await waitForNextFrame();
- assert_equals(getComputedStyle(element_vertical).width, '175px');
+ assert_equals(getComputedStyle(element_y).width, '175px');
}, 'Vertical axis');
promise_test(async (t) => {
await waitForNextFrame();
- assert_equals(getComputedStyle(element_horizontal).width, '125px');
+ assert_equals(getComputedStyle(element_x).width, '125px');
}, 'Horizontal axis');
promise_test(async (t) => {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html
index 0d951e7b139..57c666e2412 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-dynamic.tentative.html
@@ -6,6 +6,15 @@
<script src="/web-animations/testcommon.js"></script>
<script src="support/testcommon.js"></script>
<style>
+ main {
+ scroll-timeline-attachment: defer;
+ scroll-timeline-name: --timeline;
+ }
+
+ .scroller {
+ scroll-timeline-attachment: ancestor;
+ }
+
main > div {
overflow: hidden;
width: 100px;
@@ -29,9 +38,13 @@
animation-timing-function: steps(10, end);
}
</style>
-<main>
- <div id=scroller1><div></div></div>
- <div id=scroller2><div></div></div>
+<main id=main>
+ <div id=scroller1 class=scroller>
+ <div></div>
+ </div>
+ <div id=scroller2 class=scroller>
+ <div></div>
+ </div>
<div id=container></div>
</main>
<script>
@@ -64,6 +77,7 @@
} finally {
while (container.firstChild)
container.firstChild.remove();
+ main.style = '';
scroller1.style = '';
scroller2.style = '';
}
@@ -96,8 +110,8 @@
await assert_width(element, '100px');
// Switch to scroll timeline.
- scroller1.style.scrollTimelineName = 'timeline';
- element.style.animationTimeline = 'timeline';
+ scroller1.style.scrollTimelineName = '--timeline';
+ element.style.animationTimeline = '--timeline';
await assert_width(element, '120px');
// Switching from ScrollTimeline -> DocumentTimeline should preserve
@@ -117,8 +131,8 @@
assert_true(anim.pending, "The animation is in play pending");
// Switch to scroll timeline for a pending animation.
- scroller1.style.scrollTimelineName = 'timeline';
- element.style.animationTimeline = 'timeline';
+ scroller1.style.scrollTimelineName = '--timeline';
+ element.style.animationTimeline = '--timeline';
await anim.ready;
assert_false(anim.pending, "The animation is not pending");
@@ -130,18 +144,19 @@
let element = insertElement();
// Note: #scroller1 is at 20%, and #scroller2 is at 40%.
- scroller1.style.scrollTimelineName = 'timeline1';
- scroller2.style.scrollTimelineName = 'timeline2';
+ scroller1.style.scrollTimelineName = '--timeline1';
+ scroller2.style.scrollTimelineName = '--timeline2';
+ main.style.scrollTimelineName = "--timeline1, --timeline2";
await assert_width(element, '100px');
- element.style.animationTimeline = 'timeline1';
+ element.style.animationTimeline = '--timeline1';
await assert_width(element, '120px');
- element.style.animationTimeline = 'timeline2';
+ element.style.animationTimeline = '--timeline2';
await assert_width(element, '140px');
- element.style.animationTimeline = 'timeline1';
+ element.style.animationTimeline = '--timeline1';
await assert_width(element, '120px');
// Switching from ScrollTimeline -> DocumentTimeline should preserve
@@ -154,7 +169,7 @@
dynamic_rule_test(async (t, assert_width) => {
let element = insertElement();
- scroller1.style.scrollTimelineName = 'timeline';
+ scroller1.style.scrollTimelineName = '--timeline';
// DocumentTimeline applies by default.
await assert_width(element, '100px');
@@ -164,7 +179,7 @@
await element.getAnimations()[0].ready;
// DocumentTimeline -> none
- element.style.animationTimeline = 'none';
+ element.style.animationTimeline = '--none';
await assert_width(element, '0px');
// none -> DocumentTimeline
@@ -172,15 +187,15 @@
await assert_width(element, '100px');
// DocumentTimeline -> ScrollTimeline
- element.style.animationTimeline = 'timeline';
+ element.style.animationTimeline = '--timeline';
await assert_width(element, '120px');
// ScrollTimeline -> none
- element.style.animationTimeline = 'none';
+ element.style.animationTimeline = '--none';
await assert_width(element, '120px');
// none -> ScrollTimeline
- element.style.animationTimeline = 'timeline';
+ element.style.animationTimeline = '--timeline';
await assert_width(element, '120px');
}, 'Changing to/from animation-timeline:none');
@@ -188,34 +203,19 @@
dynamic_rule_test(async (t, assert_width) => {
let element = insertElement();
- element.style.animationTimeline = 'timeline';
-
- // Unknown animation-timeline, current time held at zero.
- await assert_width(element, '100px');
-
- scroller1.style.scrollTimelineName = 'timeline';
- await assert_width(element, '120px');
-
- scroller2.style.scrollTimelineName = 'timeline';
- await assert_width(element, '140px');
- }, 'Changing scroll-timeline on preceding elements affects target element');
-
-
- dynamic_rule_test(async (t, assert_width) => {
- let element = insertElement();
-
element.style.animationDirection = 'reverse';
- element.style.animationTimeline = 'timeline';
+ element.style.animationTimeline = '--timeline';
- // Unknown animation-timeline, current time held at zero.
- await assert_width(element, '200px');
+ // Inactive animation-timeline. Animation is inactive.
+ await assert_width(element, '0px');
// Note: #scroller1 is at 20%.
- scroller1.style.scrollTimelineName = 'timeline';
+ scroller1.style.scrollTimelineName = '--timeline';
await assert_width(element, '180px');
// Note: #scroller2 is at 40%.
- scroller2.style.scrollTimelineName = 'timeline';
+ scroller1.style.scrollTimelineName = '';
+ scroller2.style.scrollTimelineName = '--timeline';
await assert_width(element, '160px');
element.style.animationDirection = '';
@@ -224,13 +224,13 @@
dynamic_rule_test(async (t, assert_width) => {
let element = insertElement();
- element.style.animationTimeline = 'timeline';
+ element.style.animationTimeline = '--timeline';
- // Unknown animation-timeline, current time held at zero.
- await assert_width(element, '100px');
+ // Inactive animation-timeline. Animation effect is inactive.
+ await assert_width(element, '0px');
// Note: #scroller1 is at 20%.
- scroller1.style.scrollTimelineName = 'timeline';
+ scroller1.style.scrollTimelineName = '--timeline';
await assert_width(element, '120px');
element.style.animationPlayState = 'paused';
@@ -239,26 +239,26 @@
await assert_width(element, '120px');
// Note: #scroller2 is at 40%.
- scroller2.style.scrollTimelineName = 'timeline';
+ scroller1.style.scrollTimelineName = '';
+ scroller2.style.scrollTimelineName = '--timeline';
- // Even when switching timelines, we should be at the same position until
- // we unpause.
+ // Should be at the same position until we unpause.
await assert_width(element, '120px');
// Unpausing should synchronize to the scroll position.
element.style.animationPlayState = '';
await assert_width(element, '140px');
- }, 'Switching timelines while paused');
+ }, 'Change to timeline attachment while paused');
dynamic_rule_test(async (t, assert_width) => {
let element = insertElement();
// Note: #scroller1 is at 20%.
- scroller1.style.scrollTimelineName = 'timeline';
+ scroller1.style.scrollTimelineName = '--timeline';
await assert_width(element, '100px');
- element.style.animationTimeline = 'timeline';
+ element.style.animationTimeline = '--timeline';
element.style.animationPlayState = 'paused';
// Pausing should happen before the timeline is modified. (Tentative).
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html
index 38b8ffdc15a..742c35b2580 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-in-container-query.html
@@ -29,7 +29,7 @@
/* This does not apply initially. */
@container (width > 200px) {
#scroller {
- scroll-timeline: timeline;
+ scroll-timeline: --timeline;
}
}
@@ -42,7 +42,7 @@
height: 10px;
width: 10px;
animation: recolor 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
background-color: rgb(0, 0, 0);
}
</style>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html
index 0953f1b3894..eedc8e3958a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-inactive.html
@@ -27,12 +27,12 @@
<template id=basic>
<style>
#timeline {
- scroll-timeline: timeline;
+ scroll-timeline: --timeline;
}
#element {
width: 0px;
animation: expand 10s linear paused;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
</style>
<div id="container">
@@ -57,7 +57,7 @@
#element {
width: 0px;
animation: expand 10s linear paused;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
</style>
<div id="container">
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html
index 651ba212ded..7e0c1339b26 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-multi-pass.tentative.html
@@ -18,7 +18,7 @@
main {
height: 0px;
overflow: hidden;
- scroll-timeline: timeline1 defer, timeline2 defer;
+ scroll-timeline: --timeline1 defer, --timeline2 defer;
}
.scroller {
height: 100px;
@@ -30,12 +30,12 @@
#element1 {
width: 1px;
animation: expand_width 10s;
- animation-timeline: timeline1;
+ animation-timeline: --timeline1;
}
#element2 {
height: 1px;
animation: expand_height 10s;
- animation-timeline: timeline2;
+ animation-timeline: --timeline2;
}
</style>
<main id=main>
@@ -61,7 +61,7 @@
let events1 = [];
let events2 = [];
- insertScroller('timeline1');
+ insertScroller('--timeline1');
// Even though the scroller was just inserted into the DOM, |timeline1|
// remains inactive until the next frame.
//
@@ -69,7 +69,7 @@
assert_equals(getComputedStyle(element1).width, '1px');
(new ResizeObserver(entries => {
events1.push(entries);
- insertScroller('timeline2');
+ insertScroller('--timeline2');
assert_equals(getComputedStyle(element2).height, '1px');
})).observe(element1);
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html
index bfffafc6523..b803ee8212b 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-computed.html
@@ -5,24 +5,24 @@
<script src="/css/support/computed-testcommon.js"></script>
</head>
<style>
- #outer { scroll-timeline-name: foo; }
- #target { scroll-timeline-name: bar; }
+ #outer { scroll-timeline-name: --foo; }
+ #target { scroll-timeline-name: --bar; }
</style>
<div id="outer">
<div id="target"></div>
</div>
<script>
test_computed_value('scroll-timeline-name', 'initial', 'none');
-test_computed_value('scroll-timeline-name', 'inherit', 'foo');
+test_computed_value('scroll-timeline-name', 'inherit', '--foo');
test_computed_value('scroll-timeline-name', 'unset', 'none');
test_computed_value('scroll-timeline-name', 'revert', 'none');
test_computed_value('scroll-timeline-name', 'none');
-test_computed_value('scroll-timeline-name', 'test');
-test_computed_value('scroll-timeline-name', 'foo, bar');
-test_computed_value('scroll-timeline-name', 'bar, foo');
-test_computed_value('scroll-timeline-name', 'a, b, c, D, e');
+test_computed_value('scroll-timeline-name', '--foo');
+test_computed_value('scroll-timeline-name', '--foo, --bar');
+test_computed_value('scroll-timeline-name', '--bar, --foo');
+test_computed_value('scroll-timeline-name', '--a, --b, --c, --D, --e');
test_computed_value('scroll-timeline-name', 'none, none');
-test_computed_value('scroll-timeline-name', 'a, b, c, none, d, e');
+test_computed_value('scroll-timeline-name', '--a, --b, --c, none, --d, --e');
test(() => {
let style = getComputedStyle(document.getElementById('target'));
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html
index 0fb271250ad..d38b9640af9 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-parsing.html
@@ -12,15 +12,16 @@ test_valid_value('scroll-timeline-name', 'unset');
test_valid_value('scroll-timeline-name', 'revert');
test_valid_value('scroll-timeline-name', 'none');
-test_valid_value('scroll-timeline-name', 'abc');
-test_valid_value('scroll-timeline-name', ' abc', 'abc');
-test_valid_value('scroll-timeline-name', 'aBc');
-test_valid_value('scroll-timeline-name', 'foo, bar');
-test_valid_value('scroll-timeline-name', 'bar, foo');
+test_valid_value('scroll-timeline-name', '--abc');
+test_valid_value('scroll-timeline-name', ' --abc', '--abc');
+test_valid_value('scroll-timeline-name', '--aBc');
+test_valid_value('scroll-timeline-name', '--foo, --bar');
+test_valid_value('scroll-timeline-name', '--bar, --foo');
test_valid_value('scroll-timeline-name', 'none, none');
-test_valid_value('scroll-timeline-name', 'a, none, b');
-test_valid_value('scroll-timeline-name', 'auto');
+test_valid_value('scroll-timeline-name', '--a, none, --b');
+test_invalid_value('scroll-timeline-name', 'auto');
+test_invalid_value('scroll-timeline-name', 'abc');
test_invalid_value('scroll-timeline-name', 'default');
test_invalid_value('scroll-timeline-name', '10px');
test_invalid_value('scroll-timeline-name', 'foo bar');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html
index f5cd2ce47d7..f2bea29dd3c 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-name-shadow.html
@@ -31,10 +31,10 @@
<style>
.target {
animation: anim 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
main > .scroller {
- scroll-timeline: timeline horizontal;
+ scroll-timeline: --timeline x;
}
</style>
<div class=scroller>
@@ -42,7 +42,7 @@
<template shadowrootmode=open>
<style>
:host {
- scroll-timeline: timeline vertical;
+ scroll-timeline: --timeline y;
}
</style>
<slot></slot>
@@ -60,7 +60,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Outer animation can see scroll timeline defined by :host');
</script>
@@ -69,17 +69,17 @@
<style>
.target {
animation: anim 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
.host {
- scroll-timeline: timeline horizontal;
+ scroll-timeline: --timeline x;
}
</style>
<div class=host>
<template shadowrootmode=open>
<style>
::slotted(.scroller) {
- scroll-timeline: timeline vertical;
+ scroll-timeline: --timeline y;
}
</style>
<slot></slot>
@@ -98,7 +98,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Outer animation can see scroll timeline defined by ::slotted');
</script>
@@ -106,10 +106,10 @@
<template id=scroll_timeline_part>
<style>
.host {
- scroll-timeline: timeline vertical;
+ scroll-timeline: --timeline y;
}
.host::part(foo) {
- scroll-timeline: timeline horizontal;
+ scroll-timeline: --timeline x;
}
</style>
<div class=host>
@@ -122,7 +122,7 @@
}
.target {
animation: anim2 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
</style>
<div part=foo>
@@ -140,7 +140,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'horizontal');
+ assert_equals(anim.timeline.axis, 'x');
}, 'Inner animation can see scroll timeline defined by ::part');
</script>
@@ -149,10 +149,10 @@
<style>
.target {
animation: anim 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
.host {
- scroll-timeline: timeline horizontal;
+ scroll-timeline: --timeline x;
}
</style>
<div class=scroller>
@@ -160,7 +160,7 @@
<template shadowrootmode=open>
<style>
div {
- scroll-timeline: timeline vertical;
+ scroll-timeline: --timeline y;
}
</style>
<div>
@@ -180,6 +180,6 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Slotted element can see scroll timeline within the shadow');
</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html
index 7fe2d12be30..57a1a947126 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-nearest-with-absolute-positioned-element.html
@@ -16,7 +16,7 @@
overflow-x: scroll;
display: flex;
flex-direction: row;
- scroll-timeline: timeline inline;
+ scroll-timeline: --timeline inline;
}
.progress {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html
index 51b60e73ce6..f77c5082200 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sampling.html
@@ -8,7 +8,7 @@
overflow: hidden;
width: 100px;
height: 100px;
- scroll-timeline: timeline;
+ scroll-timeline: --timeline;
}
#contents {
height: 200px;
@@ -20,10 +20,10 @@
#element {
width: 0px;
animation: expand 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
/* Ensure stable expectations if feature is not supported */
- @supports not (animation-timeline:foo) {
+ @supports not (animation-timeline:--foo) {
#element { animation-play-state: paused; }
}
</style>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html
index 68e1cc955f5..7a6d9cdf4ae 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-shorthand.tentative.html
@@ -9,67 +9,67 @@
<script>
test_valid_value('scroll-timeline', 'none block', 'none');
test_valid_value('scroll-timeline', 'none inline');
-test_valid_value('scroll-timeline', 'abc horizontal');
-test_valid_value('scroll-timeline', 'abc inline');
-test_valid_value('scroll-timeline', 'aBc inline');
-test_valid_value('scroll-timeline', 'inline inline');
-test_valid_value('scroll-timeline', 'abc');
+test_valid_value('scroll-timeline', '--abc x');
+test_valid_value('scroll-timeline', '--abc inline');
+test_valid_value('scroll-timeline', '--aBc inline');
+test_valid_value('scroll-timeline', '--inline inline');
+test_valid_value('scroll-timeline', '--abc');
-test_valid_value('scroll-timeline', 'inline block', 'inline');
-test_valid_value('scroll-timeline', 'block block', 'block');
-test_valid_value('scroll-timeline', 'vertical block', 'vertical');
-test_valid_value('scroll-timeline', 'horizontal block', 'horizontal');
+test_valid_value('scroll-timeline', '--inline block', '--inline');
+test_valid_value('scroll-timeline', '--block block', '--block');
+test_valid_value('scroll-timeline', '--y block', '--y');
+test_valid_value('scroll-timeline', '--x block', '--x');
-test_valid_value('scroll-timeline', 'a, b, c');
-test_valid_value('scroll-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical');
-test_valid_value('scroll-timeline', 'auto');
-test_valid_value('scroll-timeline', 'abc defer vertical', 'abc vertical defer');
-test_valid_value('scroll-timeline', 'abc vertical defer');
+test_valid_value('scroll-timeline', '--a, --b, --c');
+test_valid_value('scroll-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y');
+test_valid_value('scroll-timeline', '--auto');
+test_valid_value('scroll-timeline', '--abc defer y', '--abc y defer');
+test_valid_value('scroll-timeline', '--abc y defer');
test_invalid_value('scroll-timeline', '');
-test_invalid_value('scroll-timeline', 'abc abc');
+test_invalid_value('scroll-timeline', '--abc --abc');
test_invalid_value('scroll-timeline', 'block none');
-test_invalid_value('scroll-timeline', 'inline abc');
+test_invalid_value('scroll-timeline', 'inline --abc');
test_invalid_value('scroll-timeline', 'default');
test_invalid_value('scroll-timeline', ',');
test_invalid_value('scroll-timeline', ',,block,,');
test_computed_value('scroll-timeline', 'none block', 'none');
-test_computed_value('scroll-timeline', 'abc inline');
-test_computed_value('scroll-timeline', 'none vertical');
-test_computed_value('scroll-timeline', 'abc horizontal');
-test_computed_value('scroll-timeline', 'vertical vertical');
-test_computed_value('scroll-timeline', 'abc');
-test_computed_value('scroll-timeline', 'inline block', 'inline');
-test_computed_value('scroll-timeline', 'block block', 'block');
-test_computed_value('scroll-timeline', 'vertical block', 'vertical');
-test_computed_value('scroll-timeline', 'horizontal block', 'horizontal');
-test_computed_value('scroll-timeline', 'a, b, c');
-test_computed_value('scroll-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical');
-test_computed_value('scroll-timeline', 'abc defer vertical', 'abc vertical defer');
-test_computed_value('scroll-timeline', 'abc vertical defer');
+test_computed_value('scroll-timeline', '--abc inline');
+test_computed_value('scroll-timeline', 'none y');
+test_computed_value('scroll-timeline', '--abc x');
+test_computed_value('scroll-timeline', '--y y');
+test_computed_value('scroll-timeline', '--abc');
+test_computed_value('scroll-timeline', '--inline block', '--inline');
+test_computed_value('scroll-timeline', '--block block', '--block');
+test_computed_value('scroll-timeline', '--y block', '--y');
+test_computed_value('scroll-timeline', '--x block', '--x');
+test_computed_value('scroll-timeline', '--a, --b, --c');
+test_computed_value('scroll-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y');
+test_computed_value('scroll-timeline', '--abc defer y', '--abc y defer');
+test_computed_value('scroll-timeline', '--abc y defer');
-test_shorthand_value('scroll-timeline', 'abc vertical local',
+test_shorthand_value('scroll-timeline', '--abc y local',
{
- 'scroll-timeline-name': 'abc',
- 'scroll-timeline-axis': 'vertical',
+ 'scroll-timeline-name': '--abc',
+ 'scroll-timeline-axis': 'y',
'scroll-timeline-attachment': 'local',
});
-test_shorthand_value('scroll-timeline', 'inline horizontal defer',
+test_shorthand_value('scroll-timeline', '--inline x defer',
{
- 'scroll-timeline-name': 'inline',
- 'scroll-timeline-axis': 'horizontal',
+ 'scroll-timeline-name': '--inline',
+ 'scroll-timeline-axis': 'x',
'scroll-timeline-attachment': 'defer',
});
-test_shorthand_value('scroll-timeline', 'abc vertical ancestor, def',
+test_shorthand_value('scroll-timeline', '--abc y ancestor, --def',
{
- 'scroll-timeline-name': 'abc, def',
- 'scroll-timeline-axis': 'vertical, block',
+ 'scroll-timeline-name': '--abc, --def',
+ 'scroll-timeline-axis': 'y, block',
'scroll-timeline-attachment': 'ancestor, local',
});
-test_shorthand_value('scroll-timeline', 'abc, def',
+test_shorthand_value('scroll-timeline', '--abc, --def',
{
- 'scroll-timeline-name': 'abc, def',
+ 'scroll-timeline-name': '--abc, --def',
'scroll-timeline-axis': 'block, block',
'scroll-timeline-attachment': 'local, local',
});
@@ -89,16 +89,16 @@ function test_shorthand_contraction(shorthand, longhands, expected) {
}
test_shorthand_contraction('scroll-timeline', {
- 'scroll-timeline-name': 'abc',
+ 'scroll-timeline-name': '--abc',
'scroll-timeline-axis': 'inline',
'scroll-timeline-attachment': 'defer',
-}, 'abc inline defer');
+}, '--abc inline defer');
test_shorthand_contraction('scroll-timeline', {
- 'scroll-timeline-name': 'a, b',
+ 'scroll-timeline-name': '--a, --b',
'scroll-timeline-axis': 'inline, block',
'scroll-timeline-attachment': 'ancestor, local',
-}, 'a inline ancestor, b');
+}, '--a inline ancestor, --b');
test_shorthand_contraction('scroll-timeline', {
'scroll-timeline-name': 'none, none',
@@ -109,13 +109,13 @@ test_shorthand_contraction('scroll-timeline', {
// Longhands with different lengths:
test_shorthand_contraction('scroll-timeline', {
- 'scroll-timeline-name': 'a, b, c',
+ 'scroll-timeline-name': '--a, --b, --c',
'scroll-timeline-axis': 'inline, inline',
'scroll-timeline-attachment': 'local, local',
}, '');
test_shorthand_contraction('scroll-timeline', {
- 'scroll-timeline-name': 'a, b',
+ 'scroll-timeline-name': '--a, --b',
'scroll-timeline-axis': 'inline, inline, inline',
'scroll-timeline-attachment': 'local, local',
}, '');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sibling-gcs.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sibling-gcs.html
deleted file mode 100644
index 6062e795f43..00000000000
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-sibling-gcs.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<title>scroll-timeline and container queries</title>
-<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-shorthand">
-<link rel="help" src="https://drafts.csswg.org/css-contain-3/#container-queries">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/web-animations/testcommon.js"></script>
-<script src="support/testcommon.js"></script>
-<style>
- #scroller {
- overflow: auto;
- width: auto;
- height: 100px;
- }
- #scroller > div {
- height: 200px;
- }
-
- @keyframes anim {
- from { background-color: rgb(100, 100, 100); }
- to { background-color: rgb(200, 200, 200); }
- }
- #element {
- height: 10px;
- width: 10px;
- animation: anim 10s linear;
- animation-timeline: timeline;
- background-color: rgb(0, 0, 0);
- }
-</style>
-<div>
- <div id=scroller>
- <div></div>
- </div>
- <div>
- <div id=element></div>
- </div>
-</div>
-<script>
- setup(assert_implements_animation_timeline);
-
- promise_test(async (t) => {
- element.offsetTop;
- scroller.scrollTop = 50;
- await waitForNextFrame();
- // Unknown timeline, time held at zero.
- assert_equals(getComputedStyle(element).backgroundColor, 'rgb(100, 100, 100)');
- scroller.style.scrollTimeline = 'timeline';
- await waitForCSSScrollTimelineStyle();
- assert_equals(getComputedStyle(element).backgroundColor, 'rgb(150, 150, 150)');
- }, 'Timelines appearing on preceding siblings are visible to getComputedStyle');
-</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html
index 93ad6916ea7..6bc18544f4a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-update-reversed-animation.html
@@ -18,7 +18,7 @@
overflow: hidden;
width: 300px;
height: 200px;
- scroll-timeline: timeline;
+ scroll-timeline: --timeline;
}
#target {
margin-bottom: 800px;
@@ -33,7 +33,7 @@
}
#target.update {
animation-play-state: running;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
animation-duration: auto;
}
</style>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/support/animation-range.css b/tests/wpt/web-platform-tests/scroll-animations/css/support/animation-range.css
new file mode 100644
index 00000000000..453d076b6f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/support/animation-range.css
@@ -0,0 +1,82 @@
+.flex {
+ display: flex;
+}
+
+.flex > div {
+ position: relative;
+ height: 160px;
+ margin: 0 10px;
+}
+
+.scroller {
+ width: 100px;
+ height: 100px;
+ overflow: auto;
+ border: 1px solid black;
+}
+
+.subject {
+ view-timeline-name: --view;
+ width: 20px;
+ height: 20px;
+ margin: 0 auto;
+ background: green;
+}
+
+.meters {
+ position: absolute;
+ left: 0;
+ top: 110px;
+ height: 50px;
+}
+
+.meters > div {
+ display: flex;
+ align-items: center;
+}
+
+@keyframes active-interval {
+ 0% { opacity: 1; }
+ 100% { opacity: 1; }
+}
+
+.meter {
+ width: 50px;
+ position: relative;
+ border: 2px solid black;
+ height: 5px;
+ overflow: clip;
+ opacity: 0.4;
+ animation: active-interval linear;
+ animation-timeline: --view;
+}
+
+@keyframes slide-in {
+ 0% { transform: translateX(-100%)}
+ 100% { transform: translateX(0%)}
+}
+
+.bar {
+ width: 100%;
+ height: 100%;
+ background: blue;
+ transform: translateX(-100%);
+ animation: slide-in linear;
+ animation-timeline: --view;
+}
+
+.spacer {
+ height: 400px;
+}
+
+.contain .bar, .contain .meter {
+ animation-range: contain;
+}
+
+.entry .bar, .entry .meter {
+ animation-range: entry;
+}
+
+.exit .bar, .exit .meter {
+ animation-range: exit;
+}
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js b/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js
index 66bc27bb104..91540774d08 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/support/testcommon.js
@@ -14,6 +14,6 @@ async function waitForCSSScrollTimelineStyle() {
}
function assert_implements_animation_timeline() {
- assert_implements(CSS.supports('animation-timeline:foo'),
+ assert_implements(CSS.supports('animation-timeline:--foo'),
'animation-timeline not supported');
}
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html
index eeb13150aa1..311b2c8929a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-in-keyframe-change-timeline.tentative.html
@@ -27,7 +27,7 @@
overflow-x: hidden;
width: 300px;
height: 200px;
- view-timeline: sibling defer;
+ view-timeline: --sibling defer;
}
#sibling {
margin-top: 800px;
@@ -36,7 +36,7 @@
width: 100px;
height: 50px;
background-color: blue;
- view-timeline: sibling block ancestor;
+ view-timeline: --sibling block ancestor;
}
#target {
margin-bottom: 800px;
@@ -50,14 +50,14 @@
/* using document timeline by default */
animation-range-start: contain 0%;
animation-range-end: contain 100%;
- view-timeline: target block;
+ view-timeline: --target block;
}
#target.with-view-timeline {
- animation-timeline: target;
+ animation-timeline: --target;
}
#target.with-view-timeline.retarget {
- animation-timeline: sibling;
+ animation-timeline: --sibling;
}
</style>
<body>
@@ -90,7 +90,7 @@
// Once a view-timeline is added, the kefyrames must update to reflect
// the new keyframe offsets.
target.classList.add('with-view-timeline');
- assert_equals(getComputedStyle(target).animationTimeline, 'target',
+ assert_equals(getComputedStyle(target).animationTimeline, '--target',
'Switch to view timeline');
await waitForNextFrame();
@@ -110,7 +110,7 @@
assert_frame_lists_equal(frames, expected);
target.classList.add('retarget');
- assert_equals(getComputedStyle(target).animationTimeline, 'sibling',
+ assert_equals(getComputedStyle(target).animationTimeline, '--sibling',
'Switch to another view timeline');
await waitForNextFrame();
frames = anim.effect.getKeyframes();
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html
index 93ef7ffa1eb..10934347821 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html
@@ -13,10 +13,10 @@
<style type="text/css">
@keyframes anim {
cover 0% {
- margin-left: 0px;
+ margin-left: 0px;
}
50% {
- opacity: 0.5;
+ opacity: 0.5;
}
cover 100% {
margin-right: 0px;
@@ -24,35 +24,34 @@
}
#scroller {
- scroll-timeline-attachment: defer t1;
- border: 10px solid lightgray;
+ border: 10px solid lightgray;
overflow-y: scroll;
overflow-x: hidden;
width: 300px;
height: 200px;
+ view-timeline: --t1 defer;
}
#block {
- scroll-timeline-attachment: ancestor;
- margin-top: 800px;
- margin-left: 10px;
- margin-right: 10px;
- width: 100px;
- height: 50px;
- background-color: blue;
- view-timeline: t1 block;
+ margin-top: 800px;
+ margin-left: 10px;
+ margin-right: 10px;
+ width: 100px;
+ height: 50px;
+ background-color: blue;
+ view-timeline: --t1 ancestor;
}
#target {
margin-bottom: 800px;
- margin-left: 10px;
- margin-right: 10px;
+ margin-left: 10px;
+ margin-right: 10px;
width: 100px;
height: 100px;
z-index: -1;
background-color: green;
- animation: anim auto both linear;
- animation-range-start: contain 0%;
- animation-range-end: contain 100%;
- animation-timeline: t1;
+ animation: anim auto both linear;
+ animation-range-start: contain 0%;
+ animation-range-end: contain 100%;
+ animation-timeline: --t1;
}
</style>
<body>
@@ -74,16 +73,16 @@
let frames = anim.effect.getKeyframes();
let expected_resolved_offsets = [
- { offset: 0, computedOffset: 0, easing: "linear", composite: "replace",
+ { offset: 0, computedOffset: 0, easing: "linear", composite: "replace",
marginRight: "10px", opacity: "1" },
{ offset: 1/2, computedOffset: 1/2, easing: "linear",
composite: "auto", opacity: "0.5" },
{ offset: 1, computedOffset: 1, easing: "linear", composite: "replace",
marginLeft: "10px", opacity: "1" },
- { offset: { rangeName: 'cover', offset: CSS.percent(0) },
+ { offset: { rangeName: "cover", offset: CSS.percent(0) },
computedOffset: -1/3, easing: "linear",
composite: "auto", marginLeft: "0px" },
- { offset: { rangeName: 'cover', offset: CSS.percent(100) },
+ { offset: { rangeName: "cover", offset: CSS.percent(100) },
computedOffset: 4/3, easing: "linear", composite: "auto",
marginRight: "0px" },
];
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
index 54467bc83b1..cee90f3b1b0 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
@@ -17,9 +17,9 @@
background-color: rgba(0, 0, 255);
height: 200px;
width: 200px;
- view-timeline-name: foo;
+ view-timeline-name: --foo;
animation: linear 1s both fade-in-out-animation;
- animation-timeline: foo;
+ animation-timeline: --foo;
}
#container {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-computed.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-computed.tentative.html
new file mode 100644
index 00000000000..814933f7266
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-computed.tentative.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7759">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<style>
+ #outer { timeline-scope: foo; }
+ #target { timeline-scope: bar; }
+</style>
+<div id="outer">
+ <div id="target"></div>
+</div>
+<script>
+test_computed_value('timeline-scope', 'initial', 'none');
+test_computed_value('timeline-scope', 'inherit', 'foo');
+test_computed_value('timeline-scope', 'unset', 'none');
+test_computed_value('timeline-scope', 'revert', 'none');
+test_computed_value('timeline-scope', 'none');
+test_computed_value('timeline-scope', 'test');
+test_computed_value('timeline-scope', 'foo, bar');
+test_computed_value('timeline-scope', 'bar, foo');
+test_computed_value('timeline-scope', 'a, b, c, D, e');
+
+test(() => {
+ let style = getComputedStyle(document.getElementById('target'));
+ assert_not_equals(Array.from(style).indexOf('timeline-scope'), -1);
+}, 'The timeline-scope property shows up in CSSStyleDeclaration enumeration');
+
+test(() => {
+ let style = document.getElementById('target').style;
+ assert_not_equals(style.cssText.indexOf('timeline-scope'), -1);
+}, 'The timeline-scope property shows up in CSSStyleDeclaration.cssText');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-parsing.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-parsing.tentative.html
new file mode 100644
index 00000000000..2885cb758de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope-parsing.tentative.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7759">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<div id="target"></div>
+<script>
+
+test_valid_value('timeline-scope', 'initial');
+test_valid_value('timeline-scope', 'inherit');
+test_valid_value('timeline-scope', 'unset');
+test_valid_value('timeline-scope', 'revert');
+
+test_valid_value('timeline-scope', 'none');
+test_valid_value('timeline-scope', 'abc');
+test_valid_value('timeline-scope', ' abc', 'abc');
+test_valid_value('timeline-scope', 'aBc');
+test_valid_value('timeline-scope', 'foo, bar');
+test_valid_value('timeline-scope', 'bar, foo');
+test_valid_value('timeline-scope', 'auto');
+
+test_invalid_value('timeline-scope', 'none, abc');
+test_invalid_value('timeline-scope', '10px');
+test_invalid_value('timeline-scope', 'foo bar');
+test_invalid_value('timeline-scope', '"foo" "bar"');
+test_invalid_value('timeline-scope', 'rgb(1, 2, 3)');
+test_invalid_value('timeline-scope', '#fefefe');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope.html
new file mode 100644
index 00000000000..985e694bfdc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-scope.html
@@ -0,0 +1,314 @@
+<!DOCTYPE html>
+<title>Behavior of the timeline-scope property</title>
+<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/7759">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+
+<main id=main></main>
+<script>
+ function inflate(t, template) {
+ t.add_cleanup(() => main.replaceChildren());
+ main.append(template.content.cloneNode(true));
+ main.offsetTop;
+ }
+
+ async function scrollTop(e, value) {
+ e.scrollTop = value;
+ await waitForNextFrame();
+ }
+</script>
+<style>
+ @keyframes anim {
+ from { width: 0px; }
+ to { width: 200px; }
+ }
+
+ .scroller {
+ overflow-y: hidden;
+ width: 200px;
+ height: 200px;
+ }
+ .scroller > .content {
+ margin: 400px 0px;
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ }
+ .target {
+ background-color: coral;
+ width: 0px;
+ animation: anim auto linear;
+ animation-timeline: --t1;
+ }
+ .timeline {
+ scroll-timeline-name: --t1;
+ }
+ .scope {
+ timeline-scope: --t1;
+ }
+
+</style>
+
+<!-- Basic Behavior -->
+
+<template id=deferred_timeline>
+ <div class="scope">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+ }, 'Descendant can attach to deferred timeline');
+</script>
+
+<template id=deferred_timeline_no_attachments>
+ <div class="scope">
+ <div class=target>Test</div>
+ <div class="scroller">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_no_attachments);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '0px');
+ }, 'Deferred timeline with no attachments');
+</script>
+
+<template id=scroll_timeline_inner_interference>
+ <div class="scroller timeline">
+ <div class=content>
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_inner_interference);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+ }, 'Inner timeline does not interfere with outer timeline');
+</script>
+
+<template id=deferred_timeline_two_attachments>
+ <div class="scope">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ <!-- Extra attachment -->
+ <div class="timeline"></div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_two_attachments);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '0px');
+ }, 'Deferred timeline with two attachments');
+</script>
+
+<!-- Dynamic Reattachment -->
+
+<template id=deferred_timeline_reattach>
+ <div class="scope">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ <div class="scroller">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_reattach);
+ let scrollers = main.querySelectorAll('.scroller');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 175); // 25%
+
+ // Attached to scrollers[0].
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Reattach to scrollers[1].
+ scrollers[0].classList.remove('timeline');
+ scrollers[1].classList.add('timeline');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25%
+ }, 'Dynamically re-attaching');
+</script>
+
+<template id=deferred_timeline_dynamic_detach>
+ <div class="scope">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_dynamic_detach);
+ let scrollers = main.querySelectorAll('.scroller');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 175); // 25%
+
+ // Attached to two timelines initially:
+ assert_equals(getComputedStyle(target).width, '0px');
+
+ // Detach scrollers[1].
+ scrollers[1].classList.remove('timeline');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Also detach scrollers[0].
+ scrollers[0].classList.remove('timeline');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+ }, 'Dynamically detaching');
+</script>
+
+<template id=deferred_timeline_attached_removed>
+ <div class="scope">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_attached_removed);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ let scroller_parent = scroller.parentElement;
+ scroller.remove();
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+
+ scroller_parent.append(scroller);
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+ }, 'Removing/inserting element with attaching timeline');
+</script>
+
+<template id=deferred_timeline_attached_display_none>
+ <div class="scope">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_attached_display_none);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ scroller.style.display = 'none';
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+
+ scroller.style.display = 'block';
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+ }, 'Ancestor attached element becoming display:none/block');
+</script>
+
+<template id=deferred_timeline_appearing>
+ <div class=container>
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_appearing);
+ let container = main.querySelector('.container');
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+
+ await scrollTop(scroller, 350); // 50%
+
+ // Not attached to any timeline initially.
+ assert_equals(getComputedStyle(target).width, '0px');
+
+ // Add the deferred timeline.
+ container.classList.add('scope');
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Remove the deferred timeline.
+ container.classList.remove('scope');
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+ }, 'A deferred timeline appearing dynamically in the ancestor chain');
+</script>
+
+<template id=deferred_timeline_on_self>
+ <div class="scroller timeline scope">
+ <div class=content>
+ <div class=target></div>
+ </div>
+ <div class=scroller2></div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, deferred_timeline_on_self);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 525); // 75%
+
+ assert_equals(getComputedStyle(target).width, '150px'); // 0px => 200px, 75%
+
+ // A second scroll-timeline now attaches to the same root.
+ let scroller2 = main.querySelector('.scroller2');
+ scroller2.classList.add('timeline');
+ await waitForNextFrame();
+
+ // The deferred timeline produced by timeline-scope is now inactive,
+ // but it doesn't matter, because we preferred to attach
+ // to the non-deferred timeline.
+ assert_equals(getComputedStyle(target).width, '150px'); // 0px => 200px, 75%
+ }, 'Animations prefer non-deferred timelines');
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html
index 6c2a792aeec..552461c9b6c 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation-range-update.tentative.html
@@ -27,8 +27,8 @@
z-index: -1;
background-color: green;
animation: anim auto both linear;
- animation-timeline: t1;
- view-timeline: t1 block;
+ animation-timeline: --t1;
+ view-timeline: --t1 block;
}
.restrict-range {
animation-range-start: contain 0%;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html
index a367ef9dd87..9f8ffd176e3 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html
@@ -52,9 +52,9 @@
<template id=default_view_timeline>
<style>
#target {
- view-timeline: t1;
+ view-timeline: --t1;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=vertical-scroller>
@@ -87,9 +87,9 @@
<template id=horizontal_timeline>
<style>
#target {
- view-timeline: t1 horizontal;
+ view-timeline: --t1 x;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=horizontal-scroller>
@@ -122,7 +122,7 @@
<template id=multiple_timelines>
<style>
#timelines {
- view-timeline: tv vertical ancestor, th horizontal ancestor;
+ view-timeline: --tv y ancestor, --th x ancestor;
background-color: red;
}
#scroller {
@@ -132,7 +132,7 @@
display: grid;
grid-template-columns: 50px 50px 50px 50px 50px 50px 50px;
grid-template-row: 50px 50px 50px 50px 50px 50px 50px;
- view-timeline: tv defer, th defer;
+ view-timeline: --tv defer, --th defer;
}
#scroller > div {
z-index: -1;
@@ -141,11 +141,11 @@
}
#target_v {
animation: anim 1s linear;
- animation-timeline: tv;
+ animation-timeline: --tv;
}
#target_h {
animation: anim 1s linear;
- animation-timeline: th;
+ animation-timeline: --th;
}
</style>
<div id=scroller>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html
index ff98ed78258..a91ae13d64a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html
@@ -39,10 +39,10 @@
background-color: coral;
width: 0px;
animation: anim auto linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
.timeline {
- view-timeline-name: t1;
+ view-timeline-name: --t1;
}
.local {
view-timeline-attachment: local;
@@ -122,7 +122,7 @@
<div class="timeline defer" style="view-timeline-axis:inline">
<div class=target>Test</div>
<div class=scroller>
- <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div>
+ <div class="content timeline ancestor" style="view-timeline-axis:y"></div>
</div>
</div>
</template>
@@ -133,7 +133,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Axis of deferred timeline is taken from attached timeline');
</script>
@@ -141,7 +141,7 @@
<div class="timeline defer" style="view-timeline-axis:inline">
<div class=target>Test</div>
<div class=scroller>
- <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div>
+ <div class="content timeline ancestor" style="view-timeline-axis:y"></div>
<!-- Extra attachment -->
<div class="timeline ancestor"></div>
</div>
@@ -403,11 +403,11 @@
<!-- ViewTimelines and ScrollTimelines -->
<template id=view_scroll_timeline_defer>
- <div style="scroll-timeline: t1 defer">
+ <div style="scroll-timeline: --t1 defer">
<div class=target>Test1</div>
<div class="timeline defer">
<div class=target>Test2</div>
- <div class=scroller style="scroll-timeline: t1 ancestor;">
+ <div class=scroller style="scroll-timeline: --t1 ancestor;">
<div class="content timeline ancestor" style="view-timeline-inset: 0px 50px"></div>
</div>
</div>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html
index f4649dab040..30b2a1ae051 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-computed.html
@@ -6,7 +6,7 @@
</head>
<style>
#outer { view-timeline-axis: block, inline; }
- #target { view-timeline-axis: vertical; }
+ #target { view-timeline-axis: y; }
</style>
<div id=outer>
<div id=target></div>
@@ -18,11 +18,11 @@ test_computed_value('view-timeline-axis', 'unset', 'block');
test_computed_value('view-timeline-axis', 'revert', 'block');
test_computed_value('view-timeline-axis', 'block');
test_computed_value('view-timeline-axis', 'inline');
-test_computed_value('view-timeline-axis', 'vertical');
-test_computed_value('view-timeline-axis', 'horizontal');
+test_computed_value('view-timeline-axis', 'y');
+test_computed_value('view-timeline-axis', 'x');
test_computed_value('view-timeline-axis', 'block, inline');
test_computed_value('view-timeline-axis', 'inline, block');
-test_computed_value('view-timeline-axis', 'block, vertical, horizontal, inline');
+test_computed_value('view-timeline-axis', 'block, y, x, inline');
test_computed_value('view-timeline-axis', 'inline, inline, inline, inline');
test(() => {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html
index ffcc36c3208..1ebe4410a95 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-axis-parsing.html
@@ -13,11 +13,11 @@ test_valid_value('view-timeline-axis', 'revert');
test_valid_value('view-timeline-axis', 'block');
test_valid_value('view-timeline-axis', 'inline');
-test_valid_value('view-timeline-axis', 'vertical');
-test_valid_value('view-timeline-axis', 'horizontal');
+test_valid_value('view-timeline-axis', 'y');
+test_valid_value('view-timeline-axis', 'x');
test_valid_value('view-timeline-axis', 'block, inline');
test_valid_value('view-timeline-axis', 'inline, block');
-test_valid_value('view-timeline-axis', 'block, vertical, horizontal, inline');
+test_valid_value('view-timeline-axis', 'block, y, x, inline');
test_valid_value('view-timeline-axis', 'inline, inline, inline, inline');
test_invalid_value('view-timeline-axis', 'abc');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html
index 207c8c4e223..9e042b774b9 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-dynamic.html
@@ -14,7 +14,7 @@
overflow: hidden;
width: 100px;
height: 100px;
- view-timeline: t1 defer;
+ view-timeline: --t1 defer;
}
.scroller > div {
height: 100px;
@@ -46,11 +46,11 @@
<template id=dynamic_view_timeline_name>
<style>
.timeline {
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -106,11 +106,11 @@
width: 100px;
height: 100px;
margin: 100px;
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -126,7 +126,7 @@
await scrollLeft(scroller, 20); // 10% (horizontal)
assert_equals(getComputedStyle(target).zIndex, '25', 'vertical');
- timeline.style.viewTimelineAxis = 'horizontal';
+ timeline.style.viewTimelineAxis = 'x';
await waitForCSSScrollTimelineStyle();
assert_equals(getComputedStyle(target).zIndex, '10', 'horizontal');
}, 'Dynamically changing view-timeline-axis');
@@ -138,11 +138,11 @@
width: 100px;
height: 100px;
margin: 100px;
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -166,11 +166,11 @@
<template id=timeline_display_none>
<style>
#timeline {
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html
index a7e807c2e81..9ba88fde507 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html
@@ -91,10 +91,10 @@
<template id=test_one_value>
<style>
#target {
- view-timeline: t1;
+ view-timeline: --t1;
view-timeline-inset: 10px;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=vertical>
@@ -115,10 +115,10 @@
<template id=test_two_values>
<style>
#target {
- view-timeline: t1;
+ view-timeline: --t1;
view-timeline-inset: 10px 20px;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=vertical>
@@ -140,10 +140,10 @@
<style>
#target {
font-size: 10px;
- view-timeline: t1;
+ view-timeline: --t1;
view-timeline-inset: 10px 2em;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=vertical>
@@ -165,10 +165,10 @@
<style>
#target {
font-size: 10px;
- view-timeline: t1;
+ view-timeline: --t1;
view-timeline-inset: calc(5px + max(1%, 5%)) 20%;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=vertical>
@@ -189,10 +189,10 @@
<template id=test_outset>
<style>
#target {
- view-timeline: t1;
+ view-timeline: --t1;
view-timeline-inset: -10px -20px;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=vertical>
@@ -213,10 +213,10 @@
<template id=test_horizontal>
<style>
#target {
- view-timeline: t1 horizontal;
+ view-timeline: --t1 x;
view-timeline-inset: 10px 20px;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -237,10 +237,10 @@
<template id=test_block>
<style>
#target {
- view-timeline: t1 block;
+ view-timeline: --t1 block;
view-timeline-inset: 10px 20px;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -261,10 +261,10 @@
<template id=test_inline>
<style>
#target {
- view-timeline: t1 inline;
+ view-timeline: --t1 inline;
view-timeline-inset: 10px 20px;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -288,10 +288,10 @@
scroll-padding-block: 10px 20px;
}
#target {
- view-timeline: t1 block;
+ view-timeline: --t1 block;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -316,10 +316,10 @@
writing-mode: vertical-lr;
}
#target {
- view-timeline: t1 block;
+ view-timeline: --t1 block;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -344,10 +344,10 @@
writing-mode: vertical-rl;
}
#target {
- view-timeline: t1 block;
+ view-timeline: --t1 block;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -372,10 +372,10 @@
scroll-padding-inline: 10px 20px;
}
#target {
- view-timeline: t1 inline;
+ view-timeline: --t1 inline;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -400,10 +400,10 @@
writing-mode: vertical-rl;
}
#target {
- view-timeline: t1 inline;
+ view-timeline: --t1 inline;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -428,10 +428,10 @@
writing-mode: vertical-lr;
}
#target {
- view-timeline: t1 inline;
+ view-timeline: --t1 inline;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -456,10 +456,10 @@
direction: rtl;
}
#target {
- view-timeline: t1 inline;
+ view-timeline: --t1 inline;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -485,10 +485,10 @@
direction: rtl;
}
#target {
- view-timeline: t1 inline;
+ view-timeline: --t1 inline;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -514,10 +514,10 @@
direction: rtl;
}
#target {
- view-timeline: t1 inline;
+ view-timeline: --t1 inline;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -541,10 +541,10 @@
scroll-padding-block: 10px 20px;
}
#target {
- view-timeline: t1 vertical;
+ view-timeline: --t1 y;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -559,7 +559,7 @@
await assertValueAt(scroller, target, { scrollTop:125 + 5, expected:50 }); // 50%
await assertValueAt(scroller, target, { scrollTop:200 - 10, expected:100 }); // 100%
await assertValueAt(scroller, target, { scrollTop:200, expected:-1 });
- }, 'view-timeline-inset:auto, vertical');
+ }, 'view-timeline-inset:auto, y');
</script>
<template id=test_auto_vertical_vertical_rl>
@@ -569,10 +569,10 @@
writing-mode: vertical-rl;
}
#target {
- view-timeline: t1 vertical;
+ view-timeline: --t1 y;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -587,7 +587,7 @@
await assertValueAt(scroller, target, { scrollTop:125 + 5, expected:50 }); // 50%
await assertValueAt(scroller, target, { scrollTop:200 - 10, expected:100 }); // 100%
await assertValueAt(scroller, target, { scrollTop:200, expected:-1 });
- }, 'view-timeline-inset:auto, vertical, vertical-rl');
+ }, 'view-timeline-inset:auto, y, vertical-rl');
</script>
<template id=test_auto_vertical_vertical_rl_rtl>
@@ -598,10 +598,10 @@
direction: rtl;
}
#target {
- view-timeline: t1 vertical;
+ view-timeline: --t1 y;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -616,7 +616,7 @@
await assertValueAt(scroller, target, { scrollTop:-(125 + 5), expected:50 }); // 50%
await assertValueAt(scroller, target, { scrollTop:-(200 - 10), expected:100 }); // 100%
await assertValueAt(scroller, target, { scrollTop:-200, expected:-1 });
- }, 'view-timeline-inset:auto, vertical, vertical-rl, rtl');
+ }, 'view-timeline-inset:auto, y, vertical-rl, rtl');
</script>
<template id=test_auto_horizontal>
@@ -625,10 +625,10 @@
scroll-padding-inline: 10px 20px;
}
#target {
- view-timeline: t1 horizontal;
+ view-timeline: --t1 x;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -643,7 +643,7 @@
await assertValueAt(scroller, target, { scrollLeft:135 + 5, expected:50 }); // 50%
await assertValueAt(scroller, target, { scrollLeft:200 - 10, expected:100 }); // 100%
await assertValueAt(scroller, target, { scrollLeft:200, expected:-1 });
- }, 'view-timeline-inset:auto, horizontal');
+ }, 'view-timeline-inset:auto, x');
</script>
<template id=test_auto_horizontal_rtl>
@@ -653,10 +653,10 @@
direction: rtl;
}
#target {
- view-timeline: t1 horizontal;
+ view-timeline: --t1 x;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -671,7 +671,7 @@
await assertValueAt(scroller, target, { scrollLeft:-(135 + 5), expected:50 }); // 50%
await assertValueAt(scroller, target, { scrollLeft:-(200 - 10), expected:100 }); // 100%
await assertValueAt(scroller, target, { scrollLeft:-200, expected:-1 });
- }, 'view-timeline-inset:auto, horizontal, rtl');
+ }, 'view-timeline-inset:auto, x, rtl');
</script>
<template id=test_auto_horizontal_vertical_lr>
@@ -681,10 +681,10 @@
writing-mode: vertical-lr;
}
#target {
- view-timeline: t1 horizontal;
+ view-timeline: --t1 x;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -699,7 +699,7 @@
await assertValueAt(scroller, target, { scrollLeft:135 + 5, expected:50 }); // 50%
await assertValueAt(scroller, target, { scrollLeft:200 - 10, expected:100 }); // 100%
await assertValueAt(scroller, target, { scrollLeft:200, expected:-1 });
- }, 'view-timeline-inset:auto, horizontal, vertical-lr');
+ }, 'view-timeline-inset:auto, x, vertical-lr');
</script>
<template id=test_auto_horizontal_vertical_rl>
@@ -709,10 +709,10 @@
writing-mode: vertical-rl;
}
#target {
- view-timeline: t1 horizontal;
+ view-timeline: --t1 x;
view-timeline-inset: auto auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
@@ -727,7 +727,7 @@
await assertValueAt(scroller, target, { scrollLeft:-(135 + 5), expected:50 }); // 50%
await assertValueAt(scroller, target, { scrollLeft:-(200 - 10), expected:100 }); // 100%
await assertValueAt(scroller, target, { scrollLeft:-200, expected:-1 });
- }, 'view-timeline-inset:auto, horizontal, vertical-rl');
+ }, 'view-timeline-inset:auto, x, vertical-rl');
</script>
<template id=test_auto_mix>
@@ -737,10 +737,10 @@
scroll-padding-block: 50px calc(10% + 1em);
}
#target {
- view-timeline: t1;
+ view-timeline: --t1;
view-timeline-inset: 10% auto;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html
index 04eb6489490..011f03cb5db 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html
@@ -38,10 +38,10 @@
z-index: -1;
background-color: green;
animation: anim auto both linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
animation-range-start: contain 0%;
animation-range-end: contain 100%;
- view-timeline: t1 block;
+ view-timeline: --t1 block;
}
</style>
<body>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html
index 6cead9dc586..ea9acd22ba7 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html
@@ -33,9 +33,9 @@
<style>
#target {
height: 0px;
- view-timeline: t1;
+ view-timeline: --t1;
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -58,15 +58,15 @@
<template id=timeline_preceding_sibling>
<style>
#scroller {
- view-timeline: t1 defer;
+ view-timeline: --t1 defer;
}
#timeline {
height: 0px;
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -91,11 +91,11 @@
<style>
#timeline {
height: 0px;
- view-timeline: t1;
+ view-timeline: --t1;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -122,15 +122,15 @@
<template id=timeline_ancestor_sibling>
<style>
#scroller {
- view-timeline: t1 defer;
+ view-timeline: --t1 defer;
}
#timeline {
height: 0px;
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -157,15 +157,15 @@
<template id=timeline_ancestor_sibling_conflict>
<style>
#scroller {
- view-timeline: t1 defer;
+ view-timeline: --t1 defer;
}
#timeline1, #timeline2 {
height: 0px;
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -193,18 +193,18 @@
<template id=timeline_ancestor_closer_timeline_wins>
<style>
#scroller {
- view-timeline: t1 defer;
+ view-timeline: --t1 defer;
}
#timeline {
height: 0px;
- view-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
}
#parent {
- scroll-timeline: t1 defer;
+ scroll-timeline: --t1 defer;
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
@@ -229,13 +229,13 @@
<template id=timeline_ancestor_scroll_timeline_wins_on_same_element>
<style>
#scroller {
- view-timeline: t1 defer;
- scroll-timeline: t1 defer;
+ view-timeline: --t1 defer;
+ scroll-timeline: --t1 defer;
}
#timelines {
height: 0px;
- view-timeline: t1 ancestor;
- scroll-timeline: t1 ancestor;
+ view-timeline: --t1 ancestor;
+ scroll-timeline: --t1 ancestor;
overflow: auto;
}
#timelines > div {
@@ -243,7 +243,7 @@
}
#target {
animation: anim 1s linear;
- animation-timeline: t1;
+ animation-timeline: --t1;
}
</style>
<div id=scroller class=scroller>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html
index 5657dc78178..3304723f43f 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-computed.html
@@ -5,24 +5,24 @@
<script src="/css/support/computed-testcommon.js"></script>
</head>
<style>
- #outer { view-timeline-name: foo, bar; }
- #target { view-timeline-name: faz; }
+ #outer { view-timeline-name: --foo, --bar; }
+ #target { view-timeline-name: --faz; }
</style>
<div id=outer>
<div id=target></div>
</div>
<script>
test_computed_value('view-timeline-name', 'initial', 'none');
-test_computed_value('view-timeline-name', 'inherit', 'foo, bar');
+test_computed_value('view-timeline-name', 'inherit', '--foo, --bar');
test_computed_value('view-timeline-name', 'unset', 'none');
test_computed_value('view-timeline-name', 'revert', 'none');
test_computed_value('view-timeline-name', 'none');
-test_computed_value('view-timeline-name', 'foo');
-test_computed_value('view-timeline-name', 'foo, bar');
-test_computed_value('view-timeline-name', 'bar, foo');
-test_computed_value('view-timeline-name', 'a, b, c, D, e');
+test_computed_value('view-timeline-name', '--foo');
+test_computed_value('view-timeline-name', '--foo, --bar');
+test_computed_value('view-timeline-name', '--bar, --foo');
+test_computed_value('view-timeline-name', '--a, --b, --c, --D, --e');
test_computed_value('view-timeline-name', 'none, none');
-test_computed_value('view-timeline-name', 'a, b, c, none, d, e');
+test_computed_value('view-timeline-name', '--a, --b, --c, none, --d, --e');
test(() => {
let style = getComputedStyle(document.getElementById('target'));
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html
index 3878d5c5834..2b22cbe036e 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-parsing.html
@@ -11,16 +11,16 @@ test_valid_value('view-timeline-name', 'unset');
test_valid_value('view-timeline-name', 'revert');
test_valid_value('view-timeline-name', 'none');
-test_valid_value('view-timeline-name', 'abc');
-test_valid_value('view-timeline-name', ' abc', 'abc');
-test_valid_value('view-timeline-name', 'abc ', 'abc');
-test_valid_value('view-timeline-name', 'aBc');
-test_valid_value('view-timeline-name', 'foo, bar');
-test_valid_value('view-timeline-name', 'bar, foo');
+test_valid_value('view-timeline-name', '--abc');
+test_valid_value('view-timeline-name', ' --abc', '--abc');
+test_valid_value('view-timeline-name', '--aBc');
+test_valid_value('view-timeline-name', '--foo, --bar');
+test_valid_value('view-timeline-name', '--bar, --foo');
test_valid_value('view-timeline-name', 'none, none');
-test_valid_value('view-timeline-name', 'a, none, b');
-test_valid_value('view-timeline-name', 'auto');
+test_valid_value('view-timeline-name', '--a, none, --b');
+test_invalid_value('view-timeline-name', 'auto');
+test_invalid_value('view-timeline-name', 'abc');
test_invalid_value('view-timeline-name', 'default');
test_invalid_value('view-timeline-name', '10px');
test_invalid_value('view-timeline-name', 'foo bar');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html
index 55240efcfb5..bb14618c00a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-name-shadow.html
@@ -32,10 +32,10 @@
<style>
.target {
animation: anim 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
.scroller > div {
- view-timeline: timeline horizontal;
+ view-timeline: --timeline x;
}
</style>
<div class=scroller>
@@ -44,7 +44,7 @@
<template shadowrootmode=open>
<style>
:host {
- view-timeline: timeline vertical;
+ view-timeline: --timeline y;
}
</style>
</template>
@@ -61,7 +61,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Outer animation can see view timeline defined by :host');
</script>
@@ -70,10 +70,10 @@
<style>
.target {
animation: anim 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
.host {
- view-timeline: timeline horizontal;
+ view-timeline: --timeline x;
}
</style>
<div class=scroller>
@@ -81,7 +81,7 @@
<template shadowrootmode=open>
<style>
::slotted(.target) {
- view-timeline: timeline vertical;
+ view-timeline: --timeline y;
}
</style>
<slot></slot>
@@ -99,7 +99,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Outer animation can see view timeline defined by ::slotted');
</script>
@@ -107,10 +107,10 @@
<template id=view_timeline_part>
<style>
.host {
- view-timeline: timeline vertical;
+ view-timeline: --timeline y;
}
.host::part(foo) {
- view-timeline: timeline horizontal;
+ view-timeline: --timeline x;
}
</style>
<div class=host>
@@ -123,7 +123,7 @@
}
.target {
animation: anim2 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
</style>
<div part=foo>
@@ -141,7 +141,7 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'horizontal');
+ assert_equals(anim.timeline.axis, 'x');
}, 'Inner animation can see view timeline defined by ::part');
</script>
@@ -150,10 +150,10 @@
<style>
.target {
animation: anim 10s linear;
- animation-timeline: timeline;
+ animation-timeline: --timeline;
}
.host {
- view-timeline: timeline horizontal;
+ view-timeline: --timeline x;
}
</style>
<div class=scroller>
@@ -161,7 +161,7 @@
<template shadowrootmode=open>
<style>
div {
- view-timeline: timeline vertical;
+ view-timeline: --timeline y;
}
</style>
<div>
@@ -181,6 +181,6 @@
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
- assert_equals(anim.timeline.axis, 'vertical');
+ assert_equals(anim.timeline.axis, 'y');
}, 'Slotted element can see view timeline within the shadow');
</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html
index 3d7593823db..1c657e40ceb 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-animation.html
@@ -58,13 +58,13 @@
let scroller = main.querySelector('#scroller');
let target = main.querySelector('#target');
- target.style.viewTimeline = 't1 block';
+ target.style.viewTimeline = '--t1 block';
// TODO(crbug.com/1375998): Create the timeline in a separate frame to
// work around a bug.
await waitForNextFrame();
target.style.animation = 'anim auto linear';
- target.style.animationTimeline = 't1';
+ target.style.animationTimeline = '--t1';
target.style.animationRangeStart = options.rangeStart;
target.style.animationRangeEnd = options.rangeEnd;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html
index c7199161607..960a8e6ecfb 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update-reversed-animation.html
@@ -29,8 +29,8 @@
z-index: -1;
background-color: green;
animation: anim auto linear;
- animation-timeline: timeline;
- view-timeline: timeline;
+ animation-timeline: --timeline;
+ view-timeline: --timeline;
}
#target.exit-range {
animation-range-start: exit 0%;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html
index e8e761d86ba..5400d8314b0 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-range-update.html
@@ -29,8 +29,8 @@
z-index: -1;
background-color: green;
animation: anim auto linear;
- animation-timeline: timeline;
- view-timeline: timeline;
+ animation-timeline: --timeline;
+ view-timeline: --timeline;
}
#target.exit-range {
animation-range-start: exit 0%;
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html
index f19b9e6ac21..fd00acc73ab 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-shorthand.tentative.html
@@ -9,63 +9,63 @@
<script src="/css/support/shorthand-testcommon.js"></script>
<div id="target"></div>
<script>
-test_valid_value('view-timeline', 'abcd');
+test_valid_value('view-timeline', '--abcd');
test_valid_value('view-timeline', 'none block', 'none');
test_valid_value('view-timeline', 'none inline');
-// view-timeline-name: inline/block/horizontal/vertical.
-test_valid_value('view-timeline', 'inline block', 'inline');
-test_valid_value('view-timeline', 'block block', 'block');
-test_valid_value('view-timeline', 'vertical block', 'vertical');
-test_valid_value('view-timeline', 'horizontal block', 'horizontal');
+// view-timeline-name: inline/block/x/y.
+test_valid_value('view-timeline', '--inline block', '--inline');
+test_valid_value('view-timeline', '--block block', '--block');
+test_valid_value('view-timeline', '--y block', '--y');
+test_valid_value('view-timeline', '--x block', '--x');
-test_valid_value('view-timeline', 'a, b, c');
-test_valid_value('view-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical');
-test_valid_value('view-timeline', 'auto');
-test_valid_value('view-timeline', 'abc defer vertical', 'abc vertical defer');
-test_valid_value('view-timeline', 'abc vertical defer');
+test_valid_value('view-timeline', '--a, --b, --c');
+test_valid_value('view-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y');
+test_valid_value('view-timeline', '--auto');
+test_valid_value('view-timeline', '--abc defer y', '--abc y defer');
+test_valid_value('view-timeline', '--abc y defer');
-test_invalid_value('view-timeline', 'abc abc');
+test_invalid_value('view-timeline', '--abc --abc');
test_invalid_value('view-timeline', 'block none');
test_invalid_value('view-timeline', 'none none');
test_invalid_value('view-timeline', 'default');
test_invalid_value('view-timeline', ',');
-test_invalid_value('view-timeline', ',,block,,');
+test_invalid_value('view-timeline', ',,--block,,');
-test_computed_value('view-timeline', 'abcd');
+test_computed_value('view-timeline', '--abcd');
test_computed_value('view-timeline', 'none block', 'none');
test_computed_value('view-timeline', 'none inline');
-test_computed_value('view-timeline', 'inline block', 'inline');
-test_computed_value('view-timeline', 'block block', 'block');
-test_computed_value('view-timeline', 'vertical block', 'vertical');
-test_computed_value('view-timeline', 'horizontal block', 'horizontal');
-test_computed_value('view-timeline', 'a, b, c');
-test_computed_value('view-timeline', 'a inline, b block, c vertical', 'a inline, b, c vertical');
-test_computed_value('view-timeline', 'abc defer vertical', 'abc vertical defer');
-test_computed_value('view-timeline', 'abc vertical defer');
+test_computed_value('view-timeline', '--inline block', '--inline');
+test_computed_value('view-timeline', '--block block', '--block');
+test_computed_value('view-timeline', '--y block', '--y');
+test_computed_value('view-timeline', '--x block', '--x');
+test_computed_value('view-timeline', '--a, --b, --c');
+test_computed_value('view-timeline', '--a inline, --b block, --c y', '--a inline, --b, --c y');
+test_computed_value('view-timeline', '--abc defer y', '--abc y defer');
+test_computed_value('view-timeline', '--abc y defer');
-test_shorthand_value('view-timeline', 'abc vertical',
+test_shorthand_value('view-timeline', '--abc y',
{
- 'view-timeline-name': 'abc',
- 'view-timeline-axis': 'vertical',
+ 'view-timeline-name': '--abc',
+ 'view-timeline-axis': 'y',
'view-timeline-attachment': 'local',
});
-test_shorthand_value('view-timeline', 'abc vertical defer, def',
+test_shorthand_value('view-timeline', '--abc y defer, --def',
{
- 'view-timeline-name': 'abc, def',
- 'view-timeline-axis': 'vertical, block',
+ 'view-timeline-name': '--abc, --def',
+ 'view-timeline-axis': 'y, block',
'view-timeline-attachment': 'defer, local',
});
-test_shorthand_value('view-timeline', 'abc, def',
+test_shorthand_value('view-timeline', '--abc, --def',
{
- 'view-timeline-name': 'abc, def',
+ 'view-timeline-name': '--abc, --def',
'view-timeline-axis': 'block, block',
'view-timeline-attachment': 'local, local',
});
-test_shorthand_value('view-timeline', 'inline horizontal ancestor',
+test_shorthand_value('view-timeline', '--inline x ancestor',
{
- 'view-timeline-name': 'inline',
- 'view-timeline-axis': 'horizontal',
+ 'view-timeline-name': '--inline',
+ 'view-timeline-axis': 'x',
'view-timeline-attachment': 'ancestor',
});
@@ -84,16 +84,16 @@ function test_shorthand_contraction(shorthand, longhands, expected) {
}
test_shorthand_contraction('view-timeline', {
- 'view-timeline-name': 'abc',
+ 'view-timeline-name': '--abc',
'view-timeline-axis': 'inline',
'view-timeline-attachment': 'ancestor',
-}, 'abc inline ancestor');
+}, '--abc inline ancestor');
test_shorthand_contraction('view-timeline', {
- 'view-timeline-name': 'a, b',
+ 'view-timeline-name': '--a, --b',
'view-timeline-axis': 'inline, block',
'view-timeline-attachment': 'defer, local',
-}, 'a inline defer, b');
+}, '--a inline defer, --b');
test_shorthand_contraction('view-timeline', {
'view-timeline-name': 'none, none',
@@ -104,13 +104,13 @@ test_shorthand_contraction('view-timeline', {
// Longhands with different lengths:
test_shorthand_contraction('view-timeline', {
- 'view-timeline-name': 'a, b, c',
+ 'view-timeline-name': '--a, --b, --c',
'view-timeline-axis': 'inline, inline',
'view-timeline-attachment': 'local, local',
}, '');
test_shorthand_contraction('view-timeline', {
- 'view-timeline-name': 'a, b',
+ 'view-timeline-name': '--a, --b',
'view-timeline-axis': 'inline, inline, inline',
'view-timeline-attachment': 'local, local',
}, '');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html
index 7001eceeaf8..2961fedd425 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-subject-bounds-update.html
@@ -30,8 +30,8 @@
z-index: -1;
background-color: green;
animation: anim auto both linear;
- animation-timeline: timeline;
- view-timeline: timeline;
+ animation-timeline: --timeline;
+ view-timeline: --timeline;
animation-range: exit;
}
#target.bounds-update {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html
index 6627eeb9988..1bd6f0468c3 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-used-values.html
@@ -43,10 +43,10 @@
<template id=omitted_axis>
<style>
#target {
- view-timeline-name: t1, t2; /* Two items */
+ view-timeline-name: --t1, --t2; /* Two items */
view-timeline-axis: inline; /* One item */
animation: anim 1s linear;
- animation-timeline: t2;
+ animation-timeline: --t2;
}
</style>
<div id=scroller class=scroller>
@@ -76,10 +76,10 @@
<template id=omitted_inset>
<style>
#target {
- view-timeline-name: t1, t2; /* Two items */
+ view-timeline-name: --t1, --t2; /* Two items */
view-timeline-inset: 100px; /* One item */
animation: anim 1s linear;
- animation-timeline: t2;
+ animation-timeline: --t2;
}
</style>
<div id=scroller class=scroller>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html
index e8f537b188c..db260f15f07 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-with-delay-and-range.tentative.html
@@ -27,8 +27,8 @@
z-index: -1;
background-color: green;
animation: anim auto linear;
- animation-timeline: t1;
- view-timeline: t1 block;
+ animation-timeline: --t1;
+ view-timeline: --t1 block;
animation-range-start: entry 0%;
animation-range-end: entry 100%;
/* Sentinel value when in before or after phase of the animation. */
diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html
index 8e211efa11a..88c6a453ec9 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/constructor.html
@@ -67,8 +67,8 @@ test(t => {
const gValidAxisValues = [
'block',
'inline',
- 'horizontal',
- 'vertical',
+ 'x',
+ 'y',
];
for (let axis of gValidAxisValues) {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html
index d18abcd48f5..748cda2f894 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timelines/current-time-writing-modes.html
@@ -23,9 +23,9 @@ promise_test(async t => {
const inlineScrollTimeline = new ScrollTimeline(
{source: scroller, axis: 'inline'});
const horizontalScrollTimeline = new ScrollTimeline(
- {source: scroller, axis: 'horizontal'});
+ {source: scroller, axis: 'x'});
const verticalScrollTimeline = new ScrollTimeline(
- {source: scroller, axis: 'vertical'});
+ {source: scroller, axis: 'y'});
// Unscrolled, all timelines should read a current time of 0 even though the
// X-axis will have started at the right hand side for rtl.
@@ -67,9 +67,9 @@ promise_test(async t => {
const inlineScrollTimeline = new ScrollTimeline(
{source: scroller, axis: 'inline'});
const horizontalScrollTimeline = new ScrollTimeline(
- {source: scroller, axis: 'horizontal'});
+ {source: scroller, axis: 'x'});
const verticalScrollTimeline = new ScrollTimeline(
- {source: scroller, axis: 'vertical'});
+ {source: scroller, axis: 'y'});
// Unscrolled, all timelines should read a current time of 0 even though the
// X-axis will have started at the right hand side for vertical-rl.
@@ -113,9 +113,9 @@ promise_test(async t => {
const inlineScrollTimeline = new ScrollTimeline(
{source: scroller, axis: 'inline'});
const horizontalScrollTimeline = new ScrollTimeline(
- {source: scroller, axis: 'horizontal'});
+ {source: scroller, axis: 'x'});
const verticalScrollTimeline = new ScrollTimeline(
- {source: scroller, axis: 'vertical'});
+ {source: scroller, axis: 'y'});
// Unscrolled, all timelines should read a current time of 0.
assert_percents_equal(blockScrollTimeline.currentTime, 0,
diff --git a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html
index 53330d32f1f..16b9c301417 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/change-animation-range-updates-play-state.html
@@ -33,8 +33,8 @@
z-index: -1;
background-color: green;
animation: anim auto both linear;
- animation-timeline: t1;
- view-timeline: t1;
+ animation-timeline: --t1;
+ view-timeline: --t1;
}
</style>
<body>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html
index 9ae4b1df775..ee7ce906783 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/view-timeline-subject-size-changes.html
@@ -35,7 +35,7 @@
<script type="text/javascript">
promise_test(async t => {
const options = {
- timeline: { axis: 'vertical' },
+ timeline: { axis: 'y' },
animation: {
rangeStart: { rangeName: 'entry', offset: CSS.percent(0) },
rangeEnd: { rangeName: 'entry', offset: CSS.percent(100) },
diff --git a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html
index e77cf4629cb..4eec5d8f13a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/view-timelines/zero-intrinsic-iteration-duration.tentative.html
@@ -33,8 +33,8 @@
z-index: -1;
background-color: green;
animation: anim auto linear;
- animation-timeline: t1;
- view-timeline: t1;
+ animation-timeline: --t1;
+ view-timeline: --t1;
}
</style>
<body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html
index ab667013a2b..5f6371cb428 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/partitioned-cookies.tentative.https.html
@@ -23,6 +23,14 @@ promise_test(async t => {
const scope = './resources/partitioned-cookies-'
const absolute_scope = new URL(scope, window.location).href;
+ // Set a Partitioned cookie.
+ document.cookie = '__Host-partitioned=123; Secure; Path=/; SameSite=None; Partitioned;';
+ assert_true(document.cookie.includes('__Host-partitioned=123'));
+
+ // Set an unpartitioned cookie.
+ document.cookie = 'unpartitioned=456; Secure; Path=/; SameSite=None;';
+ assert_true(document.cookie.includes('unpartitioned=456'));
+
const reg = await service_worker_unregister_and_register(t, script, scope);
await wait_for_state(t, reg.installing, 'activated');
t.add_cleanup(() => reg.unregister());
@@ -55,10 +63,6 @@ promise_test(async t => {
await wait_promise;
assert_true(got.ok, 'Message passing');
- // Set a Partitioned cookie.
- document.cookie = '__Host-partitioned=123; Secure; Path=/; SameSite=None; Partitioned;';
- assert_true(document.cookie.includes('__Host-partitioned=123'));
-
// Test that the partitioned cookie is available to this worker via HTTP.
wait_promise = new Promise(resolve => {
resolve_wait_promise = resolve;
@@ -71,6 +75,7 @@ promise_test(async t => {
await wait_promise;
assert_true(got.ok, 'Get cookies');
assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie via HTTP');
+ assert_true(got.cookies.includes('unpartitioned'), 'Can access unpartitioned cookie via HTTP');
// Test that the partitioned cookie is available to this worker via CookieStore API.
wait_promise = new Promise(resolve => {
@@ -84,6 +89,22 @@ promise_test(async t => {
await wait_promise;
assert_true(got.ok, 'Get cookies');
assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie via JS');
+ assert_true(got.cookies.includes('unpartitioned'), 'Can access unpartitioned cookie via JS');
+
+ // Test that the partitioned cookie is not available to this worker in HTTP
+ // requests from importScripts.
+ wait_promise = new Promise(resolve => {
+ resolve_wait_promise = resolve;
+ });
+ on_message = ev => {
+ got = ev.data;
+ resolve_wait_promise();
+ };
+ filtered_registrations[0].active.postMessage({type: 'echo_cookies_import'});
+ await wait_promise;
+ assert_true(got.ok, 'Get cookies');
+ assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie via importScripts');
+ assert_true(got.cookies.includes('unpartitioned'), 'Can access unpartitioned cookie via importScripts');
const popup = window.open(
new URL(
@@ -95,4 +116,4 @@ promise_test(async t => {
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html
index 3fdf937ae1a..25ddf601457 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-credentialless-frame.html
@@ -21,6 +21,9 @@ promise_test(async t => {
document.cookie = '__Host-partitioned=123; Secure; Path=/; SameSite=None; Partitioned;';
assert_true(document.cookie.includes('__Host-partitioned=123'));
+ // Make sure DOM cannot access the unpartitioned cookie.
+ assert_false(document.cookie.includes('unpartitioned=456'));
+
const reg = await service_worker_unregister_and_register(t, script, scope);
await wait_for_state(t, reg.installing, 'activated');
@@ -61,9 +64,51 @@ promise_test(async t => {
filtered_registrations[0].active.postMessage({type: 'echo_cookies_js'});
await wait_promise;
assert_true(got.ok, 'Get cookies');
- assert_true(got.cookies.includes('__Host-partitioned'), 'Can access partitioned cookie');;
+ assert_true(
+ got.cookies.includes('__Host-partitioned'),
+ 'Credentialless frame worker can access partitioned cookie via JS');
+ assert_false(
+ got.cookies.includes('unpartitioned'),
+ 'Credentialless frame worker cannot access unpartitioned cookie via JS');
+
+ // Test that the partitioned cookie is available to this worker via HTTP.
+ wait_promise = new Promise(resolve => {
+ resolve_wait_promise = resolve;
+ });
+ on_message = ev => {
+ got = ev.data;
+ resolve_wait_promise();
+ };
+ filtered_registrations[0].active.postMessage({ type: 'echo_cookies_http' });
+ await wait_promise;
+ assert_true(got.ok, 'Get cookies');
+ assert_true(
+ got.cookies.includes('__Host-partitioned'),
+ 'Credentialless frame worker can access partitioned cookie via HTTP');
+ assert_false(
+ got.cookies.includes('unpartitioned'),
+ 'Credentialless frame worker cannot access unpartitioned cookie via HTTP');
+
+ // Test that the partitioned cookie is not available to this worker in HTTP
+ // requests from importScripts.
+ wait_promise = new Promise(resolve => {
+ resolve_wait_promise = resolve;
+ });
+ on_message = ev => {
+ got = ev.data;
+ resolve_wait_promise();
+ };
+ filtered_registrations[0].active.postMessage({ type: 'echo_cookies_import' });
+ await wait_promise;
+ assert_true(got.ok, 'Get cookies');
+ assert_true(
+ got.cookies.includes('__Host-partitioned'),
+ 'Credentialless frame worker can access partitioned cookie via importScripts');
+ assert_false(
+ got.cookies.includes('unpartitioned'),
+ 'Credentialless frame worker cannot access unpartitioned cookie via importScripts');
});
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html
index 6a8ed6ca989..00b3412c41f 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html
@@ -16,6 +16,7 @@ promise_test(async t => {
const absolute_scope = new URL(scope, window.location).href;
assert_false(document.cookie.includes('__Host-partitioned=123'), 'DOM cannot access partitioned cookie');
+ assert_true(document.cookie.includes('unpartitioned=456'), 'DOM can access unpartitioned cookie');
const reg = await service_worker_unregister_and_register(t, script, scope);
await wait_for_state(t, reg.installing, 'activated');
@@ -59,7 +60,10 @@ promise_test(async t => {
assert_true(got.ok, 'Get cookies');
assert_false(
got.cookies.includes('__Host-partitioned'),
- 'Worker cannot access partitioned cookie');
+ 'Worker cannot access partitioned cookie via HTTP');
+ assert_true(
+ got.cookies.includes('unpartitioned'),
+ 'Worker can access unpartitioned cookie via HTTP');
// Test that the partitioned cookie is not available to this worker via CookieStore API.
wait_promise = new Promise(resolve => {
@@ -74,9 +78,31 @@ promise_test(async t => {
assert_true(got.ok, 'Get cookies');
assert_false(
got.cookies.includes('__Host-partitioned'),
- 'Worker cannot access partitioned cookie');
+ 'Worker cannot access partitioned cookie via JS');
+ assert_true(
+ got.cookies.includes('unpartitioned'),
+ 'Worker can access unpartitioned cookie via JS');
+
+ // Test that the partitioned cookie is not available to this worker in HTTP
+ // requests from importScripts.
+ wait_promise = new Promise(resolve => {
+ resolve_wait_promise = resolve;
+ });
+ on_message = ev => {
+ got = ev.data;
+ resolve_wait_promise();
+ };
+ filtered_registrations[0].active.postMessage({type: 'echo_cookies_import'});
+ await wait_promise;
+ assert_true(got.ok, 'Get cookies');
+ assert_false(
+ got.cookies.includes('__Host-partitioned'),
+ 'Worker cannot access partitioned cookie via importScripts');
+ assert_true(
+ got.cookies.includes('unpartitioned'),
+ 'Worker can access unpartitioned cookie via importScripts');
});
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js
index bc2a2831568..767dbf44327 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-3p-sw.js
@@ -10,6 +10,8 @@ async function onMessage(event) {
return onEchoCookiesHttp(event);
case 'echo_cookies_js':
return onEchoCookiesJs(event);
+ case 'echo_cookies_import':
+ return onEchoCookiesImport(event);
default:
return;
}
@@ -41,3 +43,11 @@ async function onEchoCookiesJs(event) {
event.source.postMessage({ok: false});
}
}
+
+// Sets `self._cookies` variable, array of the names of cookies available to
+// the request.
+importScripts(`${self.origin}/cookies/resources/list-cookies-for-script.py`);
+
+function onEchoCookiesImport(event) {
+ event.source.postMessage({ok: true, cookies: self._cookies});
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js
index bc2a2831568..767dbf44327 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/partitioned-cookies-sw.js
@@ -10,6 +10,8 @@ async function onMessage(event) {
return onEchoCookiesHttp(event);
case 'echo_cookies_js':
return onEchoCookiesJs(event);
+ case 'echo_cookies_import':
+ return onEchoCookiesImport(event);
default:
return;
}
@@ -41,3 +43,11 @@ async function onEchoCookiesJs(event) {
event.source.postMessage({ok: false});
}
}
+
+// Sets `self._cookies` variable, array of the names of cookies available to
+// the request.
+importScripts(`${self.origin}/cookies/resources/list-cookies-for-script.py`);
+
+function onEchoCookiesImport(event) {
+ event.source.postMessage({ok: true, cookies: self._cookies});
+}
diff --git a/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js b/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js
index e8e5846c93b..baf26be8b0b 100644
--- a/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js
+++ b/tests/wpt/web-platform-tests/soft-navigation-heuristics/resources/soft-navigation-helper.js
@@ -162,11 +162,11 @@ const validateSoftNavigationEntry = async (clicks, extraValidations,
'Event start timestamp matches');
assert_not_equals(entry.navigationId,
performance.getEntriesByType("navigation")[0].navigationId,
- "The navigation ID was incremented");
+ "The navigation ID was re-generated and different from the initial one.");
if (i > 0) {
assert_not_equals(entry.navigationId,
entries[i-1].navigationId,
- "The navigation ID was incremented between clicks");
+ "The navigation ID was re-generated between clicks");
}
}
assert_equals(performance.getEntriesByType("soft-navigation").length,
diff --git a/tests/wpt/web-platform-tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js b/tests/wpt/web-platform-tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js
new file mode 100644
index 00000000000..ba82edb72ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js
@@ -0,0 +1,35 @@
+// META: title=Bucket quota enforcement for indexeddb
+// META: script=/storage/buckets/resources/util.js
+
+promise_test(async t => {
+ const arraySize = 1e6;
+ const objectStoreName = "storageManager";
+ const dbname =
+ this.window ? window.location.pathname : 'estimate-worker.https.html';
+
+ let quota = arraySize / 2;
+ const bucket = await navigator.storageBuckets.open('idb', {quota});
+
+ await indexedDbDeleteRequest(bucket.indexedDB, dbname);
+
+ const db =
+ await indexedDbOpenRequest(t, bucket.indexedDB, dbname, (db_to_upgrade) => {
+ db_to_upgrade.createObjectStore(objectStoreName);
+ });
+
+ const txn = db.transaction(objectStoreName, 'readwrite');
+ const buffer = new ArrayBuffer(arraySize);
+ const view = new Uint8Array(buffer);
+
+ for (let i = 0; i < arraySize; i++) {
+ view[i] = Math.floor(Math.random() * 255);
+ }
+
+ const testBlob = new Blob([buffer], {type: 'binary/random'});
+ txn.objectStore(objectStoreName).add(testBlob, 1);
+
+ await promise_rejects_dom(
+ t, 'QuotaExceededError', transactionPromise(txn));
+
+ db.close();
+}, 'IDB respects bucket quota');
diff --git a/tests/wpt/web-platform-tests/storage/buckets/bucket-storage-policy.tentative.https.any.js b/tests/wpt/web-platform-tests/storage/buckets/bucket-storage-policy.tentative.https.any.js
new file mode 100644
index 00000000000..d6dce3675d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/storage/buckets/bucket-storage-policy.tentative.https.any.js
@@ -0,0 +1,21 @@
+// META: title=Buckets API: Tests for bucket storage policies.
+// META: script=/storage/buckets/resources/util.js
+// META: global=window,worker
+
+'use strict';
+
+promise_test(async testCase => {
+ await prepareForBucketTest(testCase);
+
+ await promise_rejects_js(
+ testCase, TypeError,
+ navigator.storageBuckets.open('negative', {quota: -1}));
+
+ await promise_rejects_js(
+ testCase, TypeError, navigator.storageBuckets.open('zero', {quota: 0}));
+
+ await promise_rejects_js(
+ testCase, TypeError,
+ navigator.storageBuckets.open(
+ 'above_max', {quota: Number.MAX_SAFE_INTEGER + 1}));
+}, 'The open promise should reject with a TypeError when quota is requested outside the range of 1 to Number.MAX_SAFE_INTEGER.');
diff --git a/tests/wpt/web-platform-tests/storage/buckets/buckets_storage_policy.tentative.https.any.js b/tests/wpt/web-platform-tests/storage/buckets/buckets_storage_policy.tentative.https.any.js
deleted file mode 100644
index a66fd81cd43..00000000000
--- a/tests/wpt/web-platform-tests/storage/buckets/buckets_storage_policy.tentative.https.any.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// META: title=Buckets API: Tests for bucket storage policies.
-// META: script=/storage/buckets/resources/util.js
-// META: global=window,worker
-
-'use strict';
-
-promise_test(async testCase => {
- await prepareForBucketTest(testCase);
-
- await promise_rejects_js(
- testCase, TypeError,
- navigator.storageBuckets.open('negative', {quota: -1}));
-
- await promise_rejects_js(
- testCase, TypeError, navigator.storageBuckets.open('zero', {quota: 0}));
-
- await promise_rejects_js(
- testCase, TypeError,
- navigator.storageBuckets.open(
- 'above_max', {quota: Number.MAX_SAFE_INTEGER + 1}));
-}, 'The open promise should reject with a TypeError when quota is requested outside the range of 1 to Number.MAX_SAFE_INTEGER.');
-
-
-promise_test(async testCase => {
- await prepareForBucketTest(testCase);
-
- // IndexedDB
- {
- const quota = 1;
- const bucket = await navigator.storageBuckets.open('idb', {quota});
-
- const objectStoreName = 'store';
- const db = await indexedDbOpenRequest(
- testCase, bucket.indexedDB, 'db', (db_to_upgrade) => {
- db_to_upgrade.createObjectStore(objectStoreName);
- });
-
- const overflowBuffer = new Uint8Array(quota + 1);
-
- const txn = db.transaction(objectStoreName, 'readwrite');
- txn.objectStore(objectStoreName).add('', overflowBuffer);
-
- await promise_rejects_dom(
- testCase, 'QuotaExceededError', transactionPromise(txn));
- }
-}, 'A QuotaExceededError is thrown when a storage API exceeds the quota of the bucket its in.');
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-message-port.any.js b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-message-port.any.js
new file mode 100644
index 00000000000..e9961ce0422
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-message-port.any.js
@@ -0,0 +1,49 @@
+// META: global=window,worker
+// META: script=../resources/test-utils.js
+// META: script=../resources/rs-utils.js
+'use strict';
+
+promise_test(async () => {
+ const channel = new MessageChannel;
+ const port1 = channel.port1;
+ const port2 = channel.port2;
+
+ const source = {
+ start(controller) {
+ controller.enqueue(port1, { transfer : [ port1 ] });
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+
+ const chunk = await stream.getReader().read();
+
+ assert_not_equals(chunk.value, port1);
+
+ let promise = new Promise(resolve => port2.onmessage = e => resolve(e.data));
+ chunk.value.postMessage("toPort2");
+ assert_equals(await promise, "toPort2");
+
+ promise = new Promise(resolve => chunk.value.onmessage = e => resolve(e.data));
+ port2.postMessage("toPort1");
+ assert_equals(await promise, "toPort1");
+}, 'Transferred MessageChannel works as expected');
+
+promise_test(async t => {
+ const channel = new MessageChannel;
+ const port1 = channel.port1;
+ const port2 = channel.port2;
+
+ const source = {
+ start(controller) {
+ controller.enqueue({ port1 }, { transfer : [ port1 ] });
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+ const [clone1, clone2] = stream.tee();
+
+ await promise_rejects_dom(t, "DataCloneError", clone2.getReader().read());
+}, 'Second branch of owning ReadableStream tee should end up into errors with transfer only values');
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-video-frame.any.js b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-video-frame.any.js
new file mode 100644
index 00000000000..ec01fda0b3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type-video-frame.any.js
@@ -0,0 +1,128 @@
+// META: global=window,worker
+// META: script=../resources/test-utils.js
+// META: script=../resources/rs-utils.js
+'use strict';
+
+function createVideoFrame()
+{
+ let init = {
+ format: 'I420',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ };
+ let data = new Uint8Array([
+ 1, 2, 3, 4, 5, 6, 7, 8, // y
+ 1, 2, // u
+ 1, 2, // v
+ ]);
+
+ return new VideoFrame(data, init);
+}
+
+promise_test(async () => {
+ const videoFrame = createVideoFrame();
+ videoFrame.test = 1;
+ const source = {
+ start(controller) {
+ assert_equals(videoFrame.format, 'I420');
+ controller.enqueue(videoFrame, { transfer : [ videoFrame ] });
+ assert_equals(videoFrame.format, null);
+ assert_equals(videoFrame.test, 1);
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+ // Cancelling the stream should close all video frames, thus no console messages of GCing VideoFrames should happen.
+ stream.cancel();
+}, 'ReadableStream of type owning should close serialized chunks');
+
+promise_test(async () => {
+ const videoFrame = createVideoFrame();
+ videoFrame.test = 1;
+ const source = {
+ start(controller) {
+ assert_equals(videoFrame.format, 'I420');
+ controller.enqueue({ videoFrame }, { transfer : [ videoFrame ] });
+ assert_equals(videoFrame.format, null);
+ assert_equals(videoFrame.test, 1);
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+ const reader = stream.getReader();
+
+ const chunk = await reader.read();
+ assert_equals(chunk.value.videoFrame.format, 'I420');
+ assert_equals(chunk.value.videoFrame.test, undefined);
+
+ chunk.value.videoFrame.close();
+}, 'ReadableStream of type owning should transfer JS chunks with transferred values');
+
+promise_test(async t => {
+ const videoFrame = createVideoFrame();
+ videoFrame.close();
+ const source = {
+ start(controller) {
+ assert_throws_dom("DataCloneError", () => controller.enqueue(videoFrame, { transfer : [ videoFrame ] }));
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+ const reader = stream.getReader();
+
+ await promise_rejects_dom(t, "DataCloneError", reader.read());
+}, 'ReadableStream of type owning should error when trying to enqueue not serializable values');
+
+promise_test(async () => {
+ const videoFrame = createVideoFrame();
+ const source = {
+ start(controller) {
+ controller.enqueue(videoFrame, { transfer : [ videoFrame ] });
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+ const [clone1, clone2] = stream.tee();
+
+ const chunk1 = await clone1.getReader().read();
+ const chunk2 = await clone2.getReader().read();
+
+ assert_equals(videoFrame.format, null);
+ assert_equals(chunk1.value.format, 'I420');
+ assert_equals(chunk2.value.format, 'I420');
+
+ chunk1.value.close();
+ chunk2.value.close();
+}, 'ReadableStream of type owning should clone serializable objects when teeing');
+
+promise_test(async () => {
+ const videoFrame = createVideoFrame();
+ videoFrame.test = 1;
+ const source = {
+ start(controller) {
+ assert_equals(videoFrame.format, 'I420');
+ controller.enqueue({ videoFrame }, { transfer : [ videoFrame ] });
+ assert_equals(videoFrame.format, null);
+ assert_equals(videoFrame.test, 1);
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+ const [clone1, clone2] = stream.tee();
+
+ const chunk1 = await clone1.getReader().read();
+ const chunk2 = await clone2.getReader().read();
+
+ assert_equals(videoFrame.format, null);
+ assert_equals(chunk1.value.videoFrame.format, 'I420');
+ assert_equals(chunk2.value.videoFrame.format, 'I420');
+
+ chunk1.value.videoFrame.close();
+ chunk2.value.videoFrame.close();
+}, 'ReadableStream of type owning should clone JS Objects with serializables when teeing');
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/owning-type.any.js b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type.any.js
new file mode 100644
index 00000000000..27a3dda894e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/owning-type.any.js
@@ -0,0 +1,91 @@
+// META: global=window,worker
+// META: script=../resources/test-utils.js
+// META: script=../resources/rs-utils.js
+'use strict';
+
+test(() => {
+ new ReadableStream({ type: 'owning' }); // ReadableStream constructed with 'owning' type
+}, 'ReadableStream can be constructed with owning type');
+
+test(() => {
+ let startCalled = false;
+
+ const source = {
+ start(controller) {
+ assert_equals(this, source, 'source is this during start');
+ assert_true(controller instanceof ReadableStreamDefaultController, 'default controller');
+ startCalled = true;
+ },
+ type: 'owning'
+ };
+
+ new ReadableStream(source);
+ assert_true(startCalled);
+}, 'ReadableStream of type owning should call start with a ReadableStreamDefaultController');
+
+test(() => {
+ let startCalled = false;
+
+ const source = {
+ start(controller) {
+ controller.enqueue("a", { transfer: [] });
+ controller.enqueue("a", { transfer: undefined });
+ startCalled = true;
+ },
+ type: 'owning'
+ };
+
+ new ReadableStream(source);
+ assert_true(startCalled);
+}, 'ReadableStream should be able to call enqueue with an empty transfer list');
+
+test(() => {
+ let startCalled = false;
+
+ const uint8Array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
+ const buffer = uint8Array.buffer;
+ let source = {
+ start(controller) {
+ startCalled = true;
+ assert_throws_js(TypeError, () => { controller.enqueue(buffer, { transfer : [ buffer ] }); }, "transfer list is not empty");
+ }
+ };
+
+ new ReadableStream(source);
+ assert_true(startCalled);
+
+ startCalled = false;
+ source = {
+ start(controller) {
+ startCalled = true;
+ assert_throws_js(TypeError, () => { controller.enqueue(buffer, { get transfer() { throw new TypeError(); } }) }, "getter throws");
+ }
+ };
+
+ new ReadableStream(source);
+ assert_true(startCalled);
+}, 'ReadableStream should check transfer parameter');
+
+promise_test(async () => {
+ const uint8Array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
+ const buffer = uint8Array.buffer;
+ buffer.test = 1;
+ const source = {
+ start(controller) {
+ assert_equals(buffer.byteLength, 8);
+ controller.enqueue(buffer, { transfer : [ buffer ] });
+ assert_equals(buffer.byteLength, 0);
+ assert_equals(buffer.test, 1);
+ },
+ type: 'owning'
+ };
+
+ const stream = new ReadableStream(source);
+ const reader = stream.getReader();
+
+ const chunk = await reader.read();
+
+ assert_not_equals(chunk.value, buffer);
+ assert_equals(chunk.value.byteLength, 8);
+ assert_equals(chunk.value.test, undefined);
+}, 'ReadableStream of type owning should transfer enqueued chunks');
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/read-task-handling.window.js b/tests/wpt/web-platform-tests/streams/readable-streams/read-task-handling.window.js
new file mode 100644
index 00000000000..2edc0ddddfe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/read-task-handling.window.js
@@ -0,0 +1,46 @@
+// META: global=window,worker
+'use strict';
+
+function performMicrotaskCheckpoint() {
+ document.createNodeIterator(document, -1, {
+ acceptNode() {
+ return NodeFilter.FILTER_ACCEPT;
+ }
+ }).nextNode();
+}
+
+test(() => {
+ // Add a getter for "then" that will incidentally be invoked
+ // during promise resolution.
+ Object.prototype.__defineGetter__('then', () => {
+ // Clean up behind ourselves.
+ delete Object.prototype.then;
+
+ // This promise should (like all promises) be resolved
+ // asynchronously.
+ var executed = false;
+ Promise.resolve().then(_ => { executed = true; });
+
+ // This shouldn't run microtasks! They should only run
+ // after the fetch is resolved.
+ performMicrotaskCheckpoint();
+
+ // The fulfill handler above shouldn't have run yet. If it has run,
+ // throw to reject this promise and fail the test.
+ assert_false(executed, "shouldn't have run microtasks yet");
+
+ // Otherwise act as if there's no "then" property so the promise
+ // fulfills and the test passes.
+ return undefined;
+ });
+
+ const readable = new ReadableStream({
+ pull(c) {
+ c.enqueue({});
+ }
+ }, { highWaterMark: 0 });
+
+ // Create a read request, incidentally resolving a promise with an
+ // object value, thereby invoking the getter installed above.
+ readable.getReader().read();
+}, "reading from a stream should occur in a microtask scope");
diff --git a/tests/wpt/web-platform-tests/streams/transferable/transform-stream-members.any.js b/tests/wpt/web-platform-tests/streams/transferable/transform-stream-members.any.js
new file mode 100644
index 00000000000..fca060b0c05
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/transferable/transform-stream-members.any.js
@@ -0,0 +1,16 @@
+const combinations = [
+ (t => [t, t.readable])(new TransformStream()),
+ (t => [t.readable, t])(new TransformStream()),
+ (t => [t, t.writable])(new TransformStream()),
+ (t => [t.writable, t])(new TransformStream()),
+];
+
+for (const combination of combinations) {
+ test(() => {
+ assert_throws_dom(
+ "DataCloneError",
+ () => structuredClone(combination, { transfer: combination }),
+ "structuredClone should throw"
+ );
+ }, `Transferring ${combination} should fail`);
+}
diff --git a/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html b/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html
index 2cbf50836df..defe4743c6a 100644
--- a/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html
+++ b/tests/wpt/web-platform-tests/subapps/add-error.tentative.https.html
@@ -82,8 +82,8 @@ promise_test(async t => {
};
let mocked_response = [
- { "unhashedAppIdPath": url_1, "resultCode": Status.FAILURE },
- { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE }
+ { "manifestIdPath": url_1, "resultCode": Status.FAILURE },
+ { "manifestIdPath": url_2, "resultCode": Status.FAILURE }
];
let expected_results = {
@@ -106,8 +106,8 @@ promise_test(async t => {
};
let mocked_response = [
- { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS },
- { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE }
+ { "manifestIdPath": url_1, "resultCode": Status.SUCCESS },
+ { "manifestIdPath": url_2, "resultCode": Status.FAILURE }
];
let expected_results = {
diff --git a/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html
index 2453fdbdecd..a9a439b36ac 100644
--- a/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html
+++ b/tests/wpt/web-platform-tests/subapps/add-success.tentative.https.html
@@ -16,7 +16,7 @@ promise_test(async t => {
};
let mocked_response = [
- { "unhashedAppIdPath": install_url, "resultCode": Status.SUCCESS }
+ { "manifestIdPath": install_url, "resultCode": Status.SUCCESS }
];
let expected_results = {
@@ -38,8 +38,8 @@ promise_test(async t => {
};
let mocked_response = [
- { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS },
- { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS }
+ { "manifestIdPath": url_1, "resultCode": Status.SUCCESS },
+ { "manifestIdPath": url_2, "resultCode": Status.SUCCESS }
];
let expected_results = {
diff --git a/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html
index c1d281abc53..ea4f96124a9 100644
--- a/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html
+++ b/tests/wpt/web-platform-tests/subapps/list-success.tentative.https.html
@@ -15,8 +15,8 @@ promise_test(async t => {
const url_2 = '/sub-app-2';
const mocked_response = [
- { "unhashedAppIdPath": url_1, "appName": "App 1" },
- { "unhashedAppIdPath": url_2, "appName": "App 2" },
+ { "manifestIdPath": url_1, "appName": "App 1" },
+ { "manifestIdPath": url_2, "appName": "App 2" },
];
let expected_results = {
diff --git a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html
index 917c3b4d022..a7271905dc7 100644
--- a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html
+++ b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html
@@ -48,9 +48,9 @@ promise_test(async t => {
let remove_call_params = [url_1, url_2, url_3];
let mocked_response = [
- { "unhashedAppIdPath": url_1, "resultCode": Status.FAILURE },
- { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE },
- { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE }
+ { "manifestIdPath": url_1, "resultCode": Status.FAILURE },
+ { "manifestIdPath": url_2, "resultCode": Status.FAILURE },
+ { "manifestIdPath": url_3, "resultCode": Status.FAILURE }
];
let expected_results = {
@@ -70,9 +70,9 @@ promise_test(async t => {
let remove_call_params = [url_1, url_2, url_3];
let mocked_response = [
- { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS },
- { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS },
- { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE }
+ { "manifestIdPath": url_1, "resultCode": Status.SUCCESS },
+ { "manifestIdPath": url_2, "resultCode": Status.SUCCESS },
+ { "manifestIdPath": url_3, "resultCode": Status.FAILURE }
];
let expected_results = {
diff --git a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html
index 6fd4305b434..ad60d6398dd 100644
--- a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html
+++ b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html
@@ -9,7 +9,7 @@ promise_test(async t => {
const url = '/sub-app';
let remove_call_params = [url];
-let mocked_response = [{ "unhashedAppIdPath": url, "resultCode": Status.SUCCESS }];
+let mocked_response = [{ "manifestIdPath": url, "resultCode": Status.SUCCESS }];
let expected_results = {[url]: "success"};
await subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results);
@@ -24,9 +24,9 @@ const url_3 = '/sub-app-3';
let remove_call_params = [url_1, url_2, url_3];
let mocked_response = [
- { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS },
- { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS },
- { "unhashedAppIdPath": url_3, "resultCode": Status.SUCCESS }
+ { "manifestIdPath": url_1, "resultCode": Status.SUCCESS },
+ { "manifestIdPath": url_2, "resultCode": Status.SUCCESS },
+ { "manifestIdPath": url_3, "resultCode": Status.SUCCESS }
];
let expected_results = {
diff --git a/tests/wpt/web-platform-tests/svg/pservers/reftests/pattern-opacity-01.svg b/tests/wpt/web-platform-tests/svg/pservers/reftests/pattern-opacity-01.svg
new file mode 100644
index 00000000000..eb2d2d7e9a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/pservers/reftests/pattern-opacity-01.svg
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml">
+ <g id="testmeta">
+ <title>Pattern: fill-opacity</title>
+ <html:link rel="help"
+ href="https://www.w3.org/TR/SVG2/pservers.html#Patterns"/>
+ <html:link rel="match" href="reference/pattern-opacity-01-ref.svg"/>
+ </g>
+ <defs>
+ <pattern id="pattern" width='1' height='1' patternContentUnits="objectBoundingBox">>
+ <rect fill="lime" width="1" height="1"/>
+ </pattern>
+ </defs>
+ <rect width="100%" height="100%" fill-opacity="0.5" fill="url(#pattern)"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg b/tests/wpt/web-platform-tests/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg
new file mode 100644
index 00000000000..1c9c68bd9d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/pservers/reftests/reference/pattern-opacity-01-ref.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <rect width="100%" height="100%" fill-opacity="0.5" fill="lime"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml b/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml
index ffb1fe1f6fb..6d3d32acc82 100644
--- a/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml
+++ b/tests/wpt/web-platform-tests/tools/ci/azure/affected_tests.yml
@@ -14,6 +14,7 @@ steps:
parameters:
packages: virtualenv
- template: install_certs.yml
+- template: color_profile.yml
- template: install_safari.yml
- template: update_hosts.yml
- template: update_manifest.yml
diff --git a/tests/wpt/web-platform-tests/tools/ci/azure/color_profile.yml b/tests/wpt/web-platform-tests/tools/ci/azure/color_profile.yml
new file mode 100644
index 00000000000..d90c6ca429d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/azure/color_profile.yml
@@ -0,0 +1,5 @@
+steps:
+- script: |
+ ./wpt macos-color-profile
+ displayName: 'Set display color profile'
+ condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))
diff --git a/tests/wpt/web-platform-tests/tools/ci/commands.json b/tests/wpt/web-platform-tests/tools/ci/commands.json
index 59463144967..f26baddacad 100644
--- a/tests/wpt/web-platform-tests/tools/ci/commands.json
+++ b/tests/wpt/web-platform-tests/tools/ci/commands.json
@@ -13,6 +13,15 @@
"help": "Output a hosts file to stdout",
"virtualenv": false
},
+ "macos-color-profile": {
+ "path": "macos_color_profile.py",
+ "script": "run",
+ "help": "Change the macOS color profile to sRGB",
+ "virtualenv": true,
+ "requirements": [
+ "requirements_macos_color_profile.txt"
+ ]
+ },
"regen-certs": {
"path": "regen_certs.py",
"script": "run",
diff --git a/tests/wpt/web-platform-tests/tools/ci/macos_color_profile.py b/tests/wpt/web-platform-tests/tools/ci/macos_color_profile.py
new file mode 100644
index 00000000000..f0919d77159
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/macos_color_profile.py
@@ -0,0 +1,43 @@
+from typing import Any
+
+from Cocoa import NSURL
+from ColorSync import (
+ CGDisplayCreateUUIDFromDisplayID,
+ ColorSyncDeviceSetCustomProfiles,
+ kColorSyncDeviceDefaultProfileID,
+ kColorSyncDisplayDeviceClass,
+)
+from Quartz import (
+ CGGetOnlineDisplayList,
+ kCGErrorSuccess,
+)
+
+
+def set_all_displays(profile_url: NSURL) -> bool:
+ max_displays = 10
+
+ (err, display_ids, display_count) = CGGetOnlineDisplayList(max_displays, None, None)
+ if err != kCGErrorSuccess:
+ raise ValueError(err)
+
+ display_uuids = [CGDisplayCreateUUIDFromDisplayID(d) for d in display_ids]
+
+ for display_uuid in display_uuids:
+ profile_info = {kColorSyncDeviceDefaultProfileID: profile_url}
+
+ success = ColorSyncDeviceSetCustomProfiles(
+ kColorSyncDisplayDeviceClass,
+ display_uuid,
+ profile_info,
+ )
+ if not success:
+ raise Exception(f"failed to set profile on {display_uuid}")
+
+ return True
+
+
+def run(venv: Any, **kwargs: Any) -> None:
+ srgb_profile_url = NSURL.fileURLWithPath_(
+ "/System/Library/ColorSync/Profiles/sRGB Profile.icc"
+ )
+ set_all_displays(srgb_profile_url)
diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_macos_color_profile.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_macos_color_profile.txt
new file mode 100644
index 00000000000..c3448a98dff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/requirements_macos_color_profile.txt
@@ -0,0 +1,4 @@
+pyobjc-core==9.1.1
+pyobjc-framework-Cocoa==9.1.1
+pyobjc-framework-ColorSync==9.1.1
+pyobjc-framework-Quartz==9.1.1
diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt
index 91789c95e30..9ab88012762 100644
--- a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt
+++ b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt
@@ -1,4 +1,4 @@
pygithub==1.58.2
pyyaml==6.0
requests==2.30.0
-taskcluster==50.1.0
+taskcluster==50.1.3
diff --git a/tests/wpt/web-platform-tests/tools/mypy.ini b/tests/wpt/web-platform-tests/tools/mypy.ini
index def40c0bd06..5dc55c5b747 100644
--- a/tests/wpt/web-platform-tests/tools/mypy.ini
+++ b/tests/wpt/web-platform-tests/tools/mypy.ini
@@ -27,6 +27,15 @@ show_error_codes = True
# Ignore missing or untyped libraries.
+[mypy-Cocoa.*]
+ignore_missing_imports = True
+
+[mypy-ColorSync.*]
+ignore_missing_imports = True
+
+[mypy-Quartz.*]
+ignore_missing_imports = True
+
[mypy-github.*]
ignore_missing_imports = True
diff --git a/tests/wpt/web-platform-tests/tools/requirements_tests.txt b/tests/wpt/web-platform-tests/tools/requirements_tests.txt
index ca946a306e7..ed41215bcc1 100644
--- a/tests/wpt/web-platform-tests/tools/requirements_tests.txt
+++ b/tests/wpt/web-platform-tests/tools/requirements_tests.txt
@@ -2,4 +2,4 @@ httpx[http2]==0.24.0
json-e==4.5.2
jsonschema==4.17.3
pyyaml==6.0
-taskcluster==50.1.0
+taskcluster==50.1.3
diff --git a/tests/wpt/web-platform-tests/tools/wpt/wpt.py b/tests/wpt/web-platform-tests/tools/wpt/wpt.py
index e423a8c67c5..e1df4ef42dc 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/wpt.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/wpt.py
@@ -132,7 +132,14 @@ def create_complete_parser():
for command in commands:
props = commands[command]
- venv.install_requirements(*props.get("requirements", []))
+ try:
+ venv.install_requirements(*props.get("requirements", []))
+ except Exception:
+ logging.warning(
+ f"Unable to install requirements ({props['requirements']!r}) for command {command}"
+ )
+ continue
+
subparser = import_command('wpt', command, props)[1]
if not subparser:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
index fcaab2e6674..28be0b3c6e1 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
@@ -7,4 +7,4 @@ packaging==23.1
pillow==9.5.0
requests==2.30.0
six==1.16.0
-urllib3==1.26.15
+urllib3==2.0.2
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py
index 7092122d8c4..3bdbf6f962c 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -50,6 +50,7 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data,
**kwargs)
executor_kwargs["close_after_done"] = True
executor_kwargs["sanitizer_enabled"] = sanitizer_enabled
+ executor_kwargs["reuse_window"] = kwargs.get("reuse_window", False)
capabilities = {
"goog:chromeOptions": {
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py
index a3a733efbd2..5df9de5f7e3 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py
@@ -1,10 +1,13 @@
# mypy: allow-untyped-defs
import os
+import time
import traceback
from typing import Type
from urllib.parse import urljoin
+from webdriver import error
+
from .base import (
CrashtestExecutor,
TestharnessExecutor,
@@ -16,6 +19,7 @@ from .executorwebdriver import (
WebDriverRefTestExecutor,
WebDriverRun,
WebDriverTestharnessExecutor,
+ WebDriverTestharnessProtocolPart,
)
from .protocol import PrintProtocolPart
@@ -57,12 +61,74 @@ def make_sanitizer_mixin(crashtest_executor_cls: Type[CrashtestExecutor]): # ty
_SanitizerMixin = make_sanitizer_mixin(WebDriverCrashtestExecutor)
-class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor, _SanitizerMixin): # type: ignore
- pass
+class ChromeDriverTestharnessProtocolPart(WebDriverTestharnessProtocolPart):
+ """Implementation of `testharness.js` tests controlled by ChromeDriver.
+ The main difference from the default WebDriver testharness implementation is
+ that the test window can be reused between tests for better performance.
+ """
-class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMixin): # type: ignore
- pass
+ def setup(self):
+ super().setup()
+ # Handle (an alphanumeric string) that may be set if window reuse is
+ # enabled. This state allows the protocol to distinguish the test
+ # window from other windows a test itself may create that the "Get
+ # Window Handles" command also returns.
+ #
+ # Because test window persistence is a Chrome-only feature, it's not
+ # exposed to the base WebDriver testharness executor.
+ self.test_window = None
+ self.reuse_window = self.parent.reuse_window
+
+ def close_test_window(self):
+ if self.test_window:
+ self._close_window(self.test_window)
+ self.test_window = None
+
+ def close_old_windows(self):
+ self.webdriver.actions.release()
+ for handle in self.webdriver.handles:
+ if handle not in {self.runner_handle, self.test_window}:
+ self._close_window(handle)
+ if not self.reuse_window:
+ self.close_test_window()
+ self.webdriver.window_handle = self.runner_handle
+ return self.runner_handle
+
+ def open_test_window(self, window_id):
+ if self.test_window:
+ # Try to reuse the existing test window by emulating the `about:blank`
+ # page with no history you would get with a new window.
+ try:
+ self.webdriver.window_handle = self.test_window
+ # Reset navigation history with Chrome DevTools Protocol:
+ # https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-resetNavigationHistory
+ body = {
+ "cmd": "Page.resetNavigationHistory",
+ "params": {},
+ }
+ self.webdriver.send_session_command("POST", "goog/cdp/execute",
+ body=body)
+ self.webdriver.url = "about:blank"
+ return
+ except error.NoSuchWindowException:
+ self.test_window = None
+ super().open_test_window(window_id)
+
+ def get_test_window(self, window_id, parent, timeout=5):
+ if self.test_window:
+ return self.test_window
+ # Poll the handles endpoint for the test window like the base WebDriver
+ # protocol part, but don't bother checking for the serialized
+ # WindowProxy (not supported by Chrome currently).
+ deadline = time.time() + timeout
+ while time.time() < deadline:
+ self.test_window = self._poll_handles_for_test_window(parent)
+ if self.test_window is not None:
+ assert self.test_window != parent
+ return self.test_window
+ time.sleep(0.03)
+ raise Exception("unable to find test window")
class ChromeDriverPrintProtocolPart(PrintProtocolPart):
@@ -117,7 +183,25 @@ render('%s').then(result => callback(result))""" % pdf_base64)
class ChromeDriverProtocol(WebDriverProtocol):
- implements = WebDriverProtocol.implements + [ChromeDriverPrintProtocolPart]
+ implements = [
+ ChromeDriverPrintProtocolPart,
+ ChromeDriverTestharnessProtocolPart,
+ *(part for part in WebDriverProtocol.implements
+ if part.name != ChromeDriverTestharnessProtocolPart.name)
+ ]
+ reuse_window = False
+
+
+class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor, _SanitizerMixin): # type: ignore
+ protocol_cls = ChromeDriverProtocol
+
+
+class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMixin): # type: ignore
+ protocol_cls = ChromeDriverProtocol
+
+ def __init__(self, *args, reuse_window=False, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.protocol.reuse_window = reuse_window
class ChromeDriverPrintRefTestExecutor(ChromeDriverRefTestExecutor):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index ab7d1ab0d4c..9a771f11c6c 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -119,14 +119,21 @@ class WebDriverTestharnessProtocolPart(TestharnessProtocolPart):
self.webdriver.actions.release()
handles = [item for item in self.webdriver.handles if item != self.runner_handle]
for handle in handles:
- try:
- self.webdriver.window_handle = handle
- self.webdriver.window.close()
- except error.NoSuchWindowException:
- pass
+ self._close_window(handle)
self.webdriver.window_handle = self.runner_handle
return self.runner_handle
+ def _close_window(self, window_handle):
+ try:
+ self.webdriver.window_handle = window_handle
+ self.webdriver.window.close()
+ except error.NoSuchWindowException:
+ pass
+
+ def open_test_window(self, window_id):
+ self.webdriver.execute_script(
+ "window.open('about:blank', '%s', 'noopener')" % window_id)
+
def get_test_window(self, window_id, parent, timeout=5):
"""Find the test window amongst all the open windows.
This is assumed to be either the named window or the one after the parent in the list of
@@ -150,12 +157,7 @@ class WebDriverTestharnessProtocolPart(TestharnessProtocolPart):
pass
if test_window is None:
- after = self.webdriver.handles
- if len(after) == 2:
- test_window = next(iter(set(after) - {parent}))
- elif after[0] == parent and len(after) > 2:
- # Hope the first one here is the test window
- test_window = after[1]
+ test_window = self._poll_handles_for_test_window(parent)
if test_window is not None:
assert test_window != parent
@@ -165,6 +167,16 @@ class WebDriverTestharnessProtocolPart(TestharnessProtocolPart):
raise Exception("unable to find test window")
+ def _poll_handles_for_test_window(self, parent):
+ test_window = None
+ after = self.webdriver.handles
+ if len(after) == 2:
+ test_window = next(iter(set(after) - {parent}))
+ elif after[0] == parent and len(after) > 2:
+ # Hope the first one here is the test window
+ test_window = after[1]
+ return test_window
+
def test_window_loaded(self):
"""Wait until the page in the new window has been loaded.
@@ -513,7 +525,7 @@ class WebDriverTestharnessExecutor(TestharnessExecutor):
parent_window = protocol.testharness.close_old_windows()
# Now start the test harness
- protocol.base.execute_script("window.open('about:blank', '%s', 'noopener')" % self.window_id)
+ protocol.testharness.open_test_window(self.window_id)
test_window = protocol.testharness.get_test_window(self.window_id,
parent_window,
timeout=5*self.timeout_multiplier)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
index c35e509776a..950273c3894 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
@@ -1,5 +1,6 @@
# mypy: allow-untyped-defs
+import abc
import hashlib
import itertools
import json
@@ -8,6 +9,7 @@ from urllib.parse import urlsplit
from abc import ABCMeta, abstractmethod
from queue import Empty
from collections import defaultdict, deque, namedtuple
+from typing import Any, cast
from . import manifestinclude
from . import manifestexpected
@@ -78,8 +80,8 @@ def update_include_for_groups(test_groups, include):
return new_include
-class TestChunker:
- def __init__(self, total_chunks, chunk_number, **kwargs):
+class TestChunker(abc.ABC):
+ def __init__(self, total_chunks: int, chunk_number: int, **kwargs: Any):
self.total_chunks = total_chunks
self.chunk_number = chunk_number
assert self.chunk_number <= self.total_chunks
@@ -87,8 +89,9 @@ class TestChunker:
assert self.logger
self.kwargs = kwargs
+ @abstractmethod
def __call__(self, manifest):
- raise NotImplementedError
+ ...
class Unchunked(TestChunker):
@@ -102,30 +105,50 @@ class Unchunked(TestChunker):
class HashChunker(TestChunker):
def __call__(self, manifest):
- chunk_index = self.chunk_number - 1
for test_type, test_path, tests in manifest:
- h = int(hashlib.md5(test_path.encode()).hexdigest(), 16)
- if h % self.total_chunks == chunk_index:
- yield test_type, test_path, tests
+ tests_for_chunk = {
+ test for test in tests
+ if self._key_in_chunk(self.chunk_key(test_type, test_path, test))
+ }
+ if tests_for_chunk:
+ yield test_type, test_path, tests_for_chunk
+
+ def _key_in_chunk(self, key: str) -> bool:
+ chunk_index = self.chunk_number - 1
+ digest = hashlib.md5(key.encode()).hexdigest()
+ return int(digest, 16) % self.total_chunks == chunk_index
+
+ @abstractmethod
+ def chunk_key(self, test_type: str, test_path: str,
+ test: wpttest.Test) -> str:
+ ...
+
+class PathHashChunker(HashChunker):
+ def chunk_key(self, test_type: str, test_path: str,
+ test: wpttest.Test) -> str:
+ return test_path
-class DirectoryHashChunker(TestChunker):
+
+class IDHashChunker(HashChunker):
+ def chunk_key(self, test_type: str, test_path: str,
+ test: wpttest.Test) -> str:
+ return cast(str, test.id)
+
+
+class DirectoryHashChunker(HashChunker):
"""Like HashChunker except the directory is hashed.
This ensures that all tests in the same directory end up in the same
chunk.
"""
- def __call__(self, manifest):
- chunk_index = self.chunk_number - 1
+ def chunk_key(self, test_type: str, test_path: str,
+ test: wpttest.Test) -> str:
depth = self.kwargs.get("depth")
- for test_type, test_path, tests in manifest:
- if depth:
- hash_path = os.path.sep.join(os.path.dirname(test_path).split(os.path.sep, depth)[:depth])
- else:
- hash_path = os.path.dirname(test_path)
- h = int(hashlib.md5(hash_path.encode()).hexdigest(), 16)
- if h % self.total_chunks == chunk_index:
- yield test_type, test_path, tests
+ if depth:
+ return os.path.sep.join(os.path.dirname(test_path).split(os.path.sep, depth)[:depth])
+ else:
+ return os.path.dirname(test_path)
class TestFilter:
@@ -245,7 +268,8 @@ class TestLoader:
if chunker_kwargs is None:
chunker_kwargs = {}
self.chunker = {"none": Unchunked,
- "hash": HashChunker,
+ "hash": PathHashChunker,
+ "id_hash": IDHashChunker,
"dir_hash": DirectoryHashChunker}[chunk_type](total_chunks,
chunk_number,
**chunker_kwargs)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
index 45b78496d1b..cef75e03be1 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
@@ -7,8 +7,15 @@ import tempfile
import pytest
from mozlog import structured
-from ..testloader import TestFilter, TestLoader, TagFilter
-from ..testloader import read_include_from_file
+from ..testloader import (
+ DirectoryHashChunker,
+ IDHashChunker,
+ PathHashChunker,
+ TestFilter,
+ TestLoader,
+ TagFilter,
+ read_include_from_file,
+)
from .test_wpttest import make_mock_manifest
here = os.path.dirname(__file__)
@@ -27,6 +34,31 @@ skip: true
"""
+@pytest.fixture
+def manifest():
+ manifest_json = {
+ "items": {
+ "testharness": {
+ "a": {
+ "foo.html": [
+ "abcdef123456",
+ ["a/foo.html?b", {}],
+ ["a/foo.html?c", {}],
+ ],
+ "bar.html": [
+ "uvwxyz987654",
+ [None, {}],
+ ],
+ }
+ }
+ },
+ "url_base": "/",
+ "version": 8,
+ }
+ return WPTManifest.from_json("/", manifest_json)
+
+
+
def test_loader_h2_tests():
manifest_json = {
"items": {
@@ -138,3 +170,65 @@ def test_loader_filter_tags():
assert len(loader.tests["testharness"]) == 1
assert loader.tests["testharness"][0].id == "/a/bar.html"
assert loader.tests["testharness"][0].tags == {"dir:a", "test-include"}
+
+
+def test_chunk_hash(manifest):
+ chunker1 = PathHashChunker(total_chunks=2, chunk_number=1)
+ chunker2 = PathHashChunker(total_chunks=2, chunk_number=2)
+ # Check that the chunkers partition the manifest (i.e., each item is
+ # assigned to exactly one chunk).
+ items = sorted([*chunker1(manifest), *chunker2(manifest)],
+ key=lambda item: item[1])
+ assert len(items) == 2
+ test_type, test_path, tests = items[0]
+ assert test_type == "testharness"
+ assert test_path == os.path.join("a", "bar.html")
+ assert {test.id for test in tests} == {"/a/bar.html"}
+ test_type, test_path, tests = items[1]
+ assert test_type == "testharness"
+ assert test_path == os.path.join("a", "foo.html")
+ assert {test.id for test in tests} == {"/a/foo.html?b", "/a/foo.html?c"}
+
+
+def test_chunk_id_hash(manifest):
+ chunker1 = IDHashChunker(total_chunks=2, chunk_number=1)
+ chunker2 = IDHashChunker(total_chunks=2, chunk_number=2)
+ items = []
+ for test_type, test_path, tests in [*chunker1(manifest), *chunker2(manifest)]:
+ assert len(tests) > 0
+ items.extend((test_type, test_path, test) for test in tests)
+ assert len(items) == 3
+ items.sort(key=lambda item: item[2].id)
+ test_type, test_path, test = items[0]
+ assert test_type == "testharness"
+ assert test_path == os.path.join("a", "bar.html")
+ assert test.id == "/a/bar.html"
+ test_type, test_path, test = items[1]
+ assert test_type == "testharness"
+ assert test_path == os.path.join("a", "foo.html")
+ assert test.id == "/a/foo.html?b"
+ test_type, test_path, test = items[2]
+ assert test_type == "testharness"
+ assert test_path == os.path.join("a", "foo.html")
+ assert test.id == "/a/foo.html?c"
+
+
+def test_chunk_dir_hash(manifest):
+ chunker1 = DirectoryHashChunker(total_chunks=2, chunk_number=1)
+ chunker2 = DirectoryHashChunker(total_chunks=2, chunk_number=2)
+ # Check that tests in the same directory are located in the same chunk
+ # (which particular chunk is irrelevant).
+ empty_chunk, chunk_a = sorted([
+ list(chunker1(manifest)),
+ list(chunker2(manifest)),
+ ], key=len)
+ assert len(empty_chunk) == 0
+ assert len(chunk_a) == 2
+ test_type, test_path, tests = chunk_a[0]
+ assert test_type == "testharness"
+ assert test_path == os.path.join("a", "bar.html")
+ assert {test.id for test in tests} == {"/a/bar.html"}
+ test_type, test_path, tests = chunk_a[1]
+ assert test_type == "testharness"
+ assert test_path == os.path.join("a", "foo.html")
+ assert {test.id for test in tests} == {"/a/foo.html?b", "/a/foo.html?c"}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
index 416e75b417f..1c5895eec6e 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -280,7 +280,8 @@ scheme host and port.""")
help="Total number of chunks to use")
chunking_group.add_argument("--this-chunk", action="store", type=int, default=1,
help="Chunk number to run")
- chunking_group.add_argument("--chunk-type", action="store", choices=["none", "hash", "dir_hash"],
+ chunking_group.add_argument("--chunk-type", action="store",
+ choices=["none", "hash", "id_hash", "dir_hash"],
default=None, help="Chunking type to use")
ssl_group = parser.add_argument_group("SSL/TLS")
@@ -367,6 +368,12 @@ scheme host and port.""")
action="store_true",
dest="sanitizer_enabled",
help="Only alert on sanitizer-related errors and crashes.")
+ chrome_group.add_argument(
+ "--reuse-window",
+ action="store_true",
+ help=("Reuse a window across `testharness.js` tests where possible, "
+ "which can speed up testing. Also useful for ensuring that the "
+ "renderer process has a stable PID for a debugger to attach to."))
sauce_group = parser.add_argument_group("Sauce Labs-specific")
sauce_group.add_argument("--sauce-browser", dest="sauce_browser",
diff --git a/tests/wpt/web-platform-tests/wai-aria/role/abstract-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/abstract-roles.html
new file mode 100644
index 00000000000..8a98ba74ead
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wai-aria/role/abstract-roles.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<html>
+<head>
+ <title>Abstract Role Verification Tests</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/wai-aria/scripts/aria-utils.js"></script>
+</head>
+<body>
+
+
+<p>Verifies <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a></p>
+ <nav role="command" data-testname="command role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="composite" data-testname="composite role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="input" data-testname="input role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="landmark" data-testname="landmark role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="range" data-testname="range role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="roletype" data-testname="roletype role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="section" data-testname="section role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="sectionhead" data-testname="sectionhead role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="select" data-testname="select role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="structure" data-testname="structure role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="widget" data-testname="widget role" data-expectedrole="navigation" class="ex">x</nav>
+ <nav role="window" data-testname="window role" data-expectedrole="navigation" class="ex">x</nav>
+
+
+<script>
+AriaUtils.verifyRolesBySelector(".ex");
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/wai-aria/role/fallback-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/fallback-roles.html
new file mode 100644
index 00000000000..5242a02deec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wai-aria/role/fallback-roles.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Fallback Role Verification Tests</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/wai-aria/scripts/aria-utils.js"></script>
+ </head>
+ <body>
+
+ <p>Verifies Fallback Roles from <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a></p>
+
+ <navigation role="region group" data-testname="fallback role w/ region with no label" data-expectedrole="group" class="ex">x</nav>
+ <navigation role="region group" data-testname="fallback role w/ region with label" aria-label="x" data-expectedrole="region" class="ex">x</nav>
+
+<!-- todo: additional fallback roles:
+
+- valid/valid "switch checkbox"
+- valid/invalid "foo group"
+- unicode char tests with fallback
+- whitespace tests with fallback
+- unicode char tests with fallback
+- "invalid, punctuation, tests, link, button"
+
+-->
+
+<script>
+AriaUtils.verifyRolesBySelector(".ex");
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/wai-aria/role/form-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/form-roles.html
new file mode 100644
index 00000000000..935899c583b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wai-aria/role/form-roles.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html>
+<head>
+ <title>Form Role Verification Tests</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/wai-aria/scripts/aria-utils.js"></script>
+</head>
+<body>
+
+<p>Verifies <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a> and the <a href="https://w3c.github.io/aria/#form">form</a> role.</p>
+
+
+<!-- no label -->
+<nav role="form" data-testname="form without label" data-expectedrole="navigation" class="ex">x</nav>
+
+<!-- w/ label -->
+<nav role="form" data-testname="form with label" data-expectedrole="form" aria-label="x" class="ex">x</nav>
+
+<script>
+AriaUtils.verifyRolesBySelector(".ex");
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/wai-aria/role/invalid-roles.html b/tests/wpt/web-platform-tests/wai-aria/role/invalid-roles.html
new file mode 100644
index 00000000000..e7d38dc8c95
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wai-aria/role/invalid-roles.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<html>
+<head>
+ <title>Invalid Role Verification Tests</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/wai-aria/scripts/aria-utils.js"></script>
+</head>
+<body>
+
+<p>Verifies Invalid Roles from <a href="https://w3c.github.io/aria/#document-handling_author-errors_roles">9.1 Roles - handling author errors</a></p>
+
+<nav role="foo" data-testname="invalid role name foo" data-expectedrole="navigation" class="ex">x</nav>
+<nav role="foo bar" data-testname="multiple invalid role names" data-expectedrole="navigation" class="ex">x</nav>
+
+<!-- todo: additional invalid roles:
+
+- whitespace tests (including line breaks, tabs, zero-width space, braille space)
+- diacritics
+- joiners (e.g. like emoji variants use)
+- non-western chars
+- RTL strings (Hebrew & Arabic)
+- escaped chars, URL-encoded chars
+- backslash closing quote and other obvious hack attempts
+- etc.
+
+-->
+
+<script>
+AriaUtils.verifyRolesBySelector(".ex");
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/wai-aria/role/role_none_conflict_resolution.html b/tests/wpt/web-platform-tests/wai-aria/role/role_none_conflict_resolution.html
new file mode 100644
index 00000000000..efb247fc77c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wai-aria/role/role_none_conflict_resolution.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<html>
+<head>
+ <title>Role None Conflict Resolution Verification Tests</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/wai-aria/scripts/aria-utils.js"></script>
+</head>
+<body>
+
+<p>Verifies <a href="https://w3c.github.io/aria/#conflict_resolution_presentation_none"></a>conflict resolution</a> requirements for the ARIA <a href="https://w3c.github.io/aria/#none">none</a> and <a href="https://w3c.github.io/aria/#presentation">presentation</a> roles.</p>
+
+<!-- none with label(global) on header -->
+<h1 role="none" data-testname="heading role none with global attr aria-label" data-expectedrole="heading" aria-label="x" class="ex">x</h1>
+
+<!-- none with label(global) on paragraph -->
+<p role="none" data-testname="p role none with global attr aria-label (prohibited role)" data-expectedrole="paragraph" aria-label="x" class="ex">x</p>
+<p role="none" data-testname="p role none without global attr aria-label (prohibited role)" data-expectedrole="none" class="ex">x</p>
+
+<!-- none with focusable header -->
+<h1 role="none" data-testname="focusable heading role none with tabindex=0" data-expectedrole="heading" tabindex="0" class="ex">x</h1>
+<h1 role="none" data-testname="focusable heading role none with tabindex=-1" data-expectedrole="heading" tabindex="-1" class="ex">x</h1>
+<h1 role="none" data-testname="non-focusable heading role none" data-expectedrole="none" class="ex">x</h1>
+
+<!-- none with non-global-->
+<h1 role="none" data-testname="none with non-global" data-expectedrole="none" class="ex" aria-level="2"> Sample Content </h1>
+
+
+<script>
+AriaUtils.verifyRolesBySelector(".ex");
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/wai-aria/role/roles.html b/tests/wpt/web-platform-tests/wai-aria/role/roles.html
index 71946cbffa5..72c9cdd0cd3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/role/roles.html
+++ b/tests/wpt/web-platform-tests/wai-aria/role/roles.html
@@ -56,7 +56,7 @@ AriaUtils.assignAndVerifyRolesByRoleNames([
"emphasis",
"feed",
"figure",
- "form",
+ // form -> ./form-roles.html
"generic",
// graphics-* roles -> /graphics-aria
// "grid" -> ./grid-roles.html
diff --git a/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js b/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js
index 339f16df838..8de3b8c3cd0 100644
--- a/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js
+++ b/tests/wpt/web-platform-tests/webauthn/public-key-credential-to-json.https.window.js
@@ -27,9 +27,6 @@ function convertValue(value, optParent) {
case 'function':
return value.apply(optParent);
case 'object':
- if (value === null) {
- return value;
- }
if (value.__proto__.constructor === Object) {
var result = {};
Object.entries(value).map((k, v) => {
@@ -68,7 +65,9 @@ function convertObject(obj, params) {
switch (typeof (param)) {
case 'string':
assert_true(param in obj, `missing ${param}`);
- result[param] = convertValue(obj[param], obj);
+ if (obj[param] !== null) {
+ result[param] = convertValue(obj[param], obj);
+ }
break;
case 'object':
assert_true(param.name in obj, `missing ${param.name}`);
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/back/back.py b/tests/wpt/web-platform-tests/webdriver/tests/back/back.py
index 21e8498ccd5..62434323e0a 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/back/back.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/back/back.py
@@ -164,6 +164,6 @@ def test_cross_origin(session, url):
assert session.url == first_page
- with pytest.raises(error.StaleElementReferenceException):
+ with pytest.raises(error.NoSuchElementException):
elem.click()
elem = session.find.css("#delete", all=False)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py
index 69c96c8c545..99a95df1049 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/event_buffer.py
@@ -81,9 +81,10 @@ async def test_console_log_cached_message_after_refresh(
# Log a message, refresh, log another message and subscribe
expected_text_1 = await create_log(bidi_session, new_tab, log_type, "cached_message_1")
- await bidi_session.browsing_context.navigate(
- context=new_tab["context"], url=new_tab["url"], wait="complete"
- )
+ context = new_tab["context"]
+ await bidi_session.browsing_context.navigate(context=context,
+ url='about:blank',
+ wait="complete")
expected_text_2 = await create_log(bidi_session, new_tab, log_type, "cached_message_2")
await subscribe_events(events=["log.entryAdded"])
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py
index d23a4cf83e5..4d604f6877e 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/log/entry_added/subscription.py
@@ -63,9 +63,10 @@ async def test_subscribe_unsubscribe(bidi_session, new_tab, wait_for_event, log_
assert len(events) == 0
# Refresh to create a new context
- await bidi_session.browsing_context.navigate(
- context=new_tab["context"], url=new_tab["url"], wait="complete"
- )
+ context = new_tab["context"]
+ await bidi_session.browsing_context.navigate(context=context,
+ url='about:blank',
+ wait="complete")
# Check we still don't receive ConsoleLogEntry events from the new context
expected_text_1 = await create_log(bidi_session, new_tab, log_type, "text_1")
@@ -76,9 +77,10 @@ async def test_subscribe_unsubscribe(bidi_session, new_tab, wait_for_event, log_
# Refresh to create a new context. Note that we refresh to avoid getting
# cached events from the log event buffer.
- await bidi_session.browsing_context.navigate(
- context=new_tab["context"], url=new_tab["url"], wait="complete"
- )
+ context = new_tab["context"]
+ await bidi_session.browsing_context.navigate(context=context,
+ url='about:blank',
+ wait="complete")
# Check that if we subscribe again, we can receive events
await bidi_session.session.subscribe(events=["log.entryAdded"])
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py
index ea85b2c6c94..0cb571038b7 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/arguments.py
@@ -136,124 +136,94 @@ async def test_local_value(bidi_session, top_context, argument, expected_type):
@pytest.mark.asyncio
@pytest.mark.parametrize(
- "setup_expression, function_declaration, await_promise, expected",
+ "setup_expression, function_declaration, expected",
[
(
"Symbol('foo')",
"(symbol) => symbol.toString()",
- False,
{"type": "string", "value": "Symbol(foo)"},
),
- (
- "[1,2]",
- "(array) => array[0]",
- False,
- {"type": "number", "value": 1}),
+ ("[1,2]", "(array) => array[0]", {"type": "number", "value": 1}),
(
"new RegExp('foo')",
"(regexp) => regexp.source",
- False,
{"type": "string", "value": "foo"},
),
(
"new Date(1654004849000)",
"(date) => date.toISOString()",
- False,
{"type": "string", "value": "2022-05-31T13:47:29.000Z"},
),
(
"new Map([['foo', 'bar']])",
"(map) => map.get('foo')",
- False,
{"type": "string", "value": "bar"},
),
(
"new Set(['foo'])",
"(set) => set.has('foo')",
- False,
{"type": "boolean", "value": True},
),
(
"{const weakMap = new WeakMap(); weakMap.set(weakMap, 'foo')}",
"(weakMap)=> weakMap.get(weakMap)",
- False,
{"type": "string", "value": "foo"},
),
(
"{const weakSet = new WeakSet(); weakSet.add(weakSet)}",
"(weakSet)=> weakSet.has(weakSet)",
- False,
{"type": "boolean", "value": True},
),
(
"new Error('error message')",
"(error) => error.message",
- False,
{"type": "string", "value": "error message"},
),
(
"new SyntaxError('syntax error message')",
"(error) => error.message",
- False,
{"type": "string", "value": "syntax error message"},
),
(
"new Promise((resolve) => resolve(3))",
"(promise) => promise",
- True,
{"type": "number", "value": 3},
),
(
- "new Promise(() => {})",
- "(promise) => promise",
- False,
- {"type": "promise"},
- ),
- (
"new Int8Array(2)",
"(int8Array) => int8Array.length",
- False,
{"type": "number", "value": 2},
),
(
"new ArrayBuffer(8)",
"(arrayBuffer) => arrayBuffer.byteLength",
- False,
{"type": "number", "value": 8},
),
- (
- "() => true",
- "(func) => func()",
- False,
- {"type": "boolean", "value": True}),
+ ("() => true", "(func) => func()", {"type": "boolean", "value": True}),
(
"(function() {return false;})",
"(func) => func()",
- False,
{"type": "boolean", "value": False},
),
(
"window.foo = 3; window",
"(window) => window.foo",
- False,
{"type": "number", "value": 3},
),
(
"window.url = new URL('https://example.com'); window.url",
"(url) => url.hostname",
- False,
{"type": "string", "value": "example.com"},
),
(
"({SOME_PROPERTY:'SOME_VALUE'})",
"(obj) => obj.SOME_PROPERTY",
- False,
{"type": "string", "value": "SOME_VALUE"},
),
],
)
async def test_remote_reference_argument(
- bidi_session, top_context, setup_expression, function_declaration, await_promise, expected
+ bidi_session, top_context, setup_expression, function_declaration, expected
):
remote_value_result = await bidi_session.script.evaluate(
expression=setup_expression,
@@ -268,7 +238,7 @@ async def test_remote_reference_argument(
result = await bidi_session.script.call_function(
function_declaration=function_declaration,
arguments=[{"handle": remote_value_handle}],
- await_promise=await_promise,
+ await_promise=True if remote_value_result["type"] == "promise" else False,
target=ContextTarget(top_context["context"]),
)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py
index 1dd6cd0aadf..005574b03ca 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/session/subscribe/invalid.py
@@ -148,7 +148,10 @@ async def test_subscribe_to_closed_tab(bidi_session, send_blocking_command):
# Try to subscribe to the closed context
with pytest.raises(NoSuchFrameException):
- response = await send_blocking_command(
+ await send_blocking_command(
"session.subscribe",
- {"events": ["log.entryAdded"], "contexts": [new_tab["context"]]},
+ {
+ "events": ["log.entryAdded"],
+ "contexts": [new_tab["context"]]
+ },
)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py b/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py
index bada57942b4..492718292a1 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/element_click/navigate.py
@@ -1,5 +1,6 @@
import pytest
-from webdriver import error
+
+from webdriver.error import NoSuchElementException
from tests.support.asserts import assert_success
from tests.support.helpers import wait_for_new_handle
@@ -120,7 +121,7 @@ def test_link_from_toplevel_context_with_target(session, inline, target):
wait = Poll(
session,
timeout=5,
- ignored_exceptions=error.NoSuchElementException,
+ ignored_exceptions=NoSuchElementException,
message="Expected element has not been found")
wait.until(lambda s: s.find.css("#foo"))
@@ -159,7 +160,7 @@ def test_link_from_nested_context_with_target(session, inline, iframe, target):
wait = Poll(
session,
timeout=5,
- ignored_exceptions=error.NoSuchElementException,
+ ignored_exceptions=NoSuchElementException,
message="Expected element has not been found")
wait.until(lambda s: s.find.css("#foo"))
@@ -179,8 +180,6 @@ def test_link_cross_origin(session, inline, url):
assert_success(response)
assert session.url == target_page
- with pytest.raises(error.StaleElementReferenceException):
- link.click()
session.find.css("#delete", all=False)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py b/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py
index 61c66e201b9..f27be403f9e 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/forward/forward.py
@@ -190,6 +190,6 @@ def test_cross_origin(session, url):
assert session.url == second_page
- with pytest.raises(error.StaleElementReferenceException):
+ with pytest.raises(error.NoSuchElementException):
elem.click()
elem = session.find.css("#delete", all=False)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py b/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py
index a367fc105e1..d61377af275 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/navigate_to/navigate.py
@@ -74,7 +74,7 @@ def test_cross_origin(session, inline, url):
assert_success(response)
assert session.url == second_page
- with pytest.raises(error.StaleElementReferenceException):
+ with pytest.raises(error.NoSuchElementException):
elem.click()
session.find.css("#delete", all=False)
diff --git a/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpParameters-codec.html b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpParameters-codec.html
new file mode 100644
index 00000000000..5c81349b152
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpParameters-codec.html
@@ -0,0 +1,422 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>RTCRtpEncodingParameters codec property</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../webrtc/RTCPeerConnection-helper.js"></script>
+<script src="../webrtc/third_party/sdp/sdp.js"></script>
+<script src="../webrtc/simulcast/simulcast.js"></script>
+<script>
+ 'use strict';
+
+ function findFirstCodec(name) {
+ return RTCRtpSender.getCapabilities(name.split('/')[0]).codecs.filter(c => c.mimeType.localeCompare(name, undefined, { sensitivity: 'base' }) === 0)[0];
+ }
+
+ function codecsNotMatching(mimeType) {
+ return RTCRtpSender.getCapabilities(mimeType.split('/')[0]).codecs.filter(c => c.mimeType.localeCompare(mimeType, undefined, {sensitivity: 'base'}) !== 0);
+ }
+
+ function assertCodecEquals(a, b) {
+ assert_equals(a.mimeType, b.mimeType);
+ assert_equals(a.clockRate, b.clockRate);
+ assert_equals(a.channels, b.channels);
+ assert_equals(a.sdpFmtpLine, b.sdpFmtpLine);
+ }
+
+ async function codecsForSender(sender) {
+ const rids = sender.getParameters().encodings.map(e => e.rid);
+ const stats = await sender.getStats();
+ const codecs = [...stats]
+ .filter(([k, v]) => v.type === 'outbound-rtp')
+ .sort(([k, v], [k2, v2]) => rids.indexOf(v.rid) - rids.indexOf(v2.rid))
+ .map(([k, v]) => stats.get(v.codecId).mimeType);
+ return codecs;
+ }
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const { sender } = pc.addTransceiver('audio');
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ assert_equals(encoding.codec, undefined);
+ }, `Codec should be undefined by default on audio encodings`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const { sender } = pc.addTransceiver('video');
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ assert_equals(encoding.codec, undefined);
+ }, `Codec should be undefined by default on video encodings`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const opus = findFirstCodec('audio/opus');
+
+ const { sender } = pc.addTransceiver('audio', {
+ sendEncodings: [{codec: opus}],
+ });
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ assertCodecEquals(opus, encoding.codec);
+ }, `Creating an audio sender with addTransceiver and codec should work`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const vp8 = findFirstCodec('video/VP8');
+
+ const { sender } = pc.addTransceiver('video', {
+ sendEncodings: [{codec: vp8}],
+ });
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ assertCodecEquals(vp8, encoding.codec);
+ }, `Creating a video sender with addTransceiver and codec should work`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const opus = findFirstCodec('audio/opus');
+
+ const { sender } = pc.addTransceiver('audio');
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = opus;
+ await sender.setParameters(param);
+ param = sender.getParameters();
+ encoding = param.encodings[0];
+
+ assertCodecEquals(opus, encoding.codec);
+
+ delete encoding.codec;
+ await sender.setParameters(param);
+ param = sender.getParameters();
+ encoding = param.encodings[0];
+
+ assert_equals(encoding.codec, undefined);
+ }, `Setting codec on an audio sender with setParameters should work`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const vp8 = findFirstCodec('video/VP8');
+
+ const { sender } = pc.addTransceiver('video');
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = vp8;
+ await sender.setParameters(param);
+ param = sender.getParameters();
+ encoding = param.encodings[0];
+
+ assertCodecEquals(vp8, encoding.codec);
+
+ delete encoding.codec;
+ await sender.setParameters(param);
+ param = sender.getParameters();
+ encoding = param.encodings[0];
+
+ assert_equals(encoding.codec, undefined);
+ }, `Setting codec on a video sender with setParameters should work`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const newCodec = {
+ mimeType: "audio/newCodec",
+ clockRate: 90000,
+ channel: 2,
+ };
+
+ assert_throws_dom('OperationError', () => pc.addTransceiver('video', {
+ sendEncodings: [{codec: newCodec}],
+ }));
+ }, `Creating an audio sender with addTransceiver and non-existing codec should throw OperationError`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const newCodec = {
+ mimeType: "video/newCodec",
+ clockRate: 90000,
+ };
+
+ assert_throws_dom('OperationError', () => pc.addTransceiver('video', {
+ sendEncodings: [{codec: newCodec}],
+ }));
+ }, `Creating a video sender with addTransceiver and non-existing codec should throw OperationError`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const newCodec = {
+ mimeType: "audio/newCodec",
+ clockRate: 90000,
+ channel: 2,
+ };
+
+ const { sender } = pc.addTransceiver('audio');
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = newCodec;
+ await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param));
+ }, `Setting a non-existing codec on an audio sender with setParameters should throw InvalidModificationError`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const newCodec = {
+ mimeType: "video/newCodec",
+ clockRate: 90000,
+ };
+
+ const { sender } = pc.addTransceiver('video');
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = newCodec;
+ await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param));
+ }, `Setting a non-existing codec on a video sender with setParameters should throw InvalidModificationError`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const opus = findFirstCodec('audio/opus');
+ const nonOpus = codecsNotMatching(opus.mimeType);
+
+ const transceiver = pc.addTransceiver('audio');
+ const sender = transceiver.sender;
+
+ transceiver.setCodecPreferences(nonOpus);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = opus;
+ await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param));
+ }, `Setting a non-preferred codec on an audio sender with setParameters should throw InvalidModificationError`);
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const vp8 = findFirstCodec('video/VP8');
+ const nonVP8 = codecsNotMatching(vp8.mimeType);
+
+ const transceiver = pc.addTransceiver('video');
+ const sender = transceiver.sender;
+
+ transceiver.setCodecPreferences(nonVP8);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = vp8;
+ await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param));
+ }, `Setting a non-preferred codec on a video sender with setParameters should throw InvalidModificationError`);
+
+ promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ const opus = findFirstCodec('audio/opus');
+ const nonOpus = codecsNotMatching(opus.mimeType);
+
+ const transceiver = pc1.addTransceiver('audio');
+ const sender = transceiver.sender;
+
+ transceiver.setCodecPreferences(nonOpus);
+
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = opus;
+ await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param));
+ }, `Setting a non-negotiated codec on an audio sender with setParameters should throw InvalidModificationError`);
+
+ promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ const vp8 = findFirstCodec('video/VP8');
+ const nonVP8 = codecsNotMatching(vp8.mimeType);
+
+ const transceiver = pc1.addTransceiver('video');
+ const sender = transceiver.sender;
+
+ transceiver.setCodecPreferences(nonVP8);
+
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ encoding.codec = vp8;
+ await promise_rejects_dom(t, "InvalidModificationError", sender.setParameters(param));
+ }, `Setting a non-negotiated codec on a video sender with setParameters should throw InvalidModificationError`);
+
+ promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ const opus = findFirstCodec('audio/opus');
+ const nonOpus = codecsNotMatching(opus.mimeType);
+
+ const transceiver = pc1.addTransceiver('audio', {
+ sendEncodings: [{codec: opus}],
+ });
+ const sender = transceiver.sender;
+
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ assertCodecEquals(opus, encoding.codec);
+
+ transceiver.setCodecPreferences(nonOpus);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ param = sender.getParameters();
+ encoding = param.encodings[0];
+
+ assert_equals(encoding.codec, undefined);
+ }, `Codec should be undefined after negotiating away the currently set codec on an audio sender`);
+
+ promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+
+ const vp8 = findFirstCodec('video/VP8');
+ const nonVP8 = codecsNotMatching(vp8.mimeType);
+
+ const transceiver = pc1.addTransceiver('video', {
+ sendEncodings: [{codec: vp8}],
+ });
+ const sender = transceiver.sender;
+
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+
+ assertCodecEquals(vp8, encoding.codec);
+
+ transceiver.setCodecPreferences(nonVP8);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ param = sender.getParameters();
+ encoding = param.encodings[0];
+
+ assert_equals(encoding.codec, undefined);
+ }, `Codec should be undefined after negotiating away the currently set codec on a video sender`);
+
+ promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ const stream = await getNoiseStream({audio:true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+
+ const opus = findFirstCodec('audio/opus');
+ const nonOpus = codecsNotMatching(opus.mimeType);
+
+ const transceiver = pc1.addTransceiver(stream.getTracks()[0]);
+ const sender = transceiver.sender;
+
+ transceiver.setCodecPreferences(nonOpus.concat([opus]));
+
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ let codecs = await codecsForSender(sender);
+ assert_not_equals(codecs[0], opus.mimeType);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+ encoding.codec = opus;
+
+ await sender.setParameters(param);
+
+ codecs = await codecsForSender(sender);
+ assert_array_equals(codecs, [opus.mimeType]);
+ }, `Stats output-rtp should match the selected codec in non-simulcast usecase on an audio sender`);
+
+ promise_test(async (t) => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ t.add_cleanup(() => pc2.close());
+ const stream = await getNoiseStream({video:true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+
+ const vp8 = findFirstCodec('video/VP8');
+ const nonVP8 = codecsNotMatching(vp8.mimeType);
+
+ const transceiver = pc1.addTransceiver(stream.getTracks()[0]);
+ const sender = transceiver.sender;
+
+ transceiver.setCodecPreferences(nonVP8.concat([vp8]));
+
+ exchangeIceCandidates(pc1, pc2);
+ await exchangeOfferAnswer(pc1, pc2);
+
+ let codecs = await codecsForSender(sender);
+ assert_not_equals(codecs[0], vp8.mimeType);
+
+ let param = sender.getParameters();
+ let encoding = param.encodings[0];
+ encoding.codec = vp8;
+
+ await sender.setParameters(param);
+
+ codecs = await codecsForSender(sender);
+ assert_array_equals(codecs, [vp8.mimeType]);
+ }, `Stats output-rtp should match the selected codec in non-simulcast usecase on a video sender`);
+</script>
diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/current/current.html b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/current/current.html
new file mode 100644
index 00000000000..82a48d40990
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/current/current.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>Current page used as a test helper</title>
diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/incumbent/incumbent.html b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/incumbent/incumbent.html
new file mode 100644
index 00000000000..2c5572b7749
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/incumbent/incumbent.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>Incumbent page used as a test helper</title>
+
+<iframe src="../current/current.html" id="current"></iframe>
+
+<script>
+ const current = document.querySelector("#current").contentWindow;
+
+ window.hello = () => {
+ window.ws = new current.WebSocket('foo');
+ ws.close();
+ };
+</script>
diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/url-parsing.html b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/url-parsing.html
new file mode 100644
index 00000000000..21ef6cd3a95
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/multi-globals/url-parsing/url-parsing.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<title>Multiple globals for base URL in WebSocket constructor</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!-- This is the entry global -->
+
+<iframe src="incumbent/incumbent.html"></iframe>
+
+<script>
+async_test((t) => {
+ onload = t.step_func_done(() => {
+ frames[0].hello();
+ // Inside constructors, "this's relevant settings object" === "current settings object",
+ // because of how "this" is constructed.
+ // https://github.com/whatwg/websockets/issues/46
+ const expectedUrl = new URL('current/foo', location.href);
+ expectedUrl.protocol = 'ws:';
+ assert_equals(frames[0].ws.url, expectedUrl.href);
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js
index dc7133bb867..d5b8e3bbda1 100644
--- a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js
+++ b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js
@@ -171,17 +171,24 @@ promise_test(async t => {
promise_test(async t => {
// Establish a WebTransport session.
- const wt = new WebTransport(webtransport_url('echo.py'));
+ const wt = new WebTransport(webtransport_url('echo_datagram_length.py'));
await wt.ready;
const writer = wt.datagrams.writable.getWriter();
const reader = wt.datagrams.readable.getReader();
// Write and read max-size datagram.
- await writer.write(new Uint8Array(wt.datagrams.maxDatagramSize));
+ const maxDatagramSize = wt.datagrams.maxDatagramSize;
+ await writer.write(new Uint8Array(maxDatagramSize));
+
+ // the server should echo the datagram length encoded in JSON
const { value: token, done } = await reader.read();
assert_false(done);
- assert_equals(token.length, wt.datagrams.maxDatagramSize);
+
+ const decoder = new TextDecoder();
+ const datagramStr = decoder.decode(token);
+ const jsonObject = JSON.parse(datagramStr);
+ assert_equals(jsonObject['length'], maxDatagramSize);
}, 'Transfer max-size datagram');
promise_test(async t => {
diff --git a/tests/wpt/web-platform-tests/webtransport/handlers/echo_datagram_length.py b/tests/wpt/web-platform-tests/webtransport/handlers/echo_datagram_length.py
new file mode 100644
index 00000000000..f0610b085fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webtransport/handlers/echo_datagram_length.py
@@ -0,0 +1,8 @@
+import json
+
+def datagram_received(session, data: bytes):
+ # encode the received length into a JSON string and send back
+ data_len = len(data)
+ out_datagram_json = json.dumps({'length': data_len})
+ out_data = out_datagram_json.encode()
+ session.send_datagram(out_data)