aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/meta-legacy-layout/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini120
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-computed.html.ini45
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-valid.html.ini54
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-computed.html.ini45
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-valid.html.ini51
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-002.htm.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-004.htm.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-color/light-dark-basic.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-color/light-dark-currentcolor.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-color/light-dark-inheritance.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini27
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-text/white-space/trailing-other-space-separators-break-spaces-004.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-computed.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-valid.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom-view/offsetTopLeft-border-box.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/css/selectors/is-where-parsing.html.ini96
-rw-r--r--tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini80
-rw-r--r--tests/wpt/meta-legacy-layout/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini27
-rw-r--r--tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini (renamed from tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini)0
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-01.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-02.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-03.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-04.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-05.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-06.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-07.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-08.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-09.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-10.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-11.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-12.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-13.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-14.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-15.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-16.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-17.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-18.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-19.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-20.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-21.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-22.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-23.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-24.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-25.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-26.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-27.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-28.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-29.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-30.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-31.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-32.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-33.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-34.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-35.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-36.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-37.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-38.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-39.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-40.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-41.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini5
-rw-r--r--tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display-type-002.tentative.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-details-element/name-attribute.html.ini (renamed from tests/wpt/meta/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini)7
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/interfaces.html.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini7
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/permission-element/no-end-tag-no-contents.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/uievents/idlharness.window.js.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/webaudio/idlharness.https.window.js.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/webgl/idlharness.any.js.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/webmessaging/with-ports/017.html.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/workers/shared-worker-partitioned-cookies.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/xhr/xhr-timeout-longtask.any.js.ini6
-rw-r--r--tests/wpt/meta/MANIFEST.json1755
-rw-r--r--tests/wpt/meta/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini120
-rw-r--r--tests/wpt/meta/css/css-align/parsing/align-tracks-computed.html.ini45
-rw-r--r--tests/wpt/meta/css/css-align/parsing/align-tracks-valid.html.ini54
-rw-r--r--tests/wpt/meta/css/css-align/parsing/justify-tracks-computed.html.ini45
-rw-r--r--tests/wpt/meta/css/css-align/parsing/justify-tracks-valid.html.ini51
-rw-r--r--tests/wpt/meta/css/css-backgrounds/border-image-repeat-002.htm.ini2
-rw-r--r--tests/wpt/meta/css/css-backgrounds/border-image-repeat-004.htm.ini2
-rw-r--r--tests/wpt/meta/css/css-backgrounds/border-image-slice-004.htm.ini2
-rw-r--r--tests/wpt/meta/css/css-color/light-dark-basic.html.ini6
-rw-r--r--tests/wpt/meta/css/css-color/light-dark-currentcolor.html.ini2
-rw-r--r--tests/wpt/meta/css/css-color/light-dark-inheritance.html.ini2
-rw-r--r--tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini75
-rw-r--r--tests/wpt/meta/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini27
-rw-r--r--tests/wpt/meta/css/css-ui/parsing/form-sizing-computed.html.ini6
-rw-r--r--tests/wpt/meta/css/css-ui/parsing/form-sizing-valid.html.ini6
-rw-r--r--tests/wpt/meta/css/selectors/is-where-parsing.html.ini96
-rw-r--r--tests/wpt/meta/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini6
-rw-r--r--tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini80
-rw-r--r--tests/wpt/meta/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini27
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini2
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini12
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/the-window-object/open-close/creating_browsing_context_test_01.html.ini3
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-01.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-02.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-03.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-04.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-05.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-06.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-07.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-08.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-09.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-10.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-11.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-12.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-13.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-14.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-15.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-16.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-17.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-18.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-19.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-20.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-21.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-22.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-23.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-24.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-25.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-26.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-27.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-28.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-29.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-30.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-31.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-32.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-33.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-34.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-35.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-36.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-37.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-38.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-39.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-40.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-41.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini18
-rw-r--r--tests/wpt/meta/html/editing/dnd/the-draggable-attribute/draggable_attribute.html.ini6
-rw-r--r--tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini3
-rw-r--r--tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini3
-rw-r--r--tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini5
-rw-r--r--tests/wpt/meta/html/rendering/the-details-element/details-display-type-002.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/forms/historical.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/interactive-elements/the-details-element/name-attribute.html.ini (renamed from tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini)10
-rw-r--r--tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/interfaces.html.ini9
-rw-r--r--tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/permission-element/no-end-tag-no-contents.html.ini3
-rw-r--r--tests/wpt/meta/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini3
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini3
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini6
-rw-r--r--tests/wpt/meta/uievents/idlharness.window.js.ini18
-rw-r--r--tests/wpt/meta/webaudio/idlharness.https.window.js.ini9
-rw-r--r--tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini3
-rw-r--r--tests/wpt/meta/webgl/idlharness.any.js.ini6
-rw-r--r--tests/wpt/meta/webmessaging/without-ports/018.html.ini4
-rw-r--r--tests/wpt/meta/workers/shared-worker-partitioned-cookies.tentative.https.html.ini3
-rw-r--r--tests/wpt/tests/WebCryptoAPI/import_export/okp_importKey.https.any.js32
-rw-r--r--tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js1
-rw-r--r--tests/wpt/tests/WebCryptoAPI/sign_verify/hmac.js1
-rw-r--r--tests/wpt/tests/accname/name/comp_embedded_control.html113
-rw-r--r--tests/wpt/tests/accname/name/comp_hidden_not_referenced.html76
-rw-r--r--tests/wpt/tests/clipboard-apis/async-unsanitized-standard-html-formats-write-read.tentative.https.html64
-rw-r--r--tests/wpt/tests/css/css-align/parsing/align-tracks-computed.html37
-rw-r--r--tests/wpt/tests/css/css-align/parsing/align-tracks-invalid.html41
-rw-r--r--tests/wpt/tests/css/css-align/parsing/align-tracks-valid.html44
-rw-r--r--tests/wpt/tests/css/css-align/parsing/justify-tracks-computed.html35
-rw-r--r--tests/wpt/tests/css/css-align/parsing/justify-tracks-invalid.html42
-rw-r--r--tests/wpt/tests/css/css-align/parsing/justify-tracks-valid.html41
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-001.html24
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-002-ref.html49
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-002.html52
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html137
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html86
-rw-r--r--tests/wpt/tests/css/css-backgrounds/border-image-repeat-001.htmbin2722 -> 0 bytes
-rw-r--r--tests/wpt/tests/css/css-backgrounds/border-image-repeat-002.htmbin2718 -> 1822 bytes
-rw-r--r--tests/wpt/tests/css/css-backgrounds/border-image-repeat-003.htmbin3060 -> 0 bytes
-rw-r--r--tests/wpt/tests/css/css-backgrounds/border-image-repeat-004.htmbin2502 -> 1325 bytes
-rw-r--r--tests/wpt/tests/css/css-backgrounds/border-image-slice-004.htmbin2508 -> 1305 bytes
-rw-r--r--tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-002-ref.html54
-rw-r--r--tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-004-ref.html54
-rw-r--r--tests/wpt/tests/css/css-backgrounds/reference/border-image-slice-004-ref.html21
-rw-r--r--tests/wpt/tests/css/css-backgrounds/support/9grid20-40-red.pngbin0 -> 738 bytes
-rw-r--r--tests/wpt/tests/css/css-cascade/tons-of-declarations-crash.html6
-rw-r--r--tests/wpt/tests/css/css-color/light-dark-basic.html26
-rw-r--r--tests/wpt/tests/css/css-color/light-dark-currentcolor.html16
-rw-r--r--tests/wpt/tests/css/css-color/light-dark-inheritance.html22
-rw-r--r--tests/wpt/tests/css/css-flexbox/order/order-abs-children-painting-order-different-container.html53
-rw-r--r--tests/wpt/tests/css/css-fonts/font-synthesis-08-ref.html31
-rw-r--r--tests/wpt/tests/css/css-fonts/font-synthesis-08.html43
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001-ref.html120
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001.html80
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001-ref.html116
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001.html91
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001-ref.html87
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001.html67
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002-ref.html68
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002.html71
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001-ref.html114
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001.html81
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001-ref.html117
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001.html91
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001-ref.html86
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001.html67
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002-ref.html68
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002.html72
-rw-r--r--tests/wpt/tests/css/css-grid/subgrid/align-self-baseline-with-subgrid-mbp.html41
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/clip-path-foreignobject-non-zero-xy.html14
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/clip-path-shape-foreignobject-non-zero-xy.html11
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-offset-print.html13
-rw-r--r--tests/wpt/tests/css/css-properties-values-api/determine-registration.html32
-rw-r--r--tests/wpt/tests/css/css-properties-values-api/get-computed-style-enumeration.html96
-rw-r--r--tests/wpt/tests/css/css-properties-values-api/invalid-at-computed-value-time.html73
-rw-r--r--tests/wpt/tests/css/css-scoping/slotted-parsing.html13
-rw-r--r--tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html41
-rw-r--r--tests/wpt/tests/css/css-ui/parsing/form-sizing-computed.html4
-rw-r--r--tests/wpt/tests/css/css-ui/parsing/form-sizing-invalid.html2
-rw-r--r--tests/wpt/tests/css/css-ui/parsing/form-sizing-valid.html4
-rw-r--r--tests/wpt/tests/css/css-writing-modes/forms/file-input-computed-style.html39
-rw-r--r--tests/wpt/tests/css/css-writing-modes/forms/file-input-horizontal.optional.html12
-rw-r--r--tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical-rtl.optional.html12
-rw-r--r--tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical.optional.html12
-rw-r--r--tests/wpt/tests/css/css-writing-modes/forms/select-multiple-keyboard-selection.optional.html87
-rw-r--r--tests/wpt/tests/css/selectors/is-where-parsing.html38
-rw-r--r--tests/wpt/tests/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html2
-rw-r--r--tests/wpt/tests/css/selectors/parsing/parse-has.html2
-rw-r--r--tests/wpt/tests/css/support/parsing-testcommon.js9
-rw-r--r--tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js341
-rw-r--r--tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html74
-rw-r--r--tests/wpt/tests/dom/parts/basic-dom-part-objects.tentative.html1
-rw-r--r--tests/wpt/tests/fledge/tentative/TODO3
-rw-r--r--tests/wpt/tests/fledge/tentative/cross-origin.https.sub.window.js262
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py4
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/fledge-util.js6
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/subordinate-frame.sub.html (renamed from tests/wpt/tests/fledge/tentative/resources/iframe.sub.html)20
-rw-r--r--tests/wpt/tests/fs/resources/test-helpers.js10
-rw-r--r--tests/wpt/tests/fs/script-tests/FileSystemFileHandle-move.js14
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11.html33
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12.html31
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15-ref.html24
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20-ref.html22
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21-ref.html22
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23-ref.html22
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24-ref.html22
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25-ref.html25
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26-ref.html25
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27-ref.html25
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28-ref.html25
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29-ref.html25
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30-ref.html25
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32.html30
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39-ref.html24
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40-ref.html23
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41-ref.html24
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41.html32
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-utils.js8
-rw-r--r--tests/wpt/tests/html/dom/elements/global-attributes/lang-attribute-shadow.window.js81
-rw-r--r--tests/wpt/tests/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html40
-rw-r--r--tests/wpt/tests/html/rendering/the-details-element/details-display-type-002-ref.html10
-rw-r--r--tests/wpt/tests/html/rendering/the-details-element/details-display-type-002.tentative.html17
-rw-r--r--tests/wpt/tests/html/rendering/widgets/form-sizing-input-number.tentative.html4
-rw-r--r--tests/wpt/tests/html/rendering/widgets/form-sizing-input-text.tentative.html4
-rw-r--r--tests/wpt/tests/html/rendering/widgets/form-sizing-select.tentative.html12
-rw-r--r--tests/wpt/tests/html/rendering/widgets/form-sizing-textarea.tentative.html4
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html18
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resources/media-min-width.html12
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-img-element/image-compositing-change.html2
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html7
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-input-element/input-importNode-to-detached-document-crash.html11
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-details-element/name-attribute.html (renamed from tests/wpt/tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html)58
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html (renamed from tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html)0
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html (renamed from tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html)0
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html (renamed from tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html)0
-rw-r--r--tests/wpt/tests/html/semantics/interfaces.js1
-rw-r--r--tests/wpt/tests/html/semantics/permission-element/no-end-tag-no-contents.html27
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-1.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-2.html1
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-iframe.html1
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/helper.js10
-rw-r--r--tests/wpt/tests/interfaces/WEBGL_clip_cull_distance.idl2
-rw-r--r--tests/wpt/tests/interfaces/WEBGL_multi_draw.idl20
-rw-r--r--tests/wpt/tests/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl18
-rw-r--r--tests/wpt/tests/interfaces/audio-session.idl33
-rw-r--r--tests/wpt/tests/interfaces/clipboard-apis.idl2
-rw-r--r--tests/wpt/tests/interfaces/css-view-transitions-2.idl9
-rw-r--r--tests/wpt/tests/interfaces/edit-context.idl11
-rw-r--r--tests/wpt/tests/interfaces/fenced-frame.idl26
-rw-r--r--tests/wpt/tests/interfaces/html.idl2
-rw-r--r--tests/wpt/tests/interfaces/intersection-observer.idl2
-rw-r--r--tests/wpt/tests/interfaces/mediasession.idl2
-rw-r--r--tests/wpt/tests/interfaces/shared-storage.idl11
-rw-r--r--tests/wpt/tests/interfaces/turtledove.idl3
-rw-r--r--tests/wpt/tests/interfaces/ua-client-hints.idl2
-rw-r--r--tests/wpt/tests/interfaces/uievents.idl2
-rw-r--r--tests/wpt/tests/interfaces/webaudio.idl9
-rw-r--r--tests/wpt/tests/interfaces/webgl2.idl72
-rw-r--r--tests/wpt/tests/interfaces/webrtc-encoded-transform.idl4
-rw-r--r--tests/wpt/tests/interfaces/webtransport.idl7
-rw-r--r--tests/wpt/tests/mst-content-hint/RTCRtpSendParameters-degradationEffect.html95
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html10
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/anchor-click.html8
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/history-back-same-doc.html9
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/history-pushState.html6
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/history-replaceState.html4
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/location-api.html4
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/navigation-back-forward-same-doc.html13
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-replace-same-doc.html4
-rw-r--r--tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-same-doc.html6
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/current-basic.html34
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/entries-after-navigations-in-multiple-windows.html3
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/entries-when-inactive.html9
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/index-not-in-entries.html4
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-cross-document.html3
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-same-document.html11
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-reload.html3
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-replace.html3
-rw-r--r--tests/wpt/tests/navigation-api/navigation-history-entry/sameDocument-after-fragment-navigate.html11
-rw-r--r--tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-before-popstate-intercept.html3
-rw-r--r--tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-dispose-ordering.html3
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-for-full-session-history.tentative.html3
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-for-navigation-in-child.html16
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-intercept.html14
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-navigate-during.html10
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replace-with-intercept.html5
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replaceState.html5
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document.html14
-rw-r--r--tests/wpt/tests/navigation-api/per-entry-events/dispose-skip-current-on-truncate.html15
-rw-r--r--tests/wpt/tests/navigation-api/state/same-document-away-and-back-location-api.html14
-rw-r--r--tests/wpt/tests/navigation-api/state/same-document-away-and-back-navigation-api.html14
-rw-r--r--tests/wpt/tests/navigation-api/updateCurrentEntry-method/same-document-away-and-back-location-api.html10
-rw-r--r--tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html36
-rw-r--r--tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html.sub.headers3
-rw-r--r--tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html32
-rw-r--r--tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html.sub.headers2
-rw-r--r--tests/wpt/tests/resources/chromium/generic_sensor_mocks.js11
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/keydown.tentative.html2
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/keypress.tentative.html31
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/keyup.tentative.html30
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js5
-rw-r--r--tests/wpt/tests/svg/types/scripted/SVGLength-px-with-context.html36
-rwxr-xr-xtests/wpt/tests/tools/ci/run_tc.py9
-rw-r--r--tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py10
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py33
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py18
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py5
-rw-r--r--tests/wpt/tests/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html50
-rw-r--r--tests/wpt/tests/webcodecs/audio-encoder.https.any.js2
-rw-r--r--tests/wpt/tests/webcodecs/transfering.https.any.js54
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/script/call_function/invalid.py12
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/script/call_function/user_activation.py43
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/script/evaluate/invalid.py10
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/script/evaluate/user_activation.py43
-rw-r--r--tests/wpt/tests/websockets/interfaces/WebSocket/close/close-connecting-async.any.js31
-rw-r--r--tests/wpt/tests/workers/shared-worker-partitioned-cookies.tentative.https.html62
-rw-r--r--tests/wpt/tests/workers/support/shared-worker-echo-cookies.js40
-rw-r--r--tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-frame.html50
-rw-r--r--tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-window.html26
-rw-r--r--tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-helper.js28
-rw-r--r--tests/wpt/webgl/meta-legacy-layout/conformance2/state/gl-object-get-calls.html.ini4
466 files changed, 8189 insertions, 3117 deletions
diff --git a/tests/wpt/meta-legacy-layout/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini b/tests/wpt/meta-legacy-layout/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini
index ed0fd4312df..4c3061e29a5 100644
--- a/tests/wpt/meta-legacy-layout/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini
+++ b/tests/wpt/meta-legacy-layout/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini
@@ -287,6 +287,66 @@
[Good parameters: X448 bits (jwk, object(crv, d, x, kty), {name: X448}, false, [deriveKey, deriveBits, deriveKey, deriveBits\])]
expected: FAIL
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(kty, crv, x), {name: X25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(kty, crv, x), {name: X448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
+
[okp_importKey.https.any.worker.html]
[Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, true, [\])]
@@ -576,3 +636,63 @@
[Good parameters: X448 bits (jwk, object(crv, d, x, kty), {name: X448}, false, [deriveKey, deriveBits, deriveKey, deriveBits\])]
expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(kty, crv, x), {name: X25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(kty, crv, x), {name: X448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-computed.html.ini
deleted file mode 100644
index e63929a5b30..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-computed.html.ini
+++ /dev/null
@@ -1,45 +0,0 @@
-[align-tracks-computed.html]
- [Property align-tracks value 'normal']
- expected: FAIL
-
- [Property align-tracks value 'baseline']
- expected: FAIL
-
- [Property align-tracks value 'last baseline']
- expected: FAIL
-
- [Property align-tracks value 'space-between']
- expected: FAIL
-
- [Property align-tracks value 'space-around']
- expected: FAIL
-
- [Property align-tracks value 'space-evenly']
- expected: FAIL
-
- [Property align-tracks value 'stretch']
- expected: FAIL
-
- [Property align-tracks value 'center']
- expected: FAIL
-
- [Property align-tracks value 'start']
- expected: FAIL
-
- [Property align-tracks value 'end']
- expected: FAIL
-
- [Property align-tracks value 'flex-start']
- expected: FAIL
-
- [Property align-tracks value 'flex-end']
- expected: FAIL
-
- [Property align-tracks value 'unsafe end']
- expected: FAIL
-
- [Property align-tracks value 'safe flex-start']
- expected: FAIL
-
- [Property align-tracks value 'normal, normal']
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-valid.html.ini
deleted file mode 100644
index cbe763cc151..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-align/parsing/align-tracks-valid.html.ini
+++ /dev/null
@@ -1,54 +0,0 @@
-[align-tracks-valid.html]
- [e.style['align-tracks'\] = "normal" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "first baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "last baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "space-between" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "space-around" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "space-evenly" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "stretch" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "center" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "start" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "end" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "flex-start" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "flex-end" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "unsafe end" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "safe flex-start" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "flex-start, last baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "normal, normal" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "start, flex-end, flex-end, flex-end, flex-end" should set the property value]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-computed.html.ini
deleted file mode 100644
index c5b835863d7..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-computed.html.ini
+++ /dev/null
@@ -1,45 +0,0 @@
-[justify-tracks-computed.html]
- [Property justify-tracks value 'normal']
- expected: FAIL
-
- [Property justify-tracks value 'space-between']
- expected: FAIL
-
- [Property justify-tracks value 'space-around']
- expected: FAIL
-
- [Property justify-tracks value 'space-evenly']
- expected: FAIL
-
- [Property justify-tracks value 'stretch']
- expected: FAIL
-
- [Property justify-tracks value 'center']
- expected: FAIL
-
- [Property justify-tracks value 'start']
- expected: FAIL
-
- [Property justify-tracks value 'end']
- expected: FAIL
-
- [Property justify-tracks value 'flex-start']
- expected: FAIL
-
- [Property justify-tracks value 'flex-end']
- expected: FAIL
-
- [Property justify-tracks value 'unsafe end']
- expected: FAIL
-
- [Property justify-tracks value 'safe flex-start']
- expected: FAIL
-
- [Property justify-tracks value 'left']
- expected: FAIL
-
- [Property justify-tracks value 'unsafe right']
- expected: FAIL
-
- [Property justify-tracks value 'normal, normal']
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-valid.html.ini
deleted file mode 100644
index 641b10fa7bd..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-align/parsing/justify-tracks-valid.html.ini
+++ /dev/null
@@ -1,51 +0,0 @@
-[justify-tracks-valid.html]
- [e.style['justify-tracks'\] = "normal" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "space-between" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "space-around" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "space-evenly" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "stretch" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "center" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "start" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "end" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "flex-start" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "flex-end" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "unsafe end" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "safe flex-start" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "left" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "unsafe right" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "flex-start, last baseline" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "normal, normal" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "start, flex-end, flex-end, flex-end, flex-end" should set the property value]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-002.htm.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-002.htm.ini
new file mode 100644
index 00000000000..fb4031b3d52
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-002.htm.ini
@@ -0,0 +1,2 @@
+[border-image-repeat-002.htm]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-004.htm.ini b/tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-004.htm.ini
new file mode 100644
index 00000000000..7ae2c899b70
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-backgrounds/border-image-repeat-004.htm.ini
@@ -0,0 +1,2 @@
+[border-image-repeat-004.htm]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-color/light-dark-basic.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/light-dark-basic.html.ini
new file mode 100644
index 00000000000..e04d692f0eb
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-color/light-dark-basic.html.ini
@@ -0,0 +1,6 @@
+[light-dark-basic.html]
+ [light-dark(white, black)]
+ expected: FAIL
+
+ [light-dark(light-dark(white, red), red)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-color/light-dark-currentcolor.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/light-dark-currentcolor.html.ini
new file mode 100644
index 00000000000..669af6d8ea5
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-color/light-dark-currentcolor.html.ini
@@ -0,0 +1,2 @@
+[light-dark-currentcolor.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-color/light-dark-inheritance.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/light-dark-inheritance.html.ini
new file mode 100644
index 00000000000..bf8493daf3a
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-color/light-dark-inheritance.html.ini
@@ -0,0 +1,2 @@
+[light-dark-inheritance.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini b/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini
index 2b2e0fce8eb..80111fb0236 100644
--- a/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini
@@ -1,5 +1,4 @@
[position-absolute-013.html]
- expected: TIMEOUT
[.flexbox 309]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini
deleted file mode 100644
index 52b0d0166bc..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini
+++ /dev/null
@@ -1,27 +0,0 @@
-[text-spacing-trim-combinations-001.html]
- ["国((国"]
- expected: FAIL
-
- ["国・(国"]
- expected: FAIL
-
- ["国)(国"]
- expected: FAIL
-
- ["国 (国"]
- expected: FAIL
-
- ["国))国"]
- expected: FAIL
-
- ["国)・国"]
- expected: FAIL
-
- ["国) 国"]
- expected: FAIL
-
- ["国(((国"]
- expected: FAIL
-
- ["国)))国"]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-text/white-space/trailing-other-space-separators-break-spaces-004.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/white-space/trailing-other-space-separators-break-spaces-004.html.ini
deleted file mode 100644
index 3257d1b4d49..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-text/white-space/trailing-other-space-separators-break-spaces-004.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[trailing-other-space-separators-break-spaces-004.html]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-computed.html.ini
index 39141cebc56..25c7ccdbe18 100644
--- a/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-computed.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-computed.html.ini
@@ -4,3 +4,9 @@
[Property form-sizing value 'normal']
expected: FAIL
+
+ [Property form-sizing value 'fixed']
+ expected: FAIL
+
+ [Property form-sizing value 'content']
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-valid.html.ini
index cda7dbed687..a31eb2c5cb0 100644
--- a/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-valid.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-ui/parsing/form-sizing-valid.html.ini
@@ -4,3 +4,9 @@
[e.style['form-sizing'\] = "normal" should set the property value]
expected: FAIL
+
+ [e.style['form-sizing'\] = "fixed" should set the property value]
+ expected: FAIL
+
+ [e.style['form-sizing'\] = "content" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini
new file mode 100644
index 00000000000..3fc2e24da01
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/cssom-view/MediaQueryList-extends-EventTarget.html.ini
@@ -0,0 +1,3 @@
+[MediaQueryList-extends-EventTarget.html]
+ [onchange removes listener]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/offsetTopLeft-border-box.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/offsetTopLeft-border-box.html.ini
new file mode 100644
index 00000000000..00753fab1d1
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/cssom-view/offsetTopLeft-border-box.html.ini
@@ -0,0 +1,6 @@
+[offsetTopLeft-border-box.html]
+ [container: 0]
+ expected: FAIL
+
+ [container: 1]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/selectors/is-where-parsing.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/is-where-parsing.html.ini
index dae62bf6253..83f85b33d30 100644
--- a/tests/wpt/meta-legacy-layout/css/selectors/is-where-parsing.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/selectors/is-where-parsing.html.ini
@@ -40,3 +40,99 @@
[Pseudo-elements inside]
expected: FAIL
+
+ [":is(div )" should be a valid selector]
+ expected: FAIL
+
+ [":where(div )" should be a valid selector]
+ expected: FAIL
+
+ [":is(div + bar, div ~ .baz)" should be a valid selector]
+ expected: FAIL
+
+ [":where(div + bar, div ~ .baz)" should be a valid selector]
+ expected: FAIL
+
+ [":is(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":where(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":is(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":where(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:is(div ))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:where(div ))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:is(div .foo))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:where(div .foo))" should be a valid selector]
+ expected: FAIL
+
+ [":is(:hover, :active)" should be a valid selector]
+ expected: FAIL
+
+ [":where(:hover, :active)" should be a valid selector]
+ expected: FAIL
+
+ [":is(div):hover" should be a valid selector]
+ expected: FAIL
+
+ [":where(div):hover" should be a valid selector]
+ expected: FAIL
+
+ [":is(div)::before" should be a valid selector]
+ expected: FAIL
+
+ [":where(div)::before" should be a valid selector]
+ expected: FAIL
+
+ [":is(::before)" should be a valid selector]
+ expected: FAIL
+
+ [":where(::before)" should be a valid selector]
+ expected: FAIL
+
+ [":is(div) + bar" should be a valid selector]
+ expected: FAIL
+
+ [":where(div) + bar" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):is(:hover)" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):where(:hover)" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):is([attr='value'\])" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):where([attr='value'\])" should be a valid selector]
+ expected: FAIL
+
+ [":not(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":not(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":not(:is(div .foo))" should be a valid selector]
+ expected: FAIL
+
+ [":not(:where(div .foo))" should be a valid selector]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini
index 7b4af3d0cd3..6d4e77b234b 100644
--- a/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini
@@ -16,3 +16,9 @@
[CSS Selectors: The relational pseudo-class (disallow nesting :has() inside :has())]
expected: FAIL
+
+ [":has(:is(:has(*)))" should be a valid selector]
+ expected: FAIL
+
+ [":has(:where(:has(*)))" should be a valid selector]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini
new file mode 100644
index 00000000000..5eb54f20977
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-constructor.any.js.ini
@@ -0,0 +1,80 @@
+[observable-constructor.any.worker.html]
+ [Observable constructor]
+ expected: FAIL
+
+ [Subscriber interface is not constructible]
+ expected: FAIL
+
+ [subscribe() can be called with no arguments]
+ expected: FAIL
+
+ [Observable constructor calls initializer on subscribe]
+ expected: FAIL
+
+ [Observable error path called synchronously]
+ expected: FAIL
+
+ [Observable should error if initializer throws]
+ expected: FAIL
+
+ [Subscription does not emit values after completion]
+ expected: FAIL
+
+ [Subscription does not emit values after error]
+ expected: FAIL
+
+ [Completing or nexting a subscriber after an error does nothing]
+ expected: FAIL
+
+ [Errors pushed to the subscriber that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Errors thrown in the initializer that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Subscription reports errors that are pushed after subscriber is closed by completion]
+ expected: FAIL
+
+ [Errors thrown by initializer function after subscriber is closed by completion are reported]
+ expected: FAIL
+
+
+[observable-constructor.any.html]
+ [Observable constructor]
+ expected: FAIL
+
+ [Subscriber interface is not constructible]
+ expected: FAIL
+
+ [subscribe() can be called with no arguments]
+ expected: FAIL
+
+ [Observable constructor calls initializer on subscribe]
+ expected: FAIL
+
+ [Observable error path called synchronously]
+ expected: FAIL
+
+ [Observable should error if initializer throws]
+ expected: FAIL
+
+ [Subscription does not emit values after completion]
+ expected: FAIL
+
+ [Subscription does not emit values after error]
+ expected: FAIL
+
+ [Completing or nexting a subscriber after an error does nothing]
+ expected: FAIL
+
+ [Errors pushed to the subscriber that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Errors thrown in the initializer that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Subscription reports errors that are pushed after subscriber is closed by completion]
+ expected: FAIL
+
+ [Errors thrown by initializer function after subscriber is closed by completion are reported]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini b/tests/wpt/meta-legacy-layout/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini
new file mode 100644
index 00000000000..c68ae3e8990
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini
@@ -0,0 +1,27 @@
+[basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html]
+ [Declarative DOM Parts innerHTML <div><h1>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <div><h1 parseparts>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <div parseparts=""><h1>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <div parseparts=""><h1 parseparts>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template><h1>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template><h1 parseparts>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template parseparts="" class="expect_success"><h1>content... (expect parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template parseparts="" class="expect_success"><h1 parseparts>content... (expect parts)]
+ expected: FAIL
+
+ [Basic NodePart parsing]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini
index f9de5391ad6..f2d7867c9ff 100644
--- a/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini
@@ -146,3 +146,12 @@
[list-style-image sec-fetch-site - HTTPS downgrade-upgrade]
expected: FAIL
+
+ [border-image sec-fetch-mode - Not sent to non-trustworthy cross-site destination]
+ expected: FAIL
+
+ [background-image sec-fetch-site - HTTPS downgrade (header not sent)]
+ expected: TIMEOUT
+
+ [border-image sec-fetch-site - HTTPS downgrade (header not sent)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
new file mode 100644
index 00000000000..3e07e6b7d1f
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
@@ -0,0 +1,6 @@
+[empty-iframe-load-event.html]
+ [Check execution order from nested timeout]
+ expected: FAIL
+
+ [Check execution order on load handler]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
index c5fc1407992..1bca09f21d6 100644
--- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
@@ -1,5 +1,4 @@
[iframe-src-aboutblank-navigate-immediately.html]
- expected: TIMEOUT
[Navigating to a different document with window.open]
expected: FAIL
@@ -7,4 +6,4 @@
expected: FAIL
[Navigating to a different document with form submission]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
index 149bcb4ff8c..51fd557bd7f 100644
--- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
@@ -7,6 +7,3 @@
[load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank#foo']
expected: FAIL
-
- [load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank']
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini
index 324db3d9b35..5aef7ce66ce 100644
--- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini
@@ -10,3 +10,6 @@
[load event does not fire on window.open('about:blank?foo')]
expected: FAIL
+
+ [load event does not fire on window.open('about:blank')]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini
index 7dc346632a4..7dc346632a4 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
new file mode 100644
index 00000000000..60a4fa51f8a
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
@@ -0,0 +1,3 @@
+[a-click.html]
+ [aElement.click() before the load event must NOT replace]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini
index e84cccbbd1f..6c777ea167c 100644
--- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/form-submit-button-click.html.ini
@@ -1,3 +1,4 @@
[form-submit-button-click.html]
+ expected: TIMEOUT
[Replace before load, triggered by submitButton.click()]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini
new file mode 100644
index 00000000000..02bd301a7ca
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini
@@ -0,0 +1,3 @@
+[traverse_the_history_write_onload_1.html]
+ [Traverse the history when a history entry is written in the load event]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini
deleted file mode 100644
index addd810a23d..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[canvas.2d.disconnected-font-size-math.html]
- expected: CRASH
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
index 17247137cb1..5cdcce07c65 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
@@ -1,2 +1,2 @@
[canvas.2d.disconnected.html]
- expected: CRASH
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-01.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-01.html.ini
new file mode 100644
index 00000000000..cc76a05c1d8
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-01.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-01.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-02.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-02.html.ini
new file mode 100644
index 00000000000..d83ab8db3b9
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-02.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-02.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-03.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-03.html.ini
new file mode 100644
index 00000000000..341d054ebbc
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-03.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-03.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-04.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-04.html.ini
new file mode 100644
index 00000000000..d34ae8710b2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-04.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-04.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-05.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-05.html.ini
new file mode 100644
index 00000000000..c80d7307d57
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-05.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-05.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-06.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-06.html.ini
new file mode 100644
index 00000000000..40d08e09e38
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-06.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-06.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-07.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-07.html.ini
new file mode 100644
index 00000000000..8b118b20ad7
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-07.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-07.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-08.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-08.html.ini
new file mode 100644
index 00000000000..927891eb7e0
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-08.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-08.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-09.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-09.html.ini
new file mode 100644
index 00000000000..53ac23518f6
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-09.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-09.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-10.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-10.html.ini
new file mode 100644
index 00000000000..9e6f6f536c0
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-10.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-10.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-11.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-11.html.ini
new file mode 100644
index 00000000000..69ea943cfa8
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-11.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-11.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-12.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-12.html.ini
new file mode 100644
index 00000000000..cb9af7df593
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-12.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-12.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-13.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-13.html.ini
new file mode 100644
index 00000000000..43a10154051
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-13.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-13.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-14.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-14.html.ini
new file mode 100644
index 00000000000..5b3c17a3035
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-14.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-14.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-15.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-15.html.ini
new file mode 100644
index 00000000000..9b7646bf688
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-15.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-15.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-16.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-16.html.ini
new file mode 100644
index 00000000000..57a8aa33c82
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-16.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-16.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-17.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-17.html.ini
new file mode 100644
index 00000000000..8436d0266fe
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-17.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-17.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-18.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-18.html.ini
new file mode 100644
index 00000000000..1a75c98888d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-18.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-18.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-19.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-19.html.ini
new file mode 100644
index 00000000000..882a73cedc1
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-19.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-19.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-20.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-20.html.ini
new file mode 100644
index 00000000000..e2ac54e85b6
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-20.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-20.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-21.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-21.html.ini
new file mode 100644
index 00000000000..1fe6eed4d86
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-21.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-21.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-22.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-22.html.ini
new file mode 100644
index 00000000000..2bbb71f26cf
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-22.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-22.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-23.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-23.html.ini
new file mode 100644
index 00000000000..340f5057d5c
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-23.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-23.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-24.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-24.html.ini
new file mode 100644
index 00000000000..d4a3db2a878
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-24.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-24.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-25.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-25.html.ini
new file mode 100644
index 00000000000..2ef28e7d55d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-25.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-25.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-26.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-26.html.ini
new file mode 100644
index 00000000000..eae14c85b6d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-26.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-26.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-27.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-27.html.ini
new file mode 100644
index 00000000000..49b7b6b841b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-27.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-27.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-28.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-28.html.ini
new file mode 100644
index 00000000000..c168cc1a8b6
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-28.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-28.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-29.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-29.html.ini
new file mode 100644
index 00000000000..d03ea918944
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-29.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-29.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-30.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-30.html.ini
new file mode 100644
index 00000000000..bbb82b3cd63
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-30.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-30.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-31.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-31.html.ini
new file mode 100644
index 00000000000..052af599162
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-31.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-31.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-32.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-32.html.ini
new file mode 100644
index 00000000000..d6240b000ed
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-32.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-32.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-33.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-33.html.ini
new file mode 100644
index 00000000000..993ccadc8f3
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-33.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-33.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-34.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-34.html.ini
new file mode 100644
index 00000000000..9a036bcae5c
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-34.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-34.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-35.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-35.html.ini
new file mode 100644
index 00000000000..4b931e6b885
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-35.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-35.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-36.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-36.html.ini
new file mode 100644
index 00000000000..5c6d67ba0d4
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-36.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-36.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-37.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-37.html.ini
new file mode 100644
index 00000000000..fbada3e32c8
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-37.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-37.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-38.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-38.html.ini
new file mode 100644
index 00000000000..09b03873496
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-38.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-38.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-39.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-39.html.ini
new file mode 100644
index 00000000000..8d63022c0f9
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-39.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-39.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-40.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-40.html.ini
new file mode 100644
index 00000000000..026d2a27546
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-40.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-40.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-41.html.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-41.html.ini
new file mode 100644
index 00000000000..75cf38f059b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/dir-shadow-41.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-41.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini
new file mode 100644
index 00000000000..ec7919c1c68
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini
@@ -0,0 +1,18 @@
+[lang-attribute-shadow.window.html]
+ [lang only on slot]
+ expected: FAIL
+
+ [lang only on host]
+ expected: FAIL
+
+ [lang on host and slot]
+ expected: FAIL
+
+ [lang on host and slotted element]
+ expected: FAIL
+
+ [lang on host and slot and slotted element]
+ expected: FAIL
+
+ [lang on slot inherits from shadow host]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini b/tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini
deleted file mode 100644
index b21e45dd17f..00000000000
--- a/tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[document-base-url-changes-about-srcdoc-2.https.html]
- [document-base-url-changes-about-srcdoc-2]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html.ini b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html.ini
index ab1003579be..6f0fc648f04 100644
--- a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html.ini
@@ -1,7 +1,6 @@
[document-with-fragment-top.html]
- expected: TIMEOUT
[Autofocus elements in iframed documents with "top" fragments should work.]
expected: FAIL
[Autofocus elements in top-level browsing context's documents with "top" fragments should work.]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index 8a926207630..d169bd2e9fa 100644
--- a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,5 +1,4 @@
[supported-elements.html]
- expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
@@ -7,10 +6,10 @@
expected: FAIL
[Host element with delegatesFocus including no focusable descendants should be skipped]
- expected: TIMEOUT
+ expected: FAIL
[Area element should support autofocus]
- expected: NOTRUN
+ expected: FAIL
[Host element with delegatesFocus should support autofocus]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display-type-002.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display-type-002.tentative.html.ini
new file mode 100644
index 00000000000..4e5a3ff1e5b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display-type-002.tentative.html.ini
@@ -0,0 +1,2 @@
+[details-display-type-002.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini
index a7b23688dad..516e1fa0442 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini
@@ -1,3 +1,4 @@
[resource-selection-source-media-env-change.html]
+ expected: TIMEOUT
[the <source> media attribute: no reaction to environment change]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini
deleted file mode 100644
index 30b696b181c..00000000000
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[image-compositing-change.html]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini
index 52f30c9e707..ad86a0c8730 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/multipart-formdata.window.js.ini
@@ -178,3 +178,9 @@
[multipart/form-data: 0x00 in name (normal form)]
expected: FAIL
+
+ [multipart/form-data: Basic test (formdata event)]
+ expected: FAIL
+
+ [multipart/form-data: non-ASCII in name and value (normal form)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini
new file mode 100644
index 00000000000..7682a4830bf
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini
@@ -0,0 +1,4 @@
+[reparent-form-during-planned-navigation-task.html]
+ expected: TIMEOUT
+ [reparent-form-during-planned-navigation-task]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini
index 63ed783745e..091da3d48a6 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/urlencoded2.window.js.ini
@@ -143,9 +143,6 @@
[application/x-www-form-urlencoded: character not in encoding in filename (normal form)]
expected: FAIL
- [application/x-www-form-urlencoded: 0x00 in name (formdata event)]
- expected: FAIL
-
[application/x-www-form-urlencoded: backslash in value (normal form)]
expected: FAIL
@@ -167,9 +164,6 @@
[application/x-www-form-urlencoded: double quote in value (normal form)]
expected: FAIL
- [application/x-www-form-urlencoded: Basic test (formdata event)]
- expected: FAIL
-
[application/x-www-form-urlencoded: lone surrogate in name and value (normal form)]
expected: FAIL
@@ -178,3 +172,6 @@
[application/x-www-form-urlencoded: non-ASCII in filename (formdata event)]
expected: FAIL
+
+ [application/x-www-form-urlencoded: 0x00 in value (formdata event)]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-details-element/name-attribute.html.ini
index 2646908c361..d569dd37abc 100644
--- a/tests/wpt/meta/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-details-element/name-attribute.html.ini
@@ -1,4 +1,4 @@
-[name-attribute.tentative.html]
+[name-attribute.html]
[basic handling of mutually exclusive details]
expected: FAIL
@@ -8,7 +8,7 @@
[mutually exclusive details across multiple names and multiple tree scopes]
expected: FAIL
- [mutation event and toggle event order matches tree order]
+ [mutation event and toggle event order]
expected: FAIL
[exclusivity enforcement with attachment scenario connected]
@@ -35,9 +35,6 @@
[exclusivity enforcement with attachment scenario connected-in-template]
expected: FAIL
- [mutation event and toggle event order]
- expected: FAIL
-
[handling of name attribute changes]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini
deleted file mode 100644
index 267c09e0562..00000000000
--- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[fixed-position-child-with-transformed-ancestor.html]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini
new file mode 100644
index 00000000000..5def8ec35f5
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini
@@ -0,0 +1,2 @@
+[fixed-position-child-with-transformed-ancestor.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini
deleted file mode 100644
index 32f315368ab..00000000000
--- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[fixed-position-child-with-will-change-ancestor.html]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini
new file mode 100644
index 00000000000..cddca13cbcc
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini
@@ -0,0 +1,2 @@
+[fixed-position-child-with-will-change-ancestor.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini
deleted file mode 100644
index d85ee8e016a..00000000000
--- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[top-layer-stacking.html]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini
new file mode 100644
index 00000000000..3f6ad25adbf
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini
@@ -0,0 +1,2 @@
+[top-layer-stacking.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interfaces.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interfaces.html.ini
index f2d3fc77517..f4015594b6b 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/interfaces.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/interfaces.html.ini
@@ -110,3 +110,12 @@
[Interfaces for SLOT: createElement]
expected: FAIL
+
+ [Interfaces for permission: useNS]
+ expected: FAIL
+
+ [Interfaces for permission: useParser]
+ expected: FAIL
+
+ [Interfaces for PERMISSION: createElement]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
index cc18f512574..2d44172f4dc 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
@@ -1,5 +1,6 @@
[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
@@ -7,10 +8,10 @@
expected: FAIL
[Check that rel=noopener with target=_top does a normal load]
- expected: FAIL
+ expected: NOTRUN
[Check that rel=noopener with target=_parent does a normal load]
- expected: FAIL
+ expected: NOTRUN
[Check that rel=noopener with target=_self does a normal load]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/permission-element/no-end-tag-no-contents.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/permission-element/no-end-tag-no-contents.html.ini
new file mode 100644
index 00000000000..9a7c183ef37
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/permission-element/no-end-tag-no-contents.html.ini
@@ -0,0 +1,3 @@
+[no-end-tag-no-contents.html]
+ [The permission element should have no end tag or contents]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/uievents/idlharness.window.js.ini b/tests/wpt/meta-legacy-layout/uievents/idlharness.window.js.ini
index 25d032b22eb..4995d1d82da 100644
--- a/tests/wpt/meta-legacy-layout/uievents/idlharness.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/uievents/idlharness.window.js.ini
@@ -157,3 +157,21 @@
[MutationEvent interface: operation initMutationEvent(DOMString, optional boolean, optional boolean, optional Node?, optional DOMString, optional DOMString, optional DOMString, optional unsigned short)]
expected: FAIL
+
+ [MouseEvent interface: attribute layerX]
+ expected: FAIL
+
+ [MouseEvent interface: attribute layerY]
+ expected: FAIL
+
+ [MouseEvent interface: new MouseEvent("event") must inherit property "layerX" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new MouseEvent("event") must inherit property "layerY" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "layerX" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "layerY" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/webaudio/idlharness.https.window.js.ini b/tests/wpt/meta-legacy-layout/webaudio/idlharness.https.window.js.ini
index b5e9c75e20a..63969725792 100644
--- a/tests/wpt/meta-legacy-layout/webaudio/idlharness.https.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/webaudio/idlharness.https.window.js.ini
@@ -1303,3 +1303,12 @@
[AudioParamMap interface: maplike<DOMString, AudioParam>]
expected: FAIL
+
+ [BaseAudioContext interface: attribute renderQuantumSize]
+ expected: FAIL
+
+ [BaseAudioContext interface: context must inherit property "renderQuantumSize" with the proper type]
+ expected: FAIL
+
+ [BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "renderQuantumSize" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini
index eed03df37f3..b7537329068 100644
--- a/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini
+++ b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini
@@ -1,4 +1,5 @@
[audiocontext-not-fully-active.html]
+ expected: TIMEOUT
[frame in navigated remote-site frame]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini
new file mode 100644
index 00000000000..4880a89bc1a
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini
@@ -0,0 +1,3 @@
+[moderate-exponentialRamp.html]
+ [Test exponentialRampToValueAtTime() with a moderate ratio of change]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/webgl/idlharness.any.js.ini b/tests/wpt/meta-legacy-layout/webgl/idlharness.any.js.ini
index 020e2f36dd9..b429262aa81 100644
--- a/tests/wpt/meta-legacy-layout/webgl/idlharness.any.js.ini
+++ b/tests/wpt/meta-legacy-layout/webgl/idlharness.any.js.ini
@@ -3896,6 +3896,9 @@
[WebGL2RenderingContext interface: attribute unpackColorSpace]
expected: FAIL
+ [WebGL2RenderingContext interface: operation getBufferSubData(GLenum, GLintptr, ArrayBufferView, optional unsigned long long, optional GLuint)]
+ expected: FAIL
+
[idlharness.any.worker.html]
[WebGL2RenderingContext interface: constant ONE_MINUS_SRC_COLOR on interface object]
@@ -10179,3 +10182,6 @@
[WebGL2RenderingContext interface: attribute unpackColorSpace]
expected: FAIL
+
+ [WebGL2RenderingContext interface: operation getBufferSubData(GLenum, GLintptr, ArrayBufferView, optional unsigned long long, optional GLuint)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/webmessaging/with-ports/017.html.ini b/tests/wpt/meta-legacy-layout/webmessaging/with-ports/017.html.ini
deleted file mode 100644
index c7946fc91b4..00000000000
--- a/tests/wpt/meta-legacy-layout/webmessaging/with-ports/017.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[017.html]
- expected: TIMEOUT
- [origin of the script that invoked the method, about:blank]
- expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/meta-legacy-layout/workers/constructors/Worker/Worker-constructor.html.ini
new file mode 100644
index 00000000000..80f9a4f15b8
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/workers/constructors/Worker/Worker-constructor.html.ini
@@ -0,0 +1,2 @@
+[Worker-constructor.html]
+ expected: ERROR
diff --git a/tests/wpt/meta-legacy-layout/workers/shared-worker-partitioned-cookies.tentative.https.html.ini b/tests/wpt/meta-legacy-layout/workers/shared-worker-partitioned-cookies.tentative.https.html.ini
new file mode 100644
index 00000000000..0f221c965c3
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/workers/shared-worker-partitioned-cookies.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[shared-worker-partitioned-cookies.tentative.https.html]
+ [SharedWorker: Partitioned Cookies]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/xhr/xhr-timeout-longtask.any.js.ini b/tests/wpt/meta-legacy-layout/xhr/xhr-timeout-longtask.any.js.ini
deleted file mode 100644
index 36b2068c5a6..00000000000
--- a/tests/wpt/meta-legacy-layout/xhr/xhr-timeout-longtask.any.js.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[xhr-timeout-longtask.any.worker.html]
- [Long tasks should not trigger load timeout]
- expected: FAIL
-
-
-[xhr-timeout-longtask.any.html]
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index b4f38f5d3d9..a61c4b4600f 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -1191,6 +1191,13 @@
null,
{}
]
+ ],
+ "tons-of-declarations-crash.html": [
+ "50a32c19389667a17768794415bbd89021fe1d88",
+ [
+ null,
+ {}
+ ]
]
},
"css-contain": {
@@ -5901,6 +5908,13 @@
{}
]
],
+ "input-importNode-to-detached-document-crash.html": [
+ "5e0cff4fa309a4286f922082264e2ae82bc00321",
+ [
+ null,
+ {}
+ ]
+ ],
"input-type-change-empty-crash.html": [
"6e44250ccb79f3a2a06b6ef639914cad656a4bb6",
[
@@ -30681,7 +30695,22 @@
],
{}
]
- ]
+ ],
+ "sticky": {
+ "position-sticky-offset-print.html": [
+ "3954bbcf4418b8af87dca12949efc7e6f59c963e",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ }
},
"css-tables": {
"tfoot-crash-print.html": [
@@ -130518,6 +130547,19 @@
}
},
"css-anchor-position": {
+ "anchor-center-002.html": [
+ "b7f61003a67be5baf897fa5a9c7da982586820b1",
+ [
+ null,
+ [
+ [
+ "/css/css-anchor-position/anchor-center-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"anchor-default-001.html": [
"8bb59851ee656715cb30d3a26690ee807b7fd7ca",
[
@@ -137660,6 +137702,32 @@
{}
]
],
+ "border-image-repeat-002.htm": [
+ "a0c081863d42cd4c0ea24996e23ace8537c7a133",
+ [
+ null,
+ [
+ [
+ "/css/css-backgrounds/reference/border-image-repeat-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "border-image-repeat-004.htm": [
+ "40194506940c38f2669ae1c5e8fd43b74b2313ce",
+ [
+ null,
+ [
+ [
+ "/css/css-backgrounds/reference/border-image-repeat-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"border-image-repeat-005.html": [
"f5078fc322c936d65415a4bfec5d022357cb714c",
[
@@ -138181,6 +138249,19 @@
{}
]
],
+ "border-image-slice-004.htm": [
+ "1e5adb311f597fc4fa3c4413628b70ebd4c4103e",
+ [
+ null,
+ [
+ [
+ "/css/css-backgrounds/reference/border-image-slice-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"border-image-slice-005.htm": [
"5d8bd7df1c3fe1b09a8a9387e355e2c7d111b805",
[
@@ -153525,6 +153606,32 @@
{}
]
],
+ "light-dark-currentcolor.html": [
+ "512a492b293d469b4c66052dd0b1d4ba9ca15b30",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "light-dark-inheritance.html": [
+ "1128b57319b0e9b8b4224b6c3005e18d349d8191",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"named-001.html": [
"61a98dcb7bb02fab3db18ed337eee5ddb07724fc",
[
@@ -180184,6 +180291,19 @@
]
],
"order": {
+ "order-abs-children-painting-order-different-container.html": [
+ "202581dd1d1b668722182aa22744b092c064cb95",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"order-abs-children-painting-order.html": [
"248f380e5aebb651069116cb32722389a511d962",
[
@@ -183588,6 +183708,19 @@
{}
]
],
+ "font-synthesis-08.html": [
+ "b3de1afcaee681b7e79969b325fc6bf98de4ec1c",
+ [
+ null,
+ [
+ [
+ "/css/css-fonts/font-synthesis-08-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"font-synthesis-position-001.html": [
"1ed13f67c1950f3abf4b599c2b58ad1b0db3d169",
[
@@ -192783,60 +192916,6 @@
]
]
},
- "align-tracks": {
- "masonry-align-tracks-001.html": [
- "4ff3e61087597bee960e30d245bf3aae255cec72",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "masonry-align-tracks-multi-001.html": [
- "0e20217da8063dc2e35fae3333b93988210e7eb1",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "masonry-align-tracks-stretch-001.html": [
- "d2fede7a8edcd0ddec450baa2961d767ba89a81a",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "masonry-align-tracks-stretch-002.html": [
- "1631ac3c07d3f97c30ebcad6f16f9b3cd29cd4d4",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ]
- },
"baseline": {
"masonry-grid-item-content-baseline-001.html": [
"60d11653b3f231a07ad7aa493a0effeae7720671",
@@ -193293,60 +193372,6 @@
]
]
},
- "justify-tracks": {
- "masonry-justify-tracks-001.html": [
- "bfd3c1ca587bb0bdb534a281824f158dace0c04c",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "masonry-justify-tracks-multi-001.html": [
- "011c487cb721d6185d6a27debf9fec0953af5bfe",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "masonry-justify-tracks-stretch-001.html": [
- "17cb321821830281a65b284af2de40ab3a6f53ef",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "masonry-justify-tracks-stretch-002.html": [
- "6b7746722dca430951c2f3be63e8d66308566b0c",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ]
- },
"masonry-columns-item-containing-block-is-grid-content-width.html": [
"e48b650253974a22e2dbf68eee6505ca918ddde7",
[
@@ -206909,6 +206934,19 @@
{}
]
],
+ "clip-path-foreignobject-non-zero-xy.html": [
+ "a63f4c8aa294db0b3e1ed3a3434015d65ecf453f",
+ [
+ null,
+ [
+ [
+ "/css/css-masking/clip-path/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"clip-path-geometryBox-2.html": [
"d4c47349d2053c90ebb82998b10b16e916421dbb",
[
@@ -207871,6 +207909,19 @@
{}
]
],
+ "clip-path-shape-foreignobject-non-zero-xy.html": [
+ "4e221f36e4cb7bc698f1929dcc09096114ab2693",
+ [
+ null,
+ [
+ [
+ "/css/css-masking/clip-path/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"clip-path-strokeBox-1a.html": [
"487f5363b694304923538d0314d3c6d2a685da6b",
[
@@ -299067,6 +299118,57 @@
{}
]
],
+ "file-input-horizontal.optional.html": [
+ "b7bcb340e0ef1644e99bbe665d544cc51f446ce8",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/forms/file-input-vertical.optional.html",
+ "!="
+ ],
+ [
+ "/css/css-writing-modes/forms/file-input-vertical-rtl.optional.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "file-input-vertical-rtl.optional.html": [
+ "b58242555b31251ba174fd691240337fc927f19b",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/forms/file-input-horizontal.optional.html",
+ "!="
+ ],
+ [
+ "/css/css-writing-modes/forms/file-input-vertical.optional.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "file-input-vertical.optional.html": [
+ "c9b4272f84b2ed4b29a63516d156fb7c26f2b3fa",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/forms/file-input-vertical-rtl.optional.html",
+ "!="
+ ],
+ [
+ "/css/css-writing-modes/forms/file-input-horizontal.optional.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
"meter-appearance-native-horizontal.optional.html": [
"7b25e1a9000d6c611c62c770871b7e32e4f8c696",
[
@@ -319920,6 +320022,539 @@
},
"elements": {
"global-attributes": {
+ "dir-shadow-01.html": [
+ "2d6983cb14b3f3f2c4f4ddbb2dcb987ecbc99bcf",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-01-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-02.html": [
+ "0553ef9a333a03f211c3fd302011c0b1c17c52a4",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-02-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-03.html": [
+ "5986a9d0f74a3e07ffbfa3e86b180d722feb3d01",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-03-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-04.html": [
+ "aa2ab9dc93e1e163e6408eb768a815e514f56c5b",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-04-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-05.html": [
+ "597cb8d5b8e4934ac4214a2d37f8fc52096e4e8f",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-05-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-06.html": [
+ "6cfaf7fcecd84f447b81209e31040d16558a175d",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-06-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-07.html": [
+ "dd11f4a605dfae855158673b281ecc7c55b111d0",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-07-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-08.html": [
+ "8b1377d32add450e7a2f244e4c443d7844c7f9ec",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-08-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-09.html": [
+ "d9c66e79319b75ded2a6cdc8c2da4a1854813f43",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-09-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-10.html": [
+ "ad35af808eb8128f613e2ec1f399b8b3e44febbf",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-10-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-11.html": [
+ "31e04f065e978d7e7e9c011f6cce2c2bd3aace75",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-11-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-12.html": [
+ "f6183a98d9dc290a3dd23be2f575a8052620c523",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-12-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-13.html": [
+ "35a00e6d288cc52b3b62300b956ecf5ff4ca2268",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-13-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-14.html": [
+ "6aa4a639fd03c4c2eb858e4eb3bc078d503c3bb0",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-14-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-15.html": [
+ "37c05d283c25b617095e4b2580334dceb77ff599",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-15-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-16.html": [
+ "2a8bb64a1bd5b10deb5bfa554832c11fac8e65b4",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-16-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-17.html": [
+ "7016a271741bb51b57b67afd4ab6e7c25adcf018",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-17-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-18.html": [
+ "6796dd18eaff02072147c2727a8d403e09d425b7",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-18-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-19.html": [
+ "a345a7b60d4c41abac9c9c56a444a0d28b90fee3",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-19-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-20.html": [
+ "0072d9b6c96adc4beb0814d02da56f944e925868",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-20-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-21.html": [
+ "5b9a4aa184bd65e565a1352dc36848f26482f292",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-21-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-22.html": [
+ "009ba460ce1e9b8870970f451cf563f76e4f2313",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-22-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-23.html": [
+ "dea79b93e13ae0609549d1fa61d6757776270138",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-23-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-24.html": [
+ "d26ccb270a25e91bd835401026f52a95b15e319d",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-24-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-25.html": [
+ "508b8260ff923a2208cd7aa1ab8407141604c6aa",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-25-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-26.html": [
+ "b19cb976f88ee216abf781e0d7a4333fca37d050",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-26-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-27.html": [
+ "8380f17b2186be630977f43bf90590bb945c9b8f",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-27-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-28.html": [
+ "3a0d6756b355270b9bd0ae3a2c225e39f8158159",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-28-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-29.html": [
+ "46cbf8d2911a85105ebd28f171a89e977b446781",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-29-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-30.html": [
+ "2a3e56e62cc6447fc9f0cd784839f8d7fe5457f3",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-30-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-31.html": [
+ "d48a0f8c0403e6dc56ebdea975b36161233917fd",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-31-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-32.html": [
+ "ac9c9e45792c2a61181abf7336613144cd2008eb",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-32-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-33.html": [
+ "814e3b34d6f66add65d08e1a7680c1b009475d49",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-33-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-34.html": [
+ "07f75d216a898b4d81e7c591f59e3d5d292fbb25",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-34-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-35.html": [
+ "0f2a7c882f80b9107704b5c0000bf4f3c5520d63",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-35-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-36.html": [
+ "ff4f11b3a6f7edbb83c74757e8fa3d6542901901",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-36-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-37.html": [
+ "ba0480636a0fd51ac83d32b65834789afa7428b5",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-37-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-38.html": [
+ "e8f25eb5689c89c64eb1d91fcaf4c71e6e5b3f7a",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-38-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-39.html": [
+ "72fdd665fc3ec8377e5f5f9fa165d724a30291a8",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-39-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-40.html": [
+ "567f4fa9da833fb38cf3b7cc4699487816dea3e4",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-40-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dir-shadow-41.html": [
+ "48e2057552c3a696cdf26eb70368a6a2c8dac64f",
+ [
+ null,
+ [
+ [
+ "/html/dom/elements/global-attributes/dir-shadow-41-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"dir_auto-EN-L.html": [
"fa8d793bd043d008a98020063dcea6549e9d3e19",
[
@@ -323735,6 +324370,19 @@
{}
]
],
+ "details-display-type-002.tentative.html": [
+ "716221f7c5c6f83f4b341e4affce90c2622cc40f",
+ [
+ null,
+ [
+ [
+ "/html/rendering/the-details-element/details-display-type-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"details-pseudo-elements-001.tentative.html": [
"08321977c6b4abe71b88d6fa448b088688dccb45",
[
@@ -324667,7 +325315,7 @@
]
],
"image-compositing-change.html": [
- "658c2ad39ea343e40de9aaf64dcb7c75b346ae6b",
+ "d3e7ee41711fbd1a02bb1c8f76c31435d52151a5",
[
null,
[
@@ -324682,11 +325330,11 @@
null,
[
[
- 150,
+ 0,
150
],
[
- 296,
+ 0,
296
]
]
@@ -326188,7 +326836,7 @@
{}
]
],
- "fixed-position-child-with-transformed-ancestor.html": [
+ "fixed-position-child-with-transformed-ancestor.tentative.html": [
"527d508252c15d0f1b46580afc0a0ae8bbe625d8",
[
null,
@@ -326201,7 +326849,7 @@
{}
]
],
- "fixed-position-child-with-will-change-ancestor.html": [
+ "fixed-position-child-with-will-change-ancestor.tentative.html": [
"e9db7321cd703d26e90c4a50932892da7d504218",
[
null,
@@ -326552,7 +327200,7 @@
{}
]
],
- "top-layer-stacking.html": [
+ "top-layer-stacking.tentative.html": [
"6407ef23c2e38ef000bfb59be340900312935a8a",
[
null,
@@ -339870,7 +340518,7 @@
[]
],
"eddsa.js": [
- "d425fec2dc343ef456ba714e51b940477436a32a",
+ "d77a880883117634aaba9c34ddda9b7ba60f9804",
[]
],
"eddsa_vectors.js": [
@@ -339878,7 +340526,7 @@
[]
],
"hmac.js": [
- "8df4b042f54cf68599b5d59feb8a7794205dc007",
+ "f5e2ad2769cdd8d7be5e781eb983d66837bfe3af",
[]
],
"hmac_vectors.js": [
@@ -383381,6 +384029,10 @@
}
},
"css-anchor-position": {
+ "anchor-center-002-ref.html": [
+ "40ccc2b044b3da3be44582522d99e5a138b6f354",
+ []
+ ],
"anchor-default-ref.html": [
"4d7de12447c8297b8f0fc04338d80a028a3e9798",
[]
@@ -384696,6 +385348,14 @@
"690f9ad11ad0e63d57c8c7ee10737690b7c8a061",
[]
],
+ "border-image-repeat-002-ref.html": [
+ "e295a5c65dc1f864adffffe2d9c12fdee0a97a6e",
+ []
+ ],
+ "border-image-repeat-004-ref.html": [
+ "9c3f7176633b639c24bc6736713d34505da798e6",
+ []
+ ],
"border-image-repeat-005-ref.html": [
"0a372e088baa0045bb972c7398085da56a216d03",
[]
@@ -384740,6 +385400,10 @@
"3ff7980de6c04776bba4ded110e14229d92e5c06",
[]
],
+ "border-image-slice-004-ref.html": [
+ "d9c798a616771db9bb9470253fda0b7fe3a012f8",
+ []
+ ],
"border-image-slice-005-ref.html": [
"d4a4040a7854d7578e94b372650318792925f662",
[]
@@ -385084,6 +385748,10 @@
"93f566194785c0bbe7fc9767dda86fd7ae62acf1",
[]
],
+ "9grid20-40-red.png": [
+ "75173b7edc09ab93eb76bf292eda63e207505cc9",
+ []
+ ],
"9grid40-30-20-10-green.png": [
"329699bf9d1cb665ba9be62bcb76da8ffd137f34",
[]
@@ -391999,6 +392667,10 @@
"428c8c401856627c81bc7d03663317fd76bbf08b",
[]
],
+ "font-synthesis-08-ref.html": [
+ "39cd4558d98b1fcdbc78968dff477c44d7f0fa94",
+ []
+ ],
"font-synthesis-position-001-ref.html": [
"228dc652f29d0cd1d73f0d88b8d970699070191e",
[]
@@ -399947,24 +400619,6 @@
[]
]
},
- "align-tracks": {
- "masonry-align-tracks-001-ref.html": [
- "3b22489fdb935ed1691714ddb1ddc96b6a948db1",
- []
- ],
- "masonry-align-tracks-multi-001-ref.html": [
- "b0bf3578618df14a95e65e5dbcec8a8ef55442df",
- []
- ],
- "masonry-align-tracks-stretch-001-ref.html": [
- "0712f14bb3136b96897513cc524ee0004350ccd4",
- []
- ],
- "masonry-align-tracks-stretch-002-ref.html": [
- "01f24ea986f588856cb9ea8d126632d88316ef49",
- []
- ]
- },
"baseline": {
"masonry-grid-item-content-baseline-001-ref.html": [
"cdb6d4fdf8ff8aeb8f56ae14e52b73aa370977eb",
@@ -400115,24 +400769,6 @@
[]
]
},
- "justify-tracks": {
- "masonry-justify-tracks-001-ref.html": [
- "912c9c9f823ddabbf2a2ebd0c19feacc38db34fb",
- []
- ],
- "masonry-justify-tracks-multi-001-ref.html": [
- "319ef217ea759acf81037e414ec0762363bca6c9",
- []
- ],
- "masonry-justify-tracks-stretch-001-ref.html": [
- "39053051cc837bff68d39e16a1e5ff27ee0d8ed9",
- []
- ],
- "masonry-justify-tracks-stretch-002-ref.html": [
- "69759484f298f1220f87c73a582131812b2cf407",
- []
- ]
- },
"order": {
"masonry-order-001-ref.html": [
"371699981544487f6b7c6b1e8d084e746057a07d",
@@ -422910,7 +423546,7 @@
[]
],
"parsing-testcommon.js": [
- "e480f26b3f3db5bc95ecd152c9711c3bccfcfcfe",
+ "93fd0090770b548c5116b59b037114616f541b14",
[]
],
"pattern-grg-rgr-grg.png": [
@@ -428668,7 +429304,7 @@
"fledge": {
"tentative": {
"TODO": [
- "7ec6d8808017cbef7062a28df30efb4e0513f629",
+ "2f3e72b21287a98d370bef18c23fbd2bddab97a3",
[]
],
"resources": {
@@ -428677,7 +429313,7 @@
[]
],
"decision-logic.sub.py": [
- "165d98400283c1af965b7feb270c939a5c691b84",
+ "d5ecd2db87a34136c5a0e8e07f1751811296f634",
[]
],
"empty.html": [
@@ -428689,17 +429325,17 @@
[]
],
"fledge-util.js": [
- "7ed5b13f8d987715558a129dfa93bd5a0fed4e1c",
- []
- ],
- "iframe.sub.html": [
- "0bc0ea357f6385c77a83629f34748a599ff6ad17",
+ "c89814507cbd197d12d8b6284dc18dd76d9e9ae3",
[]
],
"request-tracker.py": [
"46da796f30102e0e32a82a4dab96fa9217154306",
[]
],
+ "subordinate-frame.sub.html": [
+ "465f8e7bdf0c010d733779d528e183825ae76f97",
+ []
+ ],
"trusted-bidding-signals.py": [
"86e4db8ad448ade94b4c5885ea6b99b9f80e2871",
[]
@@ -430012,7 +430648,7 @@
[]
],
"test-helpers.js": [
- "f185e2f48b6e7915e5dd6354c62923beb98e8a25",
+ "4bcf5d7e8341e221741cd9383a8b93d785d90131",
[]
]
},
@@ -430098,7 +430734,7 @@
[]
],
"FileSystemFileHandle-move.js": [
- "dd848626e4a747f8c74dff65157704952fbff6c0",
+ "c5d08f305d0612376a3641798d0a6b3b909cf404",
[]
],
"FileSystemSyncAccessHandle-flush.js": [
@@ -435413,6 +436049,174 @@
"94e9a4f1908e4f4eb3216981a91c3c8174902fcb",
[]
],
+ "dir-shadow-01-ref.html": [
+ "3462b908b3df0d5550e74fa2ea93e9b2ff959b9b",
+ []
+ ],
+ "dir-shadow-02-ref.html": [
+ "8f358cf6471ca8d31ebad27872ec9071d28bae94",
+ []
+ ],
+ "dir-shadow-03-ref.html": [
+ "a2f574820f2049487e330765997bd8983af5a483",
+ []
+ ],
+ "dir-shadow-04-ref.html": [
+ "5724b5b84db4a6f96fa350a8e11a8c99e29c9e9c",
+ []
+ ],
+ "dir-shadow-05-ref.html": [
+ "13c5b16240c4879ff84d4c5c24ceaf3daabee49e",
+ []
+ ],
+ "dir-shadow-06-ref.html": [
+ "ca54b3bb2c8e5c13f551057d2653030ece98ddb1",
+ []
+ ],
+ "dir-shadow-07-ref.html": [
+ "0a2de4d398f5d820d5e55eb8f45ce34df6dbff97",
+ []
+ ],
+ "dir-shadow-08-ref.html": [
+ "09d8b24094f56aadb293d995fb4c8c66e1011d6d",
+ []
+ ],
+ "dir-shadow-09-ref.html": [
+ "73b9cb14870fb0dc292b0cfd49ac1afe3f2ccc9c",
+ []
+ ],
+ "dir-shadow-10-ref.html": [
+ "391e5047f91ca9282448b83987a06cd1ab32c01c",
+ []
+ ],
+ "dir-shadow-11-ref.html": [
+ "ae7e849c9773c07b5fb38c56e9d33baeec24dabc",
+ []
+ ],
+ "dir-shadow-12-ref.html": [
+ "6f6b40218a8e713a278471681f46e8d93fe53070",
+ []
+ ],
+ "dir-shadow-13-ref.html": [
+ "a6ec54186fede6655579f8f86d85925fea54475e",
+ []
+ ],
+ "dir-shadow-14-ref.html": [
+ "73d4eab9622f043302ab9c44ae49453abf47083f",
+ []
+ ],
+ "dir-shadow-15-ref.html": [
+ "0139997e657345168f7c3b0daf683fb1938a103d",
+ []
+ ],
+ "dir-shadow-16-ref.html": [
+ "926b7a900d7a220e22ab01b35a2b918d69977296",
+ []
+ ],
+ "dir-shadow-17-ref.html": [
+ "b17c3e191d8845c359ffdaedc351d2a266d5f1d7",
+ []
+ ],
+ "dir-shadow-18-ref.html": [
+ "6155a9f2c952c5114710d68beff8e23ae0d42c39",
+ []
+ ],
+ "dir-shadow-19-ref.html": [
+ "61a9592a4a8a4004755eccc6c895592cda57a875",
+ []
+ ],
+ "dir-shadow-20-ref.html": [
+ "2e813817722407eae4c6c535ace690e148a4293b",
+ []
+ ],
+ "dir-shadow-21-ref.html": [
+ "58c8d426f288273e0e190e1a72ff343695356cab",
+ []
+ ],
+ "dir-shadow-22-ref.html": [
+ "6721da534f76f0f6b5639abb7a630878c2eb7ef1",
+ []
+ ],
+ "dir-shadow-23-ref.html": [
+ "bf06a4484707cf68b38aba35e5729da7b7894109",
+ []
+ ],
+ "dir-shadow-24-ref.html": [
+ "8453e9453372cc0ac16afd7d9fafdc107b0b39b0",
+ []
+ ],
+ "dir-shadow-25-ref.html": [
+ "5a2f6d57776cb07d8b8a35f172467057a1ec6229",
+ []
+ ],
+ "dir-shadow-26-ref.html": [
+ "41e1dbc8a81ee046ffa8a178dede9e0438c3aaf6",
+ []
+ ],
+ "dir-shadow-27-ref.html": [
+ "075230d055cd50767d2da7d8c81a610c7a27449a",
+ []
+ ],
+ "dir-shadow-28-ref.html": [
+ "580f5fe3b11acfb9a70c1f460134c12068e18f66",
+ []
+ ],
+ "dir-shadow-29-ref.html": [
+ "4b949acb0985160061176a0e33ca0477837e3c45",
+ []
+ ],
+ "dir-shadow-30-ref.html": [
+ "be2cc44abd56e71797c4f1ec2662dc5e41741f68",
+ []
+ ],
+ "dir-shadow-31-ref.html": [
+ "1c5b5b11a8cabbbda078b0bd490eebb5c9e91c4a",
+ []
+ ],
+ "dir-shadow-32-ref.html": [
+ "6e5d9a96e8e5fb6dfa14d6a7a5630adc074fbba7",
+ []
+ ],
+ "dir-shadow-33-ref.html": [
+ "cdf89d78bb6126c7b350471373d9339ae60af35a",
+ []
+ ],
+ "dir-shadow-34-ref.html": [
+ "4cedca8e50d76568c381c4180780f040d2be8ea2",
+ []
+ ],
+ "dir-shadow-35-ref.html": [
+ "c4e9f8c70eb520dfc19bef0a0c91ec7f45117710",
+ []
+ ],
+ "dir-shadow-36-ref.html": [
+ "f8af117e3bf71d673906acc0ff14dc8259db14bc",
+ []
+ ],
+ "dir-shadow-37-ref.html": [
+ "5941b23c02a5aae31146e8286992a4e431795d6c",
+ []
+ ],
+ "dir-shadow-38-ref.html": [
+ "f8af117e3bf71d673906acc0ff14dc8259db14bc",
+ []
+ ],
+ "dir-shadow-39-ref.html": [
+ "8f75e9877c4051a3ae532c94cde2d9bae2270556",
+ []
+ ],
+ "dir-shadow-40-ref.html": [
+ "c1c074812b5ed248ab9aa02c10818041c56856fa",
+ []
+ ],
+ "dir-shadow-41-ref.html": [
+ "41f9c8bc31c57c4af85d8c2bc2e7024a484497bd",
+ []
+ ],
+ "dir-shadow-utils.js": [
+ "c7d89cf908286bf2ebad72abc59abe26949a209a",
+ []
+ ],
"dir_auto-EN-L-ref.html": [
"de6e13b3a3221f6054e387eb76525673bc1201f9",
[]
@@ -440346,6 +441150,10 @@
"4349df38d6aabc9bcc98a5a2666139a6d52a8881",
[]
],
+ "details-display-type-002-ref.html": [
+ "297634b521fab5e61d0bbac9edb4480b5de7366d",
+ []
+ ],
"details-pseudo-elements-001-ref.html": [
"43f2216bec7894f5ffd060bd52375697dbb3faec",
[]
@@ -440766,7 +441574,7 @@
[]
],
"media-min-width.html": [
- "7c309469024ad95eb294d32e1d97868718ff1722",
+ "8a4ad500cb184296864ea87113635f303f412e76",
[]
]
}
@@ -442446,7 +443254,7 @@
}
},
"interfaces.js": [
- "96abf61e2ce1e3523ac60427dad07de9686d9c15",
+ "05fc82f767358a75cc2c536d3944f234f4a3532b",
[]
],
"links": {
@@ -444048,11 +444856,11 @@
[]
],
"delay-load-event-iframe.html": [
- "38a9a21541987f501f8c718202ddf25da48bdca5",
+ "efec7657c3620f6ddabe6581b0ba8c6c1c187f0a",
[]
],
"helper.js": [
- "331cf79bf0bab55f33c7ee95b46de634ea6d0ccc",
+ "cb5f45eb0d656a09c8f12aa37c1127f2752f1c09",
[]
]
},
@@ -447453,7 +448261,7 @@
[]
],
"WEBGL_clip_cull_distance.idl": [
- "46fa921fd5392807558518742eff3436702030fc",
+ "a3a6dd869f9515d406e4296a7e2016d395f231ea",
[]
],
"WEBGL_color_buffer_float.idl": [
@@ -447509,11 +448317,11 @@
[]
],
"WEBGL_multi_draw.idl": [
- "ee8c044b5296f5a68c6edb48cc3e2d99a839f457",
+ "fc2270029b13d7876f717e4529b94e507809df50",
[]
],
"WEBGL_multi_draw_instanced_base_vertex_base_instance.idl": [
- "2258fa9a10cf9f05e80ab1b220452070c0fbd87b",
+ "7e4515cc36bba40fb35aa4970d02247e558a1a1d",
[]
],
"WEBGL_provoking_vertex.idl": [
@@ -447544,6 +448352,10 @@
"80ceb225308a057d99ce39f575ebcf8eb40ab5fb",
[]
],
+ "audio-session.idl": [
+ "f542347c710143e6003e96907c989614a40c701a",
+ []
+ ],
"autoplay-detection.idl": [
"cd0884fe521f3af9385ec46f65d67b7d3045f4b0",
[]
@@ -447581,7 +448393,7 @@
[]
],
"clipboard-apis.idl": [
- "3f2c9ba6f28253f6febaf689e150d188d4fc3374",
+ "51d5af18dc208b3953eb0db531343207be8e2c90",
[]
],
"compat.idl": [
@@ -447740,6 +448552,10 @@
"b0f26ea83c777becd82d86d02964c8627b3a6d83",
[]
],
+ "css-view-transitions-2.idl": [
+ "6d23f406b01ae9795a2edfaf4f2b6ade9ceb3925",
+ []
+ ],
"css-view-transitions.idl": [
"745eb1d96913389a24b933152c674abb086e3c28",
[]
@@ -447785,7 +448601,7 @@
[]
],
"edit-context.idl": [
- "937b6579376b5d4d5bb28fbc885278c539b65e98",
+ "011130480e9f3b89b0a227d82c527aa334b5e55f",
[]
],
"element-capture.idl": [
@@ -447817,7 +448633,7 @@
[]
],
"fenced-frame.idl": [
- "75196932821489cb7c76fa0b29c2a0b3f2a6d90f",
+ "0eed6a6b4ba46e0eb30b26cc78a4b9cc65fc544d",
[]
],
"fetch.idl": [
@@ -447889,7 +448705,7 @@
[]
],
"html.idl": [
- "eec3f781c7436848e705d4f82875b19accdf8ebd",
+ "c7f744ccbe601bd075f218878f618897f09413b3",
[]
],
"idle-detection.idl": [
@@ -447917,7 +448733,7 @@
[]
],
"intersection-observer.idl": [
- "52db1c4baa9562f836f2273a4b21a4f970ff9318",
+ "8502a11357faabd327d5659089198f0133a9db4c",
[]
],
"intervention-reporting.idl": [
@@ -448009,7 +448825,7 @@
[]
],
"mediasession.idl": [
- "cca46ac5a85a6384e75f20bcc670a2d3025c409a",
+ "83c1eb59dffd7caf2a811caaba72a6ebd0bacdc5",
[]
],
"mediastream-recording.idl": [
@@ -448233,7 +449049,7 @@
[]
],
"shared-storage.idl": [
- "d223736f29f5933c9f59eb220c49912f8439d50d",
+ "edbe2c2bcc3e913ff42575fe8ffef7e2425051d9",
[]
],
"speech-api.idl": [
@@ -448285,15 +449101,15 @@
[]
],
"turtledove.idl": [
- "393792ffeac7749d3e2575160106b0038701aede",
+ "c7f49f70a92522e14790bc65a11b2f3890de9e61",
[]
],
"ua-client-hints.idl": [
- "c69714b9734ade32207ba1b2ff9a6cd5c2f46924",
+ "6a40e1bdc4bae6dddcb649d7f146fb6aba74b516",
[]
],
"uievents.idl": [
- "5fdc812e700ccd0f99175b99ca4fe80d7748b13b",
+ "fef90d48410b343483493a6be6b734a7c972583e",
[]
],
"url.idl": [
@@ -448369,7 +449185,7 @@
[]
],
"webaudio.idl": [
- "1569de204bd9ff0d8d784cd0347c35a9ab1f645f",
+ "73dc35d260946aed4e24013d5882c5dbeb86423d",
[]
],
"webauthn.idl": [
@@ -448421,7 +449237,7 @@
[]
],
"webgl2.idl": [
- "5499e5a68b1be50f1e398de0d82c34b97c83f8bf",
+ "9cb639932e82fc45ab626ec00f8f28831c66eb13",
[]
],
"webgpu.idl": [
@@ -448445,7 +449261,7 @@
[]
],
"webrtc-encoded-transform.idl": [
- "6dd2ba3fffa0072136dabf9826299c40d4557dc2",
+ "1a456577d38870c033417e45cc0fa9b6317875b4",
[]
],
"webrtc-ice.idl": [
@@ -448477,7 +449293,7 @@
[]
],
"webtransport.idl": [
- "a9f514e2366e1ea2200989aef84abe612596f369",
+ "284ab350829cb4faea0ef6f62dacb4eb465a7aad",
[]
],
"webusb.idl": [
@@ -452359,6 +453175,14 @@
"12fc99b50b2e4c875c0b31d0d81d3a3f33e0eea3",
[]
],
+ "report-only-and-enforce.https.sub.html.sub.headers": [
+ "48f483dd45ee40c869aa833a61f6af3a5f889a8c",
+ []
+ ],
+ "report-only-single-endpoint.https.sub.html.sub.headers": [
+ "881eaba1493667075156de4b0a8a29da3d92c90c",
+ []
+ ],
"report-to-multiple-endpoints.https.sub.html.sub.headers": [
"14b742c5587b928b6b3bac3963443ea2c7251e1c",
[]
@@ -455438,7 +456262,7 @@
[]
],
"generic_sensor_mocks.js": [
- "98a29c2104fd91eccce12d10ecd58561755cbf82",
+ "5ca8dc0173bbe89f3bb2d54d8d955d4cd036126f",
[]
],
"generic_sensor_mocks.js.headers": [
@@ -459928,7 +460752,7 @@
[]
],
"soft-navigation-helper.js": [
- "7f83df75f8fe5db63bd0e2714b424a319f852a74",
+ "1116ebccb359e302f109bdb7ba455c827a43a193",
[]
]
}
@@ -461956,7 +462780,7 @@
[]
],
"run_tc.py": [
- "a5a6256ad542e1601988c5ad408804ec671d7298",
+ "b91825497d4996f5b3599502f7bed65475d4130f",
[]
],
"taskcluster-run.py": [
@@ -470285,7 +471109,7 @@
[]
],
"script.py": [
- "99b26927403515de31d822336ee4d5ed062f7cd6",
+ "f128b0d089c28bef46ce571a17e10d02b4fce8bd",
[]
],
"session.py": [
@@ -470660,11 +471484,11 @@
[]
],
"firefox.py": [
- "d91703f42dd2a2faeab45b2e5941ad626603ceb5",
+ "2ef3e18900ff98e5793f2cc374a5c171ada84818",
[]
],
"firefox_android.py": [
- "8437dd2005929834db22626cbbb3dcd3f4a5b926",
+ "1937d97c40193972ae44a434287cf64b362639ac",
[]
],
"ie.py": [
@@ -471041,7 +471865,7 @@
[]
],
"wptcommandline.py": [
- "58c726fe379e0cadbef9f89dcf21200189d3999e",
+ "d90f028ceb6dce9418a2c1787210db7d74e4d98e",
[]
],
"wptlogging.py": [
@@ -479345,6 +480169,22 @@
"f00448271922785d499a31e7126dfd9c63ebec95",
[]
],
+ "shared-worker-echo-cookies.js": [
+ "34dcbc9d260bd8acc87c3d4c78a4e187981d27b5",
+ []
+ ],
+ "shared-worker-partitioned-cookies-3p-frame.html": [
+ "dc700d31f97a2b2c85040531dfe52924f0058d56",
+ []
+ ],
+ "shared-worker-partitioned-cookies-3p-window.html": [
+ "e37e0a2cc6b6e53340cc46b6816b881b33c2d876",
+ []
+ ],
+ "shared-worker-partitioned-cookies-helper.js": [
+ "3bcdc879e8e5aaf6e5e73126bd0786cbd31fa618",
+ []
+ ],
"sync_xhr.js": [
"5de74765373876ef77b2ab5b8addffaa33e7e045",
[]
@@ -492929,7 +493769,7 @@
]
],
"okp_importKey.https.any.js": [
- "a0ec3e81c877e12539528ca5ba60502bc4f91979",
+ "a56bd31cbe14b1e5a2024a75fa77491bed2256ea",
[
"WebCryptoAPI/import_export/okp_importKey.https.any.html",
{
@@ -493702,7 +494542,7 @@
],
"name": {
"comp_embedded_control.html": [
- "09856ef662e90cba81059ad3c8a977e63b3781b5",
+ "2cdb5cbdf7d0e269a3613dd5af611d282af3bf64",
[
null,
{
@@ -493711,7 +494551,7 @@
]
],
"comp_hidden_not_referenced.html": [
- "84a2a2ca8026e3f82db1d66d6d4ffb1ddc3d13ef",
+ "7d9cf2c36f6426a472eceae995e1e4a0de8abb81",
[
null,
{
@@ -502903,15 +503743,6 @@
}
]
],
- "async-unsanitized-standard-html-formats-write-read.tentative.https.html": [
- "0eb97926bc091fff89913e830498d50c43049fe3",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
"async-unsanitized-standard-html-read-fail.tentative.https.html": [
"e7ddbb0cdf6e29f98ff7eb86e16c1658c94b54f8",
[
@@ -515780,27 +516611,6 @@
{}
]
],
- "align-tracks-computed.html": [
- "76241f694af632f0258c167e9b624e5db306c8de",
- [
- null,
- {}
- ]
- ],
- "align-tracks-invalid.html": [
- "68f38f5a61ce5e43da50add0daf0a56b86042f72",
- [
- null,
- {}
- ]
- ],
- "align-tracks-valid.html": [
- "1c9a8b040cd88d0ae91fd83b4806f8fd0a5b198b",
- [
- null,
- {}
- ]
- ],
"column-gap-computed.html": [
"01e04b04994ae61e1e94952f06757cc896ab75df",
[
@@ -515913,27 +516723,6 @@
{}
]
],
- "justify-tracks-computed.html": [
- "372d17c91018e1600e76ebe5caba0e6584daab4b",
- [
- null,
- {}
- ]
- ],
- "justify-tracks-invalid.html": [
- "a1dc2cc73880039993e2de0d5dd6114db88d63dd",
- [
- null,
- {}
- ]
- ],
- "justify-tracks-valid.html": [
- "be4f426f144b474555b7f40da563a9d3338f3665",
- [
- null,
- {}
- ]
- ],
"place-content-computed.html": [
"1fc152c231d271163f20cba74e471734e7fbc134",
[
@@ -516156,6 +516945,13 @@
}
},
"css-anchor-position": {
+ "anchor-center-001.html": [
+ "f8583e68c00183023b88690c79cfc1d3524ab00d",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-default-003.html": [
"00c20324344d0d888aace7f5414ba7e5354af786",
[
@@ -516569,6 +517365,20 @@
{}
]
],
+ "anchor-scroll-006.html": [
+ "2ffd026b55296f105e37141646f12d999cd56d5b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "anchor-scroll-007.html": [
+ "ec519106190c7cebe095a2dc4396cfe94486fb61",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-scroll-fallback-position-001.html": [
"04518e5019349f74a2435f6c80318b2481f8fa15",
[
@@ -519850,6 +520660,13 @@
{}
]
],
+ "light-dark-basic.html": [
+ "ee0533223842e9ec0dc7b72cf4756aa296abccf0",
+ [
+ null,
+ {}
+ ]
+ ],
"nested-color-mix-with-currentcolor.html": [
"a4dd687dd5814af2e4660586a2c97c09ba34ffe4",
[
@@ -529026,6 +529843,13 @@
]
},
"subgrid": {
+ "align-self-baseline-with-subgrid-mbp.html": [
+ "bb9f8444835787f0d3fa0ee2b2f7b76dc8001a6a",
+ [
+ null,
+ {}
+ ]
+ ],
"grid-template-computed-nogrid.html": [
"1f37ce860acfd3eeec3f00dcd09819e00b15a5b9",
[
@@ -533244,7 +534068,7 @@
]
],
"determine-registration.html": [
- "20cddc48adcc9c313f3097c2ff6883a64bd4df1c",
+ "99e39c191ec0dc9fe6e2e3e93ae6f121a9cffd53",
[
null,
{}
@@ -533257,6 +534081,13 @@
{}
]
],
+ "get-computed-style-enumeration.html": [
+ "909247f69a887913c67ece8494f77d8e99e63127",
+ [
+ null,
+ {}
+ ]
+ ],
"idlharness.html": [
"6f053757c3cef099f0cea41716a942dfa7e66100",
[
@@ -533264,6 +534095,13 @@
{}
]
],
+ "invalid-at-computed-value-time.html": [
+ "56a7756f40643478b5505390f29a982e7754bd8c",
+ [
+ null,
+ {}
+ ]
+ ],
"property-cascade.html": [
"bb50213d5ce171b98b3569e2fd39fcc3b3b22abb",
[
@@ -533901,7 +534739,7 @@
]
],
"slotted-parsing.html": [
- "bed4dedd56072ad1937ec536f2e6bc04f1fb70fd",
+ "e4657b588af5e0fd5edaac23c5c94ae49f17750d",
[
null,
{}
@@ -540359,15 +541197,6 @@
]
]
},
- "text-spacing-trim": {
- "text-spacing-trim-combinations-001.html": [
- "4b49e64323a9c1a116fc1b2a1ba8138ad3170aa6",
- [
- null,
- {}
- ]
- ]
- },
"white-space": {
"append-whitespace-only-node-crash-001.html": [
"b32555b18876898beb1b3b7b4559268d64ae9c1c",
@@ -545184,21 +546013,21 @@
]
],
"form-sizing-computed.html": [
- "557b1d5eb960d4afe4b073b376d476108dc2fb95",
+ "e508cd2050e3e0dad6c4fc66cbc82d9a4d9329c9",
[
null,
{}
]
],
"form-sizing-invalid.html": [
- "80ab546f90e1ea1f54a1661ea68623ffa942e9c9",
+ "5589707b25e32da8bed734db32a6a5f491853895",
[
null,
{}
]
],
"form-sizing-valid.html": [
- "f7cc8f44c3cc06d482b0956a7e0635408d9abb9d",
+ "d9d39f79132dc4b187e2e4079ca103af471d1919",
[
null,
{}
@@ -546862,6 +547691,13 @@
{}
]
],
+ "file-input-computed-style.html": [
+ "417534e9bd6cfa6ebae9f5ecb5f37b5de45b3d9b",
+ [
+ null,
+ {}
+ ]
+ ],
"meter-appearance-native-computed-style.optional.html": [
"446036b73c92734f8d4099b3d9018879bdce1239",
[
@@ -546876,6 +547712,15 @@
{}
]
],
+ "select-multiple-keyboard-selection.optional.html": [
+ "1b160946f5c3bbcd0c7887a8527eb023c78e3b9a",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"select-multiple-options-visual-order.html": [
"359c09279ed856087e4967ed44521dce7fd63c5c",
[
@@ -551768,7 +552613,7 @@
]
],
"is-where-parsing.html": [
- "3159ecfe6a65b715912eeee10041b56defc89416",
+ "6d404dd953b28e2a1f79ce9de57ec57bbe8805f1",
[
null,
{}
@@ -551915,14 +552760,14 @@
]
],
"parse-has-disallow-nesting-has-inside-has.html": [
- "a633c913d160164023a33ff1a6ffe74dc617eb29",
+ "8ea816b5d898ebaa6a721f94ecfb4a26dadf79e4",
[
null,
{}
]
],
"parse-has.html": [
- "3492373a3362f8e220f02c84bfc8b8eb5a6e29c8",
+ "949040838cf0409e0ee4bc80fdf4ebe9095eb3de",
[
null,
{}
@@ -556943,7 +557788,29 @@
]
]
},
+ "observable": {
+ "tentative": {
+ "observable-constructor.any.js": [
+ "37c242661d6041db1df39802768d440e53b515c8",
+ [
+ "dom/observable/tentative/observable-constructor.any.html",
+ {}
+ ],
+ [
+ "dom/observable/tentative/observable-constructor.any.worker.html",
+ {}
+ ]
+ ]
+ }
+ },
"parts": {
+ "basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html": [
+ "a1af7e89c29c01d6341093fddc21653f16b87a9b",
+ [
+ null,
+ {}
+ ]
+ ],
"basic-dom-part-declarative-brace-syntax.tentative.html": [
"dd5f1ba7b1052d7b39597ae43fdbe455c6225c89",
[
@@ -556959,7 +557826,7 @@
]
],
"basic-dom-part-objects.tentative.html": [
- "af77b28b02f91b1e553901ad2f2ea4e96d8ea97b",
+ "d7adf61739cd61e975d00896bcb29f15091566d9",
[
null,
{}
@@ -590882,7 +591749,7 @@
]
],
"cross-origin.https.sub.window.js": [
- "1c1d5f2f6b77ac777b4d1c5167abba439b0bc577",
+ "178b3284bd5264997666dfde4eefa1c6c30bcdad",
[
"fledge/tentative/cross-origin.https.sub.window.html?1-4",
{
@@ -630094,6 +630961,13 @@
{}
]
],
+ "lang-attribute-shadow.window.js": [
+ "9ed242df169c11ce7da4779ff809d16a255a6194",
+ [
+ "html/dom/elements/global-attributes/lang-attribute-shadow.window.html",
+ {}
+ ]
+ ],
"mapped-attribute-adopt-001.html": [
"66ff3d64f13cdffe4413ee19534604af020203df",
[
@@ -631528,7 +632402,7 @@
]
],
"document-base-url-changes-about-srcdoc-2.https.html": [
- "eac1eaf7d0a511a5de3a0d4906842bc065e90bea",
+ "14e712ce254951f22916c5269206f2cc18b82c4c",
[
null,
{}
@@ -634290,28 +635164,28 @@
]
},
"form-sizing-input-number.tentative.html": [
- "59835805a07148061b3e37b12d98d345a7f6b4cb",
+ "0bf64c181d0f1e12da6b4d71ea449d0be0f40d39",
[
null,
{}
]
],
"form-sizing-input-text.tentative.html": [
- "32cabc557f6fc2d7cc22dcfa5eac7bd9059d5615",
+ "065994471f02867be1d2825d19e47489771e324f",
[
null,
{}
]
],
"form-sizing-select.tentative.html": [
- "f9efdc74f9145b73d02e15105a9d19996d47d277",
+ "7ce6f03ff4bd3f2edba9c684365678d858db1cdb",
[
null,
{}
]
],
"form-sizing-textarea.tentative.html": [
- "ae20e59290c7d4d8bef9d36af583356f08819014",
+ "fb4ce762e323102c0128815479daddc46ff39f9e",
[
null,
{}
@@ -635964,7 +636838,7 @@
]
],
"resource-selection-source-media-env-change.html": [
- "30d591ae6e7db18116eeb47dcf0be7c980112288",
+ "67f2c8300d2dcc4b1b23a4e0976f3fe14495ea51",
[
null,
{}
@@ -639566,7 +640440,7 @@
]
],
"resize-during-playback.html": [
- "1b057bbeac322e4bcdaa2ab7d1ff664b06402846",
+ "e1f35768bc41b4356f0638821ea42fb727d56fc4",
[
null,
{}
@@ -642279,8 +643153,8 @@
{}
]
],
- "name-attribute.tentative.html": [
- "6f45b3da089e3f14ae8a0d4c712b0dde1dd2607a",
+ "name-attribute.html": [
+ "2685546e9b00cf39f25fbb790c3543028274b598",
[
null,
{}
@@ -643011,6 +643885,15 @@
]
}
},
+ "permission-element": {
+ "no-end-tag-no-contents.html": [
+ "5fcce1421b6cd2abed01ab95c381aa7d29708e98",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"popovers": {
"hide-other-popover-side-effects.html": [
"7cc95a95e907df3fc9eee30f45a4a46f38fc90dd",
@@ -647334,14 +648217,14 @@
],
"ordering": {
"delay-load-event-1.html": [
- "5c8acd470eb578f33247f6244e9c4bbd99022768",
+ "c5812765ebb74312cba9df4afbf7f4fe607d06a2",
[
null,
{}
]
],
"delay-load-event-2.html": [
- "3399a8c001f0b9e0859d414373eced05a6ce9431",
+ "916673894dc174fc16b785b059b3861bbcb35935",
[
null,
{}
@@ -664199,7 +665082,7 @@
]
],
"RTCRtpSendParameters-degradationEffect.html": [
- "e6a03c593f3a2e9e37cd2520181b266fc827d8a2",
+ "a2da6cd139fa40978895bfc8ba2571384c280c8f",
[
null,
{
@@ -664275,7 +665158,7 @@
]
],
"after-transition-traverse.html": [
- "7dd1226e54c10c7cd502048aca469d0f722737b1",
+ "d348a218ac4a4b7efa0c54ac8e50b51783b1253a",
[
null,
{}
@@ -664312,7 +665195,7 @@
},
"currententrychange-event": {
"anchor-click.html": [
- "e0bf91166aa2386b7043ccc12aed636c965952a5",
+ "ce8fc69f5d4486c990284adfa5e4608af8fd198e",
[
null,
{}
@@ -664326,28 +665209,28 @@
]
],
"history-back-same-doc.html": [
- "768805b7526fcd25898200d0d33f87f9440e6893",
+ "885d558bb5d5350afb817c9db64be442e7155862",
[
null,
{}
]
],
"history-pushState.html": [
- "1a17a7cec0cade51f537d1ef719fed647e6ebfb6",
+ "cfefcda1d6a8e5d769c0f26373565b25d68523bf",
[
null,
{}
]
],
"history-replaceState.html": [
- "e8ae8ee57a2c78f36f27643274be01c9fe44b602",
+ "5b6fc09bf949a2f41e2393774673c7707c6a5dc7",
[
null,
{}
]
],
"location-api.html": [
- "88ebd985a1e9803a4c66b71afc4dda3033fa0565",
+ "b142fabb2279f2b81dec595865126c9cd438c33c",
[
null,
{}
@@ -664382,7 +665265,7 @@
]
],
"navigation-back-forward-same-doc.html": [
- "8182673aa59dc007d52de97d9cce27614eec38cb",
+ "cd307a3d538e5842e1061fc9523af5ad84dd5f91",
[
null,
{}
@@ -664424,14 +665307,14 @@
]
],
"navigation-navigate-replace-same-doc.html": [
- "f993597305723d1bb5810b7ea8a4ab83cfb3074a",
+ "79ade9396f393484ae5c6cb19936238cd9749a4f",
[
null,
{}
]
],
"navigation-navigate-same-doc.html": [
- "87fc28d174a6c8bfbcde746fc019cbd833800319",
+ "0cf5214eae62c0259cccb6c80e3d46f4fa21f551",
[
null,
{}
@@ -665282,7 +666165,7 @@
]
],
"current-basic.html": [
- "78bbbb05607c3b8c5338d1c062c192936de69407",
+ "66a7100bf6d3e72ac0ade9a7320b387b55f0916c",
[
null,
{}
@@ -665345,7 +666228,7 @@
]
],
"entries-after-navigations-in-multiple-windows.html": [
- "d1d4d86eb382cab6d9f538a6aa35cc51e64da5a0",
+ "8cba4c80b7e505595af4b3a4ecd1a3773b2462de",
[
null,
{}
@@ -665380,7 +666263,7 @@
]
],
"entries-when-inactive.html": [
- "c70b6d8bf870fbbffc7214d14e436ad83613368b",
+ "1130f69800fa50b168eff37c9860dbc04232a8b9",
[
null,
{}
@@ -665394,21 +666277,21 @@
]
],
"index-not-in-entries.html": [
- "a16d130ba16b39b80ad9b968fd16406897c9a9d1",
+ "021848f1a3e09ae4b31a85ce5014209ab2a45793",
[
null,
{}
]
],
"key-id-back-cross-document.html": [
- "2dd58c03e9d7cd3f81f50ad0c320e60dcaa07bf7",
+ "efede38ab312cfe5cb474477414ed3d4b0efe060",
[
null,
{}
]
],
"key-id-back-same-document.html": [
- "858b5fd2c896347ae86680ed554f4160636aa3fd",
+ "d3c0252fdbbd9c178736ce5c4331b6e983e0ca44",
[
null,
{}
@@ -665422,7 +666305,7 @@
]
],
"key-id-location-reload.html": [
- "f950e2f3a2172e266810fa44ded85647a8eb5247",
+ "aacd8a28598bbb3bdba3a947c6f24ea803cfd16c",
[
null,
{}
@@ -665436,7 +666319,7 @@
]
],
"key-id-location-replace.html": [
- "a58772a7f479ba2f64f2b220c85588e496e8e4c4",
+ "d741049c44d76e913f9e4052c251745c66aed077",
[
null,
{}
@@ -665478,7 +666361,7 @@
]
],
"sameDocument-after-fragment-navigate.html": [
- "a197f825d8eda300250af2961bfd14448cdc3fc2",
+ "1c0cd6e82530fd347d7760fcf64e5b41798e7f17",
[
null,
{}
@@ -666358,14 +667241,14 @@
]
],
"currententrychange-before-popstate-intercept.html": [
- "c51c7c444cb9a574f334e87ee1107271971dc42f",
+ "10627c5875433a44dcf18e080239c5e520f6c939",
[
null,
{}
]
],
"currententrychange-dispose-ordering.html": [
- "4ca9ba29800b737ba36f9eb040be44b1162290f2",
+ "ecca39e6a0a69e5f680df1e4d581555f5c5e7473",
[
null,
{}
@@ -666616,28 +667499,28 @@
]
],
"dispose-for-full-session-history.tentative.html": [
- "9bed225cf36550a71942188a2b9d701e02244cdb",
+ "6f5007ac569f6245a8fe4e5f0ff4c4502f078bec",
[
null,
{}
]
],
"dispose-for-navigation-in-child.html": [
- "24828770852687fc0af9aa1473119e2ac40f6a1a",
+ "d351fad6c0895b7240e64319594deb9dff2731d1",
[
null,
{}
]
],
"dispose-same-document-intercept.html": [
- "44aa096aafec78dd06215b90ac75316d61b5c5e2",
+ "862e01127bed042f29d32def902a381452ae78d1",
[
null,
{}
]
],
"dispose-same-document-navigate-during.html": [
- "59d9b3cce3977ae255e25a2e96220ef92700c63c",
+ "88eb35c225fa7cbeb8bf03a2af8f37629ff580c5",
[
null,
{}
@@ -666651,28 +667534,28 @@
]
],
"dispose-same-document-replace-with-intercept.html": [
- "4e492e30aedeb69030cb596e2e5b8f117290d2de",
+ "7814543e7142229b300ecf51d17eb9fd9a4ca764",
[
null,
{}
]
],
"dispose-same-document-replaceState.html": [
- "a6197260a28b8137a142453fd669fbeb82b12680",
+ "78df25774c33d8812f920921015dd6d692b5050d",
[
null,
{}
]
],
"dispose-same-document.html": [
- "27806ce3c86a672701785be2453788e50b9b7388",
+ "e41403e773cdbdbfaa109a29055397bf5a3b40da",
[
null,
{}
]
],
"dispose-skip-current-on-truncate.html": [
- "56ec4d301f9540fc7baf3f0f8daf52df6b4ea4b2",
+ "bcf0ee3b79e577a1d31094426d7f320743572164",
[
null,
{}
@@ -666893,14 +667776,14 @@
]
],
"same-document-away-and-back-location-api.html": [
- "d161df8b5295f1bbc8e396a4345ef2ae0112264f",
+ "ddc90eef8c57027c20e3c53ae900087dd5ea988d",
[
null,
{}
]
],
"same-document-away-and-back-navigation-api.html": [
- "220908e4c46cb91ad24408078ef1f7846b45e1b6",
+ "cfb7765b0d5dc49a910b3d9ee15fb93af28ab4ff",
[
null,
{}
@@ -666993,7 +667876,7 @@
]
],
"same-document-away-and-back-location-api.html": [
- "47b1904f4f46f6cbd1a8bbdebbd2516e9669df93",
+ "04b615cf831ed20f397d56a997075748aa681f33",
[
null,
{}
@@ -671475,6 +672358,24 @@
}
]
],
+ "report-only-and-enforce.https.sub.html": [
+ "6254b3247e2d1075b1c34db70c0092b9dfd39089",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "report-only-single-endpoint.https.sub.html": [
+ "7f9bad40cbba1650a2df88b43b84ccf5d55086e8",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"report-to-multiple-endpoints.https.sub.html": [
"ce392ed94124d35726bc8fdbdbb6c855d69d0cb8",
[
@@ -698949,7 +699850,25 @@
]
],
"keydown.tentative.html": [
- "fac86d71d2cc04c17fedc98e4d8ba8133050725a",
+ "19971e6d2da58d50cc6e94411b644e74fb4db137",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "keypress.tentative.html": [
+ "5bd512ec3e74a1cb3ac5da0e3d6406a3799c96e6",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "keyup.tentative.html": [
+ "8b5717d62e935676aea2894d601f0075878edb44",
[
null,
{
@@ -710832,7 +711751,7 @@
]
],
"SVGLength-px-with-context.html": [
- "b5c2149b692eea53d7565031d135317526736c44",
+ "7cbe27f83a3be8a2f106eb27bc6540d0274ec56c",
[
null,
{}
@@ -724092,6 +725011,13 @@
{}
]
],
+ "moderate-exponentialRamp.html": [
+ "cf32d253ae625cf82f9475b5469dfdef9973cc8f",
+ [
+ null,
+ {}
+ ]
+ ],
"nan-param.html": [
"e9b8f0accbd1b0359275615f3ef12bd7e9317c4f",
[
@@ -725797,7 +726723,7 @@
]
],
"audio-encoder.https.any.js": [
- "cd7739bcd26deb4fb8e5970d39180d68e3a331d3",
+ "51496551cf525b3208be63bb3dbce325a13882ed",
[
"webcodecs/audio-encoder.https.any.html",
{
@@ -728221,7 +729147,7 @@
]
],
"transfering.https.any.js": [
- "b9487e589d833d8617eeae4d7f4cc513c30a9c69",
+ "b127670d7b4c6f78382f1b34a080ac9b7a119a6c",
[
"webcodecs/transfering.https.any.html",
{
@@ -744509,6 +745435,147 @@
{}
]
],
+ "close-connecting-async.any.js": [
+ "c7ace1fca2734085705e191cd2a5e089f2306664",
+ [
+ "websockets/interfaces/WebSocket/close/close-connecting-async.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "../../../constants.sub.js"
+ ],
+ [
+ "variant",
+ ""
+ ],
+ [
+ "variant",
+ "?wpt_flags=h2"
+ ],
+ [
+ "variant",
+ "?wss"
+ ]
+ ]
+ }
+ ],
+ [
+ "websockets/interfaces/WebSocket/close/close-connecting-async.any.html?wpt_flags=h2",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "../../../constants.sub.js"
+ ],
+ [
+ "variant",
+ ""
+ ],
+ [
+ "variant",
+ "?wpt_flags=h2"
+ ],
+ [
+ "variant",
+ "?wss"
+ ]
+ ]
+ }
+ ],
+ [
+ "websockets/interfaces/WebSocket/close/close-connecting-async.any.html?wss",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "../../../constants.sub.js"
+ ],
+ [
+ "variant",
+ ""
+ ],
+ [
+ "variant",
+ "?wpt_flags=h2"
+ ],
+ [
+ "variant",
+ "?wss"
+ ]
+ ]
+ }
+ ],
+ [
+ "websockets/interfaces/WebSocket/close/close-connecting-async.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "../../../constants.sub.js"
+ ],
+ [
+ "variant",
+ ""
+ ],
+ [
+ "variant",
+ "?wpt_flags=h2"
+ ],
+ [
+ "variant",
+ "?wss"
+ ]
+ ]
+ }
+ ],
+ [
+ "websockets/interfaces/WebSocket/close/close-connecting-async.any.worker.html?wpt_flags=h2",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "../../../constants.sub.js"
+ ],
+ [
+ "variant",
+ ""
+ ],
+ [
+ "variant",
+ "?wpt_flags=h2"
+ ],
+ [
+ "variant",
+ "?wss"
+ ]
+ ]
+ }
+ ],
+ [
+ "websockets/interfaces/WebSocket/close/close-connecting-async.any.worker.html?wss",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "../../../constants.sub.js"
+ ],
+ [
+ "variant",
+ ""
+ ],
+ [
+ "variant",
+ "?wpt_flags=h2"
+ ],
+ [
+ "variant",
+ "?wss"
+ ]
+ ]
+ }
+ ]
+ ],
"close-connecting.html": [
"de038ca09f0ea6b24419e9ae3da1c621b6302f3c",
[
@@ -753762,6 +754829,15 @@
{}
]
],
+ "shared-worker-partitioned-cookies.tentative.https.html": [
+ "e5f79cd864965af352c5ebcc4491d1311b652ef0",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"shared-worker-partitioned.tentative.html": [
"0be8479fa9b0d6f8bca1109d3adc27ae76242cef",
[
@@ -775666,41 +776742,6 @@
{}
]
],
- "border-image-repeat-001.htm": [
- "e447421a89ff6a0036a209b1c2ecef93f256a6ae",
- [
- null,
- {}
- ]
- ],
- "border-image-repeat-002.htm": [
- "f1fd6ffbc3bf56c18c6d10a7460dc5be3a073117",
- [
- null,
- {}
- ]
- ],
- "border-image-repeat-003.htm": [
- "255fdfccb96fe5a27ceba17aa72728dd528f0edc",
- [
- null,
- {}
- ]
- ],
- "border-image-repeat-004.htm": [
- "acf7cfa7b842b96c70a57dda047e834e8649f594",
- [
- null,
- {}
- ]
- ],
- "border-image-slice-004.htm": [
- "86b3c1e6b1dd80770c3867b058e9a8920786db06",
- [
- null,
- {}
- ]
- ],
"border-images.html": [
"930a1df3b7fda4098f36cc9691a544f46e2311d5",
[
@@ -780166,10 +781207,12 @@
]
],
"invalid.py": [
- "cfe5711e63bed061462fb1cd5da75e023883b5fb",
+ "9de343955c8a260203f0a0beee962e0aa2ddaaf6",
[
null,
- {}
+ {
+ "timeout": "long"
+ }
]
],
"invalid_tentative.py": [
@@ -780248,6 +781291,13 @@
null,
{}
]
+ ],
+ "user_activation.py": [
+ "786fb43954f19d28e08b9b75b88b06d29dad89bc",
+ [
+ null,
+ {}
+ ]
]
},
"classic_interop": {
@@ -780326,7 +781376,7 @@
]
],
"invalid.py": [
- "666bf4d06e0ef128132ef659c8ce039e3821f6fc",
+ "f27720a204e5ae78e12fcfa6be883750b9767337",
[
null,
{}
@@ -780380,6 +781430,13 @@
null,
{}
]
+ ],
+ "user_activation.py": [
+ "4ca558435d70e3890b0b8b8c7b7b3f4cd28db91e",
+ [
+ null,
+ {}
+ ]
]
},
"get_realms": {
diff --git a/tests/wpt/meta/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini
index 5c65209a084..381ee699ecc 100644
--- a/tests/wpt/meta/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini
+++ b/tests/wpt/meta/WebCryptoAPI/import_export/okp_importKey.https.any.js.ini
@@ -287,6 +287,66 @@
[Good parameters: X448 bits (jwk, object(crv, d, x, kty), {name: X448}, false, [deriveKey, deriveBits, deriveKey, deriveBits\])]
expected: FAIL
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(kty, crv, x), {name: X25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(kty, crv, x), {name: X448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
+
[okp_importKey.https.any.html]
[Good parameters: Ed25519 bits (spki, buffer(44), {name: Ed25519}, true, [\])]
@@ -576,3 +636,63 @@
[Good parameters: X448 bits (jwk, object(crv, d, x, kty), {name: X448}, false, [deriveKey, deriveBits, deriveKey, deriveBits\])]
expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(kty, crv, x), {name: Ed25519}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed25519 (jwk, object(crv, d, x, kty), {name: Ed25519}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(kty, crv, x), {name: Ed448}, true, [verify, verify\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: Ed448 (jwk, object(crv, d, x, kty), {name: Ed448}, true, [sign, sign\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(kty, crv, x), {name: X25519}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X25519 (jwk, object(crv, d, x, kty), {name: X25519}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(kty, crv, x), {name: X448}, true, [\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits, deriveKey\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveBits\])]
+ expected: FAIL
+
+ [Good parameters with ignored JWK alg: X448 (jwk, object(crv, d, x, kty), {name: X448}, true, [deriveKey, deriveBits, deriveKey, deriveBits\])]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/parsing/align-tracks-computed.html.ini b/tests/wpt/meta/css/css-align/parsing/align-tracks-computed.html.ini
deleted file mode 100644
index e63929a5b30..00000000000
--- a/tests/wpt/meta/css/css-align/parsing/align-tracks-computed.html.ini
+++ /dev/null
@@ -1,45 +0,0 @@
-[align-tracks-computed.html]
- [Property align-tracks value 'normal']
- expected: FAIL
-
- [Property align-tracks value 'baseline']
- expected: FAIL
-
- [Property align-tracks value 'last baseline']
- expected: FAIL
-
- [Property align-tracks value 'space-between']
- expected: FAIL
-
- [Property align-tracks value 'space-around']
- expected: FAIL
-
- [Property align-tracks value 'space-evenly']
- expected: FAIL
-
- [Property align-tracks value 'stretch']
- expected: FAIL
-
- [Property align-tracks value 'center']
- expected: FAIL
-
- [Property align-tracks value 'start']
- expected: FAIL
-
- [Property align-tracks value 'end']
- expected: FAIL
-
- [Property align-tracks value 'flex-start']
- expected: FAIL
-
- [Property align-tracks value 'flex-end']
- expected: FAIL
-
- [Property align-tracks value 'unsafe end']
- expected: FAIL
-
- [Property align-tracks value 'safe flex-start']
- expected: FAIL
-
- [Property align-tracks value 'normal, normal']
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/parsing/align-tracks-valid.html.ini b/tests/wpt/meta/css/css-align/parsing/align-tracks-valid.html.ini
deleted file mode 100644
index cbe763cc151..00000000000
--- a/tests/wpt/meta/css/css-align/parsing/align-tracks-valid.html.ini
+++ /dev/null
@@ -1,54 +0,0 @@
-[align-tracks-valid.html]
- [e.style['align-tracks'\] = "normal" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "first baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "last baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "space-between" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "space-around" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "space-evenly" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "stretch" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "center" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "start" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "end" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "flex-start" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "flex-end" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "unsafe end" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "safe flex-start" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "flex-start, last baseline" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "normal, normal" should set the property value]
- expected: FAIL
-
- [e.style['align-tracks'\] = "start, flex-end, flex-end, flex-end, flex-end" should set the property value]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/parsing/justify-tracks-computed.html.ini b/tests/wpt/meta/css/css-align/parsing/justify-tracks-computed.html.ini
deleted file mode 100644
index c5b835863d7..00000000000
--- a/tests/wpt/meta/css/css-align/parsing/justify-tracks-computed.html.ini
+++ /dev/null
@@ -1,45 +0,0 @@
-[justify-tracks-computed.html]
- [Property justify-tracks value 'normal']
- expected: FAIL
-
- [Property justify-tracks value 'space-between']
- expected: FAIL
-
- [Property justify-tracks value 'space-around']
- expected: FAIL
-
- [Property justify-tracks value 'space-evenly']
- expected: FAIL
-
- [Property justify-tracks value 'stretch']
- expected: FAIL
-
- [Property justify-tracks value 'center']
- expected: FAIL
-
- [Property justify-tracks value 'start']
- expected: FAIL
-
- [Property justify-tracks value 'end']
- expected: FAIL
-
- [Property justify-tracks value 'flex-start']
- expected: FAIL
-
- [Property justify-tracks value 'flex-end']
- expected: FAIL
-
- [Property justify-tracks value 'unsafe end']
- expected: FAIL
-
- [Property justify-tracks value 'safe flex-start']
- expected: FAIL
-
- [Property justify-tracks value 'left']
- expected: FAIL
-
- [Property justify-tracks value 'unsafe right']
- expected: FAIL
-
- [Property justify-tracks value 'normal, normal']
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/parsing/justify-tracks-valid.html.ini b/tests/wpt/meta/css/css-align/parsing/justify-tracks-valid.html.ini
deleted file mode 100644
index 641b10fa7bd..00000000000
--- a/tests/wpt/meta/css/css-align/parsing/justify-tracks-valid.html.ini
+++ /dev/null
@@ -1,51 +0,0 @@
-[justify-tracks-valid.html]
- [e.style['justify-tracks'\] = "normal" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "space-between" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "space-around" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "space-evenly" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "stretch" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "center" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "start" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "end" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "flex-start" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "flex-end" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "unsafe end" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "safe flex-start" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "left" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "unsafe right" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "flex-start, last baseline" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "normal, normal" should set the property value]
- expected: FAIL
-
- [e.style['justify-tracks'\] = "start, flex-end, flex-end, flex-end, flex-end" should set the property value]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-backgrounds/border-image-repeat-002.htm.ini b/tests/wpt/meta/css/css-backgrounds/border-image-repeat-002.htm.ini
new file mode 100644
index 00000000000..fb4031b3d52
--- /dev/null
+++ b/tests/wpt/meta/css/css-backgrounds/border-image-repeat-002.htm.ini
@@ -0,0 +1,2 @@
+[border-image-repeat-002.htm]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-backgrounds/border-image-repeat-004.htm.ini b/tests/wpt/meta/css/css-backgrounds/border-image-repeat-004.htm.ini
new file mode 100644
index 00000000000..7ae2c899b70
--- /dev/null
+++ b/tests/wpt/meta/css/css-backgrounds/border-image-repeat-004.htm.ini
@@ -0,0 +1,2 @@
+[border-image-repeat-004.htm]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-backgrounds/border-image-slice-004.htm.ini b/tests/wpt/meta/css/css-backgrounds/border-image-slice-004.htm.ini
new file mode 100644
index 00000000000..33ecfc8ebc7
--- /dev/null
+++ b/tests/wpt/meta/css/css-backgrounds/border-image-slice-004.htm.ini
@@ -0,0 +1,2 @@
+[border-image-slice-004.htm]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color/light-dark-basic.html.ini b/tests/wpt/meta/css/css-color/light-dark-basic.html.ini
new file mode 100644
index 00000000000..e04d692f0eb
--- /dev/null
+++ b/tests/wpt/meta/css/css-color/light-dark-basic.html.ini
@@ -0,0 +1,6 @@
+[light-dark-basic.html]
+ [light-dark(white, black)]
+ expected: FAIL
+
+ [light-dark(light-dark(white, red), red)]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color/light-dark-currentcolor.html.ini b/tests/wpt/meta/css/css-color/light-dark-currentcolor.html.ini
new file mode 100644
index 00000000000..669af6d8ea5
--- /dev/null
+++ b/tests/wpt/meta/css/css-color/light-dark-currentcolor.html.ini
@@ -0,0 +1,2 @@
+[light-dark-currentcolor.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color/light-dark-inheritance.html.ini b/tests/wpt/meta/css/css-color/light-dark-inheritance.html.ini
new file mode 100644
index 00000000000..bf8493daf3a
--- /dev/null
+++ b/tests/wpt/meta/css/css-color/light-dark-inheritance.html.ini
@@ -0,0 +1,2 @@
+[light-dark-inheritance.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini b/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini
index d12a4482f02..ca491f611bd 100644
--- a/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini
+++ b/tests/wpt/meta/css/css-fonts/variations/at-font-face-font-matching.html.ini
@@ -50,9 +50,6 @@
[Matching font-stretch: '110%' should prefer '115% 116%' over '105%']
expected: FAIL
- [Matching font-stretch: '90%' should prefer '90% 100%' over '50% 80%']
- expected: FAIL
-
[Matching font-style: 'normal' should prefer 'oblique 0deg' over 'oblique 10deg 40deg']
expected: FAIL
@@ -71,9 +68,6 @@
[Matching font-style: 'oblique 10deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
expected: FAIL
- [Matching font-style: 'oblique 0deg' should prefer 'oblique 5deg' over 'oblique 15deg 20deg']
- expected: FAIL
-
[Matching font-style: 'oblique 0deg' should prefer 'oblique 15deg 20deg' over 'oblique 30deg 60deg']
expected: FAIL
@@ -107,9 +101,6 @@
[Matching font-weight: '430' should prefer '340 398' over '501 550']
expected: FAIL
- [Matching font-style: 'oblique 10deg' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg']
- expected: FAIL
-
[Matching font-style: 'oblique -20deg' should prefer 'oblique -10deg' over 'italic']
expected: FAIL
@@ -146,9 +137,6 @@
[Matching font-weight: '400' should prefer '400' over '450 460']
expected: FAIL
- [Matching font-style: 'italic' should prefer 'normal' over 'oblique 0deg']
- expected: FAIL
-
[Matching font-style: 'oblique 20deg' should prefer 'oblique 40deg 50deg' over 'oblique 10deg']
expected: FAIL
@@ -164,12 +152,6 @@
[Matching font-style: 'oblique 20deg' should prefer 'oblique 20deg' over 'oblique 30deg 60deg']
expected: FAIL
- [Matching font-style: 'oblique 21deg' should prefer 'oblique 10deg' over 'italic']
- expected: FAIL
-
- [Matching font-style: 'oblique 10deg' should prefer 'oblique 5deg' over 'oblique 15deg 20deg']
- expected: FAIL
-
[Matching font-weight: '399' should prefer '400' over '450 460']
expected: FAIL
@@ -191,9 +173,6 @@
[Matching font-style: 'oblique 10deg' should prefer 'oblique 10deg' over 'oblique 5deg']
expected: FAIL
- [Matching font-style: 'oblique 10deg' should prefer 'oblique 40deg 50deg' over 'italic']
- expected: FAIL
-
[Matching font-style: 'oblique -20deg' should prefer 'italic' over 'oblique 0deg']
expected: FAIL
@@ -206,9 +185,6 @@
[Matching font-weight: '430' should prefer '500' over '400 425']
expected: FAIL
- [Matching font-weight: '500' should prefer '350 399' over '351 398']
- expected: FAIL
-
[Matching font-weight: '501' should prefer '500' over '450 460']
expected: FAIL
@@ -224,9 +200,6 @@
[Matching font-style: 'oblique -10deg' should prefer 'oblique -50deg -40deg' over 'italic']
expected: FAIL
- [Matching font-style: 'normal' should prefer 'normal' over 'oblique 0deg']
- expected: FAIL
-
[Matching font-style: 'normal' should prefer 'oblique 10deg 40deg' over 'oblique 20deg 30deg']
expected: FAIL
@@ -248,9 +221,6 @@
[Matching font-style: 'italic' should prefer 'oblique 0deg' over 'oblique -60deg -30deg']
expected: FAIL
- [Matching font-style: 'oblique -10deg' should prefer 'italic' over 'oblique 0deg 10deg']
- expected: FAIL
-
[Matching font-style: 'oblique 20deg' should prefer 'oblique 0deg' over 'oblique -50deg -20deg']
expected: FAIL
@@ -260,9 +230,6 @@
[Matching font-weight: '500' should prefer '500' over '450 460']
expected: FAIL
- [Matching font-weight: '501' should prefer '501' over '502 510']
- expected: FAIL
-
[Matching font-style: 'normal' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
expected: FAIL
@@ -277,3 +244,45 @@
[Matching font-style: 'oblique -21deg' should prefer 'italic' over 'oblique 0deg']
expected: FAIL
+
+ [Matching font-weight: '500' should prefer '450 460' over '400']
+ expected: FAIL
+
+ [Matching font-weight: '399' should prefer '350 399' over '340 360']
+ expected: FAIL
+
+ [Matching font-stretch: '110%' should prefer '100%' over '50% 80%']
+ expected: FAIL
+
+ [Matching font-stretch: '90%' should prefer '50% 80%' over '60% 70%']
+ expected: FAIL
+
+ [Matching font-stretch: '90%' should prefer '110% 140%' over '120% 130%']
+ expected: FAIL
+
+ [Matching font-style: 'italic' should prefer 'oblique 20deg' over 'oblique 30deg 60deg']
+ expected: FAIL
+
+ [Matching font-style: 'italic' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg']
+ expected: FAIL
+
+ [Matching font-style: 'italic' should prefer 'oblique 5deg' over 'normal']
+ expected: FAIL
+
+ [Matching font-style: 'oblique 20deg' should prefer 'oblique 10deg' over 'italic']
+ expected: FAIL
+
+ [Matching font-style: 'oblique 10deg' should prefer 'oblique 0deg' over 'oblique -50deg -20deg']
+ expected: FAIL
+
+ [Matching font-style: 'oblique 0deg' should prefer 'italic' over 'oblique -50deg -20deg']
+ expected: FAIL
+
+ [Matching font-style: 'oblique -20deg' should prefer 'oblique -60deg -40deg' over 'oblique -10deg']
+ expected: FAIL
+
+ [Matching font-style: 'oblique -21deg' should prefer 'oblique -21deg' over 'oblique -60deg -40deg']
+ expected: FAIL
+
+ [Matching font-style: 'oblique -21deg' should prefer 'oblique 0deg' over 'oblique 30deg 60deg']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini b/tests/wpt/meta/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini
deleted file mode 100644
index 52b0d0166bc..00000000000
--- a/tests/wpt/meta/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html.ini
+++ /dev/null
@@ -1,27 +0,0 @@
-[text-spacing-trim-combinations-001.html]
- ["国((国"]
- expected: FAIL
-
- ["国・(国"]
- expected: FAIL
-
- ["国)(国"]
- expected: FAIL
-
- ["国 (国"]
- expected: FAIL
-
- ["国))国"]
- expected: FAIL
-
- ["国)・国"]
- expected: FAIL
-
- ["国) 国"]
- expected: FAIL
-
- ["国(((国"]
- expected: FAIL
-
- ["国)))国"]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-ui/parsing/form-sizing-computed.html.ini b/tests/wpt/meta/css/css-ui/parsing/form-sizing-computed.html.ini
index 39141cebc56..25c7ccdbe18 100644
--- a/tests/wpt/meta/css/css-ui/parsing/form-sizing-computed.html.ini
+++ b/tests/wpt/meta/css/css-ui/parsing/form-sizing-computed.html.ini
@@ -4,3 +4,9 @@
[Property form-sizing value 'normal']
expected: FAIL
+
+ [Property form-sizing value 'fixed']
+ expected: FAIL
+
+ [Property form-sizing value 'content']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-ui/parsing/form-sizing-valid.html.ini b/tests/wpt/meta/css/css-ui/parsing/form-sizing-valid.html.ini
index cda7dbed687..a31eb2c5cb0 100644
--- a/tests/wpt/meta/css/css-ui/parsing/form-sizing-valid.html.ini
+++ b/tests/wpt/meta/css/css-ui/parsing/form-sizing-valid.html.ini
@@ -4,3 +4,9 @@
[e.style['form-sizing'\] = "normal" should set the property value]
expected: FAIL
+
+ [e.style['form-sizing'\] = "fixed" should set the property value]
+ expected: FAIL
+
+ [e.style['form-sizing'\] = "content" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/selectors/is-where-parsing.html.ini b/tests/wpt/meta/css/selectors/is-where-parsing.html.ini
index dae62bf6253..83f85b33d30 100644
--- a/tests/wpt/meta/css/selectors/is-where-parsing.html.ini
+++ b/tests/wpt/meta/css/selectors/is-where-parsing.html.ini
@@ -40,3 +40,99 @@
[Pseudo-elements inside]
expected: FAIL
+
+ [":is(div )" should be a valid selector]
+ expected: FAIL
+
+ [":where(div )" should be a valid selector]
+ expected: FAIL
+
+ [":is(div + bar, div ~ .baz)" should be a valid selector]
+ expected: FAIL
+
+ [":where(div + bar, div ~ .baz)" should be a valid selector]
+ expected: FAIL
+
+ [":is(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":where(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":is(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":where(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:is(div ))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:where(div ))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:is(div .foo))" should be a valid selector]
+ expected: FAIL
+
+ [":host(:where(div .foo))" should be a valid selector]
+ expected: FAIL
+
+ [":is(:hover, :active)" should be a valid selector]
+ expected: FAIL
+
+ [":where(:hover, :active)" should be a valid selector]
+ expected: FAIL
+
+ [":is(div):hover" should be a valid selector]
+ expected: FAIL
+
+ [":where(div):hover" should be a valid selector]
+ expected: FAIL
+
+ [":is(div)::before" should be a valid selector]
+ expected: FAIL
+
+ [":where(div)::before" should be a valid selector]
+ expected: FAIL
+
+ [":is(::before)" should be a valid selector]
+ expected: FAIL
+
+ [":where(::before)" should be a valid selector]
+ expected: FAIL
+
+ [":is(div) + bar" should be a valid selector]
+ expected: FAIL
+
+ [":where(div) + bar" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):is(:hover)" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):where(:hover)" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):is([attr='value'\])" should be a valid selector]
+ expected: FAIL
+
+ ["::part(foo):where([attr='value'\])" should be a valid selector]
+ expected: FAIL
+
+ [":not(:is(div))" should be a valid selector]
+ expected: FAIL
+
+ [":not(:where(div))" should be a valid selector]
+ expected: FAIL
+
+ [":not(:is(div .foo))" should be a valid selector]
+ expected: FAIL
+
+ [":not(:where(div .foo))" should be a valid selector]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini
index 7b4af3d0cd3..6d4e77b234b 100644
--- a/tests/wpt/meta/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini
+++ b/tests/wpt/meta/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html.ini
@@ -16,3 +16,9 @@
[CSS Selectors: The relational pseudo-class (disallow nesting :has() inside :has())]
expected: FAIL
+
+ [":has(:is(:has(*)))" should be a valid selector]
+ expected: FAIL
+
+ [":has(:where(:has(*)))" should be a valid selector]
+ expected: FAIL
diff --git a/tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini b/tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini
new file mode 100644
index 00000000000..5eb54f20977
--- /dev/null
+++ b/tests/wpt/meta/dom/observable/tentative/observable-constructor.any.js.ini
@@ -0,0 +1,80 @@
+[observable-constructor.any.worker.html]
+ [Observable constructor]
+ expected: FAIL
+
+ [Subscriber interface is not constructible]
+ expected: FAIL
+
+ [subscribe() can be called with no arguments]
+ expected: FAIL
+
+ [Observable constructor calls initializer on subscribe]
+ expected: FAIL
+
+ [Observable error path called synchronously]
+ expected: FAIL
+
+ [Observable should error if initializer throws]
+ expected: FAIL
+
+ [Subscription does not emit values after completion]
+ expected: FAIL
+
+ [Subscription does not emit values after error]
+ expected: FAIL
+
+ [Completing or nexting a subscriber after an error does nothing]
+ expected: FAIL
+
+ [Errors pushed to the subscriber that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Errors thrown in the initializer that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Subscription reports errors that are pushed after subscriber is closed by completion]
+ expected: FAIL
+
+ [Errors thrown by initializer function after subscriber is closed by completion are reported]
+ expected: FAIL
+
+
+[observable-constructor.any.html]
+ [Observable constructor]
+ expected: FAIL
+
+ [Subscriber interface is not constructible]
+ expected: FAIL
+
+ [subscribe() can be called with no arguments]
+ expected: FAIL
+
+ [Observable constructor calls initializer on subscribe]
+ expected: FAIL
+
+ [Observable error path called synchronously]
+ expected: FAIL
+
+ [Observable should error if initializer throws]
+ expected: FAIL
+
+ [Subscription does not emit values after completion]
+ expected: FAIL
+
+ [Subscription does not emit values after error]
+ expected: FAIL
+
+ [Completing or nexting a subscriber after an error does nothing]
+ expected: FAIL
+
+ [Errors pushed to the subscriber that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Errors thrown in the initializer that are not handled by the subscription are reported to the global]
+ expected: FAIL
+
+ [Subscription reports errors that are pushed after subscriber is closed by completion]
+ expected: FAIL
+
+ [Errors thrown by initializer function after subscriber is closed by completion are reported]
+ expected: FAIL
diff --git a/tests/wpt/meta/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini b/tests/wpt/meta/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini
new file mode 100644
index 00000000000..c68ae3e8990
--- /dev/null
+++ b/tests/wpt/meta/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html.ini
@@ -0,0 +1,27 @@
+[basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html]
+ [Declarative DOM Parts innerHTML <div><h1>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <div><h1 parseparts>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <div parseparts=""><h1>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <div parseparts=""><h1 parseparts>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template><h1>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template><h1 parseparts>content... (expect no parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template parseparts="" class="expect_success"><h1>content... (expect parts)]
+ expected: FAIL
+
+ [Declarative DOM Parts innerHTML <template parseparts="" class="expect_success"><h1 parseparts>content... (expect parts)]
+ expected: FAIL
+
+ [Basic NodePart parsing]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
index 530635e744f..1bca09f21d6 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
@@ -4,3 +4,6 @@
[Navigating to a different document with link click]
expected: FAIL
+
+ [Navigating to a different document with form submission]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
index 51fd557bd7f..574b2fd8927 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
@@ -5,5 +5,5 @@
[load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank?foo']
expected: FAIL
- [load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank#foo']
+ [load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank']
expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
index f27acdd3b9d..78240a2f463 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
@@ -4,3 +4,15 @@
[Test javascript URL string return values in direct and indirect (target) frame contexts. 9]
expected: FAIL
+
+ [0041 set in href="" targeting a frame and clicked]
+ expected: FAIL
+
+ [0080 00FF set in href="" targeting a frame and clicked]
+ expected: FAIL
+
+ [0080 00FF 0100 set in href="" targeting a frame and clicked]
+ expected: FAIL
+
+ [D83D DE0D set in href="" targeting a frame and clicked]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini
index 27889a98fb5..24d2f8ac554 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigate-to-unparseable-url.html.ini
@@ -1,6 +1,3 @@
[navigate-to-unparseable-url.html]
[location.href setter throws a SyntaxError DOMException for unparseable URLs]
expected: FAIL
-
- [<a> tag navigate fails for unparseable URLs]
- expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini
index 0e40ffc0656..9f7f24f662e 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/nav-cancelation-2.sub.html.ini
+++ b/tests/wpt/meta/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/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
deleted file mode 100644
index 7a5fcb79165..00000000000
--- a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[traverse_the_history_5.html]
- [Multiple history traversals, last would be aborted]
- expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/the-window-object/open-close/creating_browsing_context_test_01.html.ini b/tests/wpt/meta/html/browsers/the-window-object/open-close/creating_browsing_context_test_01.html.ini
deleted file mode 100644
index 4b4820d1729..00000000000
--- a/tests/wpt/meta/html/browsers/the-window-object/open-close/creating_browsing_context_test_01.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[creating_browsing_context_test_01.html]
- [first argument: absolute url]
- expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-01.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-01.html.ini
new file mode 100644
index 00000000000..cc76a05c1d8
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-01.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-01.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-02.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-02.html.ini
new file mode 100644
index 00000000000..d83ab8db3b9
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-02.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-02.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-03.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-03.html.ini
new file mode 100644
index 00000000000..341d054ebbc
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-03.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-03.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-04.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-04.html.ini
new file mode 100644
index 00000000000..d34ae8710b2
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-04.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-04.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-05.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-05.html.ini
new file mode 100644
index 00000000000..c80d7307d57
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-05.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-05.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-06.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-06.html.ini
new file mode 100644
index 00000000000..40d08e09e38
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-06.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-06.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-07.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-07.html.ini
new file mode 100644
index 00000000000..8b118b20ad7
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-07.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-07.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-08.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-08.html.ini
new file mode 100644
index 00000000000..927891eb7e0
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-08.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-08.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-09.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-09.html.ini
new file mode 100644
index 00000000000..53ac23518f6
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-09.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-09.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-10.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-10.html.ini
new file mode 100644
index 00000000000..9e6f6f536c0
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-10.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-10.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-11.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-11.html.ini
new file mode 100644
index 00000000000..69ea943cfa8
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-11.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-11.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-12.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-12.html.ini
new file mode 100644
index 00000000000..cb9af7df593
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-12.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-12.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-13.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-13.html.ini
new file mode 100644
index 00000000000..43a10154051
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-13.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-13.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-14.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-14.html.ini
new file mode 100644
index 00000000000..5b3c17a3035
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-14.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-14.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-15.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-15.html.ini
new file mode 100644
index 00000000000..9b7646bf688
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-15.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-15.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-16.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-16.html.ini
new file mode 100644
index 00000000000..57a8aa33c82
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-16.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-16.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-17.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-17.html.ini
new file mode 100644
index 00000000000..8436d0266fe
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-17.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-17.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-18.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-18.html.ini
new file mode 100644
index 00000000000..1a75c98888d
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-18.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-18.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-19.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-19.html.ini
new file mode 100644
index 00000000000..882a73cedc1
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-19.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-19.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-20.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-20.html.ini
new file mode 100644
index 00000000000..e2ac54e85b6
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-20.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-20.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-21.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-21.html.ini
new file mode 100644
index 00000000000..1fe6eed4d86
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-21.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-21.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-22.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-22.html.ini
new file mode 100644
index 00000000000..2bbb71f26cf
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-22.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-22.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-23.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-23.html.ini
new file mode 100644
index 00000000000..340f5057d5c
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-23.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-23.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-24.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-24.html.ini
new file mode 100644
index 00000000000..d4a3db2a878
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-24.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-24.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-25.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-25.html.ini
new file mode 100644
index 00000000000..2ef28e7d55d
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-25.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-25.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-26.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-26.html.ini
new file mode 100644
index 00000000000..eae14c85b6d
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-26.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-26.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-27.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-27.html.ini
new file mode 100644
index 00000000000..49b7b6b841b
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-27.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-27.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-28.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-28.html.ini
new file mode 100644
index 00000000000..c168cc1a8b6
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-28.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-28.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-29.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-29.html.ini
new file mode 100644
index 00000000000..d03ea918944
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-29.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-29.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-30.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-30.html.ini
new file mode 100644
index 00000000000..bbb82b3cd63
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-30.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-30.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-31.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-31.html.ini
new file mode 100644
index 00000000000..052af599162
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-31.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-31.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-32.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-32.html.ini
new file mode 100644
index 00000000000..d6240b000ed
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-32.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-32.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-33.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-33.html.ini
new file mode 100644
index 00000000000..993ccadc8f3
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-33.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-33.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-34.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-34.html.ini
new file mode 100644
index 00000000000..9a036bcae5c
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-34.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-34.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-35.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-35.html.ini
new file mode 100644
index 00000000000..4b931e6b885
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-35.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-35.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-36.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-36.html.ini
new file mode 100644
index 00000000000..5c6d67ba0d4
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-36.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-36.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-37.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-37.html.ini
new file mode 100644
index 00000000000..fbada3e32c8
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-37.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-37.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-38.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-38.html.ini
new file mode 100644
index 00000000000..09b03873496
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-38.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-38.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-39.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-39.html.ini
new file mode 100644
index 00000000000..8d63022c0f9
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-39.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-39.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-40.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-40.html.ini
new file mode 100644
index 00000000000..026d2a27546
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-40.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-40.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-41.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-41.html.ini
new file mode 100644
index 00000000000..75cf38f059b
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/dir-shadow-41.html.ini
@@ -0,0 +1,2 @@
+[dir-shadow-41.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini b/tests/wpt/meta/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini
new file mode 100644
index 00000000000..ec7919c1c68
--- /dev/null
+++ b/tests/wpt/meta/html/dom/elements/global-attributes/lang-attribute-shadow.window.js.ini
@@ -0,0 +1,18 @@
+[lang-attribute-shadow.window.html]
+ [lang only on slot]
+ expected: FAIL
+
+ [lang only on host]
+ expected: FAIL
+
+ [lang on host and slot]
+ expected: FAIL
+
+ [lang on host and slotted element]
+ expected: FAIL
+
+ [lang on host and slot and slotted element]
+ expected: FAIL
+
+ [lang on slot inherits from shadow host]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/editing/dnd/the-draggable-attribute/draggable_attribute.html.ini b/tests/wpt/meta/html/editing/dnd/the-draggable-attribute/draggable_attribute.html.ini
index 3aefca6fde9..91cac15f60d 100644
--- a/tests/wpt/meta/html/editing/dnd/the-draggable-attribute/draggable_attribute.html.ini
+++ b/tests/wpt/meta/html/editing/dnd/the-draggable-attribute/draggable_attribute.html.ini
@@ -880,3 +880,9 @@
[Element å-bar draggable attribute test]
expected: FAIL
+
+ [Element permission should have draggable property]
+ expected: FAIL
+
+ [Element permission draggable attribute test]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini b/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini
deleted file mode 100644
index b21e45dd17f..00000000000
--- a/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[document-base-url-changes-about-srcdoc-2.https.html]
- [document-base-url-changes-about-srcdoc-2]
- expected: FAIL
diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini
index 114d6424efc..a10be12e8cc 100644
--- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini
+++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini
@@ -1,6 +1,7 @@
[document-with-fragment-nonexistent.html]
+ expected: TIMEOUT
[Autofocus elements in iframed documents with non-existent fragments should work.]
expected: FAIL
[Autofocus elements in top-level browsing context's documents with non-existent fragments should work.]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index ddd65fdcec8..16db1ea9c58 100644
--- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,15 +1,16 @@
[supported-elements.html]
+ expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
[Host element with delegatesFocus including no focusable descendants should be skipped]
- expected: FAIL
+ expected: TIMEOUT
[Element with tabindex should support autofocus]
expected: FAIL
[Area element should support autofocus]
- expected: FAIL
+ expected: NOTRUN
[Host element with delegatesFocus should support autofocus]
expected: FAIL
diff --git a/tests/wpt/meta/html/rendering/the-details-element/details-display-type-002.tentative.html.ini b/tests/wpt/meta/html/rendering/the-details-element/details-display-type-002.tentative.html.ini
new file mode 100644
index 00000000000..4e5a3ff1e5b
--- /dev/null
+++ b/tests/wpt/meta/html/rendering/the-details-element/details-display-type-002.tentative.html.ini
@@ -0,0 +1,2 @@
+[details-display-type-002.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini b/tests/wpt/meta/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini
index a7b23688dad..516e1fa0442 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html.ini
@@ -1,3 +1,4 @@
[resource-selection-source-media-env-change.html]
+ expected: TIMEOUT
[the <source> media attribute: no reaction to environment change]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
index 841bafc6eca..26704422bbe 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_escaping-2.html]
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index 4034793cc72..c6f1e5d7d84 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_nonescaping-2.html]
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini
deleted file mode 100644
index 30b696b181c..00000000000
--- a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-compositing-change.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[image-compositing-change.html]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/forms/historical.html.ini b/tests/wpt/meta/html/semantics/forms/historical.html.ini
deleted file mode 100644
index 5d8289307cc..00000000000
--- a/tests/wpt/meta/html/semantics/forms/historical.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[historical.html]
- [<input name=isindex> should not be supported]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-details-element/name-attribute.html.ini
index 1b9c7154376..d569dd37abc 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html.ini
+++ b/tests/wpt/meta/html/semantics/interactive-elements/the-details-element/name-attribute.html.ini
@@ -1,4 +1,4 @@
-[name-attribute.tentative.html]
+[name-attribute.html]
[basic handling of mutually exclusive details]
expected: FAIL
@@ -8,10 +8,7 @@
[mutually exclusive details across multiple names and multiple tree scopes]
expected: FAIL
- [mutation event and toggle event order matches order of insertion in set of named elements]
- expected: FAIL
-
- [mutation event and toggle event order matches tree order]
+ [mutation event and toggle event order]
expected: FAIL
[exclusivity enforcement with attachment scenario connected]
@@ -38,9 +35,6 @@
[exclusivity enforcement with attachment scenario connected-in-template]
expected: FAIL
- [mutation event and toggle event order]
- expected: FAIL
-
[handling of name attribute changes]
expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini
deleted file mode 100644
index 267c09e0562..00000000000
--- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[fixed-position-child-with-transformed-ancestor.html]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini
new file mode 100644
index 00000000000..5def8ec35f5
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html.ini
@@ -0,0 +1,2 @@
+[fixed-position-child-with-transformed-ancestor.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini
deleted file mode 100644
index 32f315368ab..00000000000
--- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[fixed-position-child-with-will-change-ancestor.html]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini
new file mode 100644
index 00000000000..cddca13cbcc
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html.ini
@@ -0,0 +1,2 @@
+[fixed-position-child-with-will-change-ancestor.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini
deleted file mode 100644
index d85ee8e016a..00000000000
--- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[top-layer-stacking.html]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini
new file mode 100644
index 00000000000..3f6ad25adbf
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html.ini
@@ -0,0 +1,2 @@
+[top-layer-stacking.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/interfaces.html.ini b/tests/wpt/meta/html/semantics/interfaces.html.ini
index 1eb16ea6005..bc426a7a6f2 100644
--- a/tests/wpt/meta/html/semantics/interfaces.html.ini
+++ b/tests/wpt/meta/html/semantics/interfaces.html.ini
@@ -61,3 +61,12 @@
[Interfaces for SLOT: createElement]
expected: FAIL
+
+ [Interfaces for permission: useNS]
+ expected: FAIL
+
+ [Interfaces for permission: useParser]
+ expected: FAIL
+
+ [Interfaces for PERMISSION: createElement]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
index dcd52d2fee8..e0d30013daf 100644
--- a/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
+++ b/tests/wpt/meta/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
@@ -1,4 +1,5 @@
[htmlanchorelement_noopener.html]
+ expected: TIMEOUT
[Check that targeting of rel=noopener with a given name reuses an existing window with that name]
expected: FAIL
@@ -9,4 +10,4 @@
expected: FAIL
[Check that rel=noopener with target=_self does a normal load]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/permission-element/no-end-tag-no-contents.html.ini b/tests/wpt/meta/html/semantics/permission-element/no-end-tag-no-contents.html.ini
new file mode 100644
index 00000000000..9a7c183ef37
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/permission-element/no-end-tag-no-contents.html.ini
@@ -0,0 +1,3 @@
+[no-end-tag-no-contents.html]
+ [The permission element should have no end tag or contents]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini
deleted file mode 100644
index fc0233f5241..00000000000
--- a/tests/wpt/meta/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/meta/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
index 1053fb90051..6206f8c0210 100644
--- a/tests/wpt/meta/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
@@ -2,6 +2,3 @@
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/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini b/tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
index 8bcf3a07de4..6ab46a7862c 100644
--- a/tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html.ini
@@ -4,10 +4,10 @@
expected: FAIL
[Rejection handler on pending-then-rejected promise]
- expected: TIMEOUT
+ expected: FAIL
[Sanity check: this all works as expected with no promises involved]
- expected: FAIL
+ expected: TIMEOUT
[Thenable resolution]
expected: FAIL
@@ -16,4 +16,4 @@
expected: FAIL
[Fulfillment handler on pending-then-fulfilled promise]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/uievents/idlharness.window.js.ini b/tests/wpt/meta/uievents/idlharness.window.js.ini
index 6df68cc5a33..22e2d482930 100644
--- a/tests/wpt/meta/uievents/idlharness.window.js.ini
+++ b/tests/wpt/meta/uievents/idlharness.window.js.ini
@@ -154,3 +154,21 @@
[MutationEvent interface: operation initMutationEvent(DOMString, optional boolean, optional boolean, optional Node?, optional DOMString, optional DOMString, optional DOMString, optional unsigned short)]
expected: FAIL
+
+ [MouseEvent interface: attribute layerX]
+ expected: FAIL
+
+ [MouseEvent interface: attribute layerY]
+ expected: FAIL
+
+ [MouseEvent interface: new MouseEvent("event") must inherit property "layerX" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new MouseEvent("event") must inherit property "layerY" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "layerX" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "layerY" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta/webaudio/idlharness.https.window.js.ini b/tests/wpt/meta/webaudio/idlharness.https.window.js.ini
index b5e9c75e20a..63969725792 100644
--- a/tests/wpt/meta/webaudio/idlharness.https.window.js.ini
+++ b/tests/wpt/meta/webaudio/idlharness.https.window.js.ini
@@ -1303,3 +1303,12 @@
[AudioParamMap interface: maplike<DOMString, AudioParam>]
expected: FAIL
+
+ [BaseAudioContext interface: attribute renderQuantumSize]
+ expected: FAIL
+
+ [BaseAudioContext interface: context must inherit property "renderQuantumSize" with the proper type]
+ expected: FAIL
+
+ [BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "renderQuantumSize" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini
new file mode 100644
index 00000000000..4880a89bc1a
--- /dev/null
+++ b/tests/wpt/meta/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html.ini
@@ -0,0 +1,3 @@
+[moderate-exponentialRamp.html]
+ [Test exponentialRampToValueAtTime() with a moderate ratio of change]
+ expected: FAIL
diff --git a/tests/wpt/meta/webgl/idlharness.any.js.ini b/tests/wpt/meta/webgl/idlharness.any.js.ini
index 6447307c2e8..51c3f3177a7 100644
--- a/tests/wpt/meta/webgl/idlharness.any.js.ini
+++ b/tests/wpt/meta/webgl/idlharness.any.js.ini
@@ -3884,6 +3884,9 @@
[WebGL2RenderingContext interface: attribute unpackColorSpace]
expected: FAIL
+ [WebGL2RenderingContext interface: operation getBufferSubData(GLenum, GLintptr, ArrayBufferView, optional unsigned long long, optional GLuint)]
+ expected: FAIL
+
[idlharness.any.worker.html]
[WebGLRenderingContext includes WebGLRenderingContextOverloads: member names are unique]
@@ -10149,3 +10152,6 @@
[WebGL2RenderingContext interface: attribute unpackColorSpace]
expected: FAIL
+
+ [WebGL2RenderingContext interface: operation getBufferSubData(GLenum, GLintptr, ArrayBufferView, optional unsigned long long, optional GLuint)]
+ expected: FAIL
diff --git a/tests/wpt/meta/webmessaging/without-ports/018.html.ini b/tests/wpt/meta/webmessaging/without-ports/018.html.ini
deleted file mode 100644
index b7b36c1d3a4..00000000000
--- a/tests/wpt/meta/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/meta/workers/shared-worker-partitioned-cookies.tentative.https.html.ini b/tests/wpt/meta/workers/shared-worker-partitioned-cookies.tentative.https.html.ini
new file mode 100644
index 00000000000..0f221c965c3
--- /dev/null
+++ b/tests/wpt/meta/workers/shared-worker-partitioned-cookies.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[shared-worker-partitioned-cookies.tentative.https.html]
+ [SharedWorker: Partitioned Cookies]
+ expected: FAIL
diff --git a/tests/wpt/tests/WebCryptoAPI/import_export/okp_importKey.https.any.js b/tests/wpt/tests/WebCryptoAPI/import_export/okp_importKey.https.any.js
index a0ec3e81c87..a56bd31cbe1 100644
--- a/tests/wpt/tests/WebCryptoAPI/import_export/okp_importKey.https.any.js
+++ b/tests/wpt/tests/WebCryptoAPI/import_export/okp_importKey.https.any.js
@@ -81,6 +81,11 @@
}
testFormat(format, algorithm, data, vector.name, usages, extractable);
+
+ // Test for https://github.com/WICG/webcrypto-secure-curves/pull/24
+ if (format === "jwk" && extractable) {
+ testJwkAlgBehaviours(algorithm, data.jwk, vector.name, usages);
+ }
});
});
@@ -92,6 +97,11 @@
var data = keyData[vector.name];
testFormat(format, algorithm, data, vector.name, usages, extractable);
+
+ // Test for https://github.com/WICG/webcrypto-secure-curves/pull/24
+ if (format === "jwk" && extractable) {
+ testJwkAlgBehaviours(algorithm, data.jwk, vector.name, usages);
+ }
});
});
});
@@ -126,6 +136,28 @@
}, "Good parameters: " + keySize.toString() + " bits " + parameterString(format, keyData[format], algorithm, extractable, usages));
}
+ // Test importKey/exportKey "alg" behaviours, alg is ignored upon import and alg is missing for Ed25519 and Ed448 JWK export
+ // https://github.com/WICG/webcrypto-secure-curves/pull/24
+ function testJwkAlgBehaviours(algorithm, keyData, crv, usages) {
+ promise_test(function(test) {
+ return subtle.importKey('jwk', { ...keyData, alg: 'this is ignored' }, algorithm, true, usages).
+ then(function(key) {
+ assert_equals(key.constructor, CryptoKey, "Imported a CryptoKey object");
+
+ return subtle.exportKey('jwk', key).
+ then(function(result) {
+ assert_equals(Object.keys(result).length, keyData.d ? 6 : 5, "Correct number of JWK members");
+ assert_equals(result.alg, undefined, 'No JWK "alg" member is present');
+ assert_true(equalJwk(keyData, result), "Round trip works");
+ }, function(err) {
+ assert_unreached("Threw an unexpected error: " + err.toString());
+ });
+ }, function(err) {
+ assert_unreached("Threw an unexpected error: " + err.toString());
+ });
+ }, "Good parameters with ignored JWK alg: " + crv.toString() + " " + parameterString('jwk', keyData, algorithm, true, usages));
+ }
+
// Helper methods follow:
diff --git a/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js b/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js
index d425fec2dc3..d77a8808831 100644
--- a/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js
+++ b/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js
@@ -167,6 +167,7 @@ function run_test() {
promise_test(function(test) {
return subtle.sign(algorithm, vector.privateKey, vector.data)
.then(function(signature) {
+ assert_true(equalBuffers(signature, vector.signature), "Signing did not give the expected output");
// Can we verify the signature?
return subtle.verify(algorithm, vector.publicKey, signature, vector.data)
.then(function(is_verified) {
diff --git a/tests/wpt/tests/WebCryptoAPI/sign_verify/hmac.js b/tests/wpt/tests/WebCryptoAPI/sign_verify/hmac.js
index 8df4b042f54..f5e2ad2769c 100644
--- a/tests/wpt/tests/WebCryptoAPI/sign_verify/hmac.js
+++ b/tests/wpt/tests/WebCryptoAPI/sign_verify/hmac.js
@@ -117,6 +117,7 @@ function run_test() {
promise_test(function(test) {
return subtle.sign({name: "HMAC", hash: vector.hash}, vector.key, vector.plaintext)
.then(function(signature) {
+ assert_true(equalBuffers(signature, vector.signature), "Signing did not give the expected output");
// Can we get the verify the new signature?
return subtle.verify({name: "HMAC", hash: vector.hash}, vector.key, signature, vector.plaintext)
.then(function(is_verified) {
diff --git a/tests/wpt/tests/accname/name/comp_embedded_control.html b/tests/wpt/tests/accname/name/comp_embedded_control.html
index 09856ef662e..2cdb5cbdf7d 100644
--- a/tests/wpt/tests/accname/name/comp_embedded_control.html
+++ b/tests/wpt/tests/accname/name/comp_embedded_control.html
@@ -13,24 +13,119 @@
<p>Tests the <a href="https://w3c.github.io/accname/#comp_embedded_control">#comp_embedded_control</a> portions of the AccName <em>Name Computation</em> algorithm.</p>
+<!-- Textfield (textbox) -->
<label>
<input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded textfield" class="ex">
Flash the screen
<input value="3" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded textfield inside checkbox label" class="ex"> times
</label>
+<br><br>
+<!-- HTML select:not([size]) element renders as menu button (on Mac) or single-row listbox (on Windows/Linux) -->
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded select:not([size])" class="ex">
+ Flash the screen
+ <select aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded select:not([size]) inside checkbox label" class="ex">
+ <option value="1">1</option>
+ <option value="2">2</option>
+ <option value="3" selected>3</option>
+ <option value="4">4</option>
+ <option value="5">5</option>
+ </select>
+ times
+</label>
+<br><br>
+
+<!-- HTML select[size] element renders as multi-row listbox -->
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded select[size]" class="ex">
+ Flash the screen
+ <select size=5 aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded select[size] inside checkbox label" class="ex">
+ <option value="1">1</option>
+ <option value="2">2</option>
+ <option value="3" selected>3</option>
+ <option value="4">4</option>
+ <option value="5">5</option>
+ </select>
+ times
+</label>
+<br><br>
+
+<!-- ARIA combobox examples (not interactive) -->
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded combobox (input[type=text])" class="ex">
+ Flash the screen
+ <input role="combobox" value="3" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded combobox (input[type=text]) inside checkbox label" class="ex"> times
+</label>
+<br><br>
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded combobox (span)" class="ex">
+ Flash the screen
+ <span role="combobox" tabindex="0" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded combobox (span) inside checkbox label" class="ex">3</span> times
+</label>
+<br><br>
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded combobox (div)" class="ex">
+ Flash the screen
+ <div style="display: inline-block;" role="combobox" tabindex="0" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded combobox (div) inside checkbox label" class="ex">3</div> times
+</label>
+<br><br>
+<!-- Todo: we may want another combobox example using aria-activedescendant? -->
+
+
+<!-- ARIA listbox examples (not interactive) -->
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded listbox>option[aria-selected=true]" class="ex">
+ Flash the screen
+ <ul role="listbox" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded listbox>option[aria-selected=true] inside checkbox label" class="ex" style="padding:0; list-style:none; border: solid 1px gray; width: 15em; display: inline-block;">
+ <li role="option" tabindex="-1" style="padding:0.2em 0.8em; list-style:none;">1</li>
+ <li role="option" tabindex="-1" style="padding:0.2em 0.8em; list-style:none;">2</li>
+ <li role="option" tabindex="0" aria-selected="true" style="padding:0.2em 0.8em; list-style:none; color: white; background-color: #555;">3</li>
+ <li role="option" tabindex="-1" style="padding:0.2em 0.8em; list-style:none;">4</li>
+ <li role="option" tabindex="-1" style="padding:0.2em 0.8em; list-style:none;">5</li>
+ </ul> times
+</label>
+<br><br>
-<!--
-Todo: test all remaining cases of https://w3c.github.io/accname/#comp_embedded_control
- - comp_embedded_control_textbox
- - comp_embedded_control_combobox_or_listbox
- - comp_embedded_control_range
- - comp_embedded_control_range_valuetext
- - comp_embedded_control_range_valuenow
- - comp_embedded_control_range_host_language_value
+<!-- Ranges: HTML native and ARIA sliders and steppers (valuetext, valuenow, host language specific) -->
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded input[type=range]" class="ex">
+ Flash the screen
+ <input type ="range" min="1" max="5" value="3" step="1" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded input[type=range] inside checkbox label" class="ex"> times
+</label>
+<br><br>
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded input[type=number]" class="ex">
+ Flash the screen
+ <input type ="number" min="1" max="5" value="3" step="1" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded input[type=number] inside checkbox label" class="ex"> times
+</label>
+<br><br>
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded ARIA slider (aria-valuenow)" class="ex">
+ Flash the screen
+ <span tabindex="0" role="slider" aria-valuemin="1" aria-valuemax="5" aria-valuenow="3" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded ARIA slider (aria-valuenow) inside checkbox label" class="ex">3.0</span> times
+</label>
+<br><br>
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded ARIA slider (aria-valuetext)" class="ex">
+ Flash the screen
+ <span tabindex="0" role="slider" aria-valuemin="1.0" aria-valuemax="5.0" aria-valuenow="3.0" aria-valuetext="3" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded ARIA slider (aria-valuetext) inside checkbox label" class="ex">3.0</span> times
+</label>
+<br><br>
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded ARIA spinbutton (aria-valuenow)" class="ex">
+ Flash the screen
+ <span tabindex="0" role="spinbutton" aria-valuemin="1" aria-valuemax="5" aria-valuenow="3" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded ARIA spinbutton (aria-valuenow) inside checkbox label" class="ex">3.0</span> times
+</label>
+<br><br>
+<label>
+ <input type="checkbox" data-expectedlabel="Flash the screen 3 times" data-testname="checkbox label with embedded ARIA spinbutton (aria-valuetext)" class="ex">
+ Flash the screen
+ <span tabindex="0" role="spinbutton" aria-valuemin="1.0" aria-valuemax="5.0" aria-valuenow="3.0" aria-valuetext="3" aria-label="number of times" data-expectedlabel="number of times" data-testname="label of embedded ARIA spinbutton (aria-valuetext) inside checkbox label" class="ex">3.0</span> times
+</label>
+<br><br>
--->
<script>
AriaUtils.verifyLabelsBySelector(".ex");
diff --git a/tests/wpt/tests/accname/name/comp_hidden_not_referenced.html b/tests/wpt/tests/accname/name/comp_hidden_not_referenced.html
index 84a2a2ca802..7d9cf2c36f6 100644
--- a/tests/wpt/tests/accname/name/comp_hidden_not_referenced.html
+++ b/tests/wpt/tests/accname/name/comp_hidden_not_referenced.html
@@ -1,6 +1,7 @@
<!doctype html>
<html>
<head>
+ <meta charset="utf-8">
<title>Name Comp: Hidden Not Referenced</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -13,16 +14,79 @@
<p>Tests the <a href="https://w3c.github.io/accname/#comp_hidden_not_referenced">#comp_hidden_not_referenced</a> portions of the AccName <em>Name Computation</em> algorithm.</p>
-<h2 class="ex" data-expectedlabel="heading label" data-testname="heading with interior hidden node">
- heading
- <span hidden>bogus</span>
- label
+<button
+ class="ex"
+ data-expectedlabel="visible to all users"
+ data-testname="button containing a rendered, unreferenced element that is aria-hidden=true, an unreferenced element with the hidden host language attribute, and an unreferenced element that is unconditionally rendered"
+>
+ <span aria-hidden="true">hidden,</span>
+ <span hidden>hidden from all users,</span>
+ <span>visible to all users</span>
+</button>
+
+<button
+ class="ex"
+ data-expectedlabel="hidden but referenced,"
+ data-testname="button labelled by element that is aria-hidden=true"
+ aria-labelledby="button-label-2"
+>
+ <span aria-hidden="true" id="button-label-2">hidden but referenced,</span>
+ <span hidden>hidden from all users,</span>
+ <span>visible to all users</span>
+</button>
+
+<button
+ class="ex"
+ data-expectedlabel="hidden from all users but referenced,"
+ data-testname="button labelled by element with the hidden host language attribute"
+ aria-labelledby="button-label-3"
+>
+ <span aria-hidden="true">hidden,</span>
+ <span hidden id="button-label-3">hidden from all users but referenced,</span>
+ <span>visible to all users</span>
+</button>
+
+<a
+ class="ex"
+ data-testname="link labelled by elements with assorted visibility and a11y tree exposure"
+ data-expectedlabel="visible to all users, hidden but referenced, hidden from all users but referenced"
+ href="#"
+ aria-labelledby="link-label-1a link-label-1b link-label-1c"
+>
+ <span id="link-label-1a">
+ <span>visible to all users,</span>
+ <span aria-hidden="true">hidden,</span>
+ </span>
+ <span aria-hidden="true" id="link-label-1b">hidden but referenced,</span>
+ <span hidden id="link-label-1c">hidden from all users but referenced</span>
+</a>
+
+<h2
+ class="ex"
+ data-testname="heading with name from content, containing element that is visibility:hidden with nested content that is visibility:visible"
+ data-expectedlabel="visible to all users, un-hidden for all users"
+>
+ visible to all users,
+ <span style="visibility: hidden;">
+ hidden from all users,
+ <span style="visibility: visible;">un-hidden for all users</span>
+ </span>
</h2>
-<!-- Todo: test all remaining cases of https://w3c.github.io/accname/#comp_hidden_not_referenced -->
+<!-- TODO: Test cases once https://github.com/w3c/aria/issues/1256 resolved: -->
+<!-- - button labelled by an element that is aria-hidden=true which contains a nested child that is aria-hidden=false -->
+<!-- - button labelled by an element that is aria-hidden=false which belongs to a parent that is aria-hidden=true -->
+<!-- - heading with name from content, containing rendered content that is aria-hidden=true with nested, rendered content that is aria-hidden=false -->
+<!-- - heading with name from content, containing element with the hidden host language attribute with nested content that is aria-hidden=false -->
+
+<!-- TODO: New test case?
+<!-- What is the expectation for a details element when it’s given an -->
+<!-- explicit role that allows name from contents (e.g., `comment`) -->
+<!-- but is also not in the open state, and therefore has contents -->
+<!-- that are both not rendered and excluded from the a11y tree. -->
<script>
AriaUtils.verifyLabelsBySelector(".ex");
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/tests/clipboard-apis/async-unsanitized-standard-html-formats-write-read.tentative.https.html b/tests/wpt/tests/clipboard-apis/async-unsanitized-standard-html-formats-write-read.tentative.https.html
deleted file mode 100644
index 0eb97926bc0..00000000000
--- a/tests/wpt/tests/clipboard-apis/async-unsanitized-standard-html-formats-write-read.tentative.https.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<title>Async Clipboard unsanitized HTML write -> Async Clipboard unsanitized HTML read test</title>
-<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
-<body>Body needed for test_driver.click()</body>
-<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/user-activation.js"></script>
-<script>
-'use strict';
-
-// This function removes extra spaces between tags in html. For example, the
-// following html: "<p> Hello </p> <body> World </body>" would turn into this
-// html: "<p> Hello </p> <body> World </body>"
-// We remove the extra spaces because in html they are considered equivalent,
-// but when we are comparing for equality the spaces make a difference.
-function reformatHtml(html) {
- const parser = new DOMParser();
- const htmlString =
- parser.parseFromString(html, 'text/html').documentElement.innerHTML;
- const reformattedString = htmlString.replace(/\>\s*\</g, '> <').replace(/<!--[a-zA-Z]*?-->/g, '');
- return reformattedString;
-}
-
-// Writes a payload with HTML content and checks to ensure the correct data
-// was written successfully.
-promise_test(async t => {
- await test_driver.set_permission({name: 'clipboard-read'}, 'granted');
- await test_driver.set_permission({name: 'clipboard-write'}, 'granted');
-
- // Create and write unsanitized version of standard HTML format.
- const format1 = 'text/html';
- // The string must be concatenated in this way because the html parser
- // will recognize a script tag even in quotes as a real script tag. By
- // splitting it up in this way we avoid that error.
- const html_script = '<script>const a = 5;</scr'
- + 'ipt> <p>Hello World</p>';
- const textInput = '<head><style>color:blue</style><head>' +
- '<body><p>Hello</p>' + html_script + '</body>';
- const blobInput1 = new Blob([textInput], {type: format1});
- const clipboardItemInput = new ClipboardItem({[format1]: blobInput1});
- await waitForUserActivation();
- await navigator.clipboard.write([clipboardItemInput]);
-
- // Read unsanitized version of HTML format.
- await waitForUserActivation();
- const clipboardItems =
- await navigator.clipboard.read({unsanitized: ["text/html"]});
- assert_equals(clipboardItems.length, 1);
- const clipboardItem = clipboardItems[0];
- assert_true(clipboardItem instanceof ClipboardItem);
-
- const blobOutput1 = await clipboardItem.getType(format1);
- assert_equals(blobOutput1.type, format1);
-
- const data1 = await (new Response(blobOutput1)).text();
- const outputHtml = reformatHtml(data1);
- const expectedHtml = '<html>' + textInput + '</html>';
- const unsanitizedExpectedHtml = reformatHtml(expectedHtml);
- assert_equals(outputHtml, unsanitizedExpectedHtml);
-}, 'Verify write and read unsanitized content to the clipboard given text/html format as input');
-</script>
diff --git a/tests/wpt/tests/css/css-align/parsing/align-tracks-computed.html b/tests/wpt/tests/css/css-align/parsing/align-tracks-computed.html
deleted file mode 100644
index 76241f694af..00000000000
--- a/tests/wpt/tests/css/css-align/parsing/align-tracks-computed.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>CSS Grid Level 3: getComputedStyle().alignContent</title>
-<link rel="help" href="https://drafts.csswg.org/css-grid-3/#tracks-alignment">
-<meta name="assert" content="align-tracks computed value is as specified.">
-<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("align-tracks", "normal");
-
-test_computed_value("align-tracks", "baseline");
-test_computed_value("align-tracks", "last baseline");
-
-test_computed_value("align-tracks", "space-between");
-test_computed_value("align-tracks", "space-around");
-test_computed_value("align-tracks", "space-evenly");
-test_computed_value("align-tracks", "stretch");
-
-test_computed_value("align-tracks", "center");
-test_computed_value("align-tracks", "start");
-test_computed_value("align-tracks", "end");
-test_computed_value("align-tracks", "flex-start");
-test_computed_value("align-tracks", "flex-end");
-test_computed_value("align-tracks", "unsafe end");
-test_computed_value("align-tracks", "safe flex-start");
-
-test_computed_value("align-tracks", "normal, normal", "normal")
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-align/parsing/align-tracks-invalid.html b/tests/wpt/tests/css/css-align/parsing/align-tracks-invalid.html
deleted file mode 100644
index 68f38f5a61c..00000000000
--- a/tests/wpt/tests/css/css-align/parsing/align-tracks-invalid.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>CSS Grid Level 3: parsing align-tracks with invalid values</title>
-<link rel="help" href="https://drafts.csswg.org/css-grid-3/#tracks-alignment">
-<meta name="assert" content="align-tracks supports only the grammar 'normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>'.">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/parsing-testcommon.js"></script>
-</head>
-<body>
-<script>
-test_invalid_value("align-tracks", "auto");
-test_invalid_value("align-tracks", "baseline last");
-test_invalid_value("align-tracks", "center baseline");
-test_invalid_value("align-tracks", "first");
-test_invalid_value("align-tracks", "flex-start flex-end");
-test_invalid_value("align-tracks", "last");
-test_invalid_value("align-tracks", "left");
-test_invalid_value("align-tracks", "legacy center");
-test_invalid_value("align-tracks", "legacy left");
-test_invalid_value("align-tracks", "legacy");
-test_invalid_value("align-tracks", "normal baseline");
-test_invalid_value("align-tracks", "right legacy");
-test_invalid_value("align-tracks", "safe self-end");
-test_invalid_value("align-tracks", "safe");
-test_invalid_value("align-tracks", "self-end unsafe");
-test_invalid_value("align-tracks", "self-start");
-test_invalid_value("align-tracks", "start safe");
-test_invalid_value("align-tracks", "unsafe right");
-test_invalid_value("align-tracks", "unsafe");
-
-test_invalid_value("align-tracks", "auto, left");
-test_invalid_value("align-tracks", "foo, auto");
-test_invalid_value("align-tracks", "start, left, end");
-test_invalid_value("align-tracks", "left, start, end");
-test_invalid_value("align-tracks", "start, end, left");
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-align/parsing/align-tracks-valid.html b/tests/wpt/tests/css/css-align/parsing/align-tracks-valid.html
deleted file mode 100644
index 1c9a8b040cd..00000000000
--- a/tests/wpt/tests/css/css-align/parsing/align-tracks-valid.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>CSS Grid Level 3: parsing align-tracks with valid values</title>
-<link rel="help" href="https://drafts.csswg.org/css-grid-3/#tracks-alignment">
-<meta name="assert" content="align-tracks supports the full grammar 'normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>'.">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/parsing-testcommon.js"></script>
-</head>
-<body>
-<script>
-test_valid_value("align-tracks", "normal");
-
-// <baseline-position> = [ first | last ]? baseline
-test_valid_value("align-tracks", "baseline");
-test_valid_value("align-tracks", "first baseline", "baseline");
-test_valid_value("align-tracks", "last baseline");
-
-// <content-distribution> = space-between | space-around | space-evenly | stretch
-test_valid_value("align-tracks", "space-between");
-test_valid_value("align-tracks", "space-around");
-test_valid_value("align-tracks", "space-evenly");
-test_valid_value("align-tracks", "stretch");
-
-// <overflow-position>? <content-position>
-// <overflow-position> = unsafe | safe
-// <content-position> = center | start | end | flex-start | flex-end
-test_valid_value("align-tracks", "center");
-test_valid_value("align-tracks", "start");
-test_valid_value("align-tracks", "end");
-test_valid_value("align-tracks", "flex-start");
-test_valid_value("align-tracks", "flex-end");
-test_valid_value("align-tracks", "unsafe end");
-test_valid_value("align-tracks", "safe flex-start");
-
-test_valid_value("align-tracks", "flex-start, last baseline");
-test_valid_value("align-tracks", "normal, normal", "normal");
-test_valid_value("align-tracks", "start, flex-end, flex-end, flex-end, flex-end", "start, flex-end");
-
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-align/parsing/justify-tracks-computed.html b/tests/wpt/tests/css/css-align/parsing/justify-tracks-computed.html
deleted file mode 100644
index 372d17c9101..00000000000
--- a/tests/wpt/tests/css/css-align/parsing/justify-tracks-computed.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>CSS Grid Level 3: getComputedStyle().justifyContent</title>
-<link rel="help" href="https://drafts.csswg.org/css-grid-3/#tracks-alignment">
-<meta name="assert" content="justify-tracks computed value is as specified.">
-<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("justify-tracks", "normal");
-
-test_computed_value("justify-tracks", "space-between");
-test_computed_value("justify-tracks", "space-around");
-test_computed_value("justify-tracks", "space-evenly");
-test_computed_value("justify-tracks", "stretch");
-
-test_computed_value("justify-tracks", "center");
-test_computed_value("justify-tracks", "start");
-test_computed_value("justify-tracks", "end");
-test_computed_value("justify-tracks", "flex-start");
-test_computed_value("justify-tracks", "flex-end");
-test_computed_value("justify-tracks", "unsafe end");
-test_computed_value("justify-tracks", "safe flex-start");
-test_computed_value("justify-tracks", "left");
-test_computed_value("justify-tracks", "unsafe right");
-
-test_computed_value("justify-tracks", "normal, normal", "normal")
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-align/parsing/justify-tracks-invalid.html b/tests/wpt/tests/css/css-align/parsing/justify-tracks-invalid.html
deleted file mode 100644
index a1dc2cc7388..00000000000
--- a/tests/wpt/tests/css/css-align/parsing/justify-tracks-invalid.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>CSS Grid Level 3: parsing justify-tracks with invalid values</title>
-<link rel="help" href="https://drafts.csswg.org/css-grid-3/#tracks-alignment">
-<meta name="assert" content="justify-tracks supports only the grammar 'normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]'.">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/parsing-testcommon.js"></script>
-</head>
-<body>
-<script>
-test_invalid_value("justify-tracks", "auto");
-test_invalid_value("justify-tracks", "baseline last");
-test_invalid_value("justify-tracks", "baseline");
-test_invalid_value("justify-tracks", "center baseline");
-test_invalid_value("justify-tracks", "first baseline");
-test_invalid_value("justify-tracks", "first");
-test_invalid_value("justify-tracks", "flex-start flex-end");
-test_invalid_value("justify-tracks", "last baseline");
-test_invalid_value("justify-tracks", "last");
-test_invalid_value("justify-tracks", "legacy center");
-test_invalid_value("justify-tracks", "legacy left");
-test_invalid_value("justify-tracks", "legacy");
-test_invalid_value("justify-tracks", "normal baseline");
-test_invalid_value("justify-tracks", "right legacy");
-test_invalid_value("justify-tracks", "safe self-end");
-test_invalid_value("justify-tracks", "safe");
-test_invalid_value("justify-tracks", "self-end unsafe");
-test_invalid_value("justify-tracks", "self-start");
-test_invalid_value("justify-tracks", "start safe");
-test_invalid_value("justify-tracks", "unsafe");
-
-test_invalid_value("align-tracks", "auto, left");
-test_invalid_value("align-tracks", "foo, auto");
-test_invalid_value("align-tracks", "start, foo, end");
-test_invalid_value("align-tracks", "first, start, end");
-test_invalid_value("align-tracks", "start, end, unsafe");
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-align/parsing/justify-tracks-valid.html b/tests/wpt/tests/css/css-align/parsing/justify-tracks-valid.html
deleted file mode 100644
index be4f426f144..00000000000
--- a/tests/wpt/tests/css/css-align/parsing/justify-tracks-valid.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>CSS Grid Level 3: parsing justify-tracks with valid values</title>
-<link rel="help" href="https://drafts.csswg.org/css-grid-3/#tracks-alignment">
-<meta name="assert" content="justify-tracks supports the full grammar 'normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]'.">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/parsing-testcommon.js"></script>
-</head>
-<body>
-<script>
-test_valid_value("justify-tracks", "normal");
-
-// <content-distribution> = space-between | space-around | space-evenly | stretch
-test_valid_value("justify-tracks", "space-between");
-test_valid_value("justify-tracks", "space-around");
-test_valid_value("justify-tracks", "space-evenly");
-test_valid_value("justify-tracks", "stretch");
-
-// <overflow-position>? [ <content-position> | left | right ]
-// <overflow-position> = unsafe | safe
-// <content-position> = center | start | end | flex-start | flex-end
-test_valid_value("justify-tracks", "center");
-test_valid_value("justify-tracks", "start");
-test_valid_value("justify-tracks", "end");
-test_valid_value("justify-tracks", "flex-start");
-test_valid_value("justify-tracks", "flex-end");
-test_valid_value("justify-tracks", "unsafe end");
-test_valid_value("justify-tracks", "safe flex-start");
-test_valid_value("justify-tracks", "left");
-test_valid_value("justify-tracks", "unsafe right");
-
-test_valid_value("justify-tracks", "flex-start, last baseline");
-test_valid_value("justify-tracks", "normal, normal", "normal");
-test_valid_value("justify-tracks", "start, flex-end, flex-end, flex-end, flex-end", "start, flex-end");
-
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-001.html
new file mode 100644
index 00000000000..f8583e68c00
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-001.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Tests the anchor-center keyword is parsed and computed as specified</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#anchor-center">
+<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>
+
+<div id="container">
+ <div id="target"></div>
+</div>
+
+<script>
+test_valid_value('align-self', 'anchor-center');
+test_valid_value('align-items', 'anchor-center');
+test_valid_value('justify-self', 'anchor-center');
+test_valid_value('justify-items', 'anchor-center');
+
+test_computed_value('align-self', 'anchor-center');
+test_computed_value('align-items', 'anchor-center');
+test_computed_value('justify-self', 'anchor-center');
+test_computed_value('justify-items', 'anchor-center');
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-002-ref.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-002-ref.html
new file mode 100644
index 00000000000..40ccc2b044b
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-002-ref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>Tests that 'anchor-center' behaves as 'center' in non-OOF layout modes</title>
+
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+ background: orange;
+ margin-block: 5px;
+}
+
+.item {
+ width: 40px;
+ height: 40px;
+ background: lime;
+}
+
+.flex {
+ display: flex;
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: repeat(8, 1fr);
+ grid-auto-rows: 50px;
+ grid-template-areas:
+ "a a a a b b b b"
+ "a a a a b b b b";
+}
+</style>
+
+<div class="flex container" style="align-items: center">
+ <div class="item"></div>
+</div>
+
+<div class="flex container">
+ <div class="item" style="align-self: center"></div>
+</div>
+
+<div class="grid container"
+ style="align-items: center; justify-items: center">
+ <div class="item" style="grid-area: a"></div>
+ <div class="item" style="grid-area: b"></div>
+</div>
+
+<div class="grid container">
+ <div class="item" style="grid-area: a; align-self: center"></div>
+ <div class="item" style="grid-area: b; justify-self: center"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-002.html
new file mode 100644
index 00000000000..b7f61003a67
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-002.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<title>Tests that 'anchor-center' behaves as 'center' in non-OOF layout modes</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#anchor-center">
+<link rel="match" href="anchor-center-002-ref.html">
+<link rel="author" href="mailto:xiaochengh@chromium.org">
+
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+ background: orange;
+ margin-block: 5px;
+}
+
+.item {
+ width: 40px;
+ height: 40px;
+ background: lime;
+}
+
+.flex {
+ display: flex;
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: repeat(8, 1fr);
+ grid-auto-rows: 50px;
+ grid-template-areas:
+ "a a a a b b b b"
+ "a a a a b b b b";
+}
+</style>
+
+<div class="flex container" style="align-items: anchor-center">
+ <div class="item"></div>
+</div>
+
+<div class="flex container">
+ <div class="item" style="align-self: anchor-center"></div>
+</div>
+
+<div class="grid container"
+ style="align-items: anchor-center; justify-items: anchor-center">
+ <div class="item" style="grid-area: a"></div>
+ <div class="item" style="grid-area: b"></div>
+</div>
+
+<div class="grid container">
+ <div class="item" style="grid-area: a; align-self: center"></div>
+ <div class="item" style="grid-area: b; justify-self: center"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html
new file mode 100644
index 00000000000..2ffd026b552
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<title>Tests that scroll adjustment is applied per-axis</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#needs-scroll-adjustment">
+<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: 150px;
+ height: 150px;
+ margin-bottom: 50px;
+ overflow: scroll;
+ position: relative;
+}
+
+.spacer {
+ width: 400px;
+ height: 400px;
+}
+
+.anchor {
+ position: absolute;
+ width: 50px;
+ height: 50px;
+ top: 50px;
+ left: 50px;
+ background: orange;
+}
+
+.target {
+ position: fixed;
+ width: 50px;
+ height: 50px;
+ background: lime;
+}
+
+#scroller1 { anchor-name: --scroller1; }
+#scroller2 { anchor-name: --scroller2; }
+#scroller3 { anchor-name: --scroller3; }
+
+#anchor1 { anchor-name: --a1; }
+#anchor2 { anchor-name: --a2; }
+#anchor3 { anchor-name: --a3; }
+
+/* Needs scroll adjustment in x axis only */
+#target1 {
+ anchor-default: --a1;
+ left: anchor(left);
+ top: anchor(--scroller1 bottom);
+}
+
+/* Needs scroll adjustment in y axis only */
+#target2 {
+ anchor-default: --a2;
+ top: anchor(top);
+ left: anchor(--scroller2 right);
+}
+
+/* No scroll adjustment needed */
+#target3 {
+ anchor-default: --a3;
+ top: anchor(--scroller3 bottom);
+ left: anchor(--scroller3 right);
+}
+</style>
+
+<div class="scroller" id="scroller1">
+ <div class="spacer"></div>
+ <div class="anchor" id="anchor1"></div>
+</div>
+<div class="target" id="target1"></div>
+
+<script>
+promise_test(async () => {
+ await waitUntilNextAnimationFrame();
+ assert_equals(target1.getBoundingClientRect().left, 50);
+ assert_equals(target1.getBoundingClientRect().top, 150);
+
+ scroller1.scrollLeft = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target1.getBoundingClientRect().left, 0);
+
+ scroller1.scrollTop = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target1.getBoundingClientRect().top, 150);
+}, '#target1 is scroll-adjusted in x axis only');
+</script>
+
+<div class="scroller" id="scroller2">
+ <div class="spacer"></div>
+ <div class="anchor" id="anchor2"></div>
+</div>
+<div class="target" id="target2"></div>
+
+<script>
+promise_test(async () => {
+ await waitUntilNextAnimationFrame();
+ assert_equals(target2.getBoundingClientRect().left, 150);
+ assert_equals(target2.getBoundingClientRect().top, 250);
+
+ scroller2.scrollLeft = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target2.getBoundingClientRect().left, 150);
+
+ scroller2.scrollTop = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target2.getBoundingClientRect().top, 200);
+}, '#target2 is scroll-adjusted in y axis only');
+</script>
+
+<div class="scroller" id="scroller3">
+ <div class="spacer"></div>
+ <div class="anchor" id="anchor3"></div>
+</div>
+<div class="target" id="target3"></div>
+
+<script>
+promise_test(async () => {
+ await waitUntilNextAnimationFrame();
+ assert_equals(target3.getBoundingClientRect().left, 150);
+ assert_equals(target3.getBoundingClientRect().top, 550);
+
+ scroller3.scrollLeft = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target3.getBoundingClientRect().left, 150);
+
+ scroller3.scrollTop = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target3.getBoundingClientRect().top, 550);
+}, '#target3 is scroll-adjusted in neither axis');
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html
new file mode 100644
index 00000000000..ec519106190
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<title>Tests that scroll adjustment still applies when using another anchor in default anchor's scroll container</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#needs-scroll-adjustment">
+<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: 400px;
+ height: 400px;
+ overflow: scroll;
+ position: relative;
+}
+
+#spacer {
+ width: 1000px;
+ height: 1000px;
+}
+
+.anchor {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: orange;
+}
+
+#anchor1 {
+ anchor-name: --a1;
+ left: 300px;
+ top: 100px;
+}
+
+#anchor2 {
+ anchor-name: --a2;
+ left: 200px;
+ top: 200px;
+}
+
+#anchor3 {
+ anchor-name: --a3;
+ left: 100px;
+ top: 300px;
+}
+
+/* Uses different anchors in insets instead of the default anchor.
+ * Still scroll-adjusted because they are in the same scroll container. */
+#target {
+ position: fixed;
+ width: 50px;
+ height: 50px;
+ left: anchor(--a3 left);
+ top: anchor(--a1 top);
+ anchor-default: --a2;
+ background: lime;
+}
+</style>
+
+<div id="scroller">
+ <div id="spacer"></div>
+ <div class="anchor" id="anchor1"></div>
+ <div class="anchor" id="anchor2"></div>
+ <div class="anchor" id="anchor3"></div>
+</div>
+<div id="target"></div>
+
+<script>
+promise_test(async () => {
+ await waitUntilNextAnimationFrame();
+ assert_equals(target.getBoundingClientRect().left, 100);
+ assert_equals(target.getBoundingClientRect().top, 100);
+
+ scroller.scrollLeft = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target.getBoundingClientRect().left, 50);
+
+ scroller.scrollTop = 50;
+ await waitUntilNextAnimationFrame();
+ assert_equals(target.getBoundingClientRect().top, 50);
+}, '#target3 is scroll-adjusted in both axises');
+</script>
diff --git a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-001.htm b/tests/wpt/tests/css/css-backgrounds/border-image-repeat-001.htm
deleted file mode 100644
index e447421a89f..00000000000
--- a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-001.htm
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-002.htm b/tests/wpt/tests/css/css-backgrounds/border-image-repeat-002.htm
index f1fd6ffbc3b..a0c081863d4 100644
--- a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-002.htm
+++ b/tests/wpt/tests/css/css-backgrounds/border-image-repeat-002.htm
Binary files differ
diff --git a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-003.htm b/tests/wpt/tests/css/css-backgrounds/border-image-repeat-003.htm
deleted file mode 100644
index 255fdfccb96..00000000000
--- a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-003.htm
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-004.htm b/tests/wpt/tests/css/css-backgrounds/border-image-repeat-004.htm
index acf7cfa7b84..40194506940 100644
--- a/tests/wpt/tests/css/css-backgrounds/border-image-repeat-004.htm
+++ b/tests/wpt/tests/css/css-backgrounds/border-image-repeat-004.htm
Binary files differ
diff --git a/tests/wpt/tests/css/css-backgrounds/border-image-slice-004.htm b/tests/wpt/tests/css/css-backgrounds/border-image-slice-004.htm
index 86b3c1e6b1d..1e5adb311f5 100644
--- a/tests/wpt/tests/css/css-backgrounds/border-image-slice-004.htm
+++ b/tests/wpt/tests/css/css-backgrounds/border-image-slice-004.htm
Binary files differ
diff --git a/tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-002-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-002-ref.html
new file mode 100644
index 00000000000..e295a5c65dc
--- /dev/null
+++ b/tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-002-ref.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+
+ <meta charset="UTF-8">
+
+ <title>CSS Reftest reference</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+ <style>
+ table
+ {
+ border-spacing: 0px;
+ margin: 70px;
+ table-layout: fixed;
+ }
+
+ td
+ {
+ height: 40px;
+ padding: 0px;
+ }
+
+ td.corner
+ {
+ background-image: url("../support/new-red-diamond-27x27.png");
+ background-size: cover;
+ }
+
+ td#first-row-second-cell , td#third-row-second-cell , td.second-row
+ {
+ background-image: url("../support/blue-diamond-27x27.png");
+ background-size: 34px 40px;
+ }
+
+ td.second-row
+ {
+ background-size: 40px 34px;
+ height: 102px;
+ }
+ </style>
+
+ <p>Test passes if there are three whole blue diamonds without clipping on four sides of the border.
+
+ <table>
+
+ <col width="40"><col width="102"><col width="40">
+
+ <tr><td class="corner"><td id="first-row-second-cell"><td class="corner">
+
+ <tr><td class="second-row"><td><td class="second-row">
+
+ <tr><td class="corner"><td id="third-row-second-cell"><td class="corner">
+
+ </table>
diff --git a/tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-004-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-004-ref.html
new file mode 100644
index 00000000000..9c3f7176633
--- /dev/null
+++ b/tests/wpt/tests/css/css-backgrounds/reference/border-image-repeat-004-ref.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+
+ <meta charset="UTF-8">
+
+ <title>CSS Reftest reference</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+ <style>
+ table
+ {
+ border-spacing: 0px;
+ margin: 70px;
+ table-layout: fixed;
+ }
+
+ td
+ {
+ height: 40px;
+ padding: 0px;
+ }
+
+ td.corner
+ {
+ background-image: url("../support/new-red-diamond-27x27.png");
+ background-size: cover;
+ }
+
+ td#first-row-second-cell , td#third-row-second-cell , td.second-row
+ {
+ background-image: url("../support/blue-diamond-27x27.png");
+ background-size: 100px 40px;
+ }
+
+ td.second-row
+ {
+ background-size: 40px 100px;
+ height: 100px;
+ }
+ </style>
+
+ <p>Test passes if there is only one (and streched) blue diamond on each side of the border.
+
+ <table>
+
+ <col width="40"><col width="100"><col width="40">
+
+ <tr><td class="corner"><td id="first-row-second-cell"><td class="corner">
+
+ <tr><td class="second-row"><td><td class="second-row">
+
+ <tr><td class="corner"><td id="third-row-second-cell"><td class="corner">
+
+ </table>
diff --git a/tests/wpt/tests/css/css-backgrounds/reference/border-image-slice-004-ref.html b/tests/wpt/tests/css/css-backgrounds/reference/border-image-slice-004-ref.html
new file mode 100644
index 00000000000..d9c798a6167
--- /dev/null
+++ b/tests/wpt/tests/css/css-backgrounds/reference/border-image-slice-004-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+
+ <meta charset="UTF-8">
+
+ <title>CSS Reftest reference</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+ <style>
+ div
+ {
+ border: green solid 30px;
+ height: 100px;
+ margin: 50px;
+ width: 100px;
+ }
+ </style>
+
+ <p>Test passes if there is no red color visible on the page.
+
+ <div></div>
diff --git a/tests/wpt/tests/css/css-backgrounds/support/9grid20-40-red.png b/tests/wpt/tests/css/css-backgrounds/support/9grid20-40-red.png
new file mode 100644
index 00000000000..75173b7edc0
--- /dev/null
+++ b/tests/wpt/tests/css/css-backgrounds/support/9grid20-40-red.png
Binary files differ
diff --git a/tests/wpt/tests/css/css-cascade/tons-of-declarations-crash.html b/tests/wpt/tests/css/css-cascade/tons-of-declarations-crash.html
new file mode 100644
index 00000000000..50a32c19389
--- /dev/null
+++ b/tests/wpt/tests/css/css-cascade/tons-of-declarations-crash.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<style></style>
+<script>
+document.querySelector('style').innerText = `input { border: 1px solid }`.repeat(2 << 16);
+</script>
+<input>
diff --git a/tests/wpt/tests/css/css-color/light-dark-basic.html b/tests/wpt/tests/css/css-color/light-dark-basic.html
new file mode 100644
index 00000000000..ee053322384
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/light-dark-basic.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<title>light-dark() color-scheme propagation</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7561">
+<div id="system"></div>
+<div id="light" style="color-scheme: light"></div>
+<div id="dark" style="color-scheme: dark"></div>
+<script>
+const system_is_dark = matchMedia("(prefers-color-scheme: dark)").matches;
+const elements = ["system", "light", "dark"].map(document.getElementById.bind(document));
+function test_light_dark(color, expected_light, expected_dark) {
+ test(() => {
+ for (let element of elements) {
+ let should_be_dark = element.id == "dark" || (element.id == "system" && system_is_dark);
+ element.style.backgroundColor = color;
+ assert_not_equals(element.style.backgroundColor, "", "Should be valid");
+ assert_equals(getComputedStyle(element).backgroundColor, should_be_dark ? expected_dark : expected_light);
+ }
+ }, color);
+}
+
+test_light_dark("light-dark(white, black)", "rgb(255, 255, 255)", "rgb(0, 0, 0)");
+test_light_dark("light-dark(light-dark(white, red), red)", "rgb(255, 255, 255)", "rgb(255, 0, 0)");
+</script>
diff --git a/tests/wpt/tests/css/css-color/light-dark-currentcolor.html b/tests/wpt/tests/css/css-color/light-dark-currentcolor.html
new file mode 100644
index 00000000000..512a492b293
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/light-dark-currentcolor.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CurrentColor can be used inside light-dark</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7561">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
+<style>
+.square {
+ width: 100px;
+ height: 100px;
+ color: green;
+ background-color: light-dark(currentColor, currentColor);
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div class="square"></div>
diff --git a/tests/wpt/tests/css/css-color/light-dark-inheritance.html b/tests/wpt/tests/css/css-color/light-dark-inheritance.html
new file mode 100644
index 00000000000..1128b57319b
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/light-dark-inheritance.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>light-dark() computes to the actual value, like system colors</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7561">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
+<style>
+.square {
+ width: 100px;
+ height: 100px;
+ color-scheme: dark;
+ background-color: currentColor;
+}
+.container {
+ color-scheme: light;
+ color: light-dark(green, red);
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div class="container">
+ <div class="square"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-flexbox/order/order-abs-children-painting-order-different-container.html b/tests/wpt/tests/css/css-flexbox/order/order-abs-children-painting-order-different-container.html
new file mode 100644
index 00000000000..202581dd1d1
--- /dev/null
+++ b/tests/wpt/tests/css/css-flexbox/order/order-abs-children-painting-order-different-container.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<title>CSS Test: flex order affects painting order of absolutely positioned boxes inside flex</title>
+<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#propdef-order">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1489495">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="This test check that relative positioned boxes that are grandchildren of two flexboxes don't sort paint order relative to each other.">
+<style>
+ #test {
+ display: flex;
+ height: 100px;
+ width: 100px;
+ }
+
+ #test2 {
+ display: flex;
+ height: 100px;
+ width: 100px;
+ }
+
+ #order-1 {
+ order: 1;
+ }
+
+ #order-2 {
+ order: 2;
+ }
+
+ .inner {
+ position: relative;
+ width: 100px;
+ height: 100px;
+ }
+
+ #order-1 .inner {
+ background-color: green;
+ }
+
+ #order-2 .inner {
+ background-color: red;
+ }
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div id="test">
+ <div id="order-2">
+ <div class="inner"></div>
+ </div>
+</div>
+<div id="test2" style="margin-top: -100px">
+ <div id="order-1">
+ <div class="inner"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-fonts/font-synthesis-08-ref.html b/tests/wpt/tests/css/css-fonts/font-synthesis-08-ref.html
new file mode 100644
index 00000000000..39cd4558d98
--- /dev/null
+++ b/tests/wpt/tests/css/css-fonts/font-synthesis-08-ref.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+<meta charset="utf-8"/>
+<title>CSS Test: font-synthesis style and weight</title>
+<style>
+ @font-face {
+ font-family: "lato";
+ src: url(support/fonts/Lato-Medium.ttf);
+ }
+ .test {
+ font-family: "lato";
+ font-size: 3em;
+ }
+ .auto {
+ font-style: italic;
+ font-weight: bold;
+ }
+ .weight {
+ font-weight: bold;
+ }
+ .style {
+ font-style: italic;
+ }
+</style>
+
+<section class="test">
+ <p class="auto">Filler text</p>
+ <p class>Filler text</p>
+ <p class="weight">Filler text</p>
+ <p class="style">Filler text</p>
+</section> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-fonts/font-synthesis-08.html b/tests/wpt/tests/css/css-fonts/font-synthesis-08.html
new file mode 100644
index 00000000000..b3de1afcaee
--- /dev/null
+++ b/tests/wpt/tests/css/css-fonts/font-synthesis-08.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en">
+<meta charset="utf-8"/>
+<title>CSS Test: font-synthesis style and weight</title>
+<link rel="match" href="font-synthesis-08-ref.html">
+<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#font-synthesis">
+<meta name="assert" content="If ‘weight’/'style' is not specified for
+ font-synthesis property, user agents must not synthesize bold/italic faces">
+<style>
+ @font-face {
+ font-family: "lato";
+ src: url(support/fonts/Lato-Medium.ttf);
+ }
+ .test {
+ font-family: "lato";
+ font-size: 3em;
+ font-style: italic;
+ font-weight: bold;
+ }
+ .auto {
+ font-synthesis: weight style;
+ }
+ .none {
+ font-synthesis: none;
+ }
+ .weight {
+ font-synthesis: weight;
+ }
+ .style {
+ font-synthesis: style;
+ }
+</style>
+
+<!-- If a previous font-synthesis property and value was encountered by the
+ style engine, make sure that this newer value is correctly updated and not
+ confused with an earlier value due to incorrect caching. Appearance of the
+ 4 section needs to differ in weight and style respectively. -->
+<section class="test">
+ <p class="auto">Filler text</p>
+ <p class="none">Filler text</p>
+ <p class="weight">Filler text</p>
+ <p class="style">Filler text</p>
+</section>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001-ref.html
deleted file mode 100644
index 3b22489fdb9..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001-ref.html
+++ /dev/null
@@ -1,120 +0,0 @@
-<!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: Masonry layout with `align-tracks` alignment</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <style>
-html,body {
- color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-
-grid {
- display: inline-grid;
- gap: 1px 2px;
- background: content-box silver;
- color: #444;
- padding: 1px 2px;
- block-size: 30px;
- vertical-align: top;
-}
-grid.vll, grid.vrr, grid.vlr, grid.vrl, grid.swl, grid.swr {
- inline-size: 22px;
-}
-
-grid > div {
- display: inline-flex;
- inline-size: min-content;
-}
-
-grid2 {
- display: inline-grid;
- row-gap: 1px;
- grid-template-columns: 8px;
- vertical-align: top;
- block-size: 21px;
-}
-
-item {
- background-color: #444;
- color: #fff;
- writing-mode: horizontal-tb;
- direction: ltr;
-}
-grid2:nth-child(1) {
- grid-template-rows: 8px 8px;
- margin-inline-end: 2px;
-}
-grid2:nth-child(2) {
- grid-template-rows: 12px 8px;
-}
-
-.vll grid2:nth-child(1) { block-size:17px; }
-.vrr grid2:nth-child(1) { block-size:17px; }
-.vlr grid2:nth-child(1) { block-size:17px; }
-.vrl grid2:nth-child(1) { block-size:17px; }
-.swl grid2:nth-child(1) { block-size:17px; }
-.swr grid2:nth-child(1) { block-size:17px; }
-
-.vll grid2:nth-child(2) { grid-template-rows:8px 8px; }
-.vrr grid2:nth-child(2) { grid-template-rows:8px 8px; }
-.vlr grid2:nth-child(2) { grid-template-rows:8px 8px; }
-.vrl grid2:nth-child(2) { grid-template-rows:8px 8px; }
-.swl grid2:nth-child(2) { grid-template-rows:8px 8px; }
-.swr grid2:nth-child(2) { grid-template-rows:8px 8px; }
-
-grid2:nth-child(1) > item:nth-child(1) { background: blue; inline-size:8px; block-size:8px; z-index:1; }
-grid2:nth-child(2) > item:nth-child(1) { background: magenta; inline-size:8px; block-size:12px; z-index:1; }
-grid2:nth-child(1) > item:nth-child(2) { background: lime; inline-size:12px; block-size:8px; z-index:2; }
-grid2:nth-child(2) > item:nth-child(2) { background: purple; inline-size:8px; block-size:8px; z-index:2; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <div>
- <grid2>
- <item></item>
- <item></item>
- </grid2><grid2>
- <item></item>
- <item></item>
- </grid2>
- </div>
-</grid>
-</div>
-
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let ats = [ "start", "self-start", "center", "end", "self-end", "stretch", "space-between", "space-around", "space-evenly", ];
-let acs = [ "start", "center", "end", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const ac of acs) {
- for (const at of ats) {
- for (const wm of wms) {
- let e = grid.cloneNode(true);
- e.className = wm;
- e.children[0].children[1].style.className = wm;
- e.children[0].children[0].style.alignContent = at;
- e.children[0].children[1].style.alignContent = at;
- e.style.alignContent = ac;
- document.body.appendChild(e);
- }
- }
-}
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001.html
deleted file mode 100644
index 4ff3e610875..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-001.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!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: Masonry layout with `align-tracks` alignment</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-align-tracks-001-ref.html">
- <style>
-html,body {
- color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-
-grid {
- display: inline-grid;
- gap: 1px 2px;
- grid-template-columns: repeat(2,auto);
- grid-template-rows: masonry;
- background: content-box silver;
- color: #444;
- padding: 1px 2px;
- block-size: 30px;
- vertical-align: top;
-}
-
-item {
- background-color: #444;
- color: #fff;
- writing-mode: horizontal-tb;
- direction: ltr;
-}
-
-item:nth-child(1) { background: blue; inline-size:8px; block-size:8px; }
-item:nth-child(2) { background: magenta; inline-size:8px; block-size:12px; }
-item:nth-child(3) { background: lime; inline-size:12px; block-size:8px; }
-item:nth-child(4) { background: purple; inline-size:8px; block-size:8px; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <item></item>
- <item></item>
- <item></item>
- <item></item>
-</grid>
-</div>
-
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let ats = [ "start", "self-start", "center", "end", "self-end", "stretch", "space-between", "space-around", "space-evenly", ];
-let acs = [ "start", "center", "end", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const ac of acs) {
- for (const at of ats) {
- for (const wm of wms) {
- let e = grid.cloneNode(true);
- e.className = wm;
- e.style.alignTracks = at;
- e.style.alignContent = ac;
- document.body.appendChild(e);
- }
- }
-}
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001-ref.html
deleted file mode 100644
index b0bf3578618..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001-ref.html
+++ /dev/null
@@ -1,116 +0,0 @@
-<!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: Masonry layout with multiple `align-tracks` values</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-<style>
-html,body {
- color:black; background-color:white; font:15px/1 "Courier New", monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: auto;
- grid-template-columns: repeat(8,50px); /*intentionally one more than align-tracks values*/
- gap: 3px 5px;
- padding: 10px 3px 1px 7px;
- border: solid;
- border-width: 1px 7px 3px 5px;
- background: lightgrey content-box;
- height: 500px;
- vertical-align: top;
-}
-.fallback { grid-template-columns:3px; padding:0; border:0; }
-item {
- background: grey;
- height: 2em;
- position: relative;
- border: 1px solid;
-}
-.purple { background:purple; height:auto; border-top:3px solid; }
-z { display: block; background: yellow; height: 0; width:80%; }
-a {
- position: absolute;
- inset: 0;
- top: auto;
- border: 2px solid lime;
-}
-masonry-track {
- display: grid;
- gap: 3px 5px;
-}
-masonry-track:nth-child(1) { align-content:start }
-masonry-track:nth-child(2) { align-content:end }
-masonry-track:nth-child(3) { align-content:center }
-masonry-track:nth-child(4) { align-content:stretch; grid-template-rows: auto auto repeat(3,max-content) }
-masonry-track:nth-child(5) { align-content:space-between }
-masonry-track:nth-child(6) { align-content:space-around }
-masonry-track:nth-child(7) { align-content:space-evenly }
-masonry-track:nth-child(8) { align-content:space-evenly }
-</style>
-</head>
-<body>
-<grid>
- <masonry-track>
- <item style="width:25px">1</item>
- <item>11</item>
- <item class="purple">20</item>
- <item class="purple">24</item>
- <item>29</item>
- </masonry-track>
- <masonry-track>
- <item class="purple" style="height:50px">2</item>
- <item class="purple" style="writing-mode:vertical-rl">16 vertical-rl</item>
- </masonry-track>
- <masonry-track>
- <item style="margin-left:5px">3</item>
- <item class="purple">12<z></z></item>
- <item>17</item>
- <item>25</item>
- <item>33</item>
- </masonry-track>
- <masonry-track>
- <item class="purple" style="margin-top:5px">4</item>
- <item class="purple">10</item>
- <item>15</item>
- <item>23</item>
- <item>31</item>
- </masonry-track>
- <masonry-track>
- <item>5</item>
- <item>13</item>
- <item>21</item>
- <item class="purple">28</item>
- </masonry-track>
- <masonry-track>
- <item class="purple">6<a></a></item>
- <item>9<a></a></item>
- <item class="purple">18</item>
- <item class="purple">22</item>
- <item>27</item>
- </masonry-track>
- <masonry-track>
- <item>7</item>
- <item class="purple">14<z></z><a></a></item>
- <item>19</item>
- <item class="purple">26</item>
- <item class="purple">30</item>
- </masonry-track>
- <masonry-track>
- <item class="purple" style="writing-mode:vertical-lr">8 vertical-lr</item>
- <item class="purple">32</item>
- </masonry-track>
-</grid>
-<grid class="fallback" style="align-content:start">
- <item></item>
-</grid>
-<grid class="fallback" style="align-content:center">
- <item></item>
-</grid>
-<grid class="fallback" style="align-content:center">
- <item></item>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001.html
deleted file mode 100644
index 0e20217da80..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-multi-001.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!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: Masonry layout with multiple `align-tracks` values</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-align-tracks-multi-001-ref.html">
-<style>
-html,body {
- color:black; background-color:white; font:15px/1 "Courier New", monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: masonry;
- grid-template-columns: repeat(8,50px); /*intentionally one more than align-tracks values*/
- gap: 3px 5px;
- padding: 10px 3px 1px 7px;
- border: solid;
- border-width: 1px 7px 3px 5px;
- background: lightgrey content-box;
- align-tracks: start,end,center,stretch,space-between,space-around,space-evenly;
- height: 500px;
- vertical-align: top;
-}
-.fallback { grid-template-columns:3px; padding:0; border:0; }
-item {
- background: grey;
- height: 2em;
- position: relative;
- border: 1px solid;
-}
-item:nth-child(2n) { background:purple; height:auto; border-top:3px solid; }
-z { display: block; background: yellow; height: 20%; width:80%; }
-a {
- position: absolute;
- inset: 0;
- top: auto;
- border: 2px solid lime;
-}
-</style>
-</head>
-<body>
-<grid>
- <item style="width:50%">1</item>
- <item style="height:10%">2</item>
- <item style="margin-left:10%">3</item>
- <item style="margin-top:10%">4</item>
- <item>5</item>
- <item>6<a></a></item>
- <item>7</item>
- <item style="writing-mode:vertical-lr">8 vertical-lr</item>
- <item>9<a></a></item>
- <item>10</item>
- <item>11</item>
- <item>12<z></z></item>
- <item>13</item>
- <item><z></z>14<a></a></item>
- <item>15</item>
- <item style="writing-mode:vertical-rl">16 vertical-rl</item>
- <item>17</item>
- <item>18</item>
- <item>19</item>
- <item>20</item>
- <item>21</item>
- <item>22</item>
- <item>23</item>
- <item>24</item>
- <item>25</item>
- <item>26</item>
- <item>27</item>
- <item>28</item>
- <item>29</item>
- <item>30</item>
- <item>31</item>
- <item>32</item>
- <item>33</item>
-</grid>
-<grid class="fallback" style="align-tracks:space-between">
- <item></item>
-</grid>
-<grid class="fallback" style="align-tracks:space-around">
- <item></item>
-</grid>
-<grid class="fallback" style="align-tracks:space-evenly">
- <item></item>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001-ref.html
deleted file mode 100644
index 0712f14bb31..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001-ref.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!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: Masonry layout with `align-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
-<style>
-html,body {
- color:black; background-color:white; font:16px/1 Ahem; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: 500px;
- grid-template-columns: 150px 100px 50px;
- gap: 3px 5px;
- padding: 10px;
- border: 3px solid;
- background: lightgrey content-box;
- height: 500px;
-}
-masonry-track {
- display: grid;
- gap: 3px 5px;
- align-content: stretch;
- height: 500px;
-}
-masonry-track:nth-child(1) {
- grid-template-columns: 150px;
- grid-template-rows: min-content min-content min-content auto min-content min-content min-content;
-}
-masonry-track:nth-child(2) {
- grid-template-columns: 100px;
- grid-template-rows: auto 50px auto auto 30px;
-}
-masonry-track:nth-child(3) {
- grid-template-columns: 50px;
- grid-template-rows: 30px 30px 30px auto 30px 30px auto auto;
-}
-item {
- background: grey;
- height: 30px;
- position: relative;
-}
-.purple { background:purple; height:auto; }
-z { display: block; background: yellow; height: 20%; width:80%; }
-a {
- position: absolute;
- inset: 0;
- top: auto;
- border: 2px solid lime;
-}
-</style>
-</head>
-<body>
-<grid>
- <masonry-track>
- <item style="border:10px solid; margin: 10px 0 5px 3px;">1</item>
- <item>9<a></a></item>
- <item>11</item>
- <item class="purple">12<br><br><z></z></item>
- <item class="purple" style="height:116px; border:2px solid; margin:1px">14<z></z><a></a></item>
- <item style="align-self:start" class="purple">16</item>
- <item>17</item>
- </masonry-track>
- <masonry-track>
- <item class="purple">2</item>
- <item style="height:40px; margin-top:10px" class="purple">4</item>
- <item class="purple">6<a></a></item>
- <item style="writing-mode:vertical-lr" class="purple">8 vertical</item>
- <item>19</item>
- </masonry-track>
- <masonry-track>
- <item>3</item>
- <item>5</item>
- <item>7</item>
- <item class="purple">10 A<br>B</item>
- <item>13</item>
- <item>15</item>
- <item style="margin:auto 0" class="purple">18</item>
- <item style="margin-top: auto" class="purple">20</item>
- </masonry-track>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001.html
deleted file mode 100644
index d2fede7a8ed..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-001.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!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: Masonry layout with `align-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-align-tracks-stretch-001-ref.html">
- <link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
-<style>
-html,body {
- color:black; background-color:white; font:16px/1 Ahem; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: masonry;
- grid-template-columns: 150px 100px 50px;
- gap: 3px 5px;
- padding: 10px;
- border: 3px solid;
- background: lightgrey content-box;
- align-tracks: stretch;
- height: 500px;
-}
-item {
- background: grey;
- height: 30px;
- position: relative;
-}
-item:nth-child(2n) { background:purple; height:auto; }
-item:nth-child(1) { border:10px solid; margin: 10px 0 5px 3px; }
-z { display: block; background: yellow; height: 20%; width:80%; }
-a {
- position: absolute;
- inset: 0;
- top: auto;
- border: 2px solid lime;
-}
-</style>
-</head>
-<body>
-<grid>
- <item>1</item>
- <item>2</item>
- <item>3</item>
- <item style="max-height:40px; margin-top:10px">4</item>
- <item>5</item>
- <item>6<a></a></item>
- <item>7</item>
- <item style="writing-mode:vertical-lr">8 vertical</item>
- <item>9<a></a></item>
- <item>10 A<br>B</item>
- <item>11</item>
- <item>12<br><br><z></z></item>
- <item>13</item>
- <item style="max-height:120px; border:2px solid; box-sizing:border-box; margin:1px">14<z></z><a></a></item>
- <item>15</item>
- <item style="align-self:end">16</item>
- <item>17</item>
- <item style="margin:auto 0">18</item>
- <item>19</item>
- <item style="margin-top: auto">20</item>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002-ref.html
deleted file mode 100644
index 01f24ea986f..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002-ref.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!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: Masonry layout with `align-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-<style>
-html,body {
- color:black; background-color:white; font:6px/1 monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: auto auto;
- grid-template-columns: 30px;
- gap: 1px 2px;
- padding: 2px 3px 1px 1px;
- border-style: solid;
- border-width: 1px 7px 3px 5px;
- border-inline-start-color: magenta;
- border-block-start-color: blue;
- background: lightgrey content-box;
- block-size: 25px;
- vertical-align: top;
-}
-item {
- border-inline-start: 1px solid magenta;
- border-block-start: 2px solid blue;
-}
-item:nth-child(2n+1) { background: grey; }
-item:nth-child(2n) { background: cyan; }
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <item>1</item>
- <item>2a<br>2b</item>
-</grid>
-</div>
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const reorder of [false, true]) {
- for (const cb_wm of wms) {
- for (const child_wm of wms) {
- let e = grid.cloneNode(true);
- e.className = cb_wm;
- e.children[1].className = child_wm;
- if (reorder) {
- e.children[0].style.order = '1';
- }
- document.body.appendChild(e);
- }
- }
-}
-</script>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002.html
deleted file mode 100644
index 1631ac3c07d..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/align-tracks/masonry-align-tracks-stretch-002.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!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: Masonry layout with `align-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-align-tracks-stretch-002-ref.html">
-<style>
-html,body {
- color:black; background-color:white; font:6px/1 monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: masonry;
- grid-template-columns: 30px;
- gap: 1px 2px;
- padding: 2px 3px 1px 1px;
- border-style: solid;
- border-width: 1px 7px 3px 5px;
- border-inline-start-color: magenta;
- border-block-start-color: blue;
- background: lightgrey content-box;
- align-tracks: stretch;
- block-size: 25px;
- vertical-align: top;
-}
-item {
- border-inline-start: 1px solid magenta;
- border-block-start: 2px solid blue;
-}
-item:nth-child(2n+1) { background: grey; }
-item:nth-child(2n) { background: cyan; }
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <item>1</item>
- <item>2a<br>2b</item>
-</grid>
-</div>
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const reorder of [false, true]) {
- for (const cb_wm of wms) {
- for (const child_wm of wms) {
- let e = grid.cloneNode(true);
- e.className = cb_wm;
- e.children[1].className = child_wm;
- if (reorder) {
- e.children[0].style.order = '1';
- }
- document.body.appendChild(e);
- }
- }
-}
-</script>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001-ref.html
deleted file mode 100644
index 912c9c9f823..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001-ref.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!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: Masonry layout with `justify-tracks` alignment</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <style>
-html,body {
- color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-
-grid {
- display: inline-flex;
- flex-flow: row wrap;
- background: content-box silver;
- color: #444;
- padding: 1px 2px;
- inline-size: 30px;
- vertical-align: top;
-}
-grid.vll, grid.vrr, grid.vlr, grid.vrl, grid.swl, grid.swr {
- block-size: 17px;
-}
-grid2 {
- display: inline-grid;
- column-gap: 2px;
- grid-template-columns: 8px 8px;
- vertical-align: top;
-}
-
-item {
- background-color: #444;
- color: #fff;
- writing-mode: horizontal-tb;
- direction: ltr;
-}
-
-grid > div {
- display: inline-flex;
- flex-flow: row wrap;
- inline-size: min-content;
-}
-
-grid2:nth-child(1) { margin-block-end:1px; }
-grid2:nth-child(2) { inline-size: 22px; block-size: 12px; }
-.vll grid2:nth-child(2) { margin-block-start:-4px; grid-template-columns: 12px 8px;}
-.vrr grid2:nth-child(2) { margin-block-start:-4px; grid-template-columns: 12px 8px;}
-.vlr grid2:nth-child(2) { margin-block-start:-4px; grid-template-columns: 12px 8px;}
-.vrl grid2:nth-child(2) { margin-block-start:-4px; grid-template-columns: 12px 8px;}
-.swl grid2:nth-child(2) { margin-block-start:-4px; grid-template-columns: 12px 8px;}
-.swr grid2:nth-child(2) { margin-block-start:-4px; grid-template-columns: 12px 8px;}
-
-.vll grid2:nth-child(1) { inline-size: 22px; }
-.vrr grid2:nth-child(1) { inline-size: 22px; }
-.vlr grid2:nth-child(1) { inline-size: 22px; }
-.vrl grid2:nth-child(1) { inline-size: 22px; }
-.swl grid2:nth-child(1) { inline-size: 22px; }
-.swr grid2:nth-child(1) { inline-size: 22px; }
-
-grid2:nth-child(1) > item:nth-child(1) { background: blue; inline-size:8px; block-size:8px; z-index:1; }
-grid2:nth-child(2) > item:nth-child(1) { background: magenta; inline-size:8px; block-size:12px; z-index:1; }
-grid2:nth-child(1) > item:nth-child(2) { background: lime; inline-size:12px; block-size:8px; z-index:2; }
-grid2:nth-child(2) > item:nth-child(2) { background: purple; inline-size:8px; block-size:8px; z-index:2; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <div>
- <grid2>
- <item></item>
- <item></item>
- </grid2><grid2>
- <item></item>
- <item></item>
- </grid2>
- </div>
-</grid>
-</div>
-
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let ats = [ "start", "self-start", "center", "end", "self-end", "stretch", "space-between", "space-around", "space-evenly", ];
-let acs = [ "start", "center", "end", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const ac of acs) {
- for (const at of ats) {
- for (const wm of wms) {
- let e = grid.cloneNode(true);
- e.className = wm;
- e.children[0].children[0].children[0].className = "vrl";
- e.children[0].children[0].style.justifyContent = at;
- e.children[0].children[1].style.justifyContent = at;
- e.style.justifyContent = ac;
- document.body.appendChild(e);
- }
- }
-}
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001.html
deleted file mode 100644
index bfd3c1ca587..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-001.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!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: Masonry layout with `justify-tracks` alignment</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-justify-tracks-001-ref.html">
- <style>
-html,body {
- color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-
-grid {
- display: inline-grid;
- gap: 1px 2px;
- grid-template-columns: masonry;
- grid-template-rows: repeat(2,auto);
- background: content-box silver;
- color: #444;
- padding: 1px 2px;
- inline-size: 30px;
- vertical-align: top;
-}
-
-item {
- background-color: #444;
- color: #fff;
- writing-mode: horizontal-tb;
- direction: ltr;
-}
-
-item:nth-child(1) { background: blue; inline-size:8px; block-size:8px; }
-item:nth-child(2) { background: magenta; inline-size:8px; block-size:12px; }
-item:nth-child(3) { background: lime; inline-size:12px; block-size:8px; }
-item:nth-child(4) { background: purple; inline-size:8px; block-size:8px; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <item></item>
- <item></item>
- <item></item>
- <item></item>
-</grid>
-</div>
-
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let ats = [ "start", "self-start", "center", "end", "self-end", "stretch", "space-between", "space-around", "space-evenly", ];
-let acs = [ "start", "center", "end", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const ac of acs) {
- for (const at of ats) {
- for (const wm of wms) {
- let e = grid.cloneNode(true);
- e.className = wm;
- e.children[0].className = "vrl";
- e.style.justifyTracks = at;
- e.style.justifyContent = ac;
- document.body.appendChild(e);
- }
- }
-}
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001-ref.html
deleted file mode 100644
index 319ef217ea7..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001-ref.html
+++ /dev/null
@@ -1,117 +0,0 @@
-<!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: Masonry layout with multiple `justify-tracks` values</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-<style>
-html,body {
- color:black; background-color:white; font:15px/1 "Courier New", monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-columns: auto;
- grid-template-rows: repeat(8,50px);
- gap: 3px 5px;
- padding: 10px 3px 1px 7px;
- border: solid;
- border-width: 1px 7px 3px 5px;
- background: lightgrey content-box;
- width: 500px;
- vertical-justify: top;
-}
-.fallback { grid-template-rows:3px; padding:0; border:0; display: grid; }
-item {
- background: grey;
- width: 3ch;
- position: relative;
- border: 1px solid;
-}
-.purple { background:purple; width:auto; border-left:3px solid; }
-z { display: block; background: yellow; height: calc(.2 * (50px - 2px)); width:calc(.8 * 2ch); }
-a {
- position: absolute;
- inset: 0;
- top: auto;
- border: 2px solid lime;
-}
-masonry-track {
- display: grid;
- grid-auto-flow: column;
- gap: 3px 5px;
-}
-masonry-track:nth-child(1) { justify-content:start }
-masonry-track:nth-child(2) { justify-content:end }
-masonry-track:nth-child(3) { justify-content:center }
-masonry-track:nth-child(4) { justify-content:stretch; grid-template-columns: repeat(3,auto) repeat(2,max-content); }
-masonry-track:nth-child(5) { justify-content:space-between }
-masonry-track:nth-child(6) { justify-content:space-around }
-masonry-track:nth-child(7) { justify-content:space-evenly }
-masonry-track:nth-child(8) { justify-content:space-evenly }
-</style>
-</head>
-<body>
-<grid>
- <masonry-track>
- <item style="width:50px">1</item>
- <item class="purple">20</item>
- <item class="purple">26</item>
- <item>33</item>
- </masonry-track>
- <masonry-track>
- <item class="purple" style="height:25px">2</item>
- <item>9<a></a></item>
- <item class="purple">18</item>
- <item>25</item>
- </masonry-track>
- <masonry-track>
- <item style="margin-left:10px">3</item>
- <item>15</item>
- <item class="purple">24</item>
- <item class="purple">32</item>
- </masonry-track>
- <masonry-track>
- <item class="purple" style="margin-top:5px">4</item>
- <item class="purple">10</item>
- <item class="purple" style="writing-mode:vertical-rl">16</item>
- <item>23</item>
- <item>31</item>
- </masonry-track>
- <masonry-track>
- <item>5</item>
- <item>13</item>
- <item class="purple">22</item>
- <item>29</item>
- </masonry-track>
- <masonry-track>
- <item class="purple">6<a></a></item>
- <item>11</item>
- <item>19</item>
- <item class="purple">28</item>
- </masonry-track>
- <masonry-track>
- <item>7</item>
- <item class="purple"><z></z>14<a></a></item>
- <item>21</item>
- <item class="purple">30</item>
- </masonry-track>
- <masonry-track>
- <item class="purple" style="writing-mode:vertical-lr">8</item>
- <item class="purple">12<z></z></item>
- <item>17</item>
- <item>27</item>
- </masonry-track>
-</grid>
-<grid class="fallback" style="justify-content:start">
- <item></item>
-</grid>
-<grid class="fallback" style="justify-content:center">
- <item></item>
-</grid>
-<grid class="fallback" style="justify-content:center">
- <item></item>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001.html
deleted file mode 100644
index 011c487cb72..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-multi-001.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!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: Masonry layout with multiple `justify-tracks` values</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-justify-tracks-multi-001-ref.html">
-<style>
-html,body {
- color:black; background-color:white; font:15px/1 "Courier New", monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-columns: masonry;
- grid-template-rows: repeat(8,50px); /*intentionally one more than justify-tracks values*/
- gap: 3px 5px;
- padding: 10px 3px 1px 7px;
- border: solid;
- border-width: 1px 7px 3px 5px;
- background: lightgrey content-box;
- justify-tracks: start,end,center,stretch,space-between,space-around,space-evenly;
- width: 500px;
- vertical-justify: top;
-}
-.fallback { grid-template-rows:3px; padding:0; border:0; display: grid; }
-item {
- background: grey;
- width: 3ch;
- position: relative;
- border: 1px solid;
-}
-item:nth-child(2n) { background:purple; width:auto; border-left:3px solid; }
-z { display: block; background: yellow; height: 20%; width:80%; }
-a {
- position: absolute;
- inset: 0;
- top: auto;
- border: 2px solid lime;
-}
-</style>
-</head>
-<body>
-<grid>
- <item style="width:10%">1</item>
- <item style="height:50%">2</item>
- <item style="margin-left:2%">3</item>
- <item style="margin-top:1%">4</item>
- <item>5</item>
- <item>6<a></a></item>
- <item>7</item>
- <item style="writing-mode:vertical-lr">8</item>
- <item>9<a></a></item>
- <item>10</item>
- <item>11</item>
- <item>12<z></z></item>
- <item>13</item>
- <item><z></z>14<a></a></item>
- <item>15</item>
- <item style="writing-mode:vertical-rl">16</item>
- <item>17</item>
- <item>18</item>
- <item>19</item>
- <item>20</item>
- <item>21</item>
- <item>22</item>
- <item>23</item>
- <item>24</item>
- <item>25</item>
- <item>26</item>
- <item>27</item>
- <item>28</item>
- <item>29</item>
- <item>30</item>
- <item>31</item>
- <item>32</item>
- <item>33</item>
-</grid>
-<grid class="fallback" style="justify-tracks:space-between">
- <item></item>
-</grid>
-<grid class="fallback" style="justify-tracks:space-around">
- <item></item>
-</grid>
-<grid class="fallback" style="justify-tracks:space-evenly">
- <item></item>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001-ref.html
deleted file mode 100644
index 39053051cc8..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001-ref.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!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: Masonry layout with `justify-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
-<style>
-html,body {
- color:black; background-color:white; font:16px/1 Ahem; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: 150px 100px 50px;
- grid-template-columns: 500px;
- gap: 5px 3px;
- padding: 10px;
- border: 3px solid;
- background: lightgrey content-box;
- width: 500px;
-}
-masonry-track {
- display: grid;
- gap: 5px 3px;
- width: 500px;
-}
-masonry-track:nth-child(1) {
- grid-template-rows: 150px;
- grid-template-columns: max-content auto auto min-content min-content auto;
-}
-masonry-track:nth-child(2) {
- grid-template-rows: 100px;
- grid-template-columns: auto 50px 3ch 3ch 3ch min-content min-content;
-}
-masonry-track:nth-child(3) {
- grid-template-rows: 50px;
- grid-template-columns: 3ch auto 3ch 3ch auto 3ch auto;
-}
-item {
- background: grey;
- width: 3ch;
- position: relative;
-}
-.purple { background:purple; width:auto; }
-z { display: block; background: yellow; width: 20%; height:10%; }
-a {
- position: absolute;
- inset: 0;
- left: auto;
- border: 2px solid lime;
-}
-</style>
-</head>
-<body>
-<grid>
- <masonry-track>
- <item style="border:10px solid; margin:10px 0 5px 3px;">1</item>
- <item style="writing-mode:vertical-lr" class="purple">8<br>vertical</item>
- <item class="purple">10</item>
- <item class="purple" style="width:86px; border:solid; border-width:0 2px; margin-right:1px">12<z></z></item>
- <item>15</item>
- <item style="margin:0 auto" class="purple">18</item>
- </masonry-track>
- <masonry-track>
- <item class="purple">2</item>
- <item style="width:40px; margin-right:10px" class="purple">4</item>
- <item>5</item>
- <item>9<a></a></item>
- <item>13</item>
- <item style="justify-self:start" class="purple">16</item>
- <item>19</item>
- </masonry-track>
- <masonry-track>
- <item>3</item>
- <item class="purple">6<a></a></item>
- <item>7</item>
- <item>11</item>
- <item class="purple">14<z></z><a></a></item>
- <item>17</item>
- <item style="margin-left: auto" class="purple">20</item>
- </masonry-track>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001.html
deleted file mode 100644
index 17cb3218218..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-001.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!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: Masonry layout with `justify-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-justify-tracks-stretch-001-ref.html">
- <link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
-<style>
-html,body {
- color:black; background-color:white; font:16px/1 Ahem; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-rows: 150px 100px 50px;
- grid-template-columns: masonry;
- justify-tracks: stretch;
- gap: 5px 3px;
- padding: 10px;
- border: 3px solid;
- background: lightgrey content-box;
- width: 500px;
-}
-item {
- background: grey;
- width: 3ch;
- position: relative;
-}
-item:nth-child(2n) { background:purple; width:auto; }
-item:nth-child(1) { border:10px solid; margin: 10px 0 5px 3px; }
-z { display: block; background: yellow; width: 20%; height:10%; }
-a {
- position: absolute;
- inset: 0;
- left: auto;
- border: 2px solid lime;
-}
-</style>
-</head>
-<body>
-<grid>
- <item>1</item>
- <item>2</item>
- <item>3</item>
- <item style="max-width:40px; margin-right:10px">4</item>
- <item>5</item>
- <item>6<a></a></item>
- <item>7</item>
- <item style="writing-mode:vertical-lr">8 vertical</item>
- <item>9<a></a></item>
- <item>10</item>
- <item>11</item>
- <item style="max-width:90px; border:solid; border-width:0 2px; box-sizing:border-box; margin-right:1px">12<z></z></item>
- <item>13</item>
- <item>14<z></z><a></a></item>
- <item>15</item>
- <item style="justify-self:start">16</item>
- <item>17</item>
- <item style="margin:0 auto">18</item>
- <item>19</item>
- <item style="margin-left: auto">20</item>
-</grid>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002-ref.html
deleted file mode 100644
index 69759484f29..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002-ref.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!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: Masonry layout with `justify-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-<style>
-html,body {
- color:black; background-color:white; font:6px/1 monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-columns: auto auto;
- grid-template-rows: 30px;
- gap: 1px 2px;
- padding: 2px 3px 1px 1px;
- border-style: solid;
- border-width: 1px 7px 3px 5px;
- border-inline-start-color: magenta;
- border-block-start-color: blue;
- background: lightgrey content-box;
- inline-size: 25px;
- vertical-align: top;
-}
-item {
- border-inline-start: 1px solid magenta;
- border-block-start: 2px solid blue;
-}
-item:nth-child(2n+1) { background: grey; }
-item:nth-child(2n) { background: cyan; }
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <item>1</item>
- <item>2a<br>2b</item>
-</grid>
-</div>
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const reorder of [false, true]) {
- for (const cb_wm of wms) {
- for (const child_wm of wms) {
- let e = grid.cloneNode(true);
- e.className = cb_wm;
- e.children[1].className = child_wm;
- if (reorder) {
- e.children[0].style.order = '1';
- }
- document.body.appendChild(e);
- }
- }
-}
-</script>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002.html
deleted file mode 100644
index 6b7746722dc..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/justify-tracks/masonry-justify-tracks-stretch-002.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!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: Masonry layout with `justify-tracks:stretch`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-2">
- <link rel="match" href="masonry-justify-tracks-stretch-002-ref.html">
-<style>
-html,body {
- color:black; background-color:white; font:6px/1 monospace; padding:0; margin:0;
-}
-grid {
- display: inline-grid;
- grid-template-columns: masonry;
- grid-template-rows: 30px;
- gap: 1px 2px;
- padding: 2px 3px 1px 1px;
- border-style: solid;
- border-width: 1px 7px 3px 5px;
- border-inline-start-color: magenta;
- border-block-start-color: blue;
- background: lightgrey content-box;
- justify-tracks: stretch;
- inline-size: 25px;
- vertical-align: top;
-}
-item {
- position: relative;
- border-inline-start: 1px solid magenta;
- border-block-start: 2px solid blue;
-}
-item:nth-child(2n+1) { background: grey; }
-item:nth-child(2n) { background: cyan; }
-.hl { writing-mode: horizontal-tb; direction:ltr; }
-.hr { writing-mode: horizontal-tb; direction:rtl; }
-.vll { writing-mode: vertical-lr; direction:ltr; }
-.vlr { writing-mode: vertical-lr; direction:rtl; }
-.vrl { writing-mode: vertical-rl; direction:ltr; }
-.vrr { writing-mode: vertical-rl; direction:rtl; }
-.swl { writing-mode: sideways-lr; direction:ltr; }
-.swr { writing-mode: sideways-lr; direction:rtl; }
-</style>
-</head>
-<body>
-<div style="display:none">
-<grid>
- <item>1</item>
- <item>2a<br>2b</item>
-</grid>
-</div>
-<script>
-let wms = [ "hl", "hr", "vll", "vrr", "vlr", "vrl", "swl", "swr", ];
-let grid = document.getElementsByTagName('grid')[0];
-for (const reorder of [false, true]) {
- for (const cb_wm of wms) {
- for (const child_wm of wms) {
- let e = grid.cloneNode(true);
- e.className = cb_wm;
- e.children[1].className = child_wm;
- if (reorder) {
- e.children[0].style.order = '1';
- }
- document.body.appendChild(e);
- }
- }
-}
-</script>
-</body></html>
diff --git a/tests/wpt/tests/css/css-grid/subgrid/align-self-baseline-with-subgrid-mbp.html b/tests/wpt/tests/css/css-grid/subgrid/align-self-baseline-with-subgrid-mbp.html
new file mode 100644
index 00000000000..bb9f8444835
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/subgrid/align-self-baseline-with-subgrid-mbp.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com">
+<meta name="assert" content="Margin, border, and padding of subgrids should influence the offset of items in the same baseline alignment context">
+<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-item-contribution">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<style>
+html,body {
+ color:black; background-color:white; padding:0; margin:0;
+}
+.grid {
+ font:16px/1 Ahem;
+ display: inline-grid;
+ border: 1px solid black;
+ grid-template-columns: auto auto;
+}
+.subgrid {
+ display: grid;
+ grid-template-rows: subgrid;
+ border: 9px solid blue;
+ margin-top: 15px;
+ padding-top: 6px;
+}
+.first-baseline {
+ align-self: baseline;
+}
+</style>
+</head>
+<body onload="checkLayout('.first-baseline')">
+<div id="target" class="grid">
+ <div data-offset-y="31" class="first-baseline">X</div>
+ <div class="subgrid">
+ <div data-offset-y="31" class="first-baseline">X</div>
+ </div>
+</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-foreignobject-non-zero-xy.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-foreignobject-non-zero-xy.html
new file mode 100644
index 00000000000..a63f4c8aa29
--- /dev/null
+++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-foreignobject-non-zero-xy.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>CSS Masking: clip-path on a foreignObject with non-zero 'x' and 'y' render correctly</title>
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1218383">
+<link rel="match" href="reference/green-100x100.html">
+<svg viewBox="25 50 200 100" width="200">
+ <rect x="25" y="50" width="100" height="100" fill="red"/>
+ <clipPath id="r">
+ <rect x="25" y="50" width="100" height="100"/>
+ </clipPath>
+ <foreignObject x="25" y="50" width="150" height="100" clip-path="url(#r)">
+ <div style="width: 100px; height: 100px; background-color: green; border-right: 50px solid red"></div>
+ </foreignObject>
+</svg>
diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-shape-foreignobject-non-zero-xy.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-shape-foreignobject-non-zero-xy.html
new file mode 100644
index 00000000000..4e221f36e4c
--- /dev/null
+++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-shape-foreignobject-non-zero-xy.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<title>CSS Masking: clip-path on a foreignObject with non-zero 'x' and 'y' render correctly</title>
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1218383">
+<link rel="match" href="reference/green-100x100.html">
+<svg viewBox="25 50 200 100" width="200">
+ <rect x="25" y="50" width="100" height="100" fill="red"/>
+ <foreignObject x="25" y="50" width="150" height="100" clip-path="inset(0 50 0 0)">
+ <div style="width: 100px; height: 100px; background-color: green; border-right: 50px solid red"></div>
+ </foreignObject>
+</svg>
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-offset-print.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-offset-print.html
new file mode 100644
index 00000000000..3954bbcf441
--- /dev/null
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-offset-print.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1485969">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div id="scroller" style="position:relative; width:200px; height:100px; overflow:hidden;">
+ <div style="position:absolute; width:1000px;">
+ <div style="position:sticky; left:0; height:100px; width:100px; background:green;"></div>
+ </div>
+ <div style="width:100px; height:100px; background:red;"></div>
+</div>
+<script>
+document.getElementById('scroller').scrollLeft = 100;
+</script>
diff --git a/tests/wpt/tests/css/css-properties-values-api/determine-registration.html b/tests/wpt/tests/css/css-properties-values-api/determine-registration.html
index 20cddc48adc..99e39c191ec 100644
--- a/tests/wpt/tests/css/css-properties-values-api/determine-registration.html
+++ b/tests/wpt/tests/css/css-properties-values-api/determine-registration.html
@@ -46,6 +46,38 @@ test_with_at_property({
});
}, '@property later in document order wins');
+test_with_at_property({
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '10px'
+}, (name1) => {
+ with_at_property({
+ name: name1,
+ syntax: '"<length>"',
+ inherits: true,
+ initialValue: '20px'
+ }, (name2) => {
+ assert_equals(name1, name2);
+ assert_equals(getComputedStyle(div).getPropertyValue(name2), '20px');
+ });
+}, '@property later in document order wins (overridding definition with inherits=true)');
+
+test_with_at_property({
+ syntax: '"<length>"',
+ inherits: true,
+ initialValue: '10px'
+}, (name1) => {
+ with_at_property({
+ name: name1,
+ syntax: '"<length>"',
+ inherits: false,
+ initialValue: '20px'
+ }, (name2) => {
+ assert_equals(name1, name2);
+ assert_equals(getComputedStyle(div).getPropertyValue(name2), '20px');
+ });
+}, '@property later in document order wins (overridding definition with inherits=false)');
+
test(() => {
let name = generate_name();
diff --git a/tests/wpt/tests/css/css-properties-values-api/get-computed-style-enumeration.html b/tests/wpt/tests/css/css-properties-values-api/get-computed-style-enumeration.html
new file mode 100644
index 00000000000..909247f69a8
--- /dev/null
+++ b/tests/wpt/tests/css/css-properties-values-api/get-computed-style-enumeration.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#at-property-rule">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @property --inherited-length-1 {
+ syntax: "<length>";
+ inherits: true;
+ initial-value: 10px;
+ }
+ @property --inherited-length-2 {
+ syntax: "<length>";
+ inherits: true;
+ initial-value: 20px;
+ }
+ @property --non-inherited-length-1 {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 30px;
+ }
+ @property --non-inherited-length-2 {
+ syntax: "<length>";
+ inherits: false;
+ initial-value: 40px;
+ }
+ @property --inherited-no-initial-value-1 {
+ syntax: "*";
+ inherits: true;
+ }
+ @property --inherited-no-initial-value-2 {
+ syntax: "*";
+ inherits: true;
+ }
+ @property --inherited-no-initial-value-3 {
+ syntax: "*";
+ inherits: true;
+ }
+ @property --non-inherited-no-initial-value-1 {
+ syntax: "*";
+ inherits: false;
+ }
+ @property --non-inherited-no-initial-value-2 {
+ syntax: "*";
+ inherits: false;
+ }
+ @property --non-inherited-no-initial-value-3 {
+ syntax: "*";
+ inherits: false;
+ }
+ #parent {
+ --inherited-no-initial-value-2: parent-A;
+ --non-inherited-no-initial-value-2: parent-B;
+ --non-registered-property-2: parent-C;
+ }
+ #node {
+ --inherited-length-1: 50px;
+ --non-inherited-length-1: 60px;
+ --inherited-no-initial-value-1: child-A;
+ --non-inherited-no-initial-value-1: child-B;
+ --non-registered-property-1: child-C;
+ }
+</style>
+<div id="parent"><div id="node"></div></div>
+<script>
+ let style = window.getComputedStyle(document.getElementById("node"));
+ let properties = new Map();
+ Array.from(style).filter(name => name.startsWith("--"))
+ .forEach(name => properties.set(name, style.getPropertyValue(name)));
+
+ test(() => {
+ assert_equals(properties.get("--inherited-length-1"), "50px");
+ assert_equals(properties.get("--non-inherited-length-1"), "60px");
+ assert_equals(properties.get("--inherited-no-initial-value-1"), "child-A");
+ assert_equals(properties.get("--non-inherited-no-initial-value-1"), "child-B");
+ assert_equals(properties.get("--non-registered-property-1"), "child-C");
+ }, "Custom properties specified on the node exposed when enumerating computed style.");
+
+ test(() => {
+ assert_equals(properties.get("--inherited-no-initial-value-2"), "parent-A");
+ assert_equals(properties.get("--non-registered-property-2"), "parent-C");
+ }, "Inherited custom properties specified on the parent exposed when enumerating computed style.");
+
+ test(() => {
+ assert_equals(properties.get("--inherited-length-2"), "20px");
+ assert_equals(properties.get("--non-inherited-length-2"), "40px");
+ }, "Unspecified properties with initial values exposed when enumerating computed style.");
+
+ test(() => {
+ assert_false(properties.has("--non-inherited-no-initial-value-2"));
+ }, "Non-inherited custom properties specified on the parent without initial values not exposed when enumerating computed style.");
+
+ test(() => {
+ assert_false(properties.has("--inherited-no-initial-value-3"), "inherited");
+ assert_false(properties.has("--non-inherited-no-initial-value-3"), "non-inherited");
+ }, "Unspecified properties without initial values not exposed when enumerating computed style.");
+</script>
diff --git a/tests/wpt/tests/css/css-properties-values-api/invalid-at-computed-value-time.html b/tests/wpt/tests/css/css-properties-values-api/invalid-at-computed-value-time.html
new file mode 100644
index 00000000000..56a7756f406
--- /dev/null
+++ b/tests/wpt/tests/css/css-properties-values-api/invalid-at-computed-value-time.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api/#dom-propertydescriptor-inherits" />
+<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api/#register-a-custom-property" />
+<link rel="help" href="https://drafts.csswg.org/css-variables-2/#invalid-at-computed-value-time" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=outer><div id=inner></div></div>
+<script>
+
+test(function(){
+ CSS.registerProperty({name: '--p1', syntax: '*', initialValue: '0px', inherits: true});
+ outer.style = '--p1: 42px';
+ inner.style = '--p1: var(--undefined)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p1'), '');
+
+ CSS.registerProperty({name: '--p2', syntax: '*', initialValue: '0px', inherits: false});
+ outer.style = '--p2: 42px';
+ inner.style = '--p2: var(--undefined)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p2'), '');
+}, "Universal syntax: Undefined reference results in guaranteed-invalid value.");
+
+test(function(){
+ CSS.registerProperty({name: '--p3', syntax: '<length>', initialValue: '0px', inherits: true});
+ outer.style = '--p3: 42px';
+ inner.style = '--p3: var(--undefined)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p3'), '42px');
+
+ CSS.registerProperty({name: '--p4', syntax: '<length>', initialValue: '0px', inherits: false});
+ outer.style = '--p4: 42px';
+ inner.style = '--incompatible: nolength; --p4: var(--undefined)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p4'), '0px');
+}, "Undefined reference results in unsetting the property.");
+
+test(function(){
+ CSS.registerProperty({name: '--p5', syntax: '<length>', initialValue: '0px', inherits: true});
+ outer.style = '--p5: 42px';
+ inner.style = '--incompatible: nolength; --p5: var(--incompatible)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p5'), '42px');
+
+ CSS.registerProperty({name: '--p6', syntax: '<length>', initialValue: '0px', inherits: false});
+ outer.style = '--p6: 42px';
+ inner.style = '--incompatible: nolength; --p6: var(--incompatible)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p6'), '0px');
+}, "Syntax-incompatible reference results in unsetting the property.");
+
+test(function(){
+ CSS.registerProperty({name: '--p7', syntax: '<length>', initialValue: '0px', inherits: true});
+ outer.style = '--p7: 42px';
+ inner.style = '--p7: var(--undefined, nolength)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p7'), '42px');
+
+ CSS.registerProperty({name: '--p8', syntax: '<length>', initialValue: '0px', inherits: false});
+ outer.style = '--p8: 42px';
+ inner.style = 'var(--undefined, nolength)';
+ assert_equals(getComputedStyle(inner).getPropertyValue('--p8'), '0px');
+}, "Syntax-incompatible fallback results in unsetting the property.");
+
+test(function(){
+ const rootElement = document.documentElement;
+ CSS.registerProperty({name: '--p9', syntax: '<length>', initialValue: '0px', inherits: true});
+ rootElement.style = '--p9: var(--undefined);';
+ assert_equals(getComputedStyle(rootElement).getPropertyValue('--p9'), '0px');
+
+ CSS.registerProperty({name: '--p10', syntax: '<length>', initialValue: '0px', inherits: true});
+ rootElement.style = '--incompatible: nolength; --p10: var(--incompatible)';
+ assert_equals(getComputedStyle(rootElement).getPropertyValue('--p10'), '0px');
+
+ CSS.registerProperty({name: '--p11', syntax: '<length>', initialValue: '0px', inherits: true});
+ rootElement.style = '--p11: var(--undefined, nolength)';
+ assert_equals(getComputedStyle(rootElement).getPropertyValue('--p11'), '0px');
+}, "Unsetting inherited properties on the root results in initial value.");
+
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/slotted-parsing.html b/tests/wpt/tests/css/css-scoping/slotted-parsing.html
index bed4dedd560..e4657b588af 100644
--- a/tests/wpt/tests/css/css-scoping/slotted-parsing.html
+++ b/tests/wpt/tests/css/css-scoping/slotted-parsing.html
@@ -27,13 +27,14 @@
test_valid_selector("::slotted([attr]:hover)");
test_valid_selector("::slotted(:not(.a))");
- test_valid_selector("::slotted(*):is()");
- test_valid_selector("::slotted(*):is(:hover)");
- test_valid_selector("::slotted(*):is(#id)");
+ test_valid_forgiving_selector("::slotted(*):is()");
+ test_valid_forgiving_selector("::slotted(*):is(:hover)");
+ test_valid_forgiving_selector("::slotted(*):is(#id)");
- test_valid_selector("::slotted(*):where()");
- test_valid_selector("::slotted(*):where(:hover)");
- test_valid_selector("::slotted(*):where(#id)");
+ test_valid_forgiving_selector("::slotted(*):where()");
+ test_valid_forgiving_selector("::slotted(*):where(:hover)");
+ test_valid_forgiving_selector("::slotted(*):where(#id)");
+ test_valid_forgiving_selector("::slotted(*):where(::before)");
// Allow tree-abiding pseudo elements after ::slotted
test_valid_selector("::slotted(*)::before");
diff --git a/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html b/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html
deleted file mode 100644
index 4b49e64323a..00000000000
--- a/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-combinations-001.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel="help" href="https://drafts.csswg.org/css-text-4/#text-spacing-trim-property">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../support/get-char-advances.js"></script>
-<style>
-#container {
- /* This test prefers fonts with the `halt` feature. */
- font-family: 'Yu Gothic', 'Noto Sans CJK JP';
- font-size: 10px;
-}
-</style>
-<div id="container">
- <div expect="FFHF">国((国</div>
- <div expect="FFHF">国・(国</div>
- <div expect="FFHF">国)(国</div>
- <div expect="FFHF">国 (国</div>
- <div expect="FHFF">国))国</div>
- <div expect="FHFF">国)・国</div>
- <div expect="FHFF">国) 国</div>
- <div expect="FFHHF">国(((国</div>
- <div expect="FHHFF">国)))国</div>
-</div>
-<script>
-const range = document.createRange();
-
-function assertNode(element, expect) {
- const advances = getCharAdvances(element);
- const results = advances.map(advance => advance >= 8 ? 'F' : 'H');
- const result = results.join('');
- assert_equals(result, expect);
-}
-
-for (const element of document.querySelectorAll('div[expect]')) {
- test(() => {
- let expect = element.getAttribute('expect');
- assertNode(element, expect);
- }, `"${element.innerHTML}"`);
-}
-</script>
diff --git a/tests/wpt/tests/css/css-ui/parsing/form-sizing-computed.html b/tests/wpt/tests/css/css-ui/parsing/form-sizing-computed.html
index 557b1d5eb96..e508cd2050e 100644
--- a/tests/wpt/tests/css/css-ui/parsing/form-sizing-computed.html
+++ b/tests/wpt/tests/css/css-ui/parsing/form-sizing-computed.html
@@ -8,7 +8,7 @@
<body>
<div id="target"></div>
<script>
-test_computed_value('form-sizing', 'auto');
-test_computed_value('form-sizing', 'normal');
+test_computed_value('form-sizing', 'fixed');
+test_computed_value('form-sizing', 'content');
</script>
</body>
diff --git a/tests/wpt/tests/css/css-ui/parsing/form-sizing-invalid.html b/tests/wpt/tests/css/css-ui/parsing/form-sizing-invalid.html
index 80ab546f90e..5589707b25e 100644
--- a/tests/wpt/tests/css/css-ui/parsing/form-sizing-invalid.html
+++ b/tests/wpt/tests/css/css-ui/parsing/form-sizing-invalid.html
@@ -9,6 +9,8 @@
<script>
test_invalid_value('form-sizing', 'none');
test_invalid_value('form-sizing', 'legacy');
+test_invalid_value('form-sizing', 'auto');
+test_invalid_value('form-sizing', 'normal');
test_invalid_value('form-sizing', 'normal auto');
test_invalid_value('form-sizing', '100%');
test_invalid_value('form-sizing', '10px');
diff --git a/tests/wpt/tests/css/css-ui/parsing/form-sizing-valid.html b/tests/wpt/tests/css/css-ui/parsing/form-sizing-valid.html
index f7cc8f44c3c..d9d39f79132 100644
--- a/tests/wpt/tests/css/css-ui/parsing/form-sizing-valid.html
+++ b/tests/wpt/tests/css/css-ui/parsing/form-sizing-valid.html
@@ -7,7 +7,7 @@
<script src="/css/support/parsing-testcommon.js"></script>
<body>
<script>
-test_valid_value('form-sizing', 'auto');
-test_valid_value('form-sizing', 'normal');
+test_valid_value('form-sizing', 'fixed');
+test_valid_value('form-sizing', 'content');
</script>
</body>
diff --git a/tests/wpt/tests/css/css-writing-modes/forms/file-input-computed-style.html b/tests/wpt/tests/css/css-writing-modes/forms/file-input-computed-style.html
new file mode 100644
index 00000000000..417534e9bd6
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/forms/file-input-computed-style.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<meta charset="utf-8">
+<link rel="author" title="Aditya Keerthi" href="https://github.com/pxlcoder">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes/#block-flow">
+<title>File input writing mode computed style</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<input type="file" id="horizontal-input" style="writing-mode: horizontal-tb">
+<input type="file" id="vertical-lr-input" style="writing-mode: vertical-lr">
+<input type="file" id="vertical-rl-input" style="writing-mode: vertical-rl">
+
+<script>
+for (const element of document.querySelectorAll("[id^='horizontal-']")) {
+ test(() => {
+ const style = getComputedStyle(element);
+ const blockSize = parseInt(style.blockSize, 10);
+ const inlineSize = parseInt(style.inlineSize, 10);
+ assert_not_equals(blockSize, 0);
+ assert_not_equals(inlineSize, 0);
+ assert_greater_than(inlineSize, blockSize);
+ assert_equals(style.blockSize, style.height);
+ assert_equals(style.inlineSize, style.width);
+ }, `${element.id} block size should match height and inline size should match width`);
+}
+
+for (const element of document.querySelectorAll("[id^='vertical-']")) {
+ test(() => {
+ const style = getComputedStyle(element);
+ const blockSize = parseInt(style.blockSize, 10);
+ const inlineSize = parseInt(style.inlineSize, 10);
+ assert_not_equals(blockSize, 0);
+ assert_not_equals(inlineSize, 0);
+ assert_greater_than(inlineSize, blockSize);
+ assert_equals(style.blockSize, style.width);
+ assert_equals(style.inlineSize, style.height);
+ }, `${element.id} block size should match width and inline size should match height`);
+}
+</script>
diff --git a/tests/wpt/tests/css/css-writing-modes/forms/file-input-horizontal.optional.html b/tests/wpt/tests/css/css-writing-modes/forms/file-input-horizontal.optional.html
new file mode 100644
index 00000000000..b7bcb340e0e
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/forms/file-input-horizontal.optional.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Aditya Keerthi" href="https://github.com/pxlcoder">
+<link rel="help" href="https://html.spec.whatwg.org/#file-upload-state-(type=file)">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-4/#block-flow">
+<title>File input writing mode horizontal</title>
+<meta charset="utf-8">
+<link rel="mismatch" href="file-input-vertical.optional.html">
+<link rel="mismatch" href="file-input-vertical-rtl.optional.html">
+
+<!-- Note test description should be the same across all files to mismatch on. -->
+<p>The file input below should match the correct writing mode.</p>
+<input type="file" style="writing-mode: horizontal-tb">
diff --git a/tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical-rtl.optional.html b/tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical-rtl.optional.html
new file mode 100644
index 00000000000..b58242555b3
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical-rtl.optional.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Aditya Keerthi" href="https://github.com/pxlcoder">
+<link rel="help" href="https://html.spec.whatwg.org/#file-upload-state-(type=file)">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-4/#block-flow">
+<title>File input writing mode vertical RTL</title>
+<meta charset="utf-8">
+<link rel="mismatch" href="file-input-horizontal.optional.html">
+<link rel="mismatch" href="file-input-vertical.optional.html">
+
+<!-- Note test description should be the same across all files to mismatch on. -->
+<p>The file input below should match the correct writing mode.</p>
+<input type="file" style="writing-mode: vertical-lr; direction: rtl;">
diff --git a/tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical.optional.html b/tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical.optional.html
new file mode 100644
index 00000000000..c9b4272f84b
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/forms/file-input-vertical.optional.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Aditya Keerthi" href="https://github.com/pxlcoder">
+<link rel="help" href="https://html.spec.whatwg.org/#file-upload-state-(type=file)">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-4/#block-flow">
+<title>File input writing mode vertical</title>
+<meta charset="utf-8">
+<link rel="mismatch" href="file-input-vertical-rtl.optional.html">
+<link rel="mismatch" href="file-input-horizontal.optional.html">
+
+<!-- Note test description should be the same across all files to mismatch on. -->
+<p>The file input below should match the correct writing mode.</p>
+<input type="file" style="writing-mode: vertical-lr">
diff --git a/tests/wpt/tests/css/css-writing-modes/forms/select-multiple-keyboard-selection.optional.html b/tests/wpt/tests/css/css-writing-modes/forms/select-multiple-keyboard-selection.optional.html
new file mode 100644
index 00000000000..1b160946f5c
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/forms/select-multiple-keyboard-selection.optional.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<link rel="author" title="Aditya Keerthi" href="https://github.com/pxlcoder">
+<link rel="help" href="https://html.spec.whatwg.org/#the-select-element">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-4/#block-flow">
+<title>Test &lt;select&gt; multiple keyboard selection</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<select multiple size="4"></select>
+<script>
+const select = document.querySelector("select");
+for (let i = 0; i < 5; i++) {
+ const option = document.createElement("option");
+ option.textContent = `Option ${i + 1}`;
+ select.appendChild(option);
+}
+
+const arrow_left = "\uE012";
+const arrow_up = "\uE013";
+const arrow_right = "\uE014";
+const arrow_down = "\uE015";
+
+for (const writingMode of ["horizontal-tb", "vertical-lr", "vertical-rl", "sideways-lr", "sideways-rl"]) {
+ if (!CSS.supports(`writing-mode: ${writingMode}`))
+ continue;
+
+ const isHorizontal = writingMode === "horizontal-tb";
+ const isReversedBlockFlowDirection = writingMode.endsWith("-rl");
+ const scrollBlockAxis = isHorizontal ? "scrollTop" : "scrollLeft";
+
+ let nextKey = isHorizontal ? arrow_down : arrow_right;
+ let previousKey = isHorizontal ? arrow_up : arrow_left;
+
+ if (isReversedBlockFlowDirection) {
+ [nextKey, previousKey] = [previousKey, nextKey];
+ }
+
+ promise_test(async function() {
+ select.selectedIndex = 0;
+ select.style.writingMode = writingMode;
+ this.add_cleanup(() => {
+ select.scrollTop = 0;
+ select.scrollLeft = 0;
+ select.removeAttribute("style");
+ });
+
+ assert_equals(select.value, "Option 1");
+ assert_equals(select[scrollBlockAxis], 0);
+
+ select.focus();
+
+ assert_equals(document.activeElement, select);
+
+ await test_driver.send_keys(document.activeElement, previousKey);
+ assert_equals(select.value, "Option 1");
+ assert_equals(select[scrollBlockAxis], 0);
+
+ await test_driver.send_keys(document.activeElement, nextKey);
+ assert_equals(select.value, "Option 2");
+ assert_equals(select[scrollBlockAxis], 0);
+
+ for (let i = 0; i < select.size - 1; i++) {
+ await test_driver.send_keys(document.activeElement, nextKey);
+ }
+
+ assert_equals(select.value, "Option 5");
+
+ if (!isReversedBlockFlowDirection) {
+ assert_true(select[scrollBlockAxis] > 0);
+ } else {
+ assert_true(select[scrollBlockAxis] < 0);
+ }
+
+ await test_driver.send_keys(document.activeElement, previousKey);
+ assert_equals(select.value, "Option 4");
+
+ if (!isReversedBlockFlowDirection) {
+ assert_true(select[scrollBlockAxis] > 0);
+ } else {
+ assert_true(select[scrollBlockAxis] < 0);
+ }
+ }, `select[multiple][style="writing-mode: ${writingMode}"] supports keyboard navigation`);
+};
+</script>
diff --git a/tests/wpt/tests/css/selectors/is-where-parsing.html b/tests/wpt/tests/css/selectors/is-where-parsing.html
index 3159ecfe6a6..6d404dd953b 100644
--- a/tests/wpt/tests/css/selectors/is-where-parsing.html
+++ b/tests/wpt/tests/css/selectors/is-where-parsing.html
@@ -5,27 +5,20 @@
<link rel="help" href="https://drafts.csswg.org/selectors-4/#zero-matches">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<style id="test-sheet">
- random-selector { color: blue; }
-</style>
+<script src="/css/support/parsing-testcommon.js"></script>
<script>
- let rule = document.getElementById("test-sheet").sheet.cssRules[0];
- function assert_valid(expected_parseable, pattern, expected_pattern, description) {
- test(function() {
- for (let pseudo of ["is", "where"]) {
- let selector = pattern.replace("{}", ":" + pseudo);
- let expected_selector = selector;
- if (expected_pattern != null)
- expected_selector = expected_pattern.replace("{}", ":" + pseudo);
- rule.selectorText = "random-selector";
- rule.selectorText = selector;
- (expected_parseable ? assert_equals : assert_not_equals)(
- rule.selectorText,
- expected_selector,
- `${description}: ${selector}`
- );
+ function assert_valid(valid, pattern, expected_pattern, description) {
+ for (let pseudo of ["is", "where"]) {
+ let selector = pattern.replace("{}", ":" + pseudo);
+ let expected_selector = selector;
+ if (expected_pattern != null)
+ expected_selector = expected_pattern.replace("{}", ":" + pseudo);
+ if (valid) {
+ test_valid_selector(selector, expected_selector);
+ } else {
+ test_valid_forgiving_selector(selector);
}
- }, description);
+ }
}
assert_valid(true, "{}(div )", "{}(div)", "Trailing whitespace");
@@ -42,12 +35,11 @@
assert_valid(true, "{}(:hover, :active)", null, "Pseudo-classes inside");
assert_valid(true, "{}(div):hover", null, "Pseudo-classes after");
assert_valid(true, "{}(div)::before", null, "Pseudo-elements after");
- // Should ask clarification from CSSWG
- assert_valid(true, "{}(::before)", null, "Pseudo-elements inside");
+ assert_valid(false, "{}(::before)", null, "Pseudo-elements inside");
assert_valid(true, "{}(div) + bar", null, "Combinators after");
- assert_valid(true, "::part(foo):is(:hover)", null, "After part with simple pseudo-class");
- assert_valid(false, "::part(foo):is([attr='value'])", null, "After part with invalid selector after");
+ assert_valid(true, "::part(foo){}(:hover)", null, "After part with simple pseudo-class");
+ assert_valid(false, "::part(foo){}([attr='value'])", null, "After part with invalid selector after");
assert_valid(true, ":not({}(div))", null, "Nested inside :not, without combinators");
assert_valid(true, ":not({}(div .foo))", null, "Nested inside :not, with combinators");
diff --git a/tests/wpt/tests/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html b/tests/wpt/tests/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html
index a633c913d16..8ea816b5d89 100644
--- a/tests/wpt/tests/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html
+++ b/tests/wpt/tests/css/selectors/parsing/parse-has-disallow-nesting-has-inside-has.html
@@ -8,6 +8,8 @@
<script src="/css/support/parsing-testcommon.js"></script>
<script>
test_invalid_selector('.a:has(.b:has(.c))');
+ test_valid_forgiving_selector(':has(:is(:has(*)))');
+ test_valid_forgiving_selector(':has(:where(:has(*)))');
test(() => {
// It's not easy to check that these are invalid because :is() and :where()
// use forgiving parsing. Check that they never match instead.
diff --git a/tests/wpt/tests/css/selectors/parsing/parse-has.html b/tests/wpt/tests/css/selectors/parsing/parse-has.html
index 3492373a336..949040838cf 100644
--- a/tests/wpt/tests/css/selectors/parsing/parse-has.html
+++ b/tests/wpt/tests/css/selectors/parsing/parse-has.html
@@ -37,5 +37,5 @@
test_invalid_selector(':has()');
test_invalid_selector(':has(123)');
test_invalid_selector(':has(.a, 123)');
- test_valid_selector(':has(:is(.a, 123))', [':has(:is(.a, 123))', ':has(:is(.a))']);
+ test_valid_forgiving_selector(':has(:is(.a, 123))');
</script>
diff --git a/tests/wpt/tests/css/support/parsing-testcommon.js b/tests/wpt/tests/css/support/parsing-testcommon.js
index e480f26b3f3..93fd0090770 100644
--- a/tests/wpt/tests/css/support/parsing-testcommon.js
+++ b/tests/wpt/tests/css/support/parsing-testcommon.js
@@ -50,10 +50,14 @@ function test_invalid_value(property, value) {
}, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value");
}
+function test_valid_forgiving_selector(selector) {
+ test_valid_selector(selector, selector, { onlyWhenForgiving: true });
+}
+
// serializedSelector can be the expected serialization of selector,
// or an array of permitted serializations,
// or omitted if value should serialize as selector.
-function test_valid_selector(selector, serializedSelector) {
+function test_valid_selector(selector, serializedSelector, options) {
if (arguments.length < 2)
serializedSelector = selector;
@@ -85,6 +89,9 @@ function test_valid_selector(selector, serializedSelector) {
assert_equals(cssRules.length, 1, "Sheet should have 1 rule");
assert_equals(cssRules[0].selectorText, readSelector, "serialization should round-trip");
+
+ let supports = !options?.onlyWhenForgiving;
+ assert_equals(CSS.supports(`selector(${selector})`), supports, "CSS.supports() reports the expected value");
}, stringifiedSelector + " should be a valid selector");
}
diff --git a/tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js b/tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js
new file mode 100644
index 00000000000..37c242661d6
--- /dev/null
+++ b/tests/wpt/tests/dom/observable/tentative/observable-constructor.any.js
@@ -0,0 +1,341 @@
+test(() => {
+ assert_implements(self.Observable, "The Observable interface is not implemented");
+
+ assert_true(
+ typeof Observable === "function",
+ "Observable constructor is defined"
+ );
+
+ assert_throws_js(TypeError, () => { new Observable(); });
+}, "Observable constructor");
+
+test(() => {
+ assert_implements(self.Subscriber, "The Subscriber interface is not implemented");
+ assert_true(
+ typeof Subscriber === "function",
+ "Subscriber interface is defined as a function"
+ );
+
+ assert_throws_js(TypeError, () => { new Subscriber(); });
+
+ new Observable(subscriber => {
+ assert_not_equals(subscriber, undefined, "A Subscriber must be passed into the subscribe callback");
+ assert_implements(subscriber.next, "A Subscriber object must have a next() method");
+ assert_implements(subscriber.complete, "A Subscriber object must have a complete() method");
+ assert_implements(subscriber.error, "A Subscriber object must have an error() method");
+ }).subscribe();
+}, "Subscriber interface is not constructible");
+
+test(() => {
+ let initializerCalled = false;
+ const source = new Observable(() => {
+ initializerCalled = true;
+ });
+
+ assert_false(
+ initializerCalled,
+ "initializer should not be called by construction"
+ );
+ source.subscribe();
+ assert_true(initializerCalled, "initializer should be called by subscribe");
+}, "subscribe() can be called with no arguments");
+
+test(() => {
+ let initializerCalled = false;
+ const results = [];
+
+ const source = new Observable((subscriber) => {
+ initializerCalled = true;
+ subscriber.next(1);
+ subscriber.next(2);
+ subscriber.next(3);
+ subscriber.complete();
+ });
+
+ assert_false(
+ initializerCalled,
+ "initializer should not be called by construction"
+ );
+
+ source.subscribe({
+ next: (x) => results.push(x),
+ error: () => assert_unreached("error should not be called"),
+ complete: () => results.push("complete"),
+ });
+
+ assert_true(initializerCalled, "initializer should be called by subscribe");
+ assert_array_equals(
+ results,
+ [1, 2, 3, "complete"],
+ "should emit values synchronously"
+ );
+}, "Observable constructor calls initializer on subscribe");
+
+test(() => {
+ const error = new Error("error");
+ const results = [];
+
+ const source = new Observable((subscriber) => {
+ subscriber.next(1);
+ subscriber.next(2);
+ subscriber.error(error);
+ });
+
+ source.subscribe({
+ next: () => assert_unreached("next should not be called"),
+ error: (e) => results.push(e),
+ complete: () => assert_unreached("complete should not be called"),
+ });
+
+ assert_array_equals(
+ results,
+ [1, 2, error],
+ "should emit error synchronously"
+ );
+}, "Observable error path called synchronously");
+
+test(() => {
+ const error = new Error("error");
+ const results = [];
+
+ const source = new Observable((subscriber) => {
+ subscriber.next(1);
+ throw error;
+ // TODO(https://github.com/WICG/observable/issues/76): If we add the
+ // `subscriber.closed` attribute, consider a try-finally block to assert
+ // that `subscriber.closed` is true after throwing. Also TODO: ensure that
+ // that would even be the right behavior.
+ });
+
+ source.subscribe({
+ next: (x) => results.push(x),
+ error: (e) => results.push(e),
+ complete: () => assert_unreached("complete should not be called"),
+ });
+
+ assert_array_equals(
+ results,
+ [1, error],
+ "should emit values and the throw error synchronously"
+ );
+}, "Observable should error if initializer throws");
+
+// TODO(https://github.com/WICG/observable/issues/76): If we decide the
+// `subscriber.closed` attribute is needed, re-visit these two tests that were
+// originally included:
+// https://github.com/web-platform-tests/wpt/blob/0246526ca46ef4e5eae8b8e4a87dd905c40f5326/dom/observable/tentative/observable-ctor.any.js#L123-L137.
+
+test(() => {
+ const results = [];
+
+ const source = new Observable((subscriber) => {
+ subscriber.next(1);
+ subscriber.next(2);
+ subscriber.complete();
+ subscriber.next(3);
+ });
+
+ source.subscribe({
+ next: (x) => results.push(x),
+ error: () => assert_unreached("error should not be called"),
+ complete: () => results.push("complete"),
+ });
+
+ assert_array_equals(
+ results,
+ [1, 2, "complete"],
+ "should emit values synchronously, but not nexted values after complete"
+ );
+}, "Subscription does not emit values after completion");
+
+test(() => {
+ const error = new Error("error");
+ const results = [];
+
+ const source = new Observable((subscriber) => {
+ subscriber.next(1);
+ subscriber.next(2);
+ subscriber.error(error);
+ subscriber.next(3);
+ });
+
+ source.subscribe({
+ next: (x) => results.push(x),
+ error: (e) => results.push(e),
+ complete: () => assert_unreached("complete should not be called"),
+ });
+
+ assert_array_equals(
+ results,
+ [1, 2, error],
+ "should emit values synchronously, but not nexted values after error"
+ );
+}, "Subscription does not emit values after error");
+
+test(() => {
+ const error = new Error("error");
+ const results = [];
+
+ const source = new Observable((subscriber) => {
+ subscriber.next(1);
+ subscriber.next(2);
+ subscriber.error(error);
+ // TODO(https://github.com/WICG/observable/issues/76): Assert
+ // `subscriber.closed` is true, if we add that attribute.
+ // assert_true(subscriber.closed, "subscriber is closed after error");
+ subscriber.next();
+ subscriber.complete();
+ });
+
+ source.subscribe({
+ next: (x) => results.push(x),
+ error: (error) => results.push(error),
+ complete: () => assert_unreached("complete should not be called"),
+ });
+
+ assert_array_equals(results, [1, 2, error], "should emit synchronously");
+}, "Completing or nexting a subscriber after an error does nothing");
+
+test(() => {
+ const error = new Error("error");
+ let errorReported = false;
+
+ self.addEventListener(
+ "error",
+ (e) => {
+ assert_equals(e.message, "Uncaught (in observable) error");
+ assert_equals(e.filename, location.href);
+ assert_greater_than(e.lineno, 0);
+ assert_greater_than(e.colno, 0);
+ assert_equals(e.error, error);
+ errorReported = true;
+ },
+ { once: true }
+ );
+
+ const source = new Observable((subscriber) => {
+ subscriber.error(error);
+ });
+
+ // No error handler provided.
+ source.subscribe({
+ next: () => assert_unreached("next should not be called"),
+ complete: () => assert_unreached("complete should not be called"),
+ });
+
+ assert_true(errorReported);
+}, "Errors pushed to the subscriber that are not handled by the subscription " +
+ "are reported to the global");
+
+test(() => {
+ const error = new Error("error");
+ let errorReported = false;
+
+ self.addEventListener(
+ "error",
+ (e) => {
+ assert_equals(e.message, "Uncaught (in observable) error");
+ assert_equals(e.filename, location.href);
+ assert_greater_than(e.lineno, 0);
+ assert_greater_than(e.colno, 0);
+ assert_equals(e.error, error);
+ errorReported = true;
+ },
+ { once: true }
+ );
+
+ const source = new Observable((subscriber) => {
+ throw error;
+ });
+
+ // No error handler provided.
+ source.subscribe({
+ next: () => assert_unreached("next should not be called"),
+ complete: () => assert_unreached("complete should not be called"),
+ });
+
+ assert_true(errorReported);
+}, "Errors thrown in the initializer that are not handled by the " +
+ "subscription are reported to the global");
+
+test(() => {
+ const error = new Error("error");
+ const results = [];
+ let errorReported = false;
+
+ self.addEventListener(
+ "error",
+ (e) => {
+ assert_equals(e.message, "Uncaught (in observable) error");
+ assert_equals(e.filename, location.href);
+ assert_greater_than(e.lineno, 0);
+ assert_greater_than(e.colno, 0);
+ assert_equals(e.error, error);
+ errorReported = true;
+ },
+ { once: true }
+ );
+
+ const source = new Observable((subscriber) => {
+ subscriber.next(1);
+ subscriber.next(2);
+ subscriber.complete();
+ subscriber.error(error);
+ });
+
+ source.subscribe({
+ next: (x) => results.push(x),
+ error: () => assert_unreached("error should not be called"),
+ complete: () => results.push("complete"),
+ });
+
+ assert_array_equals(
+ results,
+ [1, 2, "complete"],
+ "should emit values synchronously, but not error values after complete"
+ );
+
+ assert_true(errorReported);
+}, "Subscription reports errors that are pushed after subscriber is closed " +
+ "by completion");
+
+test(() => {
+ const error = new Error("error");
+ const results = [];
+ let errorReported = false;
+
+ self.addEventListener(
+ "error",
+ (e) => {
+ assert_equals(e.message, "Uncaught (in observable) error");
+ assert_equals(e.filename, location.href);
+ assert_greater_than(e.lineno, 0);
+ assert_greater_than(e.colno, 0);
+ assert_equals(e.error, error);
+ errorReported = true;
+ },
+ { once: true }
+ );
+
+ const source = new Observable((subscriber) => {
+ subscriber.next(1);
+ subscriber.next(2);
+ subscriber.complete();
+ throw error;
+ });
+
+ source.subscribe({
+ next: (x) => results.push(x),
+ error: () => assert_unreached("error should not be called"),
+ complete: () => results.push("complete"),
+ });
+
+ assert_array_equals(
+ results,
+ [1, 2, "complete"],
+ "should emit values synchronously, but not error after complete"
+ );
+
+ assert_true(errorReported);
+}, "Errors thrown by initializer function after subscriber is closed by " +
+ "completion are reported");
diff --git a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html
new file mode 100644
index 00000000000..a1af7e89c29
--- /dev/null
+++ b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<title>DOM Parts: Basic object structure, {{}} declarative API</title>
+<meta name="author" href="mailto:masonf@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/domparts-utils.js"></script>
+
+<div id=context_elements>
+ <div></div>
+ <div parseparts></div>
+ <template></template>
+ <template parseparts class=expect_success></template>
+</div>
+
+<script>
+function assertIsComment(node,commentText) {
+ assert_true(node instanceof Comment);
+ assert_equals(node.textContent,commentText);
+}
+
+const declarativeOpenerNoParseparts = '<h1>';
+const declarativeOpenerParseparts = '<h1 parseparts>';
+const declarativeContent = '{{#}}First{{#}}<span {{}}>Middle</span>{{/}}Last{{/}}</h1>';
+
+Array.from(document.querySelectorAll('#context_elements>*')).forEach(contextEl => {
+ const expectParts = contextEl.classList.contains('expect_success');
+ [false,true].forEach(addParsePartsInside => {
+ const description = `${contextEl.outerHTML.split('><')[0]}><h1${addParsePartsInside ? " parseparts" : ""}>content...`;
+ const content = (addParsePartsInside ? declarativeOpenerParseparts : declarativeOpenerNoParseparts) + declarativeContent;
+
+ test((t) => {
+ const root = contextEl.content ? contextEl.content.getPartRoot() : document.getPartRoot();
+ assert_equals(root.getParts().length,0,'Should start with no parts');
+ t.add_cleanup(() => {
+ contextEl.replaceChildren();
+ root.getParts().forEach(part => part.disconnect());
+ });
+ contextEl.innerHTML = content;
+ if (expectParts) {
+ let expectedRootParts = [{type:'ChildNodePart',metadata:[]}];
+ assertEqualParts(root.getParts(),expectedRootParts,0,'declarative root missing parts');
+ const childPart1 = root.getParts()[0];
+ assertIsComment(childPart1.previousSibling,'');
+ assertIsComment(childPart1.nextSibling,'');
+ const expectedChild1Parts = [{type:'ChildNodePart',metadata:[]}];
+ assertEqualParts(childPart1.getParts(),expectedChild1Parts,0,'First level childpart should just have one child part');
+ const childPart2 = childPart1.getParts()[0];
+ assertIsComment(childPart2.previousSibling,'');
+ assertIsComment(childPart2.nextSibling,'');
+ const expectedChild2Parts = [{type:'NodePart',metadata:[]}];
+ assertEqualParts(childPart2.getParts(),expectedChild2Parts,0,'Second level childpart should have just the node part');
+ assert_true(childPart2.getParts()[0].node instanceof HTMLSpanElement);
+ assert_equals(childPart2.getParts()[0].node.textContent,'Middle');
+ } else {
+ assert_equals(root.getParts().length,0);
+ }
+ }, `Declarative DOM Parts innerHTML ${description} (expect${expectParts ? "" : " no"} parts)`);
+ });
+});
+
+test((t) => {
+ const tmpl = document.createElement('template');
+ tmpl.parseparts = true;
+ // See crbug.com/1490375.
+ tmpl.innerHTML = '<div {{}}></div>';
+ const root = tmpl.content.getPartRoot();
+ t.add_cleanup(() => {
+ tmpl.remove();
+ root.getParts().forEach(part => part.disconnect());
+ });
+ assert_equals(root.getParts().length,1,'There should be one NodePart');
+}, `Basic NodePart parsing`);
+</script>
+
diff --git a/tests/wpt/tests/dom/parts/basic-dom-part-objects.tentative.html b/tests/wpt/tests/dom/parts/basic-dom-part-objects.tentative.html
index af77b28b02f..d7adf61739c 100644
--- a/tests/wpt/tests/dom/parts/basic-dom-part-objects.tentative.html
+++ b/tests/wpt/tests/dom/parts/basic-dom-part-objects.tentative.html
@@ -120,6 +120,7 @@ function addCleanup(t, part) {
// Test cloning of the entire DocumentPartRoot.
const clonedPartRoot = root.clone();
+ assertEqualParts(root.getParts(),rootExpectations,[nodePart,childNodePart],'cloning a part root should not change the original');
const clonedContainer = clonedPartRoot.rootContainer;
assert_true(clonedPartRoot instanceof DocumentPartRoot);
assert_true(clonedContainer instanceof (useTemplate ? DocumentFragment : Document));
diff --git a/tests/wpt/tests/fledge/tentative/TODO b/tests/wpt/tests/fledge/tentative/TODO
index 7ec6d880801..2f3e72b2128 100644
--- a/tests/wpt/tests/fledge/tentative/TODO
+++ b/tests/wpt/tests/fledge/tentative/TODO
@@ -25,12 +25,13 @@ Need tests for (likely not a complete list):
currently guaranteed to work, due to potential time skew between processes).
* Multiple buyers.
* Multiple interest groups with same owner.
-* Multiple origin auctions (buyer != publisher != seller).
* Multiple frame tests (including join IG policy, run auction policy,
loading URNs in fencedframes in other frames, loading component
ad URNs in fenced frames of other frames, etc)
* adAuctionConfig passed to reportResult().
* Component auctions.
+ * Including cross-origin sellers.
+* clearOriginJoinedInterestGroups.
* browserSignals fields in scoring/bidding methods.
* In reporting methods, browserSignals fields: dataVersion, topLevelSeller,
componentSeller, modifiedBid, adCost, madeHighestScoringOtherBid
diff --git a/tests/wpt/tests/fledge/tentative/cross-origin.https.sub.window.js b/tests/wpt/tests/fledge/tentative/cross-origin.https.sub.window.js
index 1c1d5f2f6b7..178b3284bd5 100644
--- a/tests/wpt/tests/fledge/tentative/cross-origin.https.sub.window.js
+++ b/tests/wpt/tests/fledge/tentative/cross-origin.https.sub.window.js
@@ -12,13 +12,18 @@
const OTHER_ORIGIN1 = 'https://{{hosts[alt][]}}:{{ports[https][0]}}';
const OTHER_ORIGIN2 = 'https://{{hosts[alt][]}}:{{ports[https][1]}}';
-
-// Runs "script" in "iframe" via an eval call. The iframe must have been
-// created by calling "createIframe()" below. "param" is passed to the
+const OTHER_ORIGIN3 = 'https://{{hosts[][]}}:{{ports[https][1]}}';
+const OTHER_ORIGIN4 = 'https://{{hosts[][www]}}:{{ports[https][0]}}';
+const OTHER_ORIGIN5 = 'https://{{hosts[][www]}}:{{ports[https][1]}}';
+const OTHER_ORIGIN6 = 'https://{{hosts[alt][www]}}:{{ports[https][0]}}';
+const OTHER_ORIGIN7 = 'https://{{hosts[alt][www]}}:{{ports[https][1]}}';
+
+// Runs "script" in "child_window" via an eval call. The "child_window" must
+// have been created by calling "createFrame()" below. "param" is passed to the
// context "script" is run in, so can be used to pass objects that
// "script" references that can't be serialized to a string, like
// fencedFrameConfigs.
-async function runInIframe(test, iframe, script, param) {
+async function runInFrame(test, child_window, script, param) {
const messageUuid = generateUuid(test);
let receivedResponse = {};
@@ -34,27 +39,29 @@ async function runInIframe(test, iframe, script, param) {
}
}
window.addEventListener('message', WaitForMessage);
- iframe.contentWindow.postMessage(
+ child_window.postMessage(
{messageUuid: messageUuid, script: script, param: param}, '*');
});
await promise;
return receivedResponse.returnValue;
}
-// Creates an iframe and navigates to a URL on "origin", and waits for the URL
-// to finish loading by waiting for the iframe to send an event. Then returns
-// the iframe.
+// Creates an frame and navigates it to a URL on "origin", and waits for the URL
+// to finish loading by waiting for the frame to send an event. Then returns
+// the frame's Window object. Depending on the value of "is_iframe", the created
+// frame will either be a new iframe, or a new top-level main frame. In the iframe
+// case, its "allow" field will be set to "permissions".
//
// Also adds a cleanup callback to "test", which runs all cleanup functions
-// added to the iframe and waits for them to complete, and then destroys the
-// iframe.
-async function createIframe(test, origin, permissions) {
- const iframeUuid = generateUuid(test);
- const iframeUrl = `${origin}${RESOURCE_PATH}iframe.sub.html?uuid=${iframeUuid}`;
- let iframe = document.createElement('iframe');
- await new Promise(function(resolve, reject) {
+// added within the frame and waits for them to complete, and then destroys the
+// iframe or closes the window.
+async function createFrame(test, origin, is_iframe = true, permissions = null) {
+ const frameUuid = generateUuid(test);
+ const frameUrl =
+ `${origin}${RESOURCE_PATH}subordinate-frame.sub.html?uuid=${frameUuid}`;
+ let promise = new Promise(function(resolve, reject) {
function WaitForMessage(event) {
- if (event.data.messageUuid != iframeUuid)
+ if (event.data.messageUuid != frameUuid)
return;
if (event.data.result === 'load complete') {
resolve();
@@ -63,17 +70,38 @@ async function createIframe(test, origin, permissions) {
}
}
window.addEventListener('message', WaitForMessage);
+ });
+
+ if (is_iframe) {
+ let iframe = document.createElement('iframe');
if (permissions)
iframe.allow = permissions;
- iframe.src = iframeUrl;
+ iframe.src = frameUrl;
document.body.appendChild(iframe);
test.add_cleanup(async () => {
- await runInIframe(test, iframe, "await test_instance.do_cleanup();");
+ await runInFrame(test, iframe.contentWindow, "await test_instance.do_cleanup();");
document.body.removeChild(iframe);
});
+
+ await promise;
+ return iframe.contentWindow;
+ }
+
+ let child_window = window.open(frameUrl);
+ test.add_cleanup(async () => {
+ await runInFrame(test, child_window, "await test_instance.do_cleanup();");
+ child_window.close();
});
- return iframe;
+
+ await promise;
+ return child_window;
+}
+
+// Wrapper around createFrame() that creates an iframe and optionally sets
+// permissions.
+async function createIframe(test, origin, permissions) {
+ return createFrame(test, origin, /*is_iframe=*/ true, permissions);
}
////////////////////////////////////////////////////////////////////////////////
@@ -85,7 +113,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, document.location.origin);
// Join a same-origin InterestGroup in a iframe navigated to its origin.
- await runInIframe(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
+ await runInFrame(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
// Run an auction using window.location.origin as a bidder. The IG should
// make a bid and win an auction.
@@ -97,7 +125,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, OTHER_ORIGIN1);
// Join a cross-origin InterestGroup in a iframe navigated to its origin.
- await runInIframe(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
+ await runInFrame(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
// Run an auction in this frame using the other origin as a bidder. The IG should
// make a bid and win an auction.
@@ -117,7 +145,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, OTHER_ORIGIN1, 'join-ad-interest-group');
// Join a cross-origin InterestGroup in a iframe navigated to its origin.
- await runInIframe(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
+ await runInFrame(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
// Run an auction in this frame using the other origin as a bidder. The IG should
// make a bid and win an auction.
@@ -136,7 +164,7 @@ subsetTest(promise_test, async test => {
// Try to join an InterestGroup in a cross-origin iframe whose permissions policy
// blocks joining interest groups. An exception should be thrown, and the interest
// group should not be joined.
- await runInIframe(test, iframe,
+ await runInFrame(test, iframe,
`try {
await joinInterestGroup(test_instance, "${uuid}");
} catch (e) {
@@ -161,7 +189,7 @@ subsetTest(promise_test, async test => {
// This should require a .well-known fetch to the parents origin, which will not
// grant permission. The case where permission is granted is not yet testable.
let interestGroup = JSON.stringify(createInterestGroupForOrigin(uuid, window.location.origin));
- await runInIframe(test, iframe,
+ await runInFrame(test, iframe,
`joinInterestGroup(test_instance, "${uuid}", ${interestGroup})`);
// Run an auction with this page's origin as a bidder. Since the join
@@ -180,10 +208,10 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, document.location.origin);
// Join a same-origin InterestGroup in a iframe navigated to its origin.
- await runInIframe(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
+ await runInFrame(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
// Run auction in same-origin iframe. This should succeed, by default.
- await runInIframe(
+ await runInFrame(
test, iframe,
`await runBasicFledgeTestExpectingWinner(test_instance, "${uuid}");`);
}, 'Run auction in same-origin iframe, default permissions.');
@@ -196,7 +224,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, OTHER_ORIGIN1);
// Run auction in cross-origin iframe. Currently, this is allowed by default.
- await runInIframe(
+ await runInFrame(
test, iframe,
`await runBasicFledgeTestExpectingWinner(
test_instance, "${uuid}",
@@ -211,7 +239,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, OTHER_ORIGIN1, "run-ad-auction");
// Run auction in cross-origin iframe that should allow the auction to occur.
- await runInIframe(
+ await runInFrame(
test, iframe,
`await runBasicFledgeTestExpectingWinner(
test_instance, "${uuid}",
@@ -227,7 +255,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, OTHER_ORIGIN1, "run-ad-auction 'none'");
// Run auction in cross-origin iframe that should not allow the auction to occur.
- await runInIframe(
+ await runInFrame(
test, iframe,
`try {
await runBasicFledgeAuction(test_instance, "${uuid}");
@@ -246,7 +274,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(test, OTHER_ORIGIN1, `run-ad-auction ${OTHER_ORIGIN1}`);
- await runInIframe(
+ await runInFrame(
test, iframe,
`await runBasicFledgeTestExpectingWinner(
test_instance, "${uuid}",
@@ -271,7 +299,7 @@ subsetTest(promise_test, async test => {
// with no fledge-related permissions.
let iframe = await createIframe(
test, OTHER_ORIGIN1, "join-ad-interest-group 'none'; run-ad-auction 'none'");
- await runInIframe(
+ await runInFrame(
test, iframe,
`await createAndNavigateFencedFrame(test_instance, param);`,
/*param=*/config);
@@ -284,7 +312,7 @@ subsetTest(promise_test, async test => {
let iframe = await createIframe(
test, OTHER_ORIGIN1, "join-ad-interest-group; run-ad-auction");
- await runInIframe(
+ await runInFrame(
test, iframe,
`await joinInterestGroup(test_instance, "${uuid}");
await runBasicFledgeAuctionAndNavigate(test_instance, "${uuid}");
@@ -298,7 +326,7 @@ subsetTest(promise_test, async test => {
// Run an auction in an cross-origin iframe, and get the resulting FencedFrameConfig.
let iframe = await createIframe(
test, OTHER_ORIGIN1, "join-ad-interest-group; run-ad-auction");
- let config = await runInIframe(
+ let config = await runInFrame(
test, iframe,
`await joinInterestGroup(test_instance, "${uuid}");
let config = await runBasicFledgeTestExpectingWinner(test_instance, "${uuid}");
@@ -322,7 +350,7 @@ subsetTest(promise_test, async test => {
// Run an auction in an cross-origin iframe, and get the resulting FencedFrameConfig.
let iframe = await createIframe(
test, OTHER_ORIGIN1, "join-ad-interest-group; run-ad-auction");
- let config = await runInIframe(
+ let config = await runInFrame(
test, iframe,
`await joinInterestGroup(test_instance, "${uuid}");
let config = await runBasicFledgeTestExpectingWinner(test_instance, "${uuid}");
@@ -336,7 +364,7 @@ subsetTest(promise_test, async test => {
// first cross-origin iframe.
let iframe2 = await createIframe(
test, OTHER_ORIGIN2, "join-ad-interest-group 'none'; run-ad-auction 'none'");
- await runInIframe(
+ await runInFrame(
test, iframe2,
`await createAndNavigateFencedFrame(test_instance, param);`,
/*param=*/config);
@@ -345,3 +373,167 @@ subsetTest(promise_test, async test => {
[ createBidderReportURL(uuid, '1', OTHER_ORIGIN1),
createSellerReportURL(uuid, '1', OTHER_ORIGIN1)]);
}, 'Run auction in cross-origin iframe and open winning ad in a fenced frame child of another cross-origin iframe.');
+
+////////////////////////////////////////////////////////////////////////////////
+// Other tests.
+////////////////////////////////////////////////////////////////////////////////
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let iframe = await createIframe(test, OTHER_ORIGIN1, "run-ad-auction");
+
+ // Do everything in a cross-origin iframe, and make sure correct top-frame origin is used.
+ await runInFrame(
+ test, iframe,
+ `const uuid = "${uuid}";
+ const renderURL = createRenderURL(uuid, /*script=*/null, /*signalsParam=*/'hostname');
+
+ await joinInterestGroup(
+ test_instance, uuid,
+ { trustedBiddingSignalsKeys: ['hostname'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL,
+ ads: [{ renderURL: renderURL }],
+ biddingLogicURL: createBiddingScriptURL({
+ generateBid:
+ \`if (browserSignals.topWindowHostname !== "${document.location.hostname}")
+ throw "Wrong topWindowHostname: " + browserSignals.topWindowHostname;
+ if (trustedBiddingSignals.hostname !== '${window.location.hostname}')
+ throw 'Wrong hostname: ' + trustedBiddingSignals.hostname;\`})});
+
+ await runBasicFledgeTestExpectingWinner(
+ test_instance, uuid,
+ { trustedScoringSignalsURL: TRUSTED_SCORING_SIGNALS_URL,
+ decisionLogicURL:
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ \`if (browserSignals.topWindowHostname !== "${document.location.hostname}")
+ throw "Wrong topWindowHostname: " + browserSignals.topWindowHostname;
+ if (trustedScoringSignals.renderURL["\${renderURL}"] !== '${window.location.hostname}')
+ throw 'Wrong hostname: ' + trustedScoringSignals.renderURL["\${renderURL}"];\` })});`);
+}, 'Different top-frame origin.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderOrigin = OTHER_ORIGIN1;
+ let sellerOrigin = OTHER_ORIGIN2;
+ let bidderSendReportToURL = createBidderReportURL(uuid, '1', OTHER_ORIGIN3);
+ let sellerSendReportToURL = createSellerReportURL(uuid, '2', OTHER_ORIGIN4);
+ let bidderBeaconURL = createBidderBeaconURL(uuid, '3', OTHER_ORIGIN5);
+ let sellerBeaconURL = createSellerBeaconURL(uuid, '4', OTHER_ORIGIN6);
+ let renderURL = createRenderURL(
+ uuid,
+ `window.fence.reportEvent({
+ eventType: "beacon",
+ eventData: window.location.href,
+ destination: ["buyer", "seller"]
+ })`,
+ /*signalsParams=*/null, OTHER_ORIGIN7);
+
+ let iframe = await createIframe(test, bidderOrigin, "join-ad-interest-group");
+ let interestGroup = createInterestGroupForOrigin(
+ uuid, bidderOrigin,
+ {biddingLogicURL: createBiddingScriptURL(
+ { origin: bidderOrigin,
+ generateBid: `if (browserSignals.topWindowHostname !== "${document.location.hostname}")
+ throw "Wrong topWindowHostname: " + browserSignals.topWindowHostname;
+ if (interestGroup.owner !== "${bidderOrigin}")
+ throw "Wrong origin: " + interestGroup.owner;
+ if (!interestGroup.biddingLogicURL.startsWith("${bidderOrigin}"))
+ throw "Wrong origin: " + interestGroup.biddingLogicURL;
+ if (interestGroup.ads[0].renderUrl != "${renderURL}")
+ throw "Wrong renderURL: " + interestGroup.ads[0].renderUrl;
+ if (browserSignals.seller !== "${sellerOrigin}")
+ throw "Wrong origin: " + browserSignals.seller;`,
+ reportWin: `if (browserSignals.topWindowHostname !== "${document.location.hostname}")
+ throw "Wrong topWindowHostname: " + browserSignals.topWindowHostname;
+ if (browserSignals.seller !== "${sellerOrigin}")
+ throw "Wrong seller: " + browserSignals.seller;
+ if (browserSignals.interestGroupOwner !== "${bidderOrigin}")
+ throw "Wrong interestGroupOwner: " + browserSignals.interestGroupOwner;
+ if (browserSignals.renderURL !== "${renderURL}")
+ throw "Wrong renderURL: " + browserSignals.renderURL;
+ if (browserSignals.seller !== "${sellerOrigin}")
+ throw "Wrong seller: " + browserSignals.seller;
+ sendReportTo("${bidderSendReportToURL}");
+ registerAdBeacon({beacon: "${bidderBeaconURL}"});` }),
+ ads: [{ renderURL: renderURL }]});
+ await runInFrame(
+ test, iframe,
+ `await joinInterestGroup(test_instance, "${uuid}", ${JSON.stringify(interestGroup)});`);
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid,
+ { seller: sellerOrigin,
+ interestGroupBuyers: [bidderOrigin],
+ decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { origin: sellerOrigin,
+ scoreAd: `if (browserSignals.topWindowHostname !== "${document.location.hostname}")
+ throw "Wrong topWindowHostname: " + browserSignals.topWindowHostname;
+ if (auctionConfig.seller !== "${sellerOrigin}")
+ throw "Wrong seller: " + auctionConfig.seller;
+ if (auctionConfig.interestGroupBuyers[0] !== "${bidderOrigin}")
+ throw "Wrong interestGroupBuyers: " + auctionConfig.interestGroupBuyers;
+ if (browserSignals.interestGroupOwner !== "${bidderOrigin}")
+ throw "Wrong interestGroupOwner: " + browserSignals.interestGroupOwner;
+ if (browserSignals.renderURL !== "${renderURL}")
+ throw "Wrong renderURL: " + browserSignals.renderURL;`,
+ reportResult: `if (browserSignals.topWindowHostname !== "${document.location.hostname}")
+ throw "Wrong topWindowHostname: " + browserSignals.topWindowHostname;
+ if (browserSignals.interestGroupOwner !== "${bidderOrigin}")
+ throw "Wrong interestGroupOwner: " + browserSignals.interestGroupOwner;
+ if (browserSignals.renderURL !== "${renderURL}")
+ throw "Wrong renderURL: " + browserSignals.renderURL;
+ sendReportTo("${sellerSendReportToURL}");
+ registerAdBeacon({beacon: "${sellerBeaconURL}"});`})
+ });
+
+ await waitForObservedRequests(
+ uuid,
+ [ bidderSendReportToURL,
+ sellerSendReportToURL,
+ `${bidderBeaconURL}, body: ${renderURL}`,
+ `${sellerBeaconURL}, body: ${renderURL}`
+ ]);
+}, 'Single seller auction with as many distinct origins as possible (except no component ads).');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Join an interest group and run an auction with a winner. Use a tracking
+ // URL for the ad, so that if it's incorrectly loaded in this test, the
+ // waitForObservedRequests() at the end of the test will see it, and the
+ // test will fail.
+ await joinInterestGroup(
+ test, uuid,
+ {ads: [{renderURL: createTrackerURL(window.location.origin, uuid, 'track_get', 'renderURL')}]});
+ let config = await runBasicFledgeTestExpectingWinner(test, uuid);
+
+ // Try to navigate a fenced frame to the winning ad in a new same-origin
+ // window. This should fail. Unfortunately, there's no assertion that
+ // can be checked for, and can't communicate with the contents of the
+ // fenced frame to make sure the load fails.
+ //
+ // So instead, join an interest group with a different sendReportTo-url,
+ // overwriting the previously joined one, and run another auction, loading
+ // the winner in another fenced frame.
+ //
+ // Then wait to see that only the reporting URLs from that second auction
+ // are requested. They should almost always be requested after the URLs
+ // from the first auction.
+ let child_window =
+ await createFrame(test, document.location.origin, /*is_iframe=*/false);
+ await runInFrame(
+ test, child_window,
+ `await createAndNavigateFencedFrame(test_instance, param);
+ await joinInterestGroup(
+ test_instance, "${uuid}",
+ {biddingLogicURL: createBiddingScriptURL(
+ {reportWin: "sendReportTo('${createBidderReportURL(uuid, "2")}');" })});
+ await runBasicFledgeAuctionAndNavigate(test_instance, "${uuid}");`,
+ /*param=*/config);
+ await waitForObservedRequests(
+ uuid, [createBidderReportURL(uuid, "2"), createSellerReportURL(uuid)]);
+}, 'Run auction in main frame, try to open winning ad in different same-origin main frame.');
diff --git a/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py b/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py
index 165d9840028..d5ecd2db87a 100644
--- a/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py
+++ b/tests/wpt/tests/fledge/tentative/resources/decision-logic.sub.py
@@ -40,8 +40,10 @@ def main(request, response):
// Don't bid on interest group with the wrong uuid. This is to prevent
// left over interest groups from other tests from affecting auction
// results.
- if (!browserSignals.renderUrl.endsWith('{{GET[uuid]}}'))
+ if (!browserSignals.renderUrl.endsWith('uuid={{GET[uuid]}}') &&
+ !browserSignals.renderUrl.includes('uuid={{GET[uuid]}}&')) {
return 0;
+ }
{{GET[scoreAd]}};
return {desirability: 2 * bid, allowComponentAuction: true};
diff --git a/tests/wpt/tests/fledge/tentative/resources/fledge-util.js b/tests/wpt/tests/fledge/tentative/resources/fledge-util.js
index 7ed5b13f8d9..c89814507cb 100644
--- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.js
+++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.js
@@ -162,8 +162,10 @@ function createDecisionScriptURL(uuid, params = {}) {
// by the decision logic script before accepting a bid. "uuid" is expected to
// be last. "signalsParams" also has no effect, but is used by
// trusted-scoring-signals.py to affect the response.
-function createRenderURL(uuid, script, signalsParams) {
- let url = new URL(`${BASE_URL}resources/fenced-frame.sub.py`);
+function createRenderURL(uuid, script, signalsParams, origin) {
+ if (origin == null)
+ origin = new URL(BASE_URL).origin;
+ let url = new URL(`${origin}${RESOURCE_PATH}fenced-frame.sub.py`);
if (script)
url.searchParams.append('script', script);
if (signalsParams)
diff --git a/tests/wpt/tests/fledge/tentative/resources/iframe.sub.html b/tests/wpt/tests/fledge/tentative/resources/subordinate-frame.sub.html
index 0bc0ea357f6..465f8e7bdf0 100644
--- a/tests/wpt/tests/fledge/tentative/resources/iframe.sub.html
+++ b/tests/wpt/tests/fledge/tentative/resources/subordinate-frame.sub.html
@@ -10,6 +10,14 @@
<body>
<script>
+ // This can be used for either iframes or top-level windows.
+ // If there is an opener, this is a top-level window, so
+ // send messages to the opener. Otherwise, this is an iframe,
+ // so send messages to the parent.
+ let message_dest = window.opener;
+ if (!message_dest)
+ message_dest = window.parent;
+
// Fake Test class that only supports adding cleanup callbacks,
// primarily to leave interest groups once the test is complete.
function Test() {
@@ -31,8 +39,9 @@
};
// Create a bogus test instance that tracks cleanup callbacks. The
- // parent frame is expected to run test_instance.do_cleanup() and
- // wait for it to complete before destroying the frame.
+ // main frame managing the test is expected to post a message
+ // to run test_instance.do_cleanup() and wait for it to complete
+ // before destroying the frame.
let test_instance = new Test();
// Register a message event listener that listens for events with data
@@ -66,11 +75,12 @@
message.result = e.toString();
}
message.messageUuid = event.data.messageUuid;
- window.parent.postMessage(message, '*');
+
+ message_dest.postMessage(message, '*');
});
- // Inform parent that the iframe has finished loading.
- window.parent.postMessage(
+ // Inform "message_dest" that the frame has finished loading.
+ message_dest.postMessage(
{messageUuid: '{{GET[uuid]}}', result: 'load complete'},
'*');
</script>
diff --git a/tests/wpt/tests/fs/resources/test-helpers.js b/tests/wpt/tests/fs/resources/test-helpers.js
index f185e2f48b6..4bcf5d7e834 100644
--- a/tests/wpt/tests/fs/resources/test-helpers.js
+++ b/tests/wpt/tests/fs/resources/test-helpers.js
@@ -17,13 +17,9 @@ const LOCK_ACCESS = {
};
// Array of separators used to separate components in hierarchical paths.
-let kPathSeparators;
-if (navigator.userAgent.includes('Windows NT')) {
- // Windows uses both '/' and '\' as path separators.
- kPathSeparators = ['/', '\\'];
-} else {
- kPathSeparators = ['/'];
-}
+// Consider both '/' and '\' as path separators to ensure file names are
+// platform-agnostic.
+let kPathSeparators = ['/', '\\'];
async function getFileSize(handle) {
const file = await handle.getFile();
diff --git a/tests/wpt/tests/fs/script-tests/FileSystemFileHandle-move.js b/tests/wpt/tests/fs/script-tests/FileSystemFileHandle-move.js
index dd848626e4a..c5d08f305d0 100644
--- a/tests/wpt/tests/fs/script-tests/FileSystemFileHandle-move.js
+++ b/tests/wpt/tests/fs/script-tests/FileSystemFileHandle-move.js
@@ -51,24 +51,14 @@ directory_test(async (t, root) => {
}, 'move(name) can be called multiple times');
directory_test(async (t, root) => {
- const dir = await root.getDirectoryHandle('dir', {create: true});
- const handle = await createFileWithContents(t, 'file-before', 'foo', dir);
- await promise_rejects_js(t, TypeError, handle.move('Lorem.'));
-
- assert_array_equals(await getSortedDirectoryEntries(root), ['dir/']);
- assert_array_equals(await getSortedDirectoryEntries(dir), ['file-before']);
- assert_equals(await getFileContents(handle), 'foo');
- assert_equals(await getFileSize(handle), 3);
-}, 'move(name) with a name with a trailing period should fail');
-
-directory_test(async (t, root) => {
const handle = await createFileWithContents(t, 'file-before', 'foo', root);
await promise_rejects_js(t, TypeError, handle.move('test/test'));
+ await promise_rejects_js(t, TypeError, handle.move('test\\test'));
assert_array_equals(await getSortedDirectoryEntries(root), ['file-before']);
assert_equals(await getFileContents(handle), 'foo');
assert_equals(await getFileSize(handle), 3);
-}, 'move(name) with a name with invalid characters should fail');
+}, 'move(name) with a name with path separators should fail');
directory_test(async (t, root) => {
const handle = await createFileWithContents(t, 'file-before', 'abc', root);
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01-ref.html
new file mode 100644
index 00000000000..3462b908b3d
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01.html
new file mode 100644
index 00000000000..2d6983cb14b
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-01.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-01-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot dir="ltr"></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02-ref.html
new file mode 100644
index 00000000000..8f358cf6471
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02.html
new file mode 100644
index 00000000000..0553ef9a333
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-02.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-02-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot dir="ltr"></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03-ref.html
new file mode 100644
index 00000000000..a2f574820f2
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p dir="rtl">paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03.html
new file mode 100644
index 00000000000..5986a9d0f74
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-03.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-03-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot dir="rtl"></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04-ref.html
new file mode 100644
index 00000000000..5724b5b84db
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p dir="rtl">اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04.html
new file mode 100644
index 00000000000..aa2ab9dc93e
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-04.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-04-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot dir="rtl"></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05-ref.html
new file mode 100644
index 00000000000..13c5b16240c
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05.html
new file mode 100644
index 00000000000..597cb8d5b8e
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-05.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-05-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot dir="auto"></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06-ref.html
new file mode 100644
index 00000000000..ca54b3bb2c8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p dir="rtl">اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06.html
new file mode 100644
index 00000000000..6cfaf7fcecd
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-06.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the slot, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-06-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the &lt;slot&gt;, paragraph in the light tree</p>
+<div id="host"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot dir="auto"></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07-ref.html
new file mode 100644
index 00000000000..0a2de4d398f
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="ltr"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07.html
new file mode 100644
index 00000000000..dd11f4a605d
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-07.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-07-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="ltr"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08-ref.html
new file mode 100644
index 00000000000..09d8b24094f
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="ltr"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08.html
new file mode 100644
index 00000000000..8b1377d32ad
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-08.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-08-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="ltr"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09-ref.html
new file mode 100644
index 00000000000..73b9cb14870
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="rtl"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09.html
new file mode 100644
index 00000000000..d9c66e79319
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-09.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-09-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="rtl"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10-ref.html
new file mode 100644
index 00000000000..391e5047f91
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="rtl"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10.html
new file mode 100644
index 00000000000..ad35af808eb
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-10.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-10-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="rtl"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11-ref.html
new file mode 100644
index 00000000000..ae7e849c977
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="auto"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11.html
new file mode 100644
index 00000000000..31e04f065e9
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-11.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-11-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="auto"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `
+ <slot></slot>
+ `;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12-ref.html
new file mode 100644
index 00000000000..6f6b40218a8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="rtl"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12.html
new file mode 100644
index 00000000000..f6183a98d9d
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-12.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-12-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the light tree</p>
+<div id="host" dir="rtl"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<slot></slot>`;
+ result.innerHTML += html_direction(host.firstChild) + " / " + getComputedStyle(host.firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13-ref.html
new file mode 100644
index 00000000000..a6ec54186fe
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="ltr"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13.html
new file mode 100644
index 00000000000..35a00e6d288
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-13.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-13-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="ltr"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p>paragraph.</p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14-ref.html
new file mode 100644
index 00000000000..73d4eab9622
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="ltr"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14.html
new file mode 100644
index 00000000000..6aa4a639fd0
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-14.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-14-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="ltr"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p>اختبر.</p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15-ref.html
new file mode 100644
index 00000000000..0139997e657
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="rtl"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: rtl / rtl.</p>
+
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15.html
new file mode 100644
index 00000000000..37c05d283c2
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-15.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-15-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="rtl"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p>paragraph.</p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16-ref.html
new file mode 100644
index 00000000000..926b7a900d7
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="rtl"><p>اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16.html
new file mode 100644
index 00000000000..2a8bb64a1bd
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-16.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-16-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="rtl"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p>اختبر.</p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17-ref.html
new file mode 100644
index 00000000000..b17c3e191d8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="auto"><p>paragraph.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17.html
new file mode 100644
index 00000000000..7016a271741
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-17.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-17-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="auto"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p>paragraph.</p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18-ref.html
new file mode 100644
index 00000000000..6155a9f2c95
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="ltr"><p dir="">اختبر.</p></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18.html
new file mode 100644
index 00000000000..6796dd18eaf
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-18.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the shadow host, paragraph in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-18-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the shadow host, paragraph in the shadow tree</p>
+<div id="host" dir="auto"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p>اختبر.</p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19-ref.html
new file mode 100644
index 00000000000..61a9592a4a8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="ltr">text.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19.html
new file mode 100644
index 00000000000..a345a7b60d4
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-19.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-19-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="ltr"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `text.`;
+ result.innerHTML += html_direction(host) + " / " + getComputedStyle(host).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20-ref.html
new file mode 100644
index 00000000000..2e813817722
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="ltr">اختبر.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20.html
new file mode 100644
index 00000000000..0072d9b6c96
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-20.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-20-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="ltr"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `اختبر.`;
+ result.innerHTML += html_direction(host) + " / " + getComputedStyle(host).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21-ref.html
new file mode 100644
index 00000000000..58c8d426f28
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="rtl">text.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21.html
new file mode 100644
index 00000000000..5b9a4aa184b
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-21.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-21-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="rtl"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `text.`;
+ result.innerHTML += html_direction(host) + " / " + getComputedStyle(host).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22-ref.html
new file mode 100644
index 00000000000..6721da534f7
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="rtl">اختبر.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: rtl / rtl.</p>
+
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22.html
new file mode 100644
index 00000000000..009ba460ce1
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-22.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-22-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="rtl"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `اختبر.`;
+ result.innerHTML += html_direction(host) + " / " + getComputedStyle(host).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23-ref.html
new file mode 100644
index 00000000000..bf06a448470
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="auto">text.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23.html
new file mode 100644
index 00000000000..dea79b93e13
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-23.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-23-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="auto"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `text.`;
+ result.innerHTML += html_direction(host) + " / " + getComputedStyle(host).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24-ref.html
new file mode 100644
index 00000000000..8453e945337
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="ltr">اختبر.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24.html
new file mode 100644
index 00000000000..d26ccb270a2
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-24.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the div (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-24-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the div (shadow host), text in the shadow tree</p>
+<div id="host" dir="auto"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the host’s text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `اختبر.`;
+ result.innerHTML += html_direction(host) + " / " + getComputedStyle(host).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25-ref.html
new file mode 100644
index 00000000000..5a2f6d57776
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+<p dir="ltr">paragraph.</p>
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25.html
new file mode 100644
index 00000000000..508b8260ff9
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-25.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-25-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+paragraph.
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p dir="ltr"><slot></slot></p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26-ref.html
new file mode 100644
index 00000000000..41e1dbc8a81
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+<p dir="ltr">اختبر.</p>
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26.html
new file mode 100644
index 00000000000..b19cb976f88
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-26.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-26-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+اختبر.
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p dir="ltr"><slot></slot></p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27-ref.html
new file mode 100644
index 00000000000..075230d055c
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+<p dir="rtl">paragraph.</p>
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27.html
new file mode 100644
index 00000000000..8380f17b218
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-27.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-27-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+paragraph.
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p dir="rtl"><slot></slot></p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28-ref.html
new file mode 100644
index 00000000000..580f5fe3b11
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+<p dir="rtl">اختبر.</p>
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28.html
new file mode 100644
index 00000000000..3a0d6756b35
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-28.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-28-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+اختبر.
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p dir="rtl"><slot></slot></p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29-ref.html
new file mode 100644
index 00000000000..4b949acb098
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+<p dir="ltr">para.</p>
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29.html
new file mode 100644
index 00000000000..46cbf8d2911
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-29.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-29-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+para.
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p dir="auto"><slot></slot></p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30-ref.html
new file mode 100644
index 00000000000..be2cc44abd5
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+div p {width: 50%; border: 1px dotted;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+<p dir="ltr">اختبر.</p>
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30.html
new file mode 100644
index 00000000000..2a3e56e62cc
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-30.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on a paragraph in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-30-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on a paragraph in the shadow tree, text in the light tree</p>
+<div id="host">
+اختبر.
+</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the paragraph is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>p {width: 50%; border: 1px dotted;}</style><p dir="auto"><slot></slot></p>`;
+ result.innerHTML += html_direction(root.querySelector('p')) + " / " + getComputedStyle(root.querySelector('p')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31-ref.html
new file mode 100644
index 00000000000..1c5b5b11a8c
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the slot, span in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the slot, span in the light tree</p>
+<div id="host" dir="ltr"><span dir="rtl" style="unicode-bidi: normal">RTL.</span></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the span is: ltr / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31.html
new file mode 100644
index 00000000000..d48a0f8c040
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-31.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the slot, span in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-31-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the slot, span in the light tree</p>
+<div id="host" dir="ltr"><span>RTL.</span></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the span is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<slot dir="rtl"></slot>`;
+ result.innerHTML += html_direction(host.querySelector('span')) + " / " + getComputedStyle(host.querySelector('span')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32-ref.html
new file mode 100644
index 00000000000..6e5d9a96e8e
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, span in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, span in the shadow tree</p>
+<div id="host" dir="rtl"><span>RTL.</span></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the shadow span is: rtl / rtl.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32.html
new file mode 100644
index 00000000000..ac9c9e45792
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-32.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=rtl on the shadow host, span in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-32-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=rtl` on the shadow host, span in the shadow tree</p>
+<div id="host" dir="rtl"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the shadow span is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<style>span {border: 1px solid silver;}</style><span>RTL.</span>`;
+ result.innerHTML += html_direction(root.querySelector('span')) + " / " + getComputedStyle(root.querySelector('span')).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33-ref.html
new file mode 100644
index 00000000000..cdf89d78bb6
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the span (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on the span (shadow host), text in the shadow tree</p>
+<span id="host" dir="ltr">اختبر.</span>
+<p id="result">The HTML direction / computed CSS `direction` value for the shadow host is: ltr / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33.html
new file mode 100644
index 00000000000..814e3b34d6f
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-33.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on the span (shadow host), text in the shadow tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-33-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on the span (shadow host), text in the shadow tree</p>
+<span id="host" dir="auto"></span>
+<p id="result">The HTML direction / computed CSS `direction` value for the shadow host is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `اختبر.`;
+ result.innerHTML += html_direction(host) + " / " + getComputedStyle(host).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34-ref.html
new file mode 100644
index 00000000000..4cedca8e50d
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on a span in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` on a span in the shadow tree, text in the light tree</p>
+<div id="host"><span dir="ltr">اختبر.</span></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the shadow span is: ltr / ltr.</p>
+
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34.html
new file mode 100644
index 00000000000..07f75d216a8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-34.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto on a span in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-34-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` on a span in the shadow tree, text in the light tree</p>
+<div id="host">اختبر.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the shadow span is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<span dir="auto"><slot></slot></span>`;
+ result.innerHTML += html_direction(root.querySelector("span")) + " / " + getComputedStyle(root.querySelector("span")).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35-ref.html
new file mode 100644
index 00000000000..c4e9f8c70eb
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a div in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div#host {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on a div in the shadow tree, text in the light tree</p>
+<div id="host" dir="rtl"><div dir="ltr"><span>اختبر.</span></div></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the span is: rtl / ltr.</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35.html
new file mode 100644
index 00000000000..0f2a7c882f8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-35.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a div in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-35-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on a div in the shadow tree, text in the light tree</p>
+<div id="host" dir="rtl"><span>اختبر.</span></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the span is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<div dir="ltr"><slot></slot></div>`;
+ result.innerHTML += html_direction(root.querySelector("div").firstChild) + " / " + getComputedStyle(root.querySelector("div").firstChild).direction + '.';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36-ref.html
new file mode 100644
index 00000000000..f8af117e3bf
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto and text in a slot in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` and text in a slot in the shadow tree, text in the light tree</p>
+<div id="host">English.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the light tree text is: ltr / ltr (on the slot) and ltr / ltr (on the host).</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36.html
new file mode 100644
index 00000000000..ff4f11b3a6f
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-36.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto and text in a slot in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-36-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` and text in a slot in the shadow tree, text in the light tree</p>
+<div id="host">English.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the light tree text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<slot dir=auto>اختبر</slot>`;
+ result.innerHTML += html_direction(root.firstChild) + " / " + getComputedStyle(root.firstChild).direction + " (on the " + root.firstChild.localName + ') and ' + html_direction(host) + " / " + getComputedStyle(host).direction + ' (on the ' + host.id + ').';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37-ref.html
new file mode 100644
index 00000000000..5941b23c02a
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto and text in a div in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` and text in a div in the shadow tree, text in the light tree</p>
+<div id="host" dir="rtl">اختبر.123 456.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the light tree text is: rtl / rtl (on the div) and ltr / ltr (on the host).</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37.html
new file mode 100644
index 00000000000..ba0480636a0
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-37.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto and text in a div in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-37-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` and text in a div in the shadow tree, text in the light tree</p>
+<div id="host">123 456.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the light tree text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<div dir="auto">اختبر.<slot></slot></div>`;
+ result.innerHTML += html_direction(root.firstChild) + " / " + getComputedStyle(root.firstChild).direction + " (on the " + root.firstChild.localName + ') and ' + html_direction(host) + " / " + getComputedStyle(host).direction + ' (on the ' + host.id + ').';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38-ref.html
new file mode 100644
index 00000000000..f8af117e3bf
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto and text in a slot in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>`dir=auto` and text in a slot in the shadow tree, text in the light tree</p>
+<div id="host">English.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the light tree text is: ltr / ltr (on the slot) and ltr / ltr (on the host).</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38.html
new file mode 100644
index 00000000000..e8f25eb5689
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-38.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=auto and text in a slot in the shadow tree, text in the light tree</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-38-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=auto` and text in a slot in the shadow tree, text in the light tree</p>
+<div id="host">English.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the light tree text is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<slot dir=auto>اختبر.</slot>`;
+ result.innerHTML += html_direction(root.firstChild) + " / " + getComputedStyle(root.firstChild).direction + " (on the " + root.firstChild.localName + ') and ' + html_direction(host) + " / " + getComputedStyle(host).direction + ' (on the ' + host.id + ').';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39-ref.html
new file mode 100644
index 00000000000..8f75e9877c4
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: text in the light tree, slotted node</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+</head>
+<body>
+
+<p>text in the light tree, slotted node</p>
+<div id="host">slotted text.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the defaultContent when there is a slotted node: ltr / ltr (on the div).</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39.html
new file mode 100644
index 00000000000..72fdd665fc3
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-39.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: text in the light tree, slotted node</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-39-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>text in the light tree, slotted node</p>
+<div id="host">slotted text.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the defaultContent when there is a slotted node: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<slot dir=auto><div>&#1571;&#1582;&#1576;&#1575;&#1585;</div>.</slot>`;
+ result.innerHTML += html_direction(root.firstChild.firstChild) + " / " + getComputedStyle(root.firstChild.firstChild).direction + " (on the " + root.firstChild.firstChild.localName + ').';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40-ref.html
new file mode 100644
index 00000000000..c1c074812b5
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: text in the light tree, no slotted node</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+</style>
+</head>
+<body>
+
+<p>text in the light tree, no slotted node</p>
+<div id="host" dir="rtl">&#1571;&#1582;&#1576;&#1575;&#1585;.</div>
+<p id="result">The HTML direction / computed CSS `direction` value for the defaultContent when there is not a slotted node: rtl / rtl (on the div).</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40.html
new file mode 100644
index 00000000000..567f4fa9da8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-40.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: text in the light tree, no slotted node</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-40-ref.html">
+<style type="text/css">
+body {width: 600px;}
+div {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>text in the light tree, no slotted node</p>
+<div id="host"></div>
+<p id="result">The HTML direction / computed CSS `direction` value for the defaultContent when there is not a slotted node: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<slot dir=auto><div>&#1571;&#1582;&#1576;&#1575;&#1585;.</div></slot>`;
+ result.innerHTML += html_direction(root.firstChild.firstChild) + " / " + getComputedStyle(root.firstChild.firstChild).direction + " (on the " + root.firstChild.firstChild.localName + ').';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41-ref.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41-ref.html
new file mode 100644
index 00000000000..41f9c8bc31c
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a div in the shadow tree, dir=rtl on the shadow host, no slotted text in the light or dark trees</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<style type="text/css">
+body {width: 600px;}
+#host {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+</head>
+<body>
+
+<p>`dir=ltr` on a div in the shadow tree, `dir=rtl` on the shadow host, no slotted text in the light or dark trees</p>
+<div id="host" dir="rtl"><div dir="ltr"><span dir="rtl"></span></div></div>
+<p id="result">The HTML direction / computed CSS `direction` value is: rtl / rtl (on the slot).</p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41.html b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41.html
new file mode 100644
index 00000000000..48e2057552c
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-41.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>[dir] and shadow slots: dir=ltr on a div in the shadow tree, dir=rtl on the shadow host, no slotted text in the light or dark trees</title>
+<link rel="author" title="Eric Meyer" href="mailto:emeyer@igalia.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/C#the-dir-attribute">
+<link rel="help" href="https://github.com/whatwg/html/issues/3699">
+<link rel="help" href="https://github.com/whatwg/html/pull/9796">
+<link rel="match" href="dir-shadow-41-ref.html">
+<style type="text/css">
+body {width: 600px;}
+#host {border: 1px solid gray; margin: 1em; padding: 0.25em;}
+span {border: 1px solid silver;}
+
+</style>
+<script src="dir-shadow-utils.js"></script>
+</head>
+<body>
+
+<p>`dir=ltr` on a div in the shadow tree, `dir=rtl` on the shadow host, no slotted text in the light or dark trees</p>
+<div id="host" dir="rtl"><span slot="x1"></span></div>
+<p id="result">The HTML direction / computed CSS `direction` value is: </p>
+
+<script type="text/javascript">
+ let root = host.attachShadow({mode:"open"});
+ root.innerHTML = `<div dir="ltr"><slot dir="auto" name="x1"></slot></div>`;
+ result.innerHTML += html_direction(root.querySelector("div[dir=ltr]").firstChild) + " / " + getComputedStyle(root.querySelector("div[dir=ltr]").firstChild).direction + " (on the " + root.querySelector("div[dir=ltr]").firstChild.localName + ').';
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-utils.js b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-utils.js
new file mode 100644
index 00000000000..c7d89cf9082
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/dir-shadow-utils.js
@@ -0,0 +1,8 @@
+function html_direction(element) {
+ let is_ltr = element.matches(":dir(ltr)");
+ let is_rtl = element.matches(":dir(rtl)");
+ if (is_ltr == is_rtl) {
+ return "error";
+ }
+ return is_ltr ? "ltr" : "rtl";
+}
diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/lang-attribute-shadow.window.js b/tests/wpt/tests/html/dom/elements/global-attributes/lang-attribute-shadow.window.js
new file mode 100644
index 00000000000..9ed242df169
--- /dev/null
+++ b/tests/wpt/tests/html/dom/elements/global-attributes/lang-attribute-shadow.window.js
@@ -0,0 +1,81 @@
+const TESTS = [
+ {
+ title: "lang only on slot",
+ light_tree: `
+ <div id="host" data-expected="en-US"><span data-expected="en-US"></span></div>
+ `,
+ shadow_tree: `
+ <slot lang="en-AU" data-expected="en-AU"></slot>
+ `,
+ },
+ {
+ title: "lang only on host",
+ light_tree: `
+ <div id="host" lang="en-AU" data-expected="en-AU"><span data-expected="en-AU"></span></div>
+ `,
+ shadow_tree: `
+ <slot data-expected="en-AU"></slot>
+ `,
+ },
+ {
+ title: "lang on host and slot",
+ light_tree: `
+ <div id="host" lang="en-AU" data-expected="en-AU"><span data-expected="en-AU"></span></div>
+ `,
+ shadow_tree: `
+ <slot lang="en-GB" data-expected="en-GB"></slot>
+ `,
+ },
+ {
+ title: "lang on host and slotted element",
+ light_tree: `
+ <div id="host" lang="en-AU" data-expected="en-AU"><span lang="en-GB" data-expected="en-GB"></span></div>
+ `,
+ shadow_tree: `
+ <slot data-expected="en-AU"></slot>
+ `,
+ },
+ {
+ title: "lang on host and slot and slotted element",
+ light_tree: `
+ <div id="host" lang="en-AU" data-expected="en-AU"><span lang="en-GB" data-expected="en-GB"></span></div>
+ `,
+ shadow_tree: `
+ <slot lang="en-NZ" data-expected="en-NZ"></slot>
+ `,
+ },
+ {
+ title: "lang on slot inherits from shadow host",
+ light_tree: `
+ <div id="host" lang="en-GB" data-expected="en-GB"><span lang="en-US" data-expected="en-US"></span></div>
+ `,
+ shadow_tree: `
+ <div lang="en-CA" data-expected="en-CA">
+ <slot data-expected="en-GB"></slot>
+ </div>
+ `,
+ },
+];
+
+const container = document.createElement("div");
+document.body.append(container);
+container.lang = "en-US";
+
+for (const obj of TESTS) {
+ test(() => {
+ container.innerHTML = obj.light_tree;
+ let shadow = container.querySelector("#host").attachShadow({mode: "open"});
+ shadow.innerHTML = obj.shadow_tree;
+ for (const element of Array.from(container.querySelectorAll("[data-expected]")).concat(Array.from(shadow.querySelectorAll("[data-expected]")))) {
+ const expected = element.getAttribute("data-expected");
+ assert_true(element.matches(`:lang(${expected})`), `element matches expected language ${expected}`);
+ for (const other_lang of ["en-US", "en-AU", "en-GB", "en-NZ", "en-CA"]) {
+ if (expected != other_lang) {
+ assert_false(element.matches(`:lang(${other_lang})`), `element does not match language ${other_lang}`);
+ }
+ }
+ }
+ }, obj.title);
+}
+
+container.remove();
diff --git a/tests/wpt/tests/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html b/tests/wpt/tests/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html
index eac1eaf7d0a..14e712ce254 100644
--- a/tests/wpt/tests/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html
+++ b/tests/wpt/tests/html/infrastructure/urls/base-url/document-base-url-changes-about-srcdoc-2.https.html
@@ -10,25 +10,19 @@ setup({ explicit_done: true });
window.start = childDocument => {
const grandchildDocument =
- childDocument.querySelector('iframe').contentDocument;
+ childDocument.getElementById('foo').contentDocument;
test(t => {
- // Clean up the iframe so that the dangling document.open() doesn't cause a
- // harness timeout.
- t.add_cleanup(() => {
- document.querySelector('iframe').remove();
- });
-
- assert_equals(childDocument.URL, 'about:srcdoc',
+ assert_equals(childDocument.URL, 'about:blank',
'Child document starting URL');
- assert_equals(grandchildDocument.URL, 'about:blank',
+ assert_equals(grandchildDocument.URL, 'about:srcdoc',
'Grandchild document starting URL');
const originalChildBaseURL = childDocument.baseURI;
grandchildDocument.open("", "");
// Verify that the document.open() trick worked: the grandchild should now
// have the same url as the child, and have inherited the child's base url.
- assert_equals(grandchildDocument.URL, 'about:srcdoc',
+ assert_equals(grandchildDocument.URL, 'about:blank',
'Grandchild document after document.open() trick');
assert_equals(grandchildDocument.baseURI, originalChildBaseURL,
'Grandchild base URL must match child base URL');
@@ -41,7 +35,7 @@ window.start = childDocument => {
// Verify that changing the child's base url succeeded and did not affect
// the grandchild's base url.
const newChildBaseURL = childDocument.baseURI;
- assert_equals(grandchildDocument.URL, 'about:srcdoc',
+ assert_equals(grandchildDocument.URL, 'about:blank',
'Grandchild document after child gets new base URL');
assert_not_equals(newChildBaseURL, originalChildBaseURL,
'Child base URL must change');
@@ -53,5 +47,25 @@ window.start = childDocument => {
};
</script>
-<iframe srcdoc="<iframe></iframe><script>parent.start(document)</script>">
-</iframe>
+<iframe src='about:blank'></iframe>
+
+<script>
+ window.onload = () => {
+ let subframe_doc = document.querySelector('iframe').contentDocument;
+ subframe_doc.body.innerHTML = '<iframe srcdoc="foo" id="foo"></iframe>';
+ promise_test((test) => {
+ return new Promise(async resolve => {
+ // We need a timeout since the srcdoc frame takes time to setup and
+ // doesn't fire a loadstop.
+ test.step_timeout(resolve, 100);
+ }).then(() => {
+ assert_equals(
+ subframe_doc.getElementById('foo').contentDocument.URL,
+ 'about:srcdoc');
+ let script = subframe_doc.createElement('script');
+ script.innerHTML = 'parent.start(document);';
+ subframe_doc.body.appendChild(script);
+ });
+ }, "wrapper promise test for timeout.");
+ };
+</script>
diff --git a/tests/wpt/tests/html/rendering/the-details-element/details-display-type-002-ref.html b/tests/wpt/tests/html/rendering/the-details-element/details-display-type-002-ref.html
new file mode 100644
index 00000000000..297634b521f
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/the-details-element/details-display-type-002-ref.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<style>
+ div {
+ margin-top: 3em;
+ }
+</style>
+<details open>
+ <summary>The summary.</summary>
+ <div>Some details.</div>
+</details>
diff --git a/tests/wpt/tests/html/rendering/the-details-element/details-display-type-002.tentative.html b/tests/wpt/tests/html/rendering/the-details-element/details-display-type-002.tentative.html
new file mode 100644
index 00000000000..716221f7c5c
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/the-details-element/details-display-type-002.tentative.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<title>Details display property (flex)</title>
+<link rel="match" href="details-display-type-002-ref.html">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1856374">
+<link rel="help" href="https://github.com/dbaron/details-styling">
+<style>
+ details {
+ display: flex;
+ flex-direction: column;
+ gap: 3em;
+ }
+</style>
+<details open>
+ <summary>The summary.</summary>
+ Some details.
+</details>
diff --git a/tests/wpt/tests/html/rendering/widgets/form-sizing-input-number.tentative.html b/tests/wpt/tests/html/rendering/widgets/form-sizing-input-number.tentative.html
index 59835805a07..0bf64c181d0 100644
--- a/tests/wpt/tests/html/rendering/widgets/form-sizing-input-number.tentative.html
+++ b/tests/wpt/tests/html/rendering/widgets/form-sizing-input-number.tentative.html
@@ -4,7 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
<style>
.disable-default {
- form-sizing: normal;
+ form-sizing: content;
}
.small-placeholder {
@@ -51,7 +51,7 @@ function addTwoElements(source1, source2) {
test(() => {
let pair = addElements(`<input type=${type}>`);
// A text <input> has approximately 20ch width by default.
- // A text <input> with form-sizing:normal must be shorter than the default.
+ // A text <input> with form-sizing:content must be shorter than the default.
assert_less_than(pair.content.offsetWidth, pair.fixed.offsetWidth);
assert_equals(pair.content.offsetHeight, pair.fixed.offsetHeight);
diff --git a/tests/wpt/tests/html/rendering/widgets/form-sizing-input-text.tentative.html b/tests/wpt/tests/html/rendering/widgets/form-sizing-input-text.tentative.html
index 32cabc557f6..065994471f0 100644
--- a/tests/wpt/tests/html/rendering/widgets/form-sizing-input-text.tentative.html
+++ b/tests/wpt/tests/html/rendering/widgets/form-sizing-input-text.tentative.html
@@ -4,7 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
<style>
.disable-default {
- form-sizing: normal;
+ form-sizing: content;
}
.small-placeholder {
@@ -50,7 +50,7 @@ function addTwoElements(source1, source2) {
test(() => {
let pair = addElements(`<input type=${type}>`);
// A text <input> has approximately 20ch width by default.
- // A text <input> with form-sizing:normal must be shorter than the default.
+ // A text <input> with form-sizing:content must be shorter than the default.
assert_less_than(pair.content.offsetWidth, pair.fixed.offsetWidth);
assert_equals(pair.content.offsetHeight, pair.fixed.offsetHeight);
diff --git a/tests/wpt/tests/html/rendering/widgets/form-sizing-select.tentative.html b/tests/wpt/tests/html/rendering/widgets/form-sizing-select.tentative.html
index f9efdc74f91..7ce6f03ff4b 100644
--- a/tests/wpt/tests/html/rendering/widgets/form-sizing-select.tentative.html
+++ b/tests/wpt/tests/html/rendering/widgets/form-sizing-select.tentative.html
@@ -5,7 +5,7 @@
<body>
<style>
.disable-default {
- form-sizing: normal;
+ form-sizing: content;
}
</style>
<div id="container"></div>
@@ -18,7 +18,7 @@ const DISABLE = 'class="disable-default"';
test(() => {
const s = '<select>><option>1<option>quick brown<option>fox</select>';
container.innerHTML = s + s;
- container.lastElementChild.style.formSizing = 'normal';
+ container.lastElementChild.style.formSizing = 'content';
const widthForContent1 = container.lastElementChild.offsetWidth;
assert_greater_than(container.firstElementChild.offsetWidth,
widthForContent1);
@@ -31,9 +31,9 @@ test(() => {
container.innerHTML = '<select><option>foo<option>quick brown fox</select>';
const select = container.firstElementChild;
const initialWidth = select.offsetWidth;
- select.style.formSizing = 'normal';
+ select.style.formSizing = 'content';
assert_less_than(select.offsetWidth, initialWidth);
- select.style.formSizing = 'auto';
+ select.style.formSizing = 'fixed';
assert_equals(select.offsetWidth, initialWidth);
}, 'dropdown: Change the form-sizing value dynamically');
@@ -76,9 +76,9 @@ if (container.firstElementChild.offsetHeight != container.lastElementChild.offse
container.innerHTML = '<select multiple><option>foo<option>quick brown fox</select>';
const select = container.firstElementChild;
const initialHeight = select.offsetHeight;
- select.style.formSizing = 'normal';
+ select.style.formSizing = 'content';
assert_less_than(select.offsetHeight, initialHeight);
- select.style.formSizing = 'auto';
+ select.style.formSizing = 'fixed';
assert_equals(select.offsetHeight, initialHeight);
}, 'listbox: Change the form-sizing value dynamically');
diff --git a/tests/wpt/tests/html/rendering/widgets/form-sizing-textarea.tentative.html b/tests/wpt/tests/html/rendering/widgets/form-sizing-textarea.tentative.html
index ae20e59290c..fb4ce762e32 100644
--- a/tests/wpt/tests/html/rendering/widgets/form-sizing-textarea.tentative.html
+++ b/tests/wpt/tests/html/rendering/widgets/form-sizing-textarea.tentative.html
@@ -4,7 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
<style>
.disable-default {
- form-sizing: normal;
+ form-sizing: content;
}
.small-placeholder {
@@ -49,7 +49,7 @@ function addTwoElements(source1, source2) {
test(() => {
let pair = addElements('<textarea></textarea>');
// Historically a <textarea> has approximately 20ch x 2lh size by default.
- // A <textarea> with form-sizing:normal must be samller than the default.
+ // A <textarea> with form-sizing:content must be samller than the default.
assert_less_than(pair.content.offsetWidth, pair.fixed.offsetWidth);
assert_less_than(pair.content.offsetHeight, pair.fixed.offsetHeight);
diff --git a/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html b/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html
index 30d591ae6e7..67f2c8300d2 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media-env-change.html
@@ -5,10 +5,20 @@
<div id=log></div>
<iframe src="resources/media-min-width.html" width="300"></iframe>
<script>
+// promises for the iframed test to resolve
+let beforeEnvChange = new Promise((resolve, reject) => {
+ window[0].resolveBeforeEnvChange = resolve;
+});
+let afterEnvChange = new Promise((resolve, reject) => {
+ window[0].resolveAfterEnvChange = resolve;
+});
+let afterLoadCalled = new Promise((resolve, reject) => {
+ window[0].resolveAfterLoadCalled = resolve;
+});
const t = promise_test(async () => {
- await new Promise(resolve => window.onload = resolve);
- assert_equals(window[0].beforeEnvChange, '#a', 'beforeEnvChange');
- assert_equals(window[0].afterEnvChange, '#a', 'afterEnvChange');
- assert_equals(window[0].afterLoadCalled, '#b', 'afterLoadCalled');
+ [beforeEnvChange, afterEnvChange, afterLoadCalled] = await Promise.all([ beforeEnvChange, afterEnvChange, afterLoadCalled ]);
+ assert_equals(beforeEnvChange, '#a', 'beforeEnvChange');
+ assert_equals(afterEnvChange, '#a', 'afterEnvChange');
+ assert_equals(afterLoadCalled, '#b', 'afterLoadCalled');
});
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resources/media-min-width.html b/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resources/media-min-width.html
index 7c309469024..8a4ad500cb1 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resources/media-min-width.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/resources/media-min-width.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<video></video>
+<video width="200"></video>
<script>
function createSource(src, media) {
var source = document.createElement('source');
@@ -14,18 +14,18 @@ const hash = str => str.substr(str.lastIndexOf('#'));
(async () => {
const v = document.querySelector('video');
v.getBoundingClientRect(); // force layout flush. ensure viewport dimensions are up-to-date
- v.append(createSource('delayed-broken-video.py#a', '(min-width: 200px)'));
- v.append(createSource('delayed-broken-video.py#b'));
+ v.append(createSource('/media-source/mp4/test.mp4#a', '(min-width: 200px)'));
+ v.append(createSource('/media-source/mp4/test.mp4#b'));
await rAF();
await rAF();
- window.beforeEnvChange = hash(v.currentSrc);
+ window.resolveBeforeEnvChange(hash(v.currentSrc));
window.frameElement.width = '150';
await rAF();
await rAF();
- window.afterEnvChange = hash(v.currentSrc);
+ window.resolveAfterEnvChange(hash(v.currentSrc));
v.load()
await rAF();
await rAF();
- window.afterLoadCalled = hash(v.currentSrc);
+ window.resolveAfterLoadCalled(hash(v.currentSrc));
})();
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-img-element/image-compositing-change.html b/tests/wpt/tests/html/semantics/embedded-content/the-img-element/image-compositing-change.html
index 658c2ad39ea..d3e7ee41711 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-img-element/image-compositing-change.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-img-element/image-compositing-change.html
@@ -2,7 +2,7 @@
<html class="reftest-wait">
<title>Composited images correctly re-raster when the image and bounds change</title>
<meta charset="utf-8">
-<meta name=fuzzy content="maxDifference=150;totalPixels=296">
+<meta name=fuzzy content="maxDifference=0-150;totalPixels=0-296">
<link rel="match" href="image-compositing-change-ref.html"/>
<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-img-element">
<style>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html b/tests/wpt/tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html
index 1b057bbeac3..e1f35768bc4 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html
@@ -14,12 +14,15 @@ for (const format of ['mp4', 'webm']) {
const video = document.createElement('video');
assert_implements_optional(video.canPlayType(`video/${format}`), `${format} supported`);
+ const eventWatcher = new EventWatcher(t, video, ['resize', 'playing', 'error', 'ended']);
+
// Load the video and wait for initial resize event.
- video.src = `/media/400x300-red-resize-200x150-green.${format}`;
video.muted = true;
video.preload = 'auto';
+ video.onerror = t.unreached_func("error during playback");
+ video.src = `/media/400x300-red-resize-200x150-green.${format}`;
document.body.appendChild(video);
- const eventWatcher = new EventWatcher(t, video, ['resize', 'playing', 'error', 'ended']);
+
await eventWatcher.wait_for(['resize']);
assert_equals(video.videoWidth, 400, 'width after first resize event');
assert_equals(video.videoHeight, 300, 'height after first resize event');
diff --git a/tests/wpt/tests/html/semantics/forms/the-input-element/input-importNode-to-detached-document-crash.html b/tests/wpt/tests/html/semantics/forms/the-input-element/input-importNode-to-detached-document-crash.html
new file mode 100644
index 00000000000..5e0cff4fa30
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-input-element/input-importNode-to-detached-document-crash.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<body>
+<p>This test passes if it does not crash.</p>
+<input id="input" type="image" src="data:image/gif;base64,">
+<iframe id="iframe"></iframe>
+<script>
+let i_doc = iframe.contentDocument;
+iframe.remove();
+i_doc.importNode(input);
+</script>
+</body>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html b/tests/wpt/tests/html/semantics/interactive-elements/the-details-element/name-attribute.html
index 6f45b3da089..2685546e9b0 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-details-element/name-attribute.tentative.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-details-element/name-attribute.html
@@ -153,8 +153,8 @@ promise_test(async t => {
if (mutation_event_received_ids.length == 0) {
// ok if mutation events are not supported
} else {
- assert_array_equals(mutation_event_received_ids, ["e0", "e1"],
- "removal event followed by addition event");
+ assert_array_equals(mutation_event_received_ids, ["e1"],
+ "mutation events received only for open attribute mutation and not for closing other element");
}
assert_element_states(elements, [0, 1, 0, 0], "states after mutation");
assert_array_equals(toggle_event_received_ids, [], "toggle events received before awaiting promises");
@@ -205,8 +205,8 @@ promise_test(async t => {
assert_array_equals(received_ids, []);
assert_element_states(elements, [1, 0, 0], "states before mutation");
elements[1].open = true;
- assert_array_equals(received_ids, ["e0", "e1"],
- "removal events received in tree order, followed by addition event, despite changes to name during mutation event");
+ assert_array_equals(received_ids, ["e1"],
+ "mutation events received only for open attribute mutation and not for closing other element");
assert_element_states(elements, [0, 1, 0], "states after mutation");
}, "interaction of open attribute changes with mutation events");
@@ -336,14 +336,47 @@ promise_test(async t => {
document.getElementById("e1"),
document.getElementById("e2") ];
+ let mutation_received_ids = [];
+ let listener = event => {
+ mutation_received_ids.push(event.target.id);
+ };
+ for (let element of elements) {
+ element.addEventListener("DOMSubtreeModified", listener);
+ }
+
assert_element_states(elements, [1, 0, 1], "states before first mutation");
+ assert_array_equals(mutation_received_ids, [], "mutation events received before first mutation");
elements[2].name = "a";
assert_element_states(elements, [1, 0, 0], "states after first mutation");
+ if (mutation_received_ids.length != 0) {
+ // OK to not support mutation events, or to send DOMSubtreeModified
+ // only for attribute addition/removal (open) but not for attribute
+ // change (name)
+ assert_array_equals(mutation_received_ids, ["e2"], "mutation events received after first mutation");
+ }
elements[0].name = "c";
elements[2].open = true;
assert_element_states(elements, [1, 0, 1], "states before second mutation");
+ if (mutation_received_ids.length != 0) { // OK to not support mutation events
+ if (mutation_received_ids.length == 1) {
+ // OK to receive DOMSubtreeModified for attribute addition/removal
+ // (open) but not for attribute change (name)
+ assert_array_equals(mutation_received_ids, ["e2"], "mutation events received before second mutation");
+ } else {
+ assert_array_equals(mutation_received_ids, ["e2", "e0", "e2"], "mutation events received before second mutation");
+ }
+ }
elements[0].name = "a";
assert_element_states(elements, [0, 0, 1], "states after second mutation");
+ if (mutation_received_ids.length != 0) { // OK to not support mutation events
+ if (mutation_received_ids.length == 1) {
+ // OK to receive DOMSubtreeModified for attribute addition/removal
+ // (open) but not for attribute change (name)
+ assert_array_equals(mutation_received_ids, ["e2"], "mutation events received before second mutation");
+ } else {
+ assert_array_equals(mutation_received_ids, ["e2", "e0", "e2", "e0"], "mutation events received after second mutation");
+ }
+ }
}, "handling of name attribute changes");
promise_test(async t => {
@@ -392,28 +425,45 @@ promise_test(async t => {
});
};
+ let track_mutations = (element) => {
+ let result = { count: 0 };
+ let listener = event => {
+ ++result.count;
+ };
+ element.addEventListener("DOMSubtreeModified", listener);
+ return result;
+ }
+
await expect_opening(watch_e0);
// Test appending an open element in the group.
let new1 = make_details();
+ let mutations1 = track_mutations(new1);
let watch_new1 = new EventWatcher(t, new1, ['toggle']);
new1.open = true;
+ assert_in_array(mutations1.count, [0, 1], "mutation events count before inserting new1");
await expect_opening(watch_new1);
container.appendChild(new1);
await expect_closing(watch_new1);
+ assert_in_array(mutations1.count, [0, 1], "mutation events count after inserting new1");
// Test appending a closed element in the group.
let new2 = make_details();
+ let mutations2 = track_mutations(new2);
let watch_new2 = new EventWatcher(t, new2, ['toggle']);
container.appendChild(new2);
+ assert_equals(mutations2.count, 0, "mutation events count after inserting new2");
// Test inserting an open element at the start of the group.
let new3 = make_details();
+ let mutations3 = track_mutations(new3);
new3.open = true; // this time do this before creating the EventWatcher
let watch_new3 = new EventWatcher(t, new3, ['toggle']);
+ assert_in_array(mutations3.count, [0, 1], "mutation events count before inserting new3");
await expect_opening(watch_new3);
container.insertBefore(new3, elements[0]);
await expect_closing(watch_new3);
+ assert_in_array(mutations3.count, [0, 1], "mutation events count after inserting new3");
}, "handling of insertion of elements into group");
</script>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html
index 527d508252c..527d508252c 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-transformed-ancestor.tentative.html
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html
index e9db7321cd7..e9db7321cd7 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/fixed-position-child-with-will-change-ancestor.tentative.html
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html
index 6407ef23c2e..6407ef23c2e 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/top-layer-stacking.tentative.html
diff --git a/tests/wpt/tests/html/semantics/interfaces.js b/tests/wpt/tests/html/semantics/interfaces.js
index 96abf61e2ce..05fc82f7673 100644
--- a/tests/wpt/tests/html/semantics/interfaces.js
+++ b/tests/wpt/tests/html/semantics/interfaces.js
@@ -100,6 +100,7 @@ var elements = [
["output", "Output"],
["p", "Paragraph"],
["param", "Param"],
+ ["permission", "Permission"],
["picture", "Picture"],
["plaintext", ""],
["pre", "Pre"],
diff --git a/tests/wpt/tests/html/semantics/permission-element/no-end-tag-no-contents.html b/tests/wpt/tests/html/semantics/permission-element/no-end-tag-no-contents.html
new file mode 100644
index 00000000000..5fcce1421b6
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/permission-element/no-end-tag-no-contents.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<!--The permission element should have no end tag or content.
+ Therefore the parsing should stop after the beginning tag, and the following
+ element and text will become part of the 'body' element's contents.
+-->
+<permission type="geolocation"><span>this is some text</span></permission>
+
+<script>
+ test(function(){
+ assert_equals(3, document.body.childElementCount); // permission, span, script
+ assert_equals(document.body.innerText, "this is some text", "The text should be part of the 'body' element's text");
+
+ assert_true(document.body.children[0] instanceof HTMLPermissionElement, "First element should be a permission element");
+ var permission = document.body.children[0];
+ assert_equals(permission.innerText, "", "The permission element should have no text");
+ assert_equals(permission.childElementCount, 0, "The permission element should have no children");
+
+ assert_true(document.body.children[1] instanceof HTMLSpanElement, "Second element should be a span element");
+ var span = document.body.children[1];
+ assert_equals(span.innerText, "this is some text", "The span element should contain the text");
+ }, "The permission element should have no end tag or contents");
+</script>
+</body> \ No newline at end of file
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-1.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-1.html
index 5c8acd470eb..c5812765ebb 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-1.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-1.html
@@ -3,8 +3,10 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="helper.js"></script>
+
<body>
<script>
runDelayEventTest('Script elements (parser-blocking)');
</script>
+
<script id="to-be-moved" src="../../resources/throw.js?pipe=trickle(d3)"></script>
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-2.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-2.html
index 3399a8c001f..916673894dc 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-2.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-2.html
@@ -3,6 +3,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="helper.js"></script>
+
<body>
<script>
runDelayEventTest('Script elements (async)');
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-iframe.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-iframe.html
index 38a9a215419..efec7657c36 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-iframe.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/delay-load-event-iframe.html
@@ -2,4 +2,3 @@
<meta charset="utf-8">
<body onload="parent.onloadIframe()">
<script src="../../resources/throw.js?pipe=trickle(d2)"></script>
-</body>
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/helper.js b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/helper.js
index 331cf79bf0b..cb5f45eb0d6 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/helper.js
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/moving-between-documents/ordering/helper.js
@@ -1,14 +1,14 @@
function runDelayEventTest(description) {
- const t = async_test(description +
+ const t_original = async_test(description +
' still delay the load event in the original Document after move');
const t_new = async_test(description +
' does not delay the load event in the new Document after move');
- const start_time = performance.now();
const iframe = document.createElement('iframe');
iframe.setAttribute('src', 'delay-load-event-iframe.html');
+ const start_time = performance.now();
document.body.appendChild(iframe);
- window.onload = t.step_func_done(() => {
+ window.onload = t_original.step_func_done(() => {
// The `#to-be-moved` script should delay the load event until it is loaded
// (i.e. 3 seconds), not just until it is moved out to another Document
// (i.e. 1 second). Here we expect the delay should be at least 2 seconds,
@@ -20,11 +20,11 @@ function runDelayEventTest(description) {
window.onloadIframe = t_new.step_func_done(() => {
// The iframe's load event is fired after 2 seconds of its subresource
// loading, and shouldn't wait for the `#to-be-moved` script.
- assert_less_than(performance.now() - start_time, 2500,
+ assert_less_than(performance.now() - start_time, 3000,
'Load event should not be delayed until moved script is loaded');
});
- t.step_timeout(() => {
+ t_original.step_timeout(() => {
const script = document.querySelector('#to-be-moved');
iframe.contentDocument.body.appendChild(script);
}, 1000);
diff --git a/tests/wpt/tests/interfaces/WEBGL_clip_cull_distance.idl b/tests/wpt/tests/interfaces/WEBGL_clip_cull_distance.idl
index 46fa921fd53..a3a6dd869f9 100644
--- a/tests/wpt/tests/interfaces/WEBGL_clip_cull_distance.idl
+++ b/tests/wpt/tests/interfaces/WEBGL_clip_cull_distance.idl
@@ -1,7 +1,7 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
-// Source: WebGL WEBGL_clip_cull_distance Extension Draft Specification (https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/)
+// Source: WebGL WEBGL_clip_cull_distance Extension Specification (https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/)
[Exposed=(Window,Worker), LegacyNoInterfaceObject]
interface WEBGL_clip_cull_distance {
diff --git a/tests/wpt/tests/interfaces/WEBGL_multi_draw.idl b/tests/wpt/tests/interfaces/WEBGL_multi_draw.idl
index ee8c044b529..fc2270029b1 100644
--- a/tests/wpt/tests/interfaces/WEBGL_multi_draw.idl
+++ b/tests/wpt/tests/interfaces/WEBGL_multi_draw.idl
@@ -7,26 +7,26 @@
interface WEBGL_multi_draw {
undefined multiDrawArraysWEBGL(
GLenum mode,
- ([AllowShared] Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset,
- ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset,
+ ([AllowShared] Int32Array or sequence<GLint>) firstsList, unsigned long long firstsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) countsList, unsigned long long countsOffset,
GLsizei drawcount);
undefined multiDrawElementsWEBGL(
GLenum mode,
- ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) countsList, unsigned long long countsOffset,
GLenum type,
- ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, unsigned long long offsetsOffset,
GLsizei drawcount);
undefined multiDrawArraysInstancedWEBGL(
GLenum mode,
- ([AllowShared] Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset,
- ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset,
- ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset,
+ ([AllowShared] Int32Array or sequence<GLint>) firstsList, unsigned long long firstsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) countsList, unsigned long long countsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, unsigned long long instanceCountsOffset,
GLsizei drawcount);
undefined multiDrawElementsInstancedWEBGL(
GLenum mode,
- ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) countsList, unsigned long long countsOffset,
GLenum type,
- ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset,
- ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, unsigned long long offsetsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, unsigned long long instanceCountsOffset,
GLsizei drawcount);
};
diff --git a/tests/wpt/tests/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl b/tests/wpt/tests/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl
index 2258fa9a10c..7e4515cc36b 100644
--- a/tests/wpt/tests/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl
+++ b/tests/wpt/tests/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl
@@ -7,20 +7,20 @@
interface WEBGL_multi_draw_instanced_base_vertex_base_instance {
undefined multiDrawArraysInstancedBaseInstanceWEBGL(
GLenum mode,
- ([AllowShared] Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset,
- ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset,
- ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset,
- ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset,
+ ([AllowShared] Int32Array or sequence<GLint>) firstsList, unsigned long long firstsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) countsList, unsigned long long countsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, unsigned long long instanceCountsOffset,
+ ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, unsigned long long baseInstancesOffset,
GLsizei drawcount
);
undefined multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL(
GLenum mode,
- ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) countsList, unsigned long long countsOffset,
GLenum type,
- ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset,
- ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset,
- ([AllowShared] Int32Array or sequence<GLint>) baseVerticesList, GLuint baseVerticesOffset,
- ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, unsigned long long offsetsOffset,
+ ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, unsigned long long instanceCountsOffset,
+ ([AllowShared] Int32Array or sequence<GLint>) baseVerticesList, unsigned long long baseVerticesOffset,
+ ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, unsigned long long baseInstancesOffset,
GLsizei drawcount
);
};
diff --git a/tests/wpt/tests/interfaces/audio-session.idl b/tests/wpt/tests/interfaces/audio-session.idl
new file mode 100644
index 00000000000..f542347c710
--- /dev/null
+++ b/tests/wpt/tests/interfaces/audio-session.idl
@@ -0,0 +1,33 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Audio Session (https://w3c.github.io/audio-session/)
+
+enum AudioSessionState {
+ "inactive",
+ "active",
+ "interrupted"
+};
+
+enum AudioSessionType {
+ "auto",
+ "playback",
+ "transient",
+ "transient-solo",
+ "ambient",
+ "play-and-record"
+};
+
+[Exposed=Window]
+partial interface Navigator {
+ // The default audio session that the user agent will use when media elements start/stop playing.
+ readonly attribute AudioSession audioSession;
+};
+
+[Exposed=Window]
+interface AudioSession : EventTarget {
+ attribute AudioSessionType type;
+
+ readonly attribute AudioSessionState state;
+ attribute EventHandler onstatechange;
+};
diff --git a/tests/wpt/tests/interfaces/clipboard-apis.idl b/tests/wpt/tests/interfaces/clipboard-apis.idl
index 3f2c9ba6f28..51d5af18dc2 100644
--- a/tests/wpt/tests/interfaces/clipboard-apis.idl
+++ b/tests/wpt/tests/interfaces/clipboard-apis.idl
@@ -28,6 +28,8 @@ interface ClipboardItem {
readonly attribute FrozenArray<DOMString> types;
Promise<Blob> getType(DOMString type);
+
+ static boolean supports(DOMString type);
};
enum PresentationStyle { "unspecified", "inline", "attachment" };
diff --git a/tests/wpt/tests/interfaces/css-view-transitions-2.idl b/tests/wpt/tests/interfaces/css-view-transitions-2.idl
new file mode 100644
index 00000000000..6d23f406b01
--- /dev/null
+++ b/tests/wpt/tests/interfaces/css-view-transitions-2.idl
@@ -0,0 +1,9 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: CSS View Transitions Module Level 2 (https://drafts.csswg.org/css-view-transitions-2/)
+
+[Exposed=Window]
+interface PageRevealEvent : Event {
+ readonly attribute ViewTransition? viewTransition;
+};
diff --git a/tests/wpt/tests/interfaces/edit-context.idl b/tests/wpt/tests/interfaces/edit-context.idl
index 937b6579376..011130480e9 100644
--- a/tests/wpt/tests/interfaces/edit-context.idl
+++ b/tests/wpt/tests/interfaces/edit-context.idl
@@ -66,11 +66,14 @@ interface TextUpdateEvent : Event {
readonly attribute unsigned long compositionEnd;
};
+enum UnderlineStyle { "none", "solid", "double", "dotted", "dashed", "wavy" };
+enum UnderlineThickness { "none", "thin", "thick" };
+
dictionary TextFormatInit {
unsigned long rangeStart;
unsigned long rangeEnd;
- DOMString underlineStyle;
- DOMString underlineThickness;
+ UnderlineStyle underlineStyle;
+ UnderlineThickness underlineThickness;
};
[Exposed=Window]
@@ -78,8 +81,8 @@ interface TextFormat {
constructor(optional TextFormatInit options = {});
readonly attribute unsigned long rangeStart;
readonly attribute unsigned long rangeEnd;
- readonly attribute DOMString underlineStyle;
- readonly attribute DOMString underlineThickness;
+ readonly attribute UnderlineStyle underlineStyle;
+ readonly attribute UnderlineThickness underlineThickness;
};
dictionary TextFormatUpdateEventInit : EventInit {
diff --git a/tests/wpt/tests/interfaces/fenced-frame.idl b/tests/wpt/tests/interfaces/fenced-frame.idl
index 75196932821..0eed6a6b4ba 100644
--- a/tests/wpt/tests/interfaces/fenced-frame.idl
+++ b/tests/wpt/tests/interfaces/fenced-frame.idl
@@ -28,6 +28,13 @@ interface FencedFrameConfig {
undefined setSharedStorageContext(DOMString contextString);
};
+typedef (USVString or FencedFrameConfig) UrnOrConfig;
+
+partial interface Navigator {
+ Promise<undefined> deprecatedReplaceInURN(
+ UrnOrConfig urnOrConfig, record<USVString, USVString> replacements);
+};
+
enum FenceReportingDestination {
"buyer",
"seller",
@@ -37,18 +44,27 @@ enum FenceReportingDestination {
};
dictionary FenceEvent {
- required DOMString eventType;
- required DOMString eventData;
- required sequence<FenceReportingDestination> destination;
+ // This dictionary has two mutually exclusive modes that aren’t represented as
+ // distinct IDL types due to distinguishability issues:
+ //
+ // When reporting to a preregistered destination (specified by enum), the following
+ // properties are used:
+ DOMString eventType;
+ DOMString eventData;
+ sequence<FenceReportingDestination> destination;
boolean once = false;
+
+ // When reporting to a custom destination URL (with substitution of macros defined by
+ // the Protected Audience buyer), the following property is used:
+ USVString destinationURL;
};
typedef (FenceEvent or DOMString) ReportEventType;
[Exposed=Window]
interface Fence {
- undefined reportEvent(ReportEventType event);
- undefined setReportEventDataForAutomaticBeacons(FenceEvent event);
+ undefined reportEvent(optional ReportEventType event = {});
+ undefined setReportEventDataForAutomaticBeacons(optional FenceEvent event = {});
sequence<FencedFrameConfig> getNestedConfigs();
};
diff --git a/tests/wpt/tests/interfaces/html.idl b/tests/wpt/tests/interfaces/html.idl
index eec3f781c74..c7f744ccbe6 100644
--- a/tests/wpt/tests/interfaces/html.idl
+++ b/tests/wpt/tests/interfaces/html.idl
@@ -1783,7 +1783,7 @@ interface Window : EventTarget {
// the user agent
readonly attribute Navigator navigator;
- readonly attribute Navigator clientInformation; // legacy alias of .navigator
+ [Replaceable] readonly attribute Navigator clientInformation; // legacy alias of .navigator
readonly attribute boolean originAgentCluster;
// user prompts
diff --git a/tests/wpt/tests/interfaces/intersection-observer.idl b/tests/wpt/tests/interfaces/intersection-observer.idl
index 52db1c4baa9..8502a11357f 100644
--- a/tests/wpt/tests/interfaces/intersection-observer.idl
+++ b/tests/wpt/tests/interfaces/intersection-observer.idl
@@ -10,6 +10,7 @@ interface IntersectionObserver {
constructor(IntersectionObserverCallback callback, optional IntersectionObserverInit options = {});
readonly attribute (Element or Document)? root;
readonly attribute DOMString rootMargin;
+ readonly attribute DOMString scrollMargin;
readonly attribute FrozenArray<double> thresholds;
undefined observe(Element target);
undefined unobserve(Element target);
@@ -42,5 +43,6 @@ dictionary IntersectionObserverEntryInit {
dictionary IntersectionObserverInit {
(Element or Document)? root = null;
DOMString rootMargin = "0px";
+ DOMString scrollMargin = "0px";
(double or sequence<double>) threshold = 0;
};
diff --git a/tests/wpt/tests/interfaces/mediasession.idl b/tests/wpt/tests/interfaces/mediasession.idl
index cca46ac5a85..83c1eb59dff 100644
--- a/tests/wpt/tests/interfaces/mediasession.idl
+++ b/tests/wpt/tests/interfaces/mediasession.idl
@@ -1,7 +1,7 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
-// Source: Media Session Standard (https://w3c.github.io/mediasession/)
+// Source: Media Session (https://w3c.github.io/mediasession/)
[Exposed=Window]
partial interface Navigator {
diff --git a/tests/wpt/tests/interfaces/shared-storage.idl b/tests/wpt/tests/interfaces/shared-storage.idl
index d223736f29f..edbe2c2bcc3 100644
--- a/tests/wpt/tests/interfaces/shared-storage.idl
+++ b/tests/wpt/tests/interfaces/shared-storage.idl
@@ -84,3 +84,14 @@ interface WorkletSharedStorage : SharedStorage {
async iterable<DOMString, DOMString>;
};
+
+interface mixin HTMLSharedStorageWritableElementUtils {
+ [CEReactions, SecureContext] attribute boolean sharedStorageWritable;
+};
+
+HTMLIFrameElement includes HTMLSharedStorageWritableElementUtils;
+HTMLImageElement includes HTMLSharedStorageWritableElementUtils;
+
+partial dictionary RequestInit {
+ boolean sharedStorageWritable;
+};
diff --git a/tests/wpt/tests/interfaces/turtledove.idl b/tests/wpt/tests/interfaces/turtledove.idl
index 393792ffeac..c7f49f70a92 100644
--- a/tests/wpt/tests/interfaces/turtledove.idl
+++ b/tests/wpt/tests/interfaces/turtledove.idl
@@ -11,8 +11,10 @@ partial interface Navigator {
dictionary AuctionAd {
required USVString renderURL;
any metadata;
+
USVString buyerReportingId;
USVString buyerAndSellerReportingId;
+ sequence<USVString> allowedReportingOrigins;
};
dictionary GenerateBidInterestGroup {
@@ -121,6 +123,7 @@ interface InterestGroupReportingScriptRunnerGlobalScope
: InterestGroupScriptRunnerGlobalScope {
undefined sendReportTo(DOMString url);
undefined registerAdBeacon(record<DOMString, USVString> map);
+ undefined registerAdMacro(DOMString name, USVString value);
};
[SecureContext]
diff --git a/tests/wpt/tests/interfaces/ua-client-hints.idl b/tests/wpt/tests/interfaces/ua-client-hints.idl
index c69714b9734..6a40e1bdc4b 100644
--- a/tests/wpt/tests/interfaces/ua-client-hints.idl
+++ b/tests/wpt/tests/interfaces/ua-client-hints.idl
@@ -12,7 +12,7 @@ dictionary UADataValues {
DOMString architecture;
DOMString bitness;
sequence<NavigatorUABrandVersion> brands;
- DOMString formFactor;
+ sequence<DOMString> formFactor;
sequence<NavigatorUABrandVersion> fullVersionList;
DOMString model;
boolean mobile;
diff --git a/tests/wpt/tests/interfaces/uievents.idl b/tests/wpt/tests/interfaces/uievents.idl
index 5fdc812e700..fef90d48410 100644
--- a/tests/wpt/tests/interfaces/uievents.idl
+++ b/tests/wpt/tests/interfaces/uievents.idl
@@ -32,6 +32,8 @@ interface MouseEvent : UIEvent {
readonly attribute long screenY;
readonly attribute long clientX;
readonly attribute long clientY;
+ readonly attribute long layerX;
+ readonly attribute long layerY;
readonly attribute boolean ctrlKey;
readonly attribute boolean shiftKey;
diff --git a/tests/wpt/tests/interfaces/webaudio.idl b/tests/wpt/tests/interfaces/webaudio.idl
index 1569de204bd..73dc35d2609 100644
--- a/tests/wpt/tests/interfaces/webaudio.idl
+++ b/tests/wpt/tests/interfaces/webaudio.idl
@@ -9,6 +9,11 @@ enum AudioContextState {
"closed"
};
+enum AudioContextRenderSizeCategory {
+ "default",
+ "hardware"
+};
+
callback DecodeErrorCallback = undefined (DOMException error);
callback DecodeSuccessCallback = undefined (AudioBuffer decodedData);
@@ -20,6 +25,7 @@ interface BaseAudioContext : EventTarget {
readonly attribute double currentTime;
readonly attribute AudioListener listener;
readonly attribute AudioContextState state;
+ readonly attribute unsigned long renderQuantumSize;
[SameObject, SecureContext]
readonly attribute AudioWorklet audioWorklet;
attribute EventHandler onstatechange;
@@ -92,6 +98,7 @@ dictionary AudioContextOptions {
(AudioContextLatencyCategory or double) latencyHint = "interactive";
float sampleRate;
(DOMString or AudioSinkOptions) sinkId;
+ (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default";
};
dictionary AudioSinkOptions {
@@ -150,6 +157,7 @@ dictionary OfflineAudioContextOptions {
unsigned long numberOfChannels = 1;
required unsigned long length;
required float sampleRate;
+ (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default";
};
[Exposed=Window]
@@ -629,6 +637,7 @@ interface AudioWorkletGlobalScope : WorkletGlobalScope {
readonly attribute unsigned long long currentFrame;
readonly attribute double currentTime;
readonly attribute float sampleRate;
+ readonly attribute unsigned long renderQuantumSize;
readonly attribute MessagePort port;
};
diff --git a/tests/wpt/tests/interfaces/webgl2.idl b/tests/wpt/tests/interfaces/webgl2.idl
index 5499e5a68b1..9cb639932e8 100644
--- a/tests/wpt/tests/interfaces/webgl2.idl
+++ b/tests/wpt/tests/interfaces/webgl2.idl
@@ -304,7 +304,7 @@ interface mixin WebGL2RenderingContextBase
// can not be exposed safely to JavaScript. GetBufferSubData
// replaces it for the purpose of fetching data back from the GPU.
undefined getBufferSubData(GLenum target, GLintptr srcByteOffset, [AllowShared] ArrayBufferView dstBuffer,
- optional GLuint dstOffset = 0, optional GLuint length = 0);
+ optional unsigned long long dstOffset = 0, optional GLuint length = 0);
/* Framebuffer objects */
undefined blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0,
@@ -336,7 +336,7 @@ interface mixin WebGL2RenderingContextBase
GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData);
undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
- GLuint srcOffset);
+ unsigned long long srcOffset);
undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
@@ -346,7 +346,7 @@ interface mixin WebGL2RenderingContextBase
TexImageSource source); // May throw DOMException
undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
- [AllowShared] ArrayBufferView? srcData, optional GLuint srcOffset = 0);
+ [AllowShared] ArrayBufferView? srcData, optional unsigned long long srcOffset = 0);
undefined copyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLint x, GLint y, GLsizei width, GLsizei height);
@@ -355,7 +355,7 @@ interface mixin WebGL2RenderingContextBase
GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLintptr offset);
undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLsizei depth, GLint border, [AllowShared] ArrayBufferView srcData,
- optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0);
undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
@@ -363,7 +363,7 @@ interface mixin WebGL2RenderingContextBase
undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
GLenum format, [AllowShared] ArrayBufferView srcData,
- optional GLuint srcOffset = 0,
+ optional unsigned long long srcOffset = 0,
optional GLuint srcLengthOverride = 0);
/* Programs and shaders */
@@ -375,28 +375,28 @@ interface mixin WebGL2RenderingContextBase
undefined uniform3ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2);
undefined uniform4ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
- undefined uniform1uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
+ undefined uniform1uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform2uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
+ undefined uniform2uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform3uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
+ undefined uniform3uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform4uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
+ undefined uniform4uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniformMatrix3x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix4x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix2x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix4x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix2x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix3x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
/* Vertex attribs */
undefined vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
@@ -415,11 +415,11 @@ interface mixin WebGL2RenderingContextBase
undefined drawBuffers(sequence<GLenum> buffers);
undefined clearBufferfv(GLenum buffer, GLint drawbuffer, Float32List values,
- optional GLuint srcOffset = 0);
+ optional unsigned long long srcOffset = 0);
undefined clearBufferiv(GLenum buffer, GLint drawbuffer, Int32List values,
- optional GLuint srcOffset = 0);
+ optional unsigned long long srcOffset = 0);
undefined clearBufferuiv(GLenum buffer, GLint drawbuffer, Uint32List values,
- optional GLuint srcOffset = 0);
+ optional unsigned long long srcOffset = 0);
undefined clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
@@ -486,10 +486,10 @@ interface mixin WebGL2RenderingContextOverloads
undefined bufferData(GLenum target, AllowSharedBufferSource? srcData, GLenum usage);
undefined bufferSubData(GLenum target, GLintptr dstByteOffset, AllowSharedBufferSource srcData);
// WebGL2:
- undefined bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, GLuint srcOffset,
+ undefined bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, unsigned long long srcOffset,
optional GLuint length = 0);
undefined bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData,
- GLuint srcOffset, optional GLuint length = 0);
+ unsigned long long srcOffset, optional GLuint length = 0);
// WebGL1 legacy entrypoints:
undefined texImage2D(GLenum target, GLint level, GLint internalformat,
@@ -512,7 +512,7 @@ interface mixin WebGL2RenderingContextOverloads
TexImageSource source); // May throw DOMException
undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
- GLuint srcOffset);
+ unsigned long long srcOffset);
undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
GLsizei height, GLenum format, GLenum type, GLintptr pboOffset);
@@ -521,46 +521,46 @@ interface mixin WebGL2RenderingContextOverloads
TexImageSource source); // May throw DOMException
undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
- GLuint srcOffset);
+ unsigned long long srcOffset);
undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLint border, GLsizei imageSize, GLintptr offset);
undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLint border, [AllowShared] ArrayBufferView srcData,
- optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0);
undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLintptr offset);
undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height, GLenum format,
[AllowShared] ArrayBufferView srcData,
- optional GLuint srcOffset = 0,
+ optional unsigned long long srcOffset = 0,
optional GLuint srcLengthOverride = 0);
- undefined uniform1fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
+ undefined uniform1fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform2fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
+ undefined uniform2fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform3fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
+ undefined uniform3fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform4fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
+ undefined uniform4fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform1iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
+ undefined uniform1iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform2iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
+ undefined uniform2iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform3iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
+ undefined uniform3iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
- undefined uniform4iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
+ undefined uniform4iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
- optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
+ optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
/* Reading back pixels */
// WebGL1:
@@ -570,7 +570,7 @@ interface mixin WebGL2RenderingContextOverloads
undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
GLintptr offset);
undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
- [AllowShared] ArrayBufferView dstData, GLuint dstOffset);
+ [AllowShared] ArrayBufferView dstData, unsigned long long dstOffset);
};
[Exposed=(Window,Worker)]
diff --git a/tests/wpt/tests/interfaces/webrtc-encoded-transform.idl b/tests/wpt/tests/interfaces/webrtc-encoded-transform.idl
index 6dd2ba3fffa..1a456577d38 100644
--- a/tests/wpt/tests/interfaces/webrtc-encoded-transform.idl
+++ b/tests/wpt/tests/interfaces/webrtc-encoded-transform.idl
@@ -78,7 +78,7 @@ dictionary RTCEncodedVideoFrameMetadata {
// New interfaces to define encoded video and audio frames. Will eventually
// re-use or extend the equivalent defined in WebCodecs.
-[Exposed=(Window,DedicatedWorker)]
+[Exposed=(Window,DedicatedWorker), Serializable]
interface RTCEncodedVideoFrame {
readonly attribute RTCEncodedVideoFrameType type;
readonly attribute unsigned long timestamp;
@@ -93,7 +93,7 @@ dictionary RTCEncodedAudioFrameMetadata {
short sequenceNumber;
};
-[Exposed=(Window,DedicatedWorker)]
+[Exposed=(Window,DedicatedWorker), Serializable]
interface RTCEncodedAudioFrame {
readonly attribute unsigned long timestamp;
attribute ArrayBuffer data;
diff --git a/tests/wpt/tests/interfaces/webtransport.idl b/tests/wpt/tests/interfaces/webtransport.idl
index a9f514e2366..284ab350829 100644
--- a/tests/wpt/tests/interfaces/webtransport.idl
+++ b/tests/wpt/tests/interfaces/webtransport.idl
@@ -19,7 +19,7 @@ interface WebTransportDatagramDuplexStream {
interface WebTransport {
constructor(USVString url, optional WebTransportOptions options = {});
- Promise<WebTransportStats> getStats();
+ Promise<WebTransportConnectionStats> getStats();
readonly attribute Promise<undefined> ready;
readonly attribute WebTransportReliabilityMode reliability;
readonly attribute WebTransportCongestionControl congestionControl;
@@ -73,13 +73,12 @@ dictionary WebTransportSendStreamOptions {
long long? sendOrder = null;
};
-dictionary WebTransportStats {
+dictionary WebTransportConnectionStats {
DOMHighResTimeStamp timestamp;
unsigned long long bytesSent;
unsigned long long packetsSent;
+ unsigned long long bytesLost;
unsigned long long packetsLost;
- unsigned long numOutgoingStreamsCreated;
- unsigned long numIncomingStreamsCreated;
unsigned long long bytesReceived;
unsigned long long packetsReceived;
DOMHighResTimeStamp smoothedRtt;
diff --git a/tests/wpt/tests/mst-content-hint/RTCRtpSendParameters-degradationEffect.html b/tests/wpt/tests/mst-content-hint/RTCRtpSendParameters-degradationEffect.html
index e6a03c593f3..a2da6cd139f 100644
--- a/tests/wpt/tests/mst-content-hint/RTCRtpSendParameters-degradationEffect.html
+++ b/tests/wpt/tests/mst-content-hint/RTCRtpSendParameters-degradationEffect.html
@@ -11,56 +11,61 @@
// This file contains tests that check that degradation preference
// actually has the desired effect. These tests take a long time to run.
+// The signal generator will generate a video stream with at least this
+// many bits per second if unconstrained.
+const minUnconstrainedBandwidth = 30000;
+
// Returns incoming bandwidth usage between stats1 and stats2
// in bits per second.
function bandwidth(stats1, stats2) {
+ if (!stats1 || !stats2) {
+ return null;
+ }
const transport1 = [...stats1.values()].filter(({type}) => type === 'transport')[0];
const transport2 = [...stats2.values()].filter(({type}) => type === 'transport')[0];
const bytes = transport2.bytesReceived - transport1.bytesReceived;
- // Multiply by 1000 to get per second, divide by 8 to get bits.
+ // If time interval is too short for proper measurement, return null.
+ if (transport1.timestamp > transport2.timestamp - 100) {
+ return null;
+ }
+ // Multiply by 1000 to get per second, multiply by 8 to get bits.
const bandwidth = 1000 * 8 * bytes /
(transport2.timestamp - transport1.timestamp);
return bandwidth;
}
+let oldStats;
+
// Returns tuple of { bandwidth, fps, x-res, y-res }
-async function measureStuff(t, pc, intervalMs) {
- const stats1 = await pc.getStats();
- await new Promise(r => t.step_timeout(r, intervalMs));
- const stats2 = await pc.getStats();
+// Updates oldStats.
+async function measureStuff(pc) {
+ const stats = await pc.getStats();
+ if (!oldStats) {
+ oldStats = stats;
+ return {};
+ }
// RTCInboundStreamStats
- const inboundRtp1List = [...stats1.values()].filter(({type}) => type === 'inbound-rtp');
- const inboundRtp2List = [...stats2.values()].filter(({type}) => type === 'inbound-rtp');
- const inboundRtp1 = inboundRtp1List[0];
- const inboundRtp2 = inboundRtp2List[0];
- const fps = 1000 * (inboundRtp2.framesReceived - inboundRtp1.framesReceived) /
- (inboundRtp2.timestamp - inboundRtp1.timestamp);
+ const oldRtpList = [...oldStats.values()].filter(({type}) => type === 'inbound-rtp');
+ const inboundRtpList = [...stats.values()].filter(({type}) => type === 'inbound-rtp');
+ const oldRtp = oldRtpList[0];
+ const inboundRtp = inboundRtpList[0];
+ const fps = 1000.0 * (inboundRtp.framesReceived - oldRtp.framesReceived) /
+ (inboundRtp.timestamp - oldRtp.timestamp);
const result = {
- bandwidth: bandwidth(stats1, stats2),
+ bandwidth: bandwidth(oldStats, stats),
fps: fps,
- width: inboundRtp2.frameWidth,
- height: inboundRtp2.frameHeight
+ width: inboundRtp.frameWidth,
+ height: inboundRtp.frameHeight
};
+ oldStats = stats;
+ if (!result.bandwidth) {
+ return {};
+ }
// Unbreak for debugging.
// con sole.log('Measure: ', performance.now(), " ", JSON.stringify(result));
return result;
}
-// Wait for a certain condition to be true on the traffic measures
-// on the PC. Will typically be conditions on resolution, framerate
-// or bandwidth.
-async function waitForCondition(t, pc, condition, maxWait, stepName) {
- let counter = 1;
- let measure = await measureStuff(t, pc, 1000);
- while (counter < maxWait && !condition(measure)) {
- measure = await measureStuff(t, pc, 1000);
- counter += 1;
- }
- assert_true(condition(measure),
- `failure in ${stepName}, measure is ${JSON.stringify(measure)}`);
- return condition(measure);
-}
-
promise_test(async t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
@@ -71,9 +76,6 @@ promise_test(async t => {
let param = sender.getParameters();
- assert_equals(param.degradationPreference, undefined,
- 'Expect initial param.degradationPreference to be undefined');
-
param.degradationPreference = 'maintain-framerate';
await sender.setParameters(param);
@@ -83,38 +85,45 @@ promise_test(async t => {
exchangeIceCandidates(pc1, pc2);
await exchangeOfferAnswer(pc1, pc2);
await listenToConnected(pc1);
+ // Allow the keyframe to pass.
+ await new Promise(r => t.step_timeout(r, 1000));
// Wait a few seconds to allow things to settle (rampup)
// We know that the generator is supposed to produce 640x480
// at 10 fps with a bandwidth exceeding 30 kbits/second.
- assert_true(await waitForCondition(t, pc2, (measure) => {
- return (measure.bandwidth > 30000 &&
+ await t.step_wait(async () => {
+ const measure = await measureStuff(pc2);
+ return (measure.bandwidth > minUnconstrainedBandwidth &&
measure.width == 640 &&
measure.fps > 9);
- }, 60, 'preconditions'));
+ }, 'Test error: Preconditions not achieved', 30000, 500);
// Measure BW, resolution and frame rate over one second
- const stats1 = await measureStuff(t, pc2, 1000);
+ // after measurements have stabilized.
+ await new Promise(r => t.step_timeout(r, 1000));
+ const stats1 = await measureStuff(pc2);
// Constrain BW to 1/2 of measured value
const newBandwidth = stats1.bandwidth / 2;
+ // Guard against inappropriate bandwidth
+ assert_greater_than(newBandwidth, minUnconstrainedBandwidth/2,
+ "Test error: Constraint too low");
const parameters = sender.getParameters();
parameters.encodings[0].maxBitrate = newBandwidth;
await sender.setParameters(parameters);
// Wait until the expected result happens.
- let stats2 = await measureStuff(t, pc2, 1000);
- let counter = 1;
- const maxWaitCount = 20;
const kBandwidthMargin = 1.3;
// It takes time to adapt to a new bandwidth, time to scale down,
// and time to acknowledge that framerate should not be reduced.
// Measured time is around 16 seconds.
- assert_true(await waitForCondition(t, pc2, (measure) => {
- return (measure.bandwidth < newBandwidth * kBandwidthMargin &&
+ await t.step_wait(async () => {
+ let measure = await measureStuff(pc2);
+ return (measure.bandwidth &&
+ measure.bandwidth < newBandwidth * kBandwidthMargin &&
measure.width < stats1.width &&
measure.fps > stats1.fps * 0.9);
- }, 60, 'adaptation'),
- `Target bandwidth ${newBandwidth * kBandwidthMargin}, target min FPS ${stats1.fps * 0.9}`);
+ }, 'Adaptation did not succeed',
+ 30000, 500);
}, 'Maintain-framerate reduces resolution on bandwidth cut', { timeout: 35000 });
</script>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html b/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html
index 7dd1226e54c..d348a218ac4 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html
+++ b/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html
@@ -5,11 +5,13 @@
<script src="resources/after-transition-commit-helpers.js"></script>
<body>
<script>
+let start_index = navigation.currentEntry.index;
+
let tests = [
- { mode: "rejectBeforeCommit", destinationIndex: 0, description: "{ commit: 'after-transition' } for a traverse navigation, reject before commit" },
- { mode: "rejectAfterCommit", destinationIndex: 1, description: "{ commit: 'after-transition' } for a traverse navigation, reject after commit" },
- { mode: "successExplicitCommit", destinationIndex: 2, description: "{ commit: 'after-transition' } for a traverse navigation, explicit commit()" },
- { mode: "successNoExplicitCommit", destinationIndex: 3, description: "{ commit: 'after-transition' } for a traverse navigation, commit when handler resolves" }
+ { mode: "rejectBeforeCommit", destinationIndex: start_index, description: "{ commit: 'after-transition' } for a traverse navigation, reject before commit" },
+ { mode: "rejectAfterCommit", destinationIndex: start_index + 1, description: "{ commit: 'after-transition' } for a traverse navigation, reject after commit" },
+ { mode: "successExplicitCommit", destinationIndex: start_index + 2, description: "{ commit: 'after-transition' } for a traverse navigation, explicit commit()" },
+ { mode: "successNoExplicitCommit", destinationIndex: start_index + 3, description: "{ commit: 'after-transition' } for a traverse navigation, commit when handler resolves" }
];
// Push a bunch of history entries so each test case can target a unique entry.
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/anchor-click.html b/tests/wpt/tests/navigation-api/currententrychange-event/anchor-click.html
index e0bf91166aa..ce8fc69f5d4 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/anchor-click.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/anchor-click.html
@@ -4,13 +4,15 @@
<a id="a" href="#foo"></a>
<script>
test(t => {
+ let start_index = navigation.currentEntry.index;
+
let oncurrententrychange_called = false;
navigation.oncurrententrychange = t.step_func(e => {
oncurrententrychange_called = true;
- assert_equals(e.from, navigation.entries()[0]);
- assert_equals(e.from.index, 0);
+ assert_equals(e.from, navigation.entries()[start_index]);
+ assert_equals(e.from.index, start_index);
assert_equals(e.navigationType, "push");
- assert_equals(navigation.currentEntry.index, 1);
+ assert_equals(navigation.currentEntry.index, start_index + 1);
});
a.click();
assert_true(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/history-back-same-doc.html b/tests/wpt/tests/navigation-api/currententrychange-event/history-back-same-doc.html
index 768805b7526..885d558bb5d 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/history-back-same-doc.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/history-back-same-doc.html
@@ -3,18 +3,21 @@
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(async t => {
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
+
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
await navigation.navigate("#foo");
- assert_equals(navigation.entries().length, 2);
+ assert_equals(navigation.entries().length, start_length + 1);
let oncurrententrychange_called = false;
navigation.oncurrententrychange = t.step_func(e => {
oncurrententrychange_called = true;
- assert_equals(e.from, navigation.entries()[1]);
+ assert_equals(e.from, navigation.entries()[start_index + 1]);
assert_equals(e.navigationType, "traverse");
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
});
history.back();
assert_false(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/history-pushState.html b/tests/wpt/tests/navigation-api/currententrychange-event/history-pushState.html
index 1a17a7cec0c..cfefcda1d6a 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/history-pushState.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/history-pushState.html
@@ -3,12 +3,14 @@
<script src="/resources/testharnessreport.js"></script>
<script>
test(t => {
+ let start_index = navigation.currentEntry.index;
+
let oncurrententrychange_called = false;
navigation.oncurrententrychange = t.step_func(e => {
oncurrententrychange_called = true;
- assert_equals(e.from, navigation.entries()[0]);
+ assert_equals(e.from, navigation.entries()[start_index]);
assert_equals(e.navigationType, "push");
- assert_equals(navigation.currentEntry.index, 1);
+ assert_equals(navigation.currentEntry.index, start_index + 1);
});
history.pushState(1, "", "#1");
assert_true(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/history-replaceState.html b/tests/wpt/tests/navigation-api/currententrychange-event/history-replaceState.html
index e8ae8ee57a2..5b6fc09bf94 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/history-replaceState.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/history-replaceState.html
@@ -3,6 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script>
test(t => {
+ let start_index = navigation.currentEntry.index;
+
let oncurrententrychange_called = false;
let original_currentEntry = navigation.currentEntry;
navigation.oncurrententrychange = t.step_func(e => {
@@ -10,7 +12,7 @@ test(t => {
assert_equals(e.from, original_currentEntry);
assert_equals(e.from.index, -1);
assert_equals(e.navigationType, "replace");
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
});
history.replaceState(1, "", "#1");
assert_true(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/location-api.html b/tests/wpt/tests/navigation-api/currententrychange-event/location-api.html
index 88ebd985a1e..b142fabb227 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/location-api.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/location-api.html
@@ -3,6 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script>
test(t => {
+ let start_index = navigation.currentEntry.index;
+
let oncurrententrychange_called = false;
let original_entry = navigation.currentEntry;
navigation.oncurrententrychange = t.step_func(e => {
@@ -10,7 +12,7 @@ test(t => {
assert_equals(e.from, original_entry);
assert_equals(e.from.index, -1);
assert_equals(e.navigationType, "replace");
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
});
location.hash = "#foo";
assert_true(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/navigation-back-forward-same-doc.html b/tests/wpt/tests/navigation-api/currententrychange-event/navigation-back-forward-same-doc.html
index 8182673aa59..cd307a3d538 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/navigation-back-forward-same-doc.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/navigation-back-forward-same-doc.html
@@ -3,19 +3,22 @@
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(async t => {
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
+
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
await navigation.navigate("#foo").committed;
- assert_equals(navigation.entries().length, 2);
+ assert_equals(navigation.entries().length, start_length + 1);
let oncurrententrychange_back_called = false;
let back_committed = false;
navigation.oncurrententrychange = t.step_func(e => {
oncurrententrychange_back_called = true;
- assert_equals(e.from, navigation.entries()[1]);
+ assert_equals(e.from, navigation.entries()[start_index + 1]);
assert_equals(e.navigationType, "traverse");
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
assert_false(back_committed);
});
let back_result = navigation.back();
@@ -27,9 +30,9 @@ promise_test(async t => {
let forward_committed = false;
navigation.oncurrententrychange = t.step_func(e => {
oncurrententrychange_forward_called = true;
- assert_equals(e.from, navigation.entries()[0]);
+ assert_equals(e.from, navigation.entries()[start_index]);
assert_equals(e.navigationType, "traverse");
- assert_equals(navigation.currentEntry.index, 1);
+ assert_equals(navigation.currentEntry.index, start_index + 1);
assert_false(forward_committed);
});
let forward_result = navigation.forward();
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-replace-same-doc.html b/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-replace-same-doc.html
index f9935973057..79ade9396f3 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-replace-same-doc.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-replace-same-doc.html
@@ -3,6 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(async t => {
+ let start_index = navigation.currentEntry.index;
+
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
@@ -14,7 +16,7 @@ promise_test(async t => {
assert_equals(e.from, original_entry);
assert_equals(e.from.index, -1);
assert_equals(e.navigationType, "replace");
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
});
let result = navigation.navigate("#foo", { history: "replace" });
assert_true(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-same-doc.html b/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-same-doc.html
index 87fc28d174a..0cf5214eae6 100644
--- a/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-same-doc.html
+++ b/tests/wpt/tests/navigation-api/currententrychange-event/navigation-navigate-same-doc.html
@@ -3,6 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(async t => {
+ let start_index = navigation.currentEntry.index;
+
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
@@ -10,9 +12,9 @@ promise_test(async t => {
let oncurrententrychange_called = false;
navigation.oncurrententrychange = t.step_func(e => {
oncurrententrychange_called = true;
- assert_equals(e.from, navigation.entries()[0]);
+ assert_equals(e.from, navigation.entries()[start_index]);
assert_equals(e.navigationType, "push");
- assert_equals(navigation.currentEntry.index, 1);
+ assert_equals(navigation.currentEntry.index, start_index + 1);
});
let result = navigation.navigate("#foo");
assert_true(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/current-basic.html b/tests/wpt/tests/navigation-api/navigation-history-entry/current-basic.html
index 78bbbb05607..66a7100bf6d 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/current-basic.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/current-basic.html
@@ -4,7 +4,9 @@
<script src="resources/is_uuid.js"></script>
<script>
test(() => {
+ let start_length = navigation.entries().length;
let first_entry = navigation.currentEntry;
+ let start_index = first_entry.index;
assert_not_equals(first_entry, null);
assert_not_equals(first_entry.key, null);
assert_true(isUUID(first_entry.key));
@@ -12,8 +14,8 @@ test(() => {
assert_true(isUUID(first_entry.id));
assert_equals(first_entry.url, location.href);
assert_true(first_entry.sameDocument);
- assert_equals(navigation.entries().length, 1);
- assert_equals(first_entry, navigation.entries()[0]);
+ assert_equals(navigation.entries().length, start_length);
+ assert_equals(first_entry, navigation.entries()[start_index]);
history.replaceState(2, "", "#2");
let second_entry = navigation.currentEntry;
@@ -24,8 +26,8 @@ test(() => {
assert_true(isUUID(second_entry.id));
assert_equals(second_entry.url, location.href);
assert_true(second_entry.sameDocument);
- assert_equals(navigation.entries().length, 1);
- assert_equals(second_entry, navigation.entries()[0]);
+ assert_equals(navigation.entries().length, start_length);
+ assert_equals(second_entry, navigation.entries()[start_index]);
history.pushState(3, "", "#3");
let third_entry = navigation.currentEntry;
@@ -36,8 +38,8 @@ test(() => {
assert_true(isUUID(third_entry.id));
assert_equals(third_entry.url, location.href);
assert_true(third_entry.sameDocument);
- assert_equals(navigation.entries().length, 2);
- assert_equals(third_entry, navigation.entries()[1]);
+ assert_equals(navigation.entries().length, start_length + 1);
+ assert_equals(third_entry, navigation.entries()[start_index + 1]);
history.pushState(4, "");
let fourth_entry = navigation.currentEntry;
@@ -48,8 +50,8 @@ test(() => {
assert_true(isUUID(fourth_entry.id));
assert_equals(fourth_entry.url, third_entry.url);
assert_true(fourth_entry.sameDocument);
- assert_equals(navigation.entries().length, 3);
- assert_equals(fourth_entry, navigation.entries()[2]);
+ assert_equals(navigation.entries().length, start_length + 2);
+ assert_equals(fourth_entry, navigation.entries()[start_index + 2]);
history.replaceState(5, "");
let fifth_entry = navigation.currentEntry;
@@ -60,8 +62,8 @@ test(() => {
assert_true(isUUID(fifth_entry.id));
assert_equals(fifth_entry.url, fourth_entry.url);
assert_true(fifth_entry.sameDocument);
- assert_equals(navigation.entries().length, 3);
- assert_equals(fifth_entry, navigation.entries()[2]);
+ assert_equals(navigation.entries().length, start_length + 2);
+ assert_equals(fifth_entry, navigation.entries()[start_index + 2]);
history.pushState(5, "");
let fifth_entry_after_push = navigation.currentEntry;
@@ -72,8 +74,8 @@ test(() => {
assert_true(isUUID(fifth_entry_after_push.id));
assert_equals(fifth_entry_after_push.url, fifth_entry.url);
assert_true(fifth_entry_after_push.sameDocument);
- assert_equals(navigation.entries().length, 4);
- assert_equals(fifth_entry_after_push, navigation.entries()[3]);
+ assert_equals(navigation.entries().length, start_length + 3);
+ assert_equals(fifth_entry_after_push, navigation.entries()[start_index + 3]);
history.replaceState(5, "");
let fifth_entry_after_replace = navigation.currentEntry;
@@ -84,8 +86,8 @@ test(() => {
assert_true(isUUID(fifth_entry_after_replace.id));
assert_equals(fifth_entry_after_replace.url, fifth_entry_after_push.url);
assert_true(fifth_entry_after_replace.sameDocument);
- assert_equals(navigation.entries().length, 4);
- assert_equals(fifth_entry_after_replace, navigation.entries()[3]);
+ assert_equals(navigation.entries().length, start_length + 3);
+ assert_equals(fifth_entry_after_replace, navigation.entries()[start_index + 3]);
location.hash = "6";
let sixth_entry = navigation.currentEntry;
@@ -96,8 +98,8 @@ test(() => {
assert_true(isUUID(sixth_entry.id));
assert_not_equals(sixth_entry.url, fifth_entry_after_replace.url);
assert_true(sixth_entry.sameDocument);
- assert_equals(navigation.entries().length, 4);
- assert_equals(sixth_entry, navigation.entries()[3]);
+ assert_equals(navigation.entries().length, start_length + 3);
+ assert_equals(sixth_entry, navigation.entries()[start_index + 3]);
navigation.entries().forEach(entry => {
assert_true(isUUID(entry.id));
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/entries-after-navigations-in-multiple-windows.html b/tests/wpt/tests/navigation-api/navigation-history-entry/entries-after-navigations-in-multiple-windows.html
index d1d4d86eb38..8cba4c80b7e 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/entries-after-navigations-in-multiple-windows.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/entries-after-navigations-in-multiple-windows.html
@@ -5,6 +5,7 @@
<iframe id="i" src="/common/blank.html"></iframe>
<script>
async_test(t => {
+ let start_index = navigation.currentEntry.index;
// The navigations in each window should have only added an navigation to
// their own window.
function assertExpectedEntries(entries, expected_url) {
@@ -25,7 +26,7 @@ async_test(t => {
window.onload = () => t.step_timeout(t.step_func(() => {
location.hash = "#1";
i.onload = t.step_func_done(() => {
- assertExpectedEntries(navigation.entries(), location.href);
+ assertExpectedEntries(navigation.entries().slice(start_index), location.href);
assertExpectedEntries(i.contentWindow.navigation.entries(), i.contentWindow.location.href);
});
i.contentWindow.location = "/common/blank.html?2";
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/entries-when-inactive.html b/tests/wpt/tests/navigation-api/navigation-history-entry/entries-when-inactive.html
index c70b6d8bf87..1130f69800f 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/entries-when-inactive.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/entries-when-inactive.html
@@ -3,14 +3,15 @@
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(t => {
- const first_entry = navigation.entries()[0];
+ let start_index = navigation.currentEntry.index;
+ const first_entry = navigation.entries()[start_index];
history.pushState(1, "", "#1");
- assert_equals(navigation.entries()[0], first_entry);
+ assert_equals(navigation.entries()[start_index], first_entry);
history.back();
window.onpopstate = t.step_func_done(() => {
- const second_entry = navigation.entries()[1];
+ const second_entry = navigation.entries()[start_index + 1];
history.replaceState(0, "", "#0");
- assert_equals(navigation.entries()[1], second_entry);
+ assert_equals(navigation.entries()[start_index + 1], second_entry);
});
}, "A non-active entry in navigation.entries() should not be modified when a different entry is modified");
</script>
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/index-not-in-entries.html b/tests/wpt/tests/navigation-api/navigation-history-entry/index-not-in-entries.html
index a16d130ba16..021848f1a3e 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/index-not-in-entries.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/index-not-in-entries.html
@@ -4,12 +4,14 @@
<iframe id="i" src="/common/blank.html"></iframe>
<script>
async_test(t => {
+ let start_index = navigation.currentEntry.index;
+
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
window.onload = () => t.step_timeout(t.step_func_done(() => {
// Remove the entry by replacing it.
let replaced_entry = navigation.currentEntry;
- assert_equals(replaced_entry.index, 0);
+ assert_equals(replaced_entry.index, start_index);
navigation.navigate("#0", { history: "replace" });
assert_equals(replaced_entry.index, -1);
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-cross-document.html b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-cross-document.html
index 2dd58c03e9d..efede38ab31 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-cross-document.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-cross-document.html
@@ -4,12 +4,13 @@
<iframe id="i" src="resources/key-navigate-back-cross-document-helper.html"></iframe>
<script>
async_test(t => {
+ let start_length = navigation.entries().length;
window.finish = t.step_func_done((end_key, end_id) => {
assert_equals(window.start_key, end_key);
assert_equals(window.start_id, end_id);
// The new history entry in the iframe should not add any entries to
// this window's navigation.
- assert_equals(navigation.entries().length, 1);
+ assert_equals(navigation.entries().length, start_length);
});
}, "NavigationHistoryEntry's key and id on cross-document back navigation");
</script>
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-same-document.html b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-same-document.html
index 858b5fd2c89..d3c0252fdbb 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-same-document.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-back-same-document.html
@@ -3,21 +3,22 @@
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(t => {
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
let key = navigation.currentEntry.key;
let id = navigation.currentEntry.id;
- assert_equals(navigation.entries().length, 1);
history.pushState("hash", "", "#hash");
assert_not_equals(key, navigation.currentEntry.key);
assert_not_equals(id, navigation.currentEntry.id);
- assert_equals(navigation.entries().length, 2);
- assert_equals(navigation.currentEntry.index, 1);
+ assert_equals(navigation.entries().length, start_length + 1);
+ assert_equals(navigation.currentEntry.index, start_index + 1);
window.onpopstate = t.step_func_done(() => {
assert_equals(key, navigation.currentEntry.key);
assert_equals(id, navigation.currentEntry.id);
- assert_equals(navigation.entries().length, 2);
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.entries().length, start_length + 1);
+ assert_equals(navigation.currentEntry.index, start_index);
});
history.back();
}, "NavigationHistoryEntry's key and id on same-document back navigation");
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-reload.html b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-reload.html
index f950e2f3a21..aacd8a28598 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-reload.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-reload.html
@@ -4,6 +4,7 @@
<iframe id="i" src="/common/blank.html"></iframe>
<script>
async_test(t => {
+ let start_length = navigation.entries().length;
window.onload = t.step_func(() => {
let key = i.contentWindow.navigation.currentEntry.key;
let id = i.contentWindow.navigation.currentEntry.id;
@@ -11,7 +12,7 @@ async_test(t => {
i.onload = t.step_func_done(() => {
assert_equals(key, i.contentWindow.navigation.currentEntry.key);
assert_equals(id, i.contentWindow.navigation.currentEntry.id);
- assert_equals(navigation.entries().length, 1);
+ assert_equals(navigation.entries().length, start_length);
});
});
}, "NavigationHistoryEntry's key and id after location.reload()");
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-replace.html b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-replace.html
index a58772a7f47..d741049c44d 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-replace.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/key-id-location-replace.html
@@ -4,6 +4,7 @@
<iframe id="i" src="/common/blank.html"></iframe>
<script>
async_test(t => {
+ let start_length = navigation.entries().length;
window.onload = t.step_func(() => {
let key = i.contentWindow.navigation.currentEntry.key;
let id = i.contentWindow.navigation.currentEntry.id;
@@ -11,7 +12,7 @@ async_test(t => {
i.onload = t.step_func_done(() => {
assert_equals(key, i.contentWindow.navigation.currentEntry.key);
assert_not_equals(id, i.contentWindow.navigation.currentEntry.id);
- assert_equals(navigation.entries().length, 1);
+ assert_equals(navigation.entries().length, start_length);
});
});
}, "NavigationHistoryEntry's key and id after location.replace()");
diff --git a/tests/wpt/tests/navigation-api/navigation-history-entry/sameDocument-after-fragment-navigate.html b/tests/wpt/tests/navigation-api/navigation-history-entry/sameDocument-after-fragment-navigate.html
index a197f825d8e..1c0cd6e8253 100644
--- a/tests/wpt/tests/navigation-api/navigation-history-entry/sameDocument-after-fragment-navigate.html
+++ b/tests/wpt/tests/navigation-api/navigation-history-entry/sameDocument-after-fragment-navigate.html
@@ -3,6 +3,9 @@
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(t => {
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
+
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
window.onload = () => t.step_timeout(t.step_func_done(() => {
@@ -21,10 +24,10 @@ async_test(t => {
assert_true(entry1.sameDocument);
assert_true(entry2.sameDocument);
- assert_equals(navigation.entries().length, 3);
- assert_equals(navigation.entries()[0], entry1);
- assert_equals(navigation.entries()[1], entry2);
- assert_equals(navigation.entries()[2], entry3);
+ assert_equals(navigation.entries().length, start_length + 2);
+ assert_equals(navigation.entries()[start_index], entry1);
+ assert_equals(navigation.entries()[start_index + 1], entry2);
+ assert_equals(navigation.entries()[start_index + 2], entry3);
}), 0);
}, "entry.sameDocument after same-document navigations");
</script>
diff --git a/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-before-popstate-intercept.html b/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-before-popstate-intercept.html
index c51c7c444cb..10627c58754 100644
--- a/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-before-popstate-intercept.html
+++ b/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-before-popstate-intercept.html
@@ -3,11 +3,12 @@
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(async t => {
+ let start_length = navigation.entries().length;
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
await navigation.navigate("#foo").committed;
- assert_equals(navigation.entries().length, 2);
+ assert_equals(navigation.entries().length, start_length + 1);
navigation.onnavigate = e => e.intercept();
diff --git a/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-dispose-ordering.html b/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-dispose-ordering.html
index 4ca9ba29800..ecca39e6a0a 100644
--- a/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-dispose-ordering.html
+++ b/tests/wpt/tests/navigation-api/ordering-and-transition/currententrychange-dispose-ordering.html
@@ -3,6 +3,7 @@
<script src="/resources/testharnessreport.js"></script>
<script>
test(t => {
+ let start_index = navigation.currentEntry.index;
let oncurrententrychange_called = false;
let ondispose_called = false;
@@ -17,7 +18,7 @@ test(t => {
assert_equals(e.from, original_entry);
assert_equals(e.from.index, -1);
assert_equals(e.navigationType, "replace");
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
});
navigation.navigate("#foo", { history: "replace" });
assert_true(oncurrententrychange_called);
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-full-session-history.tentative.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-full-session-history.tentative.html
index 9bed225cf36..6f5007ac569 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-full-session-history.tentative.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-full-session-history.tentative.html
@@ -6,9 +6,8 @@ promise_test(async (t) => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(r => window.onload = () => t.step_timeout(r, 0));
- assert_equals(navigation.entries().length, 1);
- let dispose_promise = new Promise(r => navigation.entries()[0].ondispose = r);
+ let dispose_promise = new Promise(r => navigation.currentEntry.ondispose = r);
// There is no spec for the maximum number of joint session history entries
// (hence this is a .tentative.html test). However, all(?) browsers have a
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-navigation-in-child.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-navigation-in-child.html
index 24828770852..d351fad6c08 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-navigation-in-child.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-for-navigation-in-child.html
@@ -7,20 +7,22 @@ promise_test(async (t) => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(r => window.onload = () => t.step_timeout(r, 0));
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
await iframe.contentWindow.navigation.navigate("#a");
await navigation.navigate("#1").finished;
await navigation.navigate("#2").finished;
await navigation.navigate("#3").finished;
await iframe.contentWindow.navigation.back().finished;
- assert_equals(navigation.entries().length, 4);
+ assert_equals(navigation.entries().length, start_length + 3);
assert_equals(iframe.contentWindow.navigation.entries().length, 2);
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
assert_equals(iframe.contentWindow.navigation.currentEntry.index, 0);
- let top_entry_0_before = navigation.entries()[0];
+ let top_entry_0_before = navigation.entries()[start_index];
let dispose_promises = [];
- for (let i = 1; i < navigation.entries().length; i++) {
+ for (let i = start_index + 1; i < navigation.entries().length; i++) {
dispose_promises.push(new Promise(r => navigation.entries()[i].ondispose = r))
}
@@ -31,11 +33,11 @@ promise_test(async (t) => {
// top window should have dispose events, even though that wasn't the window
// that navigated.
await Promise.all(dispose_promises);
- assert_equals(navigation.entries().length, 1);
+ assert_equals(navigation.entries().length, start_length);
assert_equals(iframe.contentWindow.navigation.entries().length, 2);
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
assert_equals(iframe.contentWindow.navigation.currentEntry.index, 1);
- assert_equals(navigation.entries()[0], top_entry_0_before);
+ assert_equals(navigation.entries()[start_index], top_entry_0_before);
}, "Dispose events should fire when entries are removed by a navigation in a different frame");
</script>
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-intercept.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-intercept.html
index 44aa096aafe..862e01127be 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-intercept.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-intercept.html
@@ -6,13 +6,15 @@ promise_test(async (t) => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(r => window.onload = () => t.step_timeout(r, 0));
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
location.hash = "#1";
location.hash = "#2";
location.hash = "#3";
- assert_equals(navigation.entries().length, 4);
- const [entry0, entry1, entry2, entry3] = navigation.entries();
+ assert_equals(navigation.entries().length, start_length + 3);
+ const [entry0, entry1, entry2, entry3] = navigation.entries().slice(start_index);
assert_equals((new URL(entry2.url)).hash, "#2");
assert_equals((new URL(entry3.url)).hash, "#3");
@@ -26,7 +28,7 @@ promise_test(async (t) => {
assert_equals(e.composed, false);
assert_array_equals(
- navigation.entries(),
+ navigation.entries().slice(start_index),
[entry0, entry1, navigation.currentEntry],
"entries() is updated during dispose for entry 2");
assert_not_equals(navigation.currentEntry, entry1, "current entry must be updated during dispose for entry 3");
@@ -41,7 +43,7 @@ promise_test(async (t) => {
assert_true(dispose2Called, "dispose for entry 2 must have happened before entry 3");
assert_array_equals(
- navigation.entries(),
+ navigation.entries().slice(start_index),
[entry0, entry1, navigation.currentEntry],
"entries() is updated during dispose for entry 3");
assert_not_equals(navigation.currentEntry, entry1, "current entry must be updated during dispose for entry 3");
@@ -60,8 +62,8 @@ promise_test(async (t) => {
navigation.navigate("#fork");
- assert_equals(navigation.entries().length, 3);
- const [finalEntry0, finalEntry1, finalEntry2] = navigation.entries();
+ assert_equals(navigation.entries().length, start_length + 2);
+ const [finalEntry0, finalEntry1, finalEntry2] = navigation.entries().slice(start_index);
assert_equals(finalEntry0, entry0);
assert_equals(finalEntry1, entry1);
assert_not_equals(finalEntry2, entry2);
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-navigate-during.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-navigate-during.html
index 59d9b3cce39..88eb35c225f 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-navigate-during.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-navigate-during.html
@@ -6,13 +6,15 @@ promise_test(async (t) => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(r => window.onload = () => t.step_timeout(r, 0));
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
location.hash = "#1";
location.hash = "#2";
location.hash = "#3";
- assert_equals(navigation.entries().length, 4);
- const [entry0, entry1, entry2, entry3] = navigation.entries();
+ assert_equals(navigation.entries().length, start_length + 3);
+ const [entry0, entry1, entry2, entry3] = navigation.entries().slice(start_index);
assert_equals((new URL(entry2.url)).hash, "#2");
assert_equals((new URL(entry3.url)).hash, "#3");
@@ -37,8 +39,8 @@ promise_test(async (t) => {
assert_equals(dispose3Called, 1, "dispose for entry 3 must happen exactly once (final check)");
- assert_equals(navigation.entries().length, 4);
- const [finalEntry0, finalEntry1, finalEntry2, finalEntry3] = navigation.entries();
+ assert_equals(navigation.entries().length, start_length + 3);
+ const [finalEntry0, finalEntry1, finalEntry2, finalEntry3] = navigation.entries().slice(start_index);
assert_equals(finalEntry0, entry0);
assert_equals(finalEntry1, entry1);
assert_not_equals(finalEntry2, entry2);
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replace-with-intercept.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replace-with-intercept.html
index 4e492e30aed..7814543e714 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replace-with-intercept.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replace-with-intercept.html
@@ -8,7 +8,6 @@ promise_test(async (t) => {
// automatically before the load event completes.
await new Promise(r => window.onload = () => t.step_timeout(r, 0));
- const entriesBefore = navigation.entries();
const currentBefore = navigation.currentEntry;
let disposeCalled = false;
@@ -21,10 +20,10 @@ promise_test(async (t) => {
assert_equals(e.composed, false);
assert_not_equals(navigation.currentEntry, currentBefore);
- assert_array_equals(navigation.entries(), [navigation.currentEntry]);
+ assert_array_equals(navigation.entries().slice(navigation.currentEntry.index), [navigation.currentEntry]);
assert_equals((new URL(navigation.currentEntry.url)).search, "?replacement");
assert_equals(navigation.transition.navigationType, "replace");
- assert_equals(navigation.transition.from, entriesBefore[0]);
+ assert_equals(navigation.transition.from, currentBefore);
assert_equals(location.search, "?replacement");
});
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replaceState.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replaceState.html
index a6197260a28..78df25774c3 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replaceState.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document-replaceState.html
@@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script>
test(t => {
- const entriesBefore = navigation.entries();
+ let start_index = navigation.currentEntry.index;
+
const currentBefore = navigation.currentEntry;
let disposeCalled = false;
@@ -16,7 +17,7 @@ test(t => {
assert_equals(e.composed, false);
assert_not_equals(navigation.currentEntry, currentBefore);
- assert_array_equals(navigation.entries(), [navigation.currentEntry]);
+ assert_array_equals(navigation.entries().slice(start_index), [navigation.currentEntry]);
assert_equals((new URL(navigation.currentEntry.url)).search, "?replacement");
assert_equals(navigation.transition, null);
assert_equals(location.search, "?replacement");
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document.html
index 27806ce3c86..e41403e773c 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-same-document.html
@@ -6,13 +6,15 @@ promise_test(async (t) => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(r => window.onload = () => t.step_timeout(r, 0));
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
location.hash = "#1";
location.hash = "#2";
location.hash = "#3";
- assert_equals(navigation.entries().length, 4);
- const [entry0, entry1, entry2, entry3] = navigation.entries();
+ assert_equals(navigation.entries().length, start_length + 3);
+ const [entry0, entry1, entry2, entry3] = navigation.entries().slice(start_index);
assert_equals((new URL(entry2.url)).hash, "#2");
assert_equals((new URL(entry3.url)).hash, "#3");
@@ -26,7 +28,7 @@ promise_test(async (t) => {
assert_equals(e.composed, false);
assert_array_equals(
- navigation.entries(),
+ navigation.entries().slice(start_index),
[entry0, entry1, navigation.currentEntry],
"entries() is updated during dispose for entry 2");
assert_not_equals(navigation.currentEntry, entry1, "current entry must be updated during dispose for entry 3");
@@ -40,7 +42,7 @@ promise_test(async (t) => {
assert_true(dispose2Called, "dispose for entry 2 must have happened before entry 3");
assert_array_equals(
- navigation.entries(),
+ navigation.entries().slice(start_index),
[entry0, entry1, navigation.currentEntry],
"entries() is updated during dispose for entry 3");
assert_not_equals(navigation.currentEntry, entry1, "current entry must be updated during dispose for entry 3");
@@ -54,8 +56,8 @@ promise_test(async (t) => {
navigation.navigate("#fork");
- assert_equals(navigation.entries().length, 3);
- const [finalEntry0, finalEntry1, finalEntry2] = navigation.entries();
+ assert_equals(navigation.entries().length, start_length + 2);
+ const [finalEntry0, finalEntry1, finalEntry2] = navigation.entries().slice(start_index);
assert_equals(finalEntry0, entry0);
assert_equals(finalEntry1, entry1);
assert_not_equals(finalEntry2, entry2);
diff --git a/tests/wpt/tests/navigation-api/per-entry-events/dispose-skip-current-on-truncate.html b/tests/wpt/tests/navigation-api/per-entry-events/dispose-skip-current-on-truncate.html
index 56ec4d301f9..bcf0ee3b79e 100644
--- a/tests/wpt/tests/navigation-api/per-entry-events/dispose-skip-current-on-truncate.html
+++ b/tests/wpt/tests/navigation-api/per-entry-events/dispose-skip-current-on-truncate.html
@@ -3,11 +3,14 @@
<script src="/resources/testharnessreport.js"></script>
<script>
promise_test(async (t) => {
+ let start_length = navigation.entries().length;
+ let start_index = navigation.currentEntry.index;
+
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
await new Promise(r => window.onload = () => t.step_timeout(r, 0));
await navigation.navigate("#1").finished;
- assert_equals(navigation.entries().length, 2);
+ assert_equals(navigation.entries().length, start_length + 1);
let iframe = document.createElement("iframe");
iframe.src = "/common/blank.html";
@@ -19,22 +22,22 @@ promise_test(async (t) => {
// document, but we will be at a joint session history entry that was created
// before the iframe was added to the document.
await navigation.back().finished;
- assert_equals(navigation.entries().length, 2);
+ assert_equals(navigation.entries().length, start_length + 1);
assert_equals(iframe.contentWindow.navigation.entries().length, 1);
- assert_equals(navigation.currentEntry.index, 0);
+ assert_equals(navigation.currentEntry.index, start_index);
assert_equals(iframe.contentWindow.navigation.currentEntry.index, 0);
// A push navigation in the top window will truncate-then-push the joint
// session history. This should dispose the forward entry in the top window,
// but should not interfere with the currentEntry in the iframe.
- let dispose_promise = new Promise(r => navigation.entries()[1].ondispose = r);
+ let dispose_promise = new Promise(r => navigation.entries()[start_index + 1].ondispose = r);
iframe.contentWindow.navigation.currentEntry.ondispose = t.unreached_func("iframe entry must not be disposed");
await navigation.navigate("#b").finished;
await dispose_promise;
- assert_equals(navigation.entries().length, 2);
+ assert_equals(navigation.entries().length, start_length + 1);
assert_equals(iframe.contentWindow.navigation.entries().length, 1);
- assert_equals(navigation.currentEntry.index, 1);
+ assert_equals(navigation.currentEntry.index, start_index + 1);
assert_equals(iframe.contentWindow.navigation.currentEntry.index, 0);
}, "Removing a currentEntry from the joint session history shouldn't dispose it");
</script>
diff --git a/tests/wpt/tests/navigation-api/state/same-document-away-and-back-location-api.html b/tests/wpt/tests/navigation-api/state/same-document-away-and-back-location-api.html
index d161df8b529..ddc90eef8c5 100644
--- a/tests/wpt/tests/navigation-api/state/same-document-away-and-back-location-api.html
+++ b/tests/wpt/tests/navigation-api/state/same-document-away-and-back-location-api.html
@@ -6,7 +6,9 @@ async_test(t => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
window.onload = () => t.step_timeout(async () => {
+ let start_length = navigation.entries().length;
let entry0 = navigation.currentEntry;
+ let start_index = entry0.index;
let navState = { statevar: "state" };
await navigation.navigate("#1", { state: navState });
@@ -15,10 +17,10 @@ async_test(t => {
location.href = "#2";
let entry2 = navigation.currentEntry;
- assert_equals(navigation.entries().length, 3);
- assert_equals(entry0, navigation.entries()[0]);
- assert_equals(entry1, navigation.entries()[1]);
- assert_equals(entry2, navigation.entries()[2]);
+ assert_equals(navigation.entries().length, start_length + 2);
+ assert_equals(entry0, navigation.entries()[start_index]);
+ assert_equals(entry1, navigation.entries()[start_index + 1]);
+ assert_equals(entry2, navigation.entries()[start_index + 2]);
assert_equals(entry0.getState(), undefined);
@@ -34,9 +36,9 @@ async_test(t => {
history.back();
window.onpopstate = t.step_func_done(() => {
- assert_equals(navigation.entries().length, 3);
+ assert_equals(navigation.entries().length, start_length + 2);
let back_entry = navigation.currentEntry;
- assert_equals(back_entry, navigation.entries()[1]);
+ assert_equals(back_entry, navigation.entries()[start_index + 1]);
let back_state = back_entry.getState();
assert_not_equals(back_state, state1);
assert_not_equals(back_state, state2);
diff --git a/tests/wpt/tests/navigation-api/state/same-document-away-and-back-navigation-api.html b/tests/wpt/tests/navigation-api/state/same-document-away-and-back-navigation-api.html
index 220908e4c46..cfb7765b0d5 100644
--- a/tests/wpt/tests/navigation-api/state/same-document-away-and-back-navigation-api.html
+++ b/tests/wpt/tests/navigation-api/state/same-document-away-and-back-navigation-api.html
@@ -6,7 +6,9 @@ async_test(t => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
window.onload = () => t.step_timeout(async () => {
+ let start_length = navigation.entries().length;
let entry0 = navigation.currentEntry;
+ let start_index = entry0.index;
let navState = { statevar: "state" };
await navigation.navigate("#1", { state: navState }).committed;
@@ -17,10 +19,10 @@ async_test(t => {
let entry2 = navigation.currentEntry;
t.step_func(() => {
- assert_equals(navigation.entries().length, 3);
- assert_equals(entry0, navigation.entries()[0]);
- assert_equals(entry1, navigation.entries()[1]);
- assert_equals(entry2, navigation.entries()[2]);
+ assert_equals(navigation.entries().length, start_length + 2);
+ assert_equals(entry0, navigation.entries()[start_index]);
+ assert_equals(entry1, navigation.entries()[start_index + 1]);
+ assert_equals(entry2, navigation.entries()[start_index + 2]);
assert_equals(entry0.getState(), undefined);
@@ -38,9 +40,9 @@ async_test(t => {
navigation.back();
window.onpopstate = t.step_func_done(() => {
- assert_equals(navigation.entries().length, 3);
+ assert_equals(navigation.entries().length, start_length + 2);
let back_entry = navigation.currentEntry;
- assert_equals(back_entry, navigation.entries()[1]);
+ assert_equals(back_entry, navigation.entries()[start_index + 1]);
let back_state = back_entry.getState();
assert_not_equals(back_state, state1);
assert_not_equals(back_state, state2);
diff --git a/tests/wpt/tests/navigation-api/updateCurrentEntry-method/same-document-away-and-back-location-api.html b/tests/wpt/tests/navigation-api/updateCurrentEntry-method/same-document-away-and-back-location-api.html
index 47b1904f4f4..04b615cf831 100644
--- a/tests/wpt/tests/navigation-api/updateCurrentEntry-method/same-document-away-and-back-location-api.html
+++ b/tests/wpt/tests/navigation-api/updateCurrentEntry-method/same-document-away-and-back-location-api.html
@@ -6,7 +6,9 @@ async_test(t => {
// Wait for after the load event so that the navigation doesn't get converted
// into a replace navigation.
window.onload = () => t.step_timeout(async () => {
+ let start_length = navigation.entries().length;
let entry0 = navigation.currentEntry;
+ let start_index = entry0.index;
let navState = { statevar: "state" };
navigation.updateCurrentEntry({ state: navState });
@@ -15,9 +17,9 @@ async_test(t => {
location.href = "#2";
let entry1 = navigation.currentEntry;
- assert_equals(navigation.entries().length, 2);
- assert_equals(entry0, navigation.entries()[0]);
- assert_equals(entry1, navigation.entries()[1]);
+ assert_equals(navigation.entries().length, start_length + 1);
+ assert_equals(entry0, navigation.entries()[start_index]);
+ assert_equals(entry1, navigation.entries()[start_index + 1]);
assert_equals(entry0.getState().statevar, "state");
assert_not_equals(entry0.getState(), navState);
@@ -28,7 +30,7 @@ async_test(t => {
history.back();
window.onpopstate = t.step_func_done(() => {
- assert_equals(navigation.entries().length, 2);
+ assert_equals(navigation.entries().length, start_length + 1);
let back_entry = navigation.currentEntry;
assert_equals(back_entry, entry0);
let back_state = back_entry.getState();
diff --git a/tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html b/tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html
new file mode 100644
index 00000000000..6254b3247e2
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html
@@ -0,0 +1,36 @@
+<!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='../../mediacapture-streams/permission-helper.js'></script>
+ <script src='/reporting/resources/report-helper.js'></script>
+ </head>
+ <body>
+ <script>
+ const base_url = `${location.protocol}//${location.host}`;
+ const endpoint = `${base_url}/reporting/resources/report.py`;
+ const enforcing_id = '69c90b97-8b7c-4439-b5d2-ff03f237b2b2';
+ const report_only_id = '9d095a14-6b1c-40e1-be19-55a1fec97d11';
+
+ promise_test(async t => {
+ await setMediaPermission("granted", ["camera","microphone"]);
+ await promise_rejects_dom(
+ t, "NotAllowedError", navigator.mediaDevices.getUserMedia({video: true}),
+ "UserMedia camera access should not be allowed in this document.");
+ while(true) {
+ await wait(100);
+ const reports = await pollReports(endpoint, enforcing_id);
+ if (reports.length) {
+ checkReportExists(reports, 'permissions-policy-violation', location.href);
+ break;
+ }
+ }
+ const report_only_reports = await pollReports(endpoint, report_only_id);
+ assert_equals(report_only_reports.length, 0, "Report-only endpoint should not receive report.");
+ }, "Enforcing policy receives reports when both enforcing and report-only policies are set.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html.sub.headers b/tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html.sub.headers
new file mode 100644
index 00000000000..48f483dd45e
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/reporting/report-only-and-enforce.https.sub.html.sub.headers
@@ -0,0 +1,3 @@
+Permissions-Policy: camera=();report-to=enforcing-endpoint
+Permissions-Policy-Report-Only: camera=();report-to=report-only-endpoint
+Reporting-Endpoints: enforcing-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=69c90b97-8b7c-4439-b5d2-ff03f237b2b2", report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=9d095a14-6b1c-40e1-be19-55a1fec97d11"
diff --git a/tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html b/tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html
new file mode 100644
index 00000000000..7f9bad40cbb
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html
@@ -0,0 +1,32 @@
+<!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='../../mediacapture-streams/permission-helper.js'></script>
+ <script src='/reporting/resources/report-helper.js'></script>
+ </head>
+ <body>
+ <script>
+ const base_url = `${location.protocol}//${location.host}`;
+ const endpoint = `${base_url}/reporting/resources/report.py`;
+ const id = 'c3841a1a-e750-4801-a50b-c4222d386515';
+
+ promise_test(async t => {
+ await setMediaPermission("granted", ["camera","microphone"]);
+ // This should not throw, as the enforcing policy does not block it.
+ await navigator.mediaDevices.getUserMedia({video: true});
+ while(true) {
+ await wait(100);
+ const reports = await pollReports(endpoint, id);
+ if (reports.length) {
+ checkReportExists(reports, 'permissions-policy-violation', location.href);
+ break;
+ }
+ }
+ }, "Reporting-Endpoints defined endpoint received reports in report-only mode.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html.sub.headers b/tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html.sub.headers
new file mode 100644
index 00000000000..881eaba1493
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/reporting/report-only-single-endpoint.https.sub.html.sub.headers
@@ -0,0 +1,2 @@
+Permissions-Policy-Report-Only: camera=();report-to=camera-endpoint
+Reporting-Endpoints: camera-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c3841a1a-e750-4801-a50b-c4222d386515"
diff --git a/tests/wpt/tests/resources/chromium/generic_sensor_mocks.js b/tests/wpt/tests/resources/chromium/generic_sensor_mocks.js
index 98a29c2104f..5ca8dc0173b 100644
--- a/tests/wpt/tests/resources/chromium/generic_sensor_mocks.js
+++ b/tests/wpt/tests/resources/chromium/generic_sensor_mocks.js
@@ -1,5 +1,6 @@
import {ReportingMode, Sensor, SensorClientRemote, SensorReceiver, SensorRemote, SensorType} from '/gen/services/device/public/mojom/sensor.mojom.m.js';
-import {SensorCreationResult, SensorInitParams_READ_BUFFER_SIZE_FOR_TESTS, SensorProvider, SensorProviderReceiver} from '/gen/services/device/public/mojom/sensor_provider.mojom.m.js';
+import {SensorCreationResult, SensorInitParams_READ_BUFFER_SIZE_FOR_TESTS} from '/gen/services/device/public/mojom/sensor_provider.mojom.m.js';
+import {WebSensorProvider, WebSensorProviderReceiver} from '/gen/third_party/blink/public/mojom/sensor/web_sensor_provider.mojom.m.js';
// A "sliding window" that iterates over |data| and returns one item at a
// time, advancing and wrapping around as needed. |data| must be an array of
@@ -287,8 +288,8 @@ self.GenericSensorTest = (() => {
}
}
- // Class that mocks SensorProvider interface defined in
- // https://cs.chromium.org/chromium/src/services/device/public/mojom/sensor_provider.mojom
+ // Class that mocks the WebSensorProvider interface defined in
+ // https://cs.chromium.org/chromium/src/third_party/blink/public/mojom/sensor/web_sensor_provider.mojom
class MockSensorProvider {
constructor() {
this.readingSizeInBytes_ =
@@ -334,10 +335,10 @@ self.GenericSensorTest = (() => {
SensorType.RELATIVE_ORIENTATION_EULER_ANGLES],
['ProximitySensor', SensorType.PROXIMITY]
]);
- this.receiver_ = new SensorProviderReceiver(this);
+ this.receiver_ = new WebSensorProviderReceiver(this);
this.interceptor_ =
- new MojoInterfaceInterceptor(SensorProvider.$interfaceName);
+ new MojoInterfaceInterceptor(WebSensorProvider.$interfaceName);
this.interceptor_.oninterfacerequest = e => {
this.bindToPipe(e.handle);
};
diff --git a/tests/wpt/tests/soft-navigation-heuristics/keydown.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/keydown.tentative.html
index fac86d71d2c..19971e6d2da 100644
--- a/tests/wpt/tests/soft-navigation-heuristics/keydown.tentative.html
+++ b/tests/wpt/tests/soft-navigation-heuristics/keydown.tentative.html
@@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8">
-<title>Detect hashchange event.</title>
+<title>Detect keyboard-event based soft navigations.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
diff --git a/tests/wpt/tests/soft-navigation-heuristics/keypress.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/keypress.tentative.html
new file mode 100644
index 00000000000..5bd512ec3e7
--- /dev/null
+++ b/tests/wpt/tests/soft-navigation-heuristics/keypress.tentative.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Detect keyboard-event based soft navigations.</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/soft-navigation-helper.js"></script>
+</head>
+<!-- Not including a body element to ensure the keypress heuristic works on
+ malformed HTML -->
+ <main id=main>
+ <div>
+ First LCP!
+ </div>
+ </main>
+ <script>
+ testSoftNavigation({
+ addContent: () => {
+ addTextToDivOnMain();
+ },
+ link: document.body,
+ interactionType: "keypress",
+ eventType: "keypress",
+ test: "Keypress on body triggers SoftNavigationHeuristics"});
+ </script>
+</html>
+
+
diff --git a/tests/wpt/tests/soft-navigation-heuristics/keyup.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/keyup.tentative.html
new file mode 100644
index 00000000000..8b5717d62e9
--- /dev/null
+++ b/tests/wpt/tests/soft-navigation-heuristics/keyup.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Detect keyboard-event based soft navigations.</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/soft-navigation-helper.js"></script>
+</head>
+<!-- Not including a body element to ensure the keyup heuristic works on
+ malformed HTML -->
+ <main id=main>
+ <div>
+ First LCP!
+ </div>
+ </main>
+ <script>
+ testSoftNavigation({
+ addContent: () => {
+ addTextToDivOnMain();
+ },
+ link: document.body,
+ interactionType: "keyup",
+ eventType: "keyup",
+ test: "Keyup on body triggers SoftNavigationHeuristics"});
+ </script>
+</html>
+
diff --git a/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js b/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js
index 7f83df75f8f..1116ebccb35 100644
--- a/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js
+++ b/tests/wpt/tests/soft-navigation-heuristics/resources/soft-navigation-helper.js
@@ -149,7 +149,7 @@ const interact =
const setEvent = (t, button, pushState, addContent, pushUrl, eventType, prepWork) => {
const eventObject =
- (eventType == 'click' || eventType == 'keydown') ? button : window;
+ (eventType == 'click' || eventType.startsWith("key")) ? button : window;
eventObject.addEventListener(eventType, async e => {
if (prepWork &&!prepWork(t)) {
return;
@@ -194,7 +194,8 @@ const validateSoftNavigationEntry = async (clicks, extraValidations,
assert_true(entry.name.includes(pushUrl ? URL : document.location.href),
"The soft navigation name is properly set");
const entryTimestamp = entry.startTime;
- assert_less_than_equal(timestamps[i]["syncPostInteraction"], entryTimestamp);
+ assert_less_than_equal(timestamps[i]["syncPostInteraction"], entryTimestamp,
+ "Entry timestamp is lower than the post interaction one");
assert_greater_than_equal(
timestamps[i]['eventStart'], entryTimestamp,
'Event start timestamp matches');
diff --git a/tests/wpt/tests/svg/types/scripted/SVGLength-px-with-context.html b/tests/wpt/tests/svg/types/scripted/SVGLength-px-with-context.html
index b5c2149b692..7cbe27f83a3 100644
--- a/tests/wpt/tests/svg/types/scripted/SVGLength-px-with-context.html
+++ b/tests/wpt/tests/svg/types/scripted/SVGLength-px-with-context.html
@@ -26,11 +26,11 @@ setup(function() {
function calculateXHeight() {
// Crude hack to calculate the x-height
- var divElement = document.createElement("div");
+ let divElement = document.createElement("div");
divElement.setAttribute("style", "height: 1ex; font-size: 12px; font-family: Ahem;");
- var pElement = document.querySelector("p");
+ let pElement = document.querySelector("p");
pElement.appendChild(divElement);
- var xHeight = divElement.offsetHeight;
+ let xHeight = divElement.offsetHeight;
pElement.removeChild(divElement);
return xHeight;
}
@@ -48,7 +48,7 @@ test(function() {
test(function() {
length.valueAsString = "3px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE);
- var referenceValue = 3 / svgWidth * 100;
+ let referenceValue = 3 / svgWidth * 100;
assert_equals(length.valueAsString, referenceValue + "%");
assert_equals(length.valueInSpecifiedUnits, referenceValue);
assert_equals(length.value, 3);
@@ -56,9 +56,23 @@ test(function() {
}, document.title + ", percentage");
test(function() {
+ let svgElement = document.getElementsByTagName("svg")[0];
+ let viewBox = svgElement.getAttribute("viewBox");
+ svgElement.removeAttribute("viewBox");
+ length.valueAsString = "50%";
+ let referenceValue = svgWidth / 2;
+ assert_equals(length.value, referenceValue);
+ svgElement.width.baseVal.value = 300;
+ referenceValue = svgElement.width.baseVal.value / 2;
+ assert_equals(length.value, referenceValue);
+ svgElement.width.baseVal.value = 150;
+ svgElement.setAttribute("viewBox", viewBox);
+}, document.title + ", changing percentage basis");
+
+test(function() {
length.valueAsString = "6px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_EMS);
- var referenceValue = 6 / fontSize;
+ let referenceValue = 6 / fontSize;
assert_equals(length.valueAsString, referenceValue + "em");
assert_equals(length.valueInSpecifiedUnits, referenceValue);
assert_equals(length.value, 6);
@@ -68,7 +82,7 @@ test(function() {
test(function() {
length.valueAsString = "2px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_EXS);
- var referenceValue = 2 / xHeight;
+ let referenceValue = 2 / xHeight;
// Don't check valueAsString here, it's unreliable across browsers.
assert_approx_equals(length.valueInSpecifiedUnits, referenceValue, 0.1);
assert_approx_equals(length.value, 2.0, 0.1);
@@ -89,7 +103,7 @@ test(function() {
test(function() {
length.valueAsString = "48px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_CM);
- var referenceValue = 48 * 2.54 / cssPixelsPerInch;
+ let referenceValue = 48 * 2.54 / cssPixelsPerInch;
assert_equals(length.valueAsString, referenceValue.toFixed(2) + "cm");
assert_approx_equals(length.valueInSpecifiedUnits, referenceValue, 0.001);
assert_equals(length.value, 48);
@@ -99,7 +113,7 @@ test(function() {
test(function() {
length.valueAsString = "48px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_MM);
- var referenceValue = 48 * 25.4 / cssPixelsPerInch;
+ let referenceValue = 48 * 25.4 / cssPixelsPerInch;
assert_equals(length.valueAsString, referenceValue.toFixed(1) + "mm");
assert_approx_equals(length.valueInSpecifiedUnits, referenceValue, 0.001);
assert_equals(length.value, 48);
@@ -109,7 +123,7 @@ test(function() {
test(function() {
length.valueAsString = "48px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_IN);
- var referenceValue = 48 / cssPixelsPerInch;
+ let referenceValue = 48 / cssPixelsPerInch;
assert_equals(length.valueAsString, referenceValue + "in");
assert_equals(length.valueInSpecifiedUnits, referenceValue);
assert_equals(length.value, 48);
@@ -119,7 +133,7 @@ test(function() {
test(function() {
length.valueAsString = "4px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PT);
- var referenceValue = 4 / cssPixelsPerInch * 72;
+ let referenceValue = 4 / cssPixelsPerInch * 72;
assert_equals(length.valueAsString, referenceValue + "pt");
assert_equals(length.valueInSpecifiedUnits, referenceValue);
assert_equals(length.value, 4);
@@ -129,7 +143,7 @@ test(function() {
test(function() {
length.valueAsString = "16px";
length.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PC);
- var referenceValue = 16 / cssPixelsPerInch * 6;
+ let referenceValue = 16 / cssPixelsPerInch * 6;
// Don't check valueAsString here, it's unreliable across browsers.
assert_equals(length.valueInSpecifiedUnits, referenceValue);
assert_equals(length.value, 16);
diff --git a/tests/wpt/tests/tools/ci/run_tc.py b/tests/wpt/tests/tools/ci/run_tc.py
index a5a6256ad54..b91825497d4 100755
--- a/tests/wpt/tests/tools/ci/run_tc.py
+++ b/tests/wpt/tests/tools/ci/run_tc.py
@@ -140,6 +140,13 @@ def install_certificates():
run(["sudo", "update-ca-certificates"])
+def start_dbus():
+ run(["sudo", "service", "dbus", "start"])
+ # Enable dbus autolaunch for Chrome
+ # https://source.chromium.org/chromium/chromium/src/+/main:content/app/content_main.cc;l=220;drc=0bcc023b8cdbc073aa5c48db373810db3f765c87.
+ os.environ["DBUS_SESSION_BUS_ADDRESS"] = "autolaunch:"
+
+
def install_chrome(channel):
if channel in ("experimental", "dev"):
deb_archive = "google-chrome-unstable_current_amd64.deb"
@@ -257,6 +264,8 @@ def setup_environment(args):
if "chrome" in args.browser:
assert args.channel is not None
install_chrome(args.channel)
+ # Chrome is using dbus for various features.
+ start_dbus()
if args.xvfb:
start_xvfb()
diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py
index 99b26927403..f128b0d089c 100644
--- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py
+++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py
@@ -124,7 +124,8 @@ class Script(BidiModule):
arguments: Optional[List[Mapping[str, Any]]] = None,
this: Optional[Mapping[str, Any]] = None,
result_ownership: Optional[OwnershipModel] = None,
- serialization_options: Optional[SerializationOptions] = None
+ serialization_options: Optional[SerializationOptions] = None,
+ user_activation: Optional[bool] = None
) -> Mapping[str, Any]:
params: MutableMapping[str, Any] = {
"functionDeclaration": function_declaration,
@@ -140,6 +141,8 @@ class Script(BidiModule):
params["resultOwnership"] = result_ownership
if serialization_options is not None:
params["serializationOptions"] = serialization_options
+ if user_activation is not None:
+ params["userActivation"] = user_activation
return params
@call_function.result
@@ -165,7 +168,8 @@ class Script(BidiModule):
target: Target,
await_promise: bool,
result_ownership: Optional[OwnershipModel] = None,
- serialization_options: Optional[SerializationOptions] = None
+ serialization_options: Optional[SerializationOptions] = None,
+ user_activation: Optional[bool] = None
) -> Mapping[str, Any]:
params: MutableMapping[str, Any] = {
"expression": expression,
@@ -177,6 +181,8 @@ class Script(BidiModule):
params["resultOwnership"] = result_ownership
if serialization_options is not None:
params["serializationOptions"] = serialization_options
+ if user_activation is not None:
+ params["userActivation"] = user_activation
return params
@evaluate.result
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
index d91703f42dd..2ef3e18900f 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -117,7 +117,7 @@ def browser_kwargs(logger, test_type, run_info_data, config, subsuite, **kwargs)
"certutil_binary": kwargs["certutil_binary"],
"ca_certificate_path": config.ssl_config["ca_cert_path"],
"e10s": kwargs["gecko_e10s"],
- "enable_fission": run_info_data["fission"],
+ "disable_fission": kwargs["disable_fission"],
"stackfix_dir": kwargs["stackfix_dir"],
"binary_args": kwargs["binary_args"].copy(),
"timeout_multiplier": get_timeout_multiplier(test_type,
@@ -174,6 +174,7 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data,
executor_kwargs["ccov"] = run_info_data.get("ccov", False)
executor_kwargs["browser_version"] = run_info_data.get("browser_version")
executor_kwargs["debug_test"] = kwargs["debug_test"]
+ executor_kwargs["disable_fission"] = kwargs["disable_fission"]
return executor_kwargs
@@ -203,18 +204,13 @@ def run_info_extras(**kwargs):
pref_value = get_bool_pref_if_exists(pref)
return pref_value if pref_value is not None else False
- # Default fission to on, unless we get --[no-]enable-fission or
- # --set-pref fission.autostart=[true|false]
- enable_fission = [item for item in [kwargs.get("enable_fission"),
- get_bool_pref_if_exists("fission.autostart"),
- True] if item is not None][0]
-
+ # Default fission to on, unless we get --disable-fission
rv = {"e10s": kwargs["gecko_e10s"],
"wasm": kwargs.get("wasm", True),
"verify": kwargs["verify"],
"headless": kwargs.get("headless", False) or "MOZ_HEADLESS" in os.environ,
- "fission": enable_fission,
- "sessionHistoryInParent": (enable_fission or
+ "fission": not kwargs.get("disable_fission"),
+ "sessionHistoryInParent": (not kwargs.get("disable_fission") or
not get_bool_pref("fission.disableSessionHistoryInParent")),
"swgl": get_bool_pref("gfx.webrender.software")}
@@ -610,7 +606,7 @@ class FirefoxOutputHandler(OutputHandler):
class ProfileCreator:
def __init__(self, logger, prefs_root, config, test_type, extra_prefs, e10s,
- enable_fission, debug_test, browser_channel, binary, certutil_binary,
+ disable_fission, debug_test, browser_channel, binary, certutil_binary,
ca_certificate_path):
self.logger = logger
self.prefs_root = prefs_root
@@ -618,7 +614,7 @@ class ProfileCreator:
self.test_type = test_type
self.extra_prefs = extra_prefs
self.e10s = e10s
- self.enable_fission = enable_fission
+ self.disable_fission = disable_fission
self.debug_test = debug_test
self.browser_channel = browser_channel
self.ca_certificate_path = ca_certificate_path
@@ -693,9 +689,8 @@ class ProfileCreator:
if self.e10s:
profile.set_preferences({"browser.tabs.remote.autostart": True})
- if self.enable_fission:
- profile.set_preferences({"fission.autostart": True})
- else:
+ profile.set_preferences({"fission.autostart": True})
+ if self.disable_fission:
profile.set_preferences({"fission.autostart": False})
if self.test_type in ("reftest", "print-reftest"):
@@ -707,7 +702,7 @@ class ProfileCreator:
# Bug 1262954: winxp + e10s, disable hwaccel
if (self.e10s and platform.system() in ("Windows", "Microsoft") and
"5.1" in platform.version()):
- self.profile.set_preferences({"layers.acceleration.disabled": True})
+ profile.set_preferences({"layers.acceleration.disabled": True})
if self.debug_test:
profile.set_preferences({"devtools.console.stdout.content": True})
@@ -769,7 +764,7 @@ class FirefoxBrowser(Browser):
def __init__(self, logger, binary, prefs_root, test_type, extra_prefs=None, debug_info=None,
symbols_path=None, stackwalk_binary=None, certutil_binary=None,
- ca_certificate_path=None, e10s=False, enable_fission=True,
+ ca_certificate_path=None, e10s=False, disable_fission=False,
stackfix_dir=None, binary_args=None, timeout_multiplier=None, leak_check=False,
asan=False, chaos_mode_flags=None, config=None,
browser_channel="nightly", headless=None, preload_browser=False,
@@ -799,7 +794,7 @@ class FirefoxBrowser(Browser):
test_type,
extra_prefs,
e10s,
- enable_fission,
+ disable_fission,
debug_test,
browser_channel,
binary,
@@ -872,7 +867,7 @@ class FirefoxWdSpecBrowser(WebDriverBrowser):
def __init__(self, logger, binary, prefs_root, webdriver_binary, webdriver_args,
extra_prefs=None, debug_info=None, symbols_path=None, stackwalk_binary=None,
certutil_binary=None, ca_certificate_path=None, e10s=False,
- enable_fission=False, stackfix_dir=None, leak_check=False,
+ disable_fission=False, stackfix_dir=None, leak_check=False,
asan=False, chaos_mode_flags=None, config=None,
browser_channel="nightly", headless=None, debug_test=False, **kwargs):
@@ -896,7 +891,7 @@ class FirefoxWdSpecBrowser(WebDriverBrowser):
"wdspec",
extra_prefs,
e10s,
- enable_fission,
+ disable_fission,
debug_test,
browser_channel,
binary,
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
index 8437dd20059..1937d97c401 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -62,6 +62,7 @@ def browser_kwargs(logger, test_type, run_info_data, config, **kwargs):
run_info_data,
**kwargs),
"e10s": run_info_data["e10s"],
+ "disable_fission": kwargs["disable_fission"],
# desktop only
"leak_check": False,
"chaos_mode_flags": kwargs["chaos_mode_flags"],
@@ -113,9 +114,9 @@ def get_environ(chaos_mode_flags, env_extras=None):
class ProfileCreator(FirefoxProfileCreator):
def __init__(self, logger, prefs_root, config, test_type, extra_prefs,
- enable_fission, debug_test, browser_channel, certutil_binary, ca_certificate_path):
+ disable_fission, debug_test, browser_channel, certutil_binary, ca_certificate_path):
super().__init__(logger, prefs_root, config, test_type, extra_prefs,
- True, enable_fission, debug_test, browser_channel, None,
+ True, disable_fission, debug_test, browser_channel, None,
certutil_binary, ca_certificate_path)
def _set_required_prefs(self, profile):
@@ -141,6 +142,10 @@ class ProfileCreator(FirefoxProfileCreator):
"layout.testing.overlay-scrollbars.always-visible": True,
})
+ profile.set_preferences({"fission.autostart": True})
+ if self.disable_fission:
+ profile.set_preferences({"fission.autostart": False})
+
class FirefoxAndroidBrowser(Browser):
init_timeout = 300
@@ -153,7 +158,7 @@ class FirefoxAndroidBrowser(Browser):
binary_args=None, timeout_multiplier=None, leak_check=False, asan=False,
chaos_mode_flags=None, config=None, browser_channel="nightly",
install_fonts=False, tests_root=None, specialpowers_path=None, adb_binary=None,
- debug_test=False, **kwargs):
+ debug_test=False, disable_fission=False, **kwargs):
super().__init__(logger)
self.prefs_root = prefs_root
@@ -178,13 +183,14 @@ class FirefoxAndroidBrowser(Browser):
self.tests_root = tests_root
self.specialpowers_path = specialpowers_path
self.adb_binary = adb_binary
+ self.disable_fission = disable_fission
self.profile_creator = ProfileCreator(logger,
prefs_root,
config,
test_type,
extra_prefs,
- False,
+ disable_fission,
debug_test,
browser_channel,
certutil_binary,
@@ -309,7 +315,7 @@ class FirefoxAndroidWdSpecBrowser(FirefoxWdSpecBrowser):
def __init__(self, logger, prefs_root, webdriver_binary, webdriver_args,
extra_prefs=None, debug_info=None, symbols_path=None, stackwalk_binary=None,
certutil_binary=None, ca_certificate_path=None, e10s=False,
- enable_fission=False, stackfix_dir=None, leak_check=False,
+ disable_fission=False, stackfix_dir=None, leak_check=False,
asan=False, chaos_mode_flags=None, config=None,
browser_channel="nightly", headless=None,
package_name="org.mozilla.geckoview.test_runner", device_serial=None,
@@ -319,7 +325,7 @@ class FirefoxAndroidWdSpecBrowser(FirefoxWdSpecBrowser):
extra_prefs=extra_prefs, debug_info=debug_info, symbols_path=symbols_path,
stackwalk_binary=stackwalk_binary, certutil_binary=certutil_binary,
ca_certificate_path=ca_certificate_path, e10s=e10s,
- enable_fission=enable_fission, stackfix_dir=stackfix_dir,
+ disable_fission=disable_fission, stackfix_dir=stackfix_dir,
leak_check=leak_check, asan=asan,
chaos_mode_flags=chaos_mode_flags, config=config,
browser_channel=browser_channel, headless=headless, **kwargs)
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py
index 58c726fe379..d90f028ceb6 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -323,10 +323,7 @@ scheme host and port.""")
default=None, help="Don't preload a gecko instance for faster restarts")
gecko_group.add_argument("--disable-e10s", dest="gecko_e10s", action="store_false", default=True,
help="Run tests without electrolysis preferences")
- gecko_group.add_argument("--enable-fission", dest="enable_fission", action="store_true", default=None,
- help="Enable fission in Gecko (defaults to enabled; "
- "this option only exists for backward compatibility).")
- gecko_group.add_argument("--no-enable-fission", dest="enable_fission", action="store_false",
+ gecko_group.add_argument("--disable-fission", dest="disable_fission", action="store_true", default=False,
help="Disable fission in Gecko.")
gecko_group.add_argument("--stackfix-dir", dest="stackfix_dir", action="store",
help="Path to directory containing assertion stack fixing scripts")
diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html b/tests/wpt/tests/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html
new file mode 100644
index 00000000000..cf32d253ae6
--- /dev/null
+++ b/tests/wpt/tests/webaudio/the-audio-api/the-audioparam-interface/moderate-exponentialRamp.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<title>Test exponentialRampToValueAtTime() with a moderate ratio of change</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+promise_test(async function() {
+ const bufferSize = 128;
+ const sampleRate = 16384;
+ // 3 * 2^6, not a power of two, so that there is some rounding error in the
+ // exponent
+ const rampEndSample = 192;
+ // These values are chosen so that there is rounding error in
+ // (offset1/offset0)^(1/rampEndSample).
+ const offset0 = 4.;
+ const offset1 = 7.;
+ // 8 units in the last place (ulp) is a generous tolerance if single
+ // precision powf() is used. Math.pow(2, -23) ~ 1 ulp.
+ // A simple recurrence relation formulation with only single precision
+ // arithmetic applied across the whole rendering quantum would accumulate
+ // error up to 50 ulp, losing 5.6 of the 24 bits of precision.
+ const relativeTolerance = 8 * Math.pow(2, -23);
+
+ const context = new OfflineAudioContext(1, bufferSize, sampleRate);
+
+ const source = new ConstantSourceNode(context);
+ source.start();
+ // Explicit event to work around
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1265393
+ source.offset.setValueAtTime(offset0, 0.);
+ source.offset.exponentialRampToValueAtTime(offset1, rampEndSample/sampleRate);
+ source.connect(context.destination);
+
+ const buffer = await context.startRendering();
+ assert_equals(buffer.length, bufferSize, "output buffer length");
+ const output = buffer.getChannelData(0);
+ const ratio = offset1 / offset0;
+ for (let i = 0; i < bufferSize; ++i) {
+ // Math.pow() uses double precision, while `output` has single precision,
+ // but `tolerance` is more than enough to accommodate differences.
+ const expected = offset0 * Math.pow(offset1/offset0, i/rampEndSample);
+ assert_approx_equals(
+ output[i],
+ expected,
+ relativeTolerance * expected,
+ "scheduled value at " + i);
+ }
+});
+</script>
diff --git a/tests/wpt/tests/webcodecs/audio-encoder.https.any.js b/tests/wpt/tests/webcodecs/audio-encoder.https.any.js
index cd7739bcd26..51496551cf5 100644
--- a/tests/wpt/tests/webcodecs/audio-encoder.https.any.js
+++ b/tests/wpt/tests/webcodecs/audio-encoder.https.any.js
@@ -241,7 +241,7 @@ async function checkEncodingError(t, config, good_data, bad_data) {
encoder.encode(bad_data);
await promise_rejects_dom(t, 'EncodingError', encoder.flush().catch((e) => {
- assert_equals(errors, 0);
+ assert_equals(errors, 1);
throw e;
}));
diff --git a/tests/wpt/tests/webcodecs/transfering.https.any.js b/tests/wpt/tests/webcodecs/transfering.https.any.js
index b9487e589d8..b127670d7b4 100644
--- a/tests/wpt/tests/webcodecs/transfering.https.any.js
+++ b/tests/wpt/tests/webcodecs/transfering.https.any.js
@@ -131,3 +131,57 @@ promise_test(async t => {
// `data.buffer` didn't get detached
assert_equals(data.length, 16, 'data.length');
}, 'Test transfering same array buffer twice');
+
+promise_test(async t => {
+ const bytes = [ 0xBA, 0xDF, 0x00, 0xD0, 0xBA, 0xDF, 0x01, 0xD0, 0xBA, 0xDF ];
+ let data = new Uint8Array(bytes);
+ let unused_buffer = new ArrayBuffer(123);
+ let init = {
+ type: 'key',
+ timestamp: 0,
+ data: data,
+ transfer: [data.buffer, unused_buffer]
+ };
+
+ assert_equals(data.length, 10, 'data.length');
+ assert_equals(unused_buffer.byteLength, 123, 'unused_buffer.byteLength');
+
+ let chunk = new EncodedAudioChunk(init);
+ assert_equals(data.length, 0, 'data.length after detach');
+ assert_equals(unused_buffer.byteLength, 0, 'unused_buffer after detach');
+
+ let output_data = new Uint8Array(chunk.byteLength);
+ chunk.copyTo(output_data);
+ let expected_data = new Uint8Array(bytes);
+ assert_equals(expected_data.length, chunk.byteLength, 'expected_data size');
+ for (let i = 0; i < chunk.byteLength; i++) {
+ assert_equals(expected_data[i], output_data[i], `expected_data[${i}]`);
+ }
+}, 'Test transfering ArrayBuffer to EncodedAudioChunk');
+
+promise_test(async t => {
+ const bytes = [ 0xBA, 0xDF, 0x00, 0xD0, 0xBA, 0xDF, 0x01, 0xD0, 0xBA, 0xDF ];
+ let data = new Uint8Array(bytes);
+ let unused_buffer = new ArrayBuffer(123);
+ let init = {
+ type: 'key',
+ timestamp: 0,
+ data: data,
+ transfer: [data.buffer, unused_buffer]
+ };
+
+ assert_equals(data.length, 10, 'data.length');
+ assert_equals(unused_buffer.byteLength, 123, 'unused_buffer.byteLength');
+
+ let chunk = new EncodedVideoChunk(init);
+ assert_equals(data.length, 0, 'data.length after detach');
+ assert_equals(unused_buffer.byteLength, 0, 'unused_buffer after detach');
+
+ let output_data = new Uint8Array(chunk.byteLength);
+ chunk.copyTo(output_data);
+ let expected_data = new Uint8Array(bytes);
+ assert_equals(expected_data.length, chunk.byteLength, 'expected_data size');
+ for (let i = 0; i < chunk.byteLength; i++) {
+ assert_equals(expected_data[i], output_data[i], `expected_data[${i}]`);
+ }
+}, 'Test transfering ArrayBuffer to EncodedVideoChunk'); \ No newline at end of file
diff --git a/tests/wpt/tests/webdriver/tests/bidi/script/call_function/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/invalid.py
index cfe5711e63b..9de343955c8 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/script/call_function/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/invalid.py
@@ -1,3 +1,5 @@
+# META: timeout=long
+
import pytest
import webdriver.bidi.error as error
@@ -421,3 +423,13 @@ async def test_params_include_shadow_tree_invalid_value(bidi_session, top_contex
serialization_options=SerializationOptions(include_shadow_tree="foo"),
target=ContextTarget(top_context["context"]),
await_promise=True)
+
+
+@pytest.mark.parametrize("user_activation", ["foo", 42, {}, []])
+async def test_params_user_activation_invalid_type(bidi_session, top_context, user_activation):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.script.call_function(
+ function_declaration="(arg) => arg",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ user_activation=user_activation)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/script/call_function/user_activation.py b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/user_activation.py
new file mode 100644
index 00000000000..786fb43954f
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/user_activation.py
@@ -0,0 +1,43 @@
+import pytest
+
+from webdriver.bidi.modules.script import ContextTarget
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize("user_activation", [True, False])
+async def test_userActivation(bidi_session, top_context, user_activation):
+ # Consume any previously set activation.
+ await bidi_session.script.evaluate(
+ expression="""window.open();""",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False)
+
+ result = await bidi_session.script.call_function(
+ function_declaration="() => navigator.userActivation.isActive && navigator.userActivation.hasBeenActive",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ user_activation=user_activation)
+
+ assert result == {
+ "type": "boolean",
+ "value": user_activation}
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize("user_activation", [True, False])
+async def test_userActivation_copy(bidi_session, top_context, user_activation):
+ # Consume any previously set activation.
+ await bidi_session.script.evaluate(
+ expression="""window.open();""",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False)
+
+ result = await bidi_session.script.call_function(
+ function_declaration="() => document.body.appendChild(document.createTextNode('test')) && document.execCommand('selectAll') && document.execCommand('copy')",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ user_activation=user_activation)
+
+ assert result == {
+ "type": "boolean",
+ "value": user_activation}
diff --git a/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/invalid.py
index 666bf4d06e0..f27720a204e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/invalid.py
@@ -152,3 +152,13 @@ async def test_params_include_shadow_tree_invalid_value(
serialization_options=SerializationOptions(include_shadow_tree="foo"),
target=ContextTarget(top_context["context"]),
await_promise=True)
+
+
+@pytest.mark.parametrize("user_activation", ["foo", 42, {}, []])
+async def test_params_user_activation_invalid_type(bidi_session, top_context, user_activation):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.script.evaluate(
+ expression="1 + 2",
+ user_activation=user_activation,
+ target=ContextTarget(top_context["context"]),
+ await_promise=True)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/user_activation.py b/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/user_activation.py
new file mode 100644
index 00000000000..4ca558435d7
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/script/evaluate/user_activation.py
@@ -0,0 +1,43 @@
+import pytest
+
+from webdriver.bidi.modules.script import ContextTarget
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize("user_activation", [True, False])
+async def test_userActivation(bidi_session, top_context, user_activation):
+ # Consume any previously set activation.
+ await bidi_session.script.evaluate(
+ expression="""window.open();""",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False)
+
+ result = await bidi_session.script.evaluate(
+ expression="navigator.userActivation.isActive && navigator.userActivation.hasBeenActive",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ user_activation=user_activation)
+
+ assert result == {
+ "type": "boolean",
+ "value": user_activation}
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize("user_activation", [True, False])
+async def test_userActivation_copy(bidi_session, top_context, user_activation):
+ # Consume any previously set activation.
+ await bidi_session.script.evaluate(
+ expression="""window.open();""",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False)
+
+ result = await bidi_session.script.evaluate(
+ expression="document.body.appendChild(document.createTextNode('test')) && document.execCommand('selectAll') && document.execCommand('copy')",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ user_activation=user_activation)
+
+ assert result == {
+ "type": "boolean",
+ "value": user_activation}
diff --git a/tests/wpt/tests/websockets/interfaces/WebSocket/close/close-connecting-async.any.js b/tests/wpt/tests/websockets/interfaces/WebSocket/close/close-connecting-async.any.js
new file mode 100644
index 00000000000..c7ace1fca27
--- /dev/null
+++ b/tests/wpt/tests/websockets/interfaces/WebSocket/close/close-connecting-async.any.js
@@ -0,0 +1,31 @@
+// META: script=../../../constants.sub.js
+// META: variant=
+// META: variant=?wpt_flags=h2
+// META: variant=?wss
+
+async_test(t => {
+ const ws = new WebSocket(SCHEME_DOMAIN_PORT + '/handshake_sleep_2');
+ let closeMethodReturned = false;
+ let errorEventSeen = false;
+ let closeEventSeen = false;
+ ws.onerror = t.step_func(() => {
+ assert_true(closeMethodReturned, 'ws.close() should have returned');
+ assert_false(errorEventSeen, 'error event should only fire once');
+ errorEventSeen = true;
+ assert_false(closeEventSeen, 'error event should come before close event');
+ });
+ ws.onclose = t.step_func_done(() => {
+ assert_true(closeMethodReturned, 'ws.close() should have returned');
+ assert_true(errorEventSeen, 'error event should have fired');
+ assert_false(closeEventSeen, 'close event should only fire once');
+ closeEventSeen = true;
+ assert_equals(ws.readyState, WebSocket.CLOSED,
+ 'readyState should be CLOSED');
+ });
+ assert_equals(ws.readyState, WebSocket.CONNECTING,
+ 'readyState should be CONNECTING');
+ ws.close();
+ closeMethodReturned = true;
+ assert_equals(ws.readyState, WebSocket.CLOSING,
+ 'readyState should be CLOSING');
+}, 'close event should be fired asynchronously when WebSocket is connecting');
diff --git a/tests/wpt/tests/workers/shared-worker-partitioned-cookies.tentative.https.html b/tests/wpt/tests/workers/shared-worker-partitioned-cookies.tentative.https.html
new file mode 100644
index 00000000000..e5f79cd8649
--- /dev/null
+++ b/tests/wpt/tests/workers/shared-worker-partitioned-cookies.tentative.https.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<head>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<title>SharedWorker: Partitioned Cookies</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-helpers.sub.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="support/shared-worker-partitioned-cookies-helper.js"></script>
+</head>
+
+<body>
+<script>
+
+promise_test(async () => {
+ // 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 worker = new SharedWorker('support/shared-worker-echo-cookies.js');
+ const nextMessage = workerMessageGenerator(worker);
+
+ worker.port.postMessage({type: 'test_message'});
+ const msg1 = await nextMessage();
+ assert_true(msg1.ok, 'Message passing');
+
+ worker.port.postMessage({type: 'echo_cookies_http'});
+ const msg2 = await nextMessage();
+ assert_true(msg2.ok, 'Get cookies');
+ assert_true(
+ msg2.cookies.includes('__Host-partitioned'),
+ 'Can access partitioned cookie via HTTP');
+ assert_true(
+ msg2.cookies.includes('unpartitioned'),
+ 'Can access unpartitioned cookie via HTTP');
+
+ worker.port.postMessage({type: 'echo_cookies_import'});
+ const msg3 = await nextMessage();
+ assert_true(msg3.ok, 'Get cookies');
+ assert_true(msg3.cookies.includes(
+ '__Host-partitioned'),
+ 'Can access partitioned cookie via importScripts');
+ assert_true(
+ msg3.cookies.includes('unpartitioned'),
+ 'Can access unpartitioned cookie via importScripts');
+
+ const popup = window.open(
+ new URL(
+ `./support/shared-worker-partitioned-cookies-3p-window.html?origin=${
+ encodeURIComponent(self.location.origin)}`,
+ get_host_info().HTTPS_NOTSAMESITE_ORIGIN + self.location.pathname));
+ await fetch_tests_from_window(popup);
+});
+
+</script>
+</body>
diff --git a/tests/wpt/tests/workers/support/shared-worker-echo-cookies.js b/tests/wpt/tests/workers/support/shared-worker-echo-cookies.js
new file mode 100644
index 00000000000..34dcbc9d260
--- /dev/null
+++ b/tests/wpt/tests/workers/support/shared-worker-echo-cookies.js
@@ -0,0 +1,40 @@
+let port;
+
+self.onconnect = e => {
+ port = e.ports[0];
+ port.addEventListener('message', onMessage);
+ port.start();
+};
+
+async function onMessage(e) {
+ switch (e.data.type) {
+ case 'test_message':
+ port.postMessage({ok: true});
+ return;
+ case 'echo_cookies_http':
+ return onEchoCookiesHttp(e);
+ case 'echo_cookies_import':
+ return onEchoCookiesImport();
+ default:
+ throw new Error('Unexpected message type ' + e.data.type);
+ }
+}
+
+async function onEchoCookiesHttp(e) {
+ try {
+ const resp = await fetch(
+ `${self.origin}/cookies/resources/list.py`, {credentials: 'include'});
+ const cookies = await resp.json();
+ port.postMessage({ok: true, cookies: Object.keys(cookies)});
+ } catch (err) {
+ port.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() {
+ port.postMessage({ok: true, cookies: self._cookies});
+}
diff --git a/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-frame.html b/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-frame.html
new file mode 100644
index 00000000000..dc700d31f97
--- /dev/null
+++ b/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-frame.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<head>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<title>Service Worker: Partitioned Cookies 3P Iframe</title>
+<script src="/resources/testharness.js"></script>
+<script src="shared-worker-partitioned-cookies-helper.js"></script>
+</head>
+
+<body>
+<script>
+
+promise_test(async () => {
+ 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 worker = new SharedWorker('./shared-worker-echo-cookies.js');
+ const nextMessage = workerMessageGenerator(worker);
+
+ worker.port.postMessage({type: 'test_message'});
+ const msg1 = await nextMessage();
+ assert_true(msg1.ok, 'Message passing');
+
+ worker.port.postMessage({type: 'echo_cookies_http'});
+ const msg2 = await nextMessage();
+ assert_true(msg2.ok, 'Get cookies');
+ assert_false(
+ msg2.cookies.includes('__Host-partitioned'),
+ 'Cannot access partitioned cookie via HTTP');
+ assert_true(
+ msg2.cookies.includes('unpartitioned'),
+ 'Can access unpartitioned cookie via HTTP');
+
+ worker.port.postMessage({type: 'echo_cookies_import'});
+ const msg3 = await nextMessage();
+ assert_true(msg3.ok, 'Get cookies');
+ assert_false(
+ msg3.cookies.includes('__Host-partitioned'),
+ 'Cannot access partitioned cookie via importScripts');
+ assert_true(
+ msg3.cookies.includes('unpartitioned'),
+ 'Can access unpartitioned cookie via importScripts');
+});
+
+</script>
+</body>
diff --git a/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-window.html b/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-window.html
new file mode 100644
index 00000000000..e37e0a2cc6b
--- /dev/null
+++ b/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-3p-window.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<head>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<title>SharedWorker: Partitioned Cookies 3P Window</title>
+<script src="/resources/testharness.js"></script>
+</head>
+
+<body>
+<script>
+
+promise_test(async t => {
+ assert_true(
+ location.search.includes('origin='), 'First party origin passed');
+ const first_party_origin =
+ new URLSearchParams(window.location.search).get('origin');
+ const iframe = document.createElement('iframe');
+ iframe.src = new URL(
+ './shared-worker-partitioned-cookies-3p-frame.html',
+ first_party_origin + location.pathname).href;
+ document.body.appendChild(iframe);
+ await fetch_tests_from_window(iframe.contentWindow);
+});
+
+</script>
+</body>
diff --git a/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-helper.js b/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-helper.js
new file mode 100644
index 00000000000..3bcdc879e8e
--- /dev/null
+++ b/tests/wpt/tests/workers/support/shared-worker-partitioned-cookies-helper.js
@@ -0,0 +1,28 @@
+// Return a generator containing the worker's message.
+//
+// Usage:
+// const worker = new SharedWorker(...);
+// const nextMessage = workerMessages(worker);
+// const msg_1 = await nextMessage();
+// const msg_2 = await nextMessage();
+// const msg_3 = await nextMessage();
+function workerMessageGenerator(shared_worker) {
+ const buffer = [];
+ let resolve = null;
+
+ shared_worker.port.onmessage = message => {
+ buffer.push(message.data);
+ if (resolve) {
+ resolve();
+ }
+ }
+ shared_worker.port.start();
+
+ return async function() {
+ if (buffer.length != 0) {
+ return buffer.shift();
+ }
+ await new Promise(r => resolve = r);
+ return buffer.shift();
+ }
+}
diff --git a/tests/wpt/webgl/meta-legacy-layout/conformance2/state/gl-object-get-calls.html.ini b/tests/wpt/webgl/meta-legacy-layout/conformance2/state/gl-object-get-calls.html.ini
index 6e0dee35b92..97a24e350d4 100644
--- a/tests/wpt/webgl/meta-legacy-layout/conformance2/state/gl-object-get-calls.html.ini
+++ b/tests/wpt/webgl/meta-legacy-layout/conformance2/state/gl-object-get-calls.html.ini
@@ -2,7 +2,6 @@
bug: https://github.com/servo/servo/issues/26128
expected:
if os == "mac": CRASH
- TIMEOUT
[WebGL test #201: gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_WRAP_R) should be 33071 (of type number). Was null (of type object).]
expected: FAIL
@@ -119,6 +118,3 @@
[WebGL test #202: gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_IMMUTABLE_FORMAT) should be false (of type boolean). Was 0 (of type number).]
expected: FAIL
-
- [Overall test]
- expected: NOTRUN