aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/wpt/meta/MANIFEST.json1137
-rw-r--r--tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini8
-rw-r--r--tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html.ini7
-rw-r--r--tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html.ini7
-rw-r--r--tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini35
-rw-r--r--tests/wpt/meta/content-security-policy/style-src/inline-style-attribute-blocked.sub.html.ini3
-rw-r--r--tests/wpt/meta/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html.ini7
-rw-r--r--tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html.ini4
-rw-r--r--tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html.ini4
-rw-r--r--tests/wpt/meta/css/css-gaps/flex/flex-gap-decorations-022.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-029.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-030.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-031.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-032.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-033.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-38.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/multicol/multicol-gap-decorations-017.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/parsing/gap-decorations-col-rule-width.html.ini9
-rw-r--r--tests/wpt/meta/css/css-images/linear-gradient-body-sibling-index.html.ini2
-rw-r--r--tests/wpt/meta/css/css-images/linear-gradient-sibling-index.html.ini2
-rw-r--r--tests/wpt/meta/css/css-mixins/dashed-function-cycles.html.ini (renamed from tests/wpt/meta/css/css-mixins/dashed-function-cycles.tentative.html.ini)19
-rw-r--r--tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini12
-rw-r--r--tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html.ini6
-rw-r--r--tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html.ini6
-rw-r--r--tests/wpt/meta/css/cssom-view/scrollIntoView-container.html.ini15
-rw-r--r--tests/wpt/meta/css/filter-effects/backdrop-filter-scale-transform.html.ini2
-rw-r--r--tests/wpt/meta/css/geometry/DOMMatrix-001.html.ini6
-rw-r--r--tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini16
-rw-r--r--tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini16
-rw-r--r--tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini22
-rw-r--r--tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini12
-rw-r--r--tests/wpt/meta/fetch/http-cache/pragma-no-cache-with-cache-control.html.ini3
-rw-r--r--tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini3
-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/replace-before-load/a-click.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-top.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini (renamed from tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini)2
-rw-r--r--tests/wpt/meta/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html.ini7
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html.ini3
-rw-r--r--tests/wpt/meta/html/dom/idlharness.https.html.ini420
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini4
-rw-r--r--tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini3
-rw-r--r--tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini66
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini183
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini171
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini102
-rw-r--r--tests/wpt/meta/streams/writable-streams/crashtests/garbage-collection.any.js.ini9
-rw-r--r--tests/wpt/meta/subresource-integrity/tentative/integrity-policy/parsing.https.html.ini9
-rw-r--r--tests/wpt/meta/subresource-integrity/tentative/integrity-policy/script.https.html.ini15
-rw-r--r--tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini39
-rw-r--r--tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini12
-rw-r--r--tests/wpt/meta/webmessaging/messageerror.html.ini6
-rw-r--r--tests/wpt/meta/webxr/render_state_update.https.html.ini2
-rw-r--r--tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini3
-rw-r--r--tests/wpt/meta/xhr/formdata/append.any.js.ini8
-rw-r--r--tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js124
-rw-r--r--tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js2
-rw-r--r--tests/wpt/tests/ai/translator/resources/util.js4
-rw-r--r--tests/wpt/tests/ai/translator/translator-bad-input.https.window.js (renamed from tests/wpt/tests/ai/translator/translator-bad-input.tentative.https.window.js)3
-rw-r--r--tests/wpt/tests/ai/translator/translator.optional.https.window.js (renamed from tests/wpt/tests/ai/translator/translator-translate.tentative.https.window.js)11
-rw-r--r--tests/wpt/tests/badging/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/clear-site-data/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/compat/webkit-box-ignores-flex-wrap.tentative.html7
-rw-r--r--tests/wpt/tests/content-security-policy/style-src/style-src-inline-style-with-csstext.html29
-rw-r--r--tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js17
-rw-r--r--tests/wpt/tests/cookie-store/httponly_cookies.https.window.js30
-rw-r--r--tests/wpt/tests/css/compositing/root-element-background-image-opaque-crash.html9
-rw-r--r--tests/wpt/tests/css/css-align/blocks/justify-items-anonymous.tentative.html10
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html8
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html8
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html4
-rw-r--r--tests/wpt/tests/css/css-animations/crashtests/chrome-bug-415627003.html17
-rw-r--r--tests/wpt/tests/css/css-break/root-margin-001-print-ref.html6
-rw-r--r--tests/wpt/tests/css/css-break/root-margin-001-print.html10
-rw-r--r--tests/wpt/tests/css/css-break/table/border-spacing.html11
-rw-r--r--tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html68
-rw-r--r--tests/wpt/tests/css/css-cascade/inline-style-background.html16
-rw-r--r--tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html73
-rw-r--r--tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html96
-rw-r--r--tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html96
-rw-r--r--tests/wpt/tests/css/css-fonts/font-variant-emoji-005-ref.html23
-rw-r--r--tests/wpt/tests/css/css-fonts/font-variant-emoji-005.html29
-rw-r--r--tests/wpt/tests/css/css-gaps/agnostic/gap-decorations-002-ref.html51
-rw-r--r--tests/wpt/tests/css/css-gaps/flex/flex-gap-decorations-022.html46
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029-ref.html70
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029.html48
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030-ref.html45
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030.html37
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031-ref.html45
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031.html38
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032-ref.html71
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032.html39
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033-ref.html72
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033.html38
-rw-r--r--tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-38.html44
-rw-r--r--tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017.html48
-rw-r--r--tests/wpt/tests/css/css-gaps/parsing/gap-decorations-col-rule-width.html51
-rw-r--r--tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index-ref.html11
-rw-r--r--tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index.html15
-rw-r--r--tests/wpt/tests/css/css-images/linear-gradient-calc-em-units-ref.html7
-rw-r--r--tests/wpt/tests/css/css-images/linear-gradient-calc-em-units.html19
-rw-r--r--tests/wpt/tests/css/css-images/linear-gradient-sibling-index-ref.html7
-rw-r--r--tests/wpt/tests/css/css-images/linear-gradient-sibling-index.html19
-rw-r--r--tests/wpt/tests/css/css-mixins/dashed-function-cycles.html (renamed from tests/wpt/tests/css/css-mixins/dashed-function-cycles.tentative.html)4
-rw-r--r--tests/wpt/tests/css/css-multicol/getclientrects-005.html139
-rw-r--r--tests/wpt/tests/css/css-multicol/getclientrects-006.html139
-rw-r--r--tests/wpt/tests/css/css-multicol/getclientrects-007.html139
-rw-r--r--tests/wpt/tests/css/css-multicol/getclientrects-008.html67
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-button-activation-without-scroller.html36
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-button-disabled-no-focus.html30
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html2
-rw-r--r--tests/wpt/tests/css/css-scroll-anchoring/table-col-and-dead-row-group-crash.html14
-rw-r--r--tests/wpt/tests/css/css-text/letter-spacing/letter-spacing-cursive-001.html39
-rw-r--r--tests/wpt/tests/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html32
-rw-r--r--tests/wpt/tests/css/css-transforms/css-scale-of-clip-path-ref.html20
-rw-r--r--tests/wpt/tests/css/css-transforms/css-scale-of-clip-path.html23
-rw-r--r--tests/wpt/tests/css/css-transforms/scale-transform-filtered-text-ref.html16
-rw-r--r--tests/wpt/tests/css/css-transforms/scale-transform-filtered-text.html24
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html4
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html110
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html37
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html46
-rw-r--r--tests/wpt/tests/css/css-view-transitions/root-preserve3d-crash.html13
-rw-r--r--tests/wpt/tests/css/css-view-transitions/root-replace-crash.html15
-rw-r--r--tests/wpt/tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html24
-rw-r--r--tests/wpt/tests/css/css-view-transitions/start-skip-start.html87
-rw-r--r--tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html19
-rw-r--r--tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html8
-rw-r--r--tests/wpt/tests/css/cssom-view/resources/scrollIntoView-frame.html16
-rw-r--r--tests/wpt/tests/css/cssom-view/scrollIntoView-container.html84
-rw-r--r--tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform-ref.html20
-rw-r--r--tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform.html23
-rw-r--r--tests/wpt/tests/css/filter-effects/backdrop-filter-transform-popover-crash.html17
-rw-r--r--tests/wpt/tests/css/filter-effects/css-filters-opacity-hit-testing.html19
-rw-r--r--tests/wpt/tests/css/geometry/DOMMatrix-001.html6
-rw-r--r--tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/docs/writing-tests/testdriver.md8
-rw-r--r--tests/wpt/tests/dom/events/scrolling/overscroll-deltas.tentative.html (renamed from tests/wpt/tests/dom/events/scrolling/overscroll-deltas.html)0
-rw-r--r--tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.tentative.html (renamed from tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.html)0
-rw-r--r--tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html (renamed from tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.html)0
-rw-r--r--tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.tentative.html (renamed from tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.html)0
-rw-r--r--tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.tentative.html (renamed from tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.html)0
-rw-r--r--tests/wpt/tests/dom/observable/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/element-timing/resources/element-timing-helpers.js2
-rw-r--r--tests/wpt/tests/event-timing/orphan-keydown.html34
-rw-r--r--tests/wpt/tests/event-timing/resources/event-timing-test-utils.js11
-rw-r--r--tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html17
-rw-r--r--tests/wpt/tests/fetch/api/request/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/fetch/http-cache/pragma-no-cache-with-cache-control.html28
-rw-r--r--tests/wpt/tests/fetch/http-cache/resources/cached_pragma_rand.py14
-rw-r--r--tests/wpt/tests/fetch/local-network-access/META.yml5
-rw-r--r--tests/wpt/tests/fetch/local-network-access/README.md11
-rw-r--r--tests/wpt/tests/fetch/local-network-access/fetch.tentative.https.html51
-rw-r--r--tests/wpt/tests/fetch/local-network-access/resources/fetch-private.html52
-rw-r--r--tests/wpt/tests/fetch/local-network-access/resources/support.sub.js186
-rw-r--r--tests/wpt/tests/fetch/local-network-access/resources/target.py105
-rw-r--r--tests/wpt/tests/file-system-access/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html49
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/html/canvas/element/path-objects/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/path-objects/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/html/editing/dnd/platform/pointerdown-add-display-none.html65
-rw-r--r--tests/wpt/tests/html/embedded-content/the-img-element/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/scripting/the-script-element/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-input-keyboard-behavior.tentative.html58
-rw-r--r--tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html9
-rw-r--r--tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html12
-rw-r--r--tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html9
-rw-r--r--tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html16
-rw-r--r--tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html52
-rw-r--r--tests/wpt/tests/html/semantics/the-link-element/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html37
-rw-r--r--tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html9
-rw-r--r--tests/wpt/tests/interfaces/largest-contentful-paint.idl3
-rw-r--r--tests/wpt/tests/interfaces/service-workers.idl2
-rw-r--r--tests/wpt/tests/interfaces/webauthn.idl52
-rw-r--r--tests/wpt/tests/largest-contentful-paint/idlharness.html2
-rw-r--r--tests/wpt/tests/largest-contentful-paint/observe-text.html2
-rw-r--r--tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js2
-rw-r--r--tests/wpt/tests/paint-timing/paint-timing-mixin.html2
-rw-r--r--tests/wpt/tests/paint-timing/resources/utils.js2
-rw-r--r--tests/wpt/tests/remote-playback/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/reporting/resources/report-helper.js4
-rw-r--r--tests/wpt/tests/resources/test/tests/functional/api-tests-1.html73
-rw-r--r--tests/wpt/tests/resources/testdriver.js10
-rw-r--r--tests/wpt/tests/resources/testharness.js94
-rw-r--r--tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html9
-rw-r--r--tests/wpt/tests/sanitizer-api/sanitizer-parseHTML.tentative.html145
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html13
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html154
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/smoke/tentative/basic.html67
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html11
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html10
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js7
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py5
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html36
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html122
-rw-r--r--tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https.html46
-rw-r--r--tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https.html50
-rw-r--r--tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html96
-rw-r--r--tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js29
-rw-r--r--tests/wpt/tests/streams/writable-streams/crashtests/garbage-collection.any.js43
-rw-r--r--tests/wpt/tests/subresource-integrity/tentative/integrity-policy/parsing.https.html119
-rw-r--r--tests/wpt/tests/subresource-integrity/tentative/integrity-policy/script.https.html239
-rw-r--r--tests/wpt/tests/svg/animations/discard-check-removal-order.html52
-rw-r--r--tests/wpt/tests/svg/animations/reftests/reference/green-100x100.svg3
-rw-r--r--tests/wpt/tests/svg/embedded/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/svg/idlharness.window.js3
-rw-r--r--tests/wpt/tests/svg/scripted/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html2
-rw-r--r--tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py7
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py3
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py41
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py90
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py4
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py8
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/formatters/chromium.py338
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py828
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js7
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py3
-rw-r--r--tests/wpt/tests/wasm/core/js/simd/simd_select.wast.js24
-rw-r--r--tests/wpt/tests/wasm/core/simd/simd_select.wast.js.html16
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/__init__.py8
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py46
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py27
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py31
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py40
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py44
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/error.py123
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py60
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py83
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js1005
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js1664
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/log.https.any.js7
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js43
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js347
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/sign.https.any.js6
-rw-r--r--tests/wpt/tests/webnn/resources/utils.js54
-rw-r--r--tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html2
-rw-r--r--tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html4
-rw-r--r--tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js2
258 files changed, 9527 insertions, 3190 deletions
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 893b07e9e3f..277c0f4217d 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -605,6 +605,13 @@
{}
]
],
+ "root-element-background-image-opaque-crash.html": [
+ "d380310d0968c3ad63eb6adc52acd929b3b43b14",
+ [
+ null,
+ {}
+ ]
+ ],
"root-element-filter-background-clip-text-crash.html": [
"e12e4bb80f40e09e189f7f239486be246ea67ade",
[
@@ -799,6 +806,13 @@
{}
]
],
+ "chrome-bug-415627003.html": [
+ "af942fbcc9701955f3778dc2e57521d10bb1ce41",
+ [
+ null,
+ {}
+ ]
+ ],
"pseudo-element-animation-with-marker.html": [
"ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5",
[
@@ -4794,6 +4808,13 @@
{}
]
],
+ "table-col-and-dead-row-group-crash.html": [
+ "e6e90a63a345fe2bb9499b729d2cf2df6ed65d9d",
+ [
+ null,
+ {}
+ ]
+ ],
"table-collapsed-borders-crash.html": [
"aa699317e2734fece3d662ad102fdd2772680e25",
[
@@ -5866,7 +5887,32 @@
null,
{}
]
- ]
+ ],
+ "root-preserve3d-crash.html": [
+ "1123280187506b326adc9378465bfc560af4415e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "root-replace-crash.html": [
+ "165eec41b6bc56db131cc7fc19f23701bc291b8c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "scoped": {
+ "crashtests": {
+ "shadow-dom.html": [
+ "a2faafc1694e15f5c513655e57e320325bd4f45a",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
+ }
},
"css-viewport": {
"zoom": {
@@ -6114,6 +6160,13 @@
{}
]
],
+ "backdrop-filter-transform-popover-crash.html": [
+ "582f0c119656020aaa5167b0547cfbde20d11b95",
+ [
+ null,
+ {}
+ ]
+ ],
"crashtests": {
"broken-reference-crash-001.html": [
"6e18e06c317e329a58b2b5132cf17dc6086d444f",
@@ -33290,6 +33343,19 @@
{}
]
],
+ "root-margin-001-print.html": [
+ "b2ec34fe0799d7cab5ac4dacb237780b6f7503e0",
+ [
+ null,
+ [
+ [
+ "/css/css-break/root-margin-001-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"table": {
"repeated-section": {
"fixedpos-in-footer-forced-break-print.html": [
@@ -38040,6 +38106,19 @@
{}
]
],
+ "webkit-box-ignores-flex-wrap.tentative.html": [
+ "98086f83570d4c5b4c6251f31093744442a907ca",
+ [
+ null,
+ [
+ [
+ "/compat/green-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"webkit-box-rtl-flex.html": [
"d20b3a0a9dbab237a799f62504b9b1ea7b90a564",
[
@@ -124754,6 +124833,19 @@
{}
]
],
+ "justify-items-anonymous.tentative.html": [
+ "641dea1f54b2f0cea29bc4c4c82e023a479e3d3c",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"justify-self-auto-margins-1.html": [
"b54eb775114808ff22b82a858426e764a623e432",
[
@@ -159361,7 +159453,7 @@
]
],
"contain-paint-stacking-context-001a.html": [
- "71102b6c73a3d88cdd953ecf82c69602ff87baa2",
+ "5e588cb61742ca406b23f573dd3609a52a191a1e",
[
null,
[
@@ -159374,7 +159466,7 @@
]
],
"contain-paint-stacking-context-001b.html": [
- "0c4d3323bf7cb28b5a31de8aac41563013b2ecd4",
+ "e03323782a7fbfbb924184fa71b0ab1031381671",
[
null,
[
@@ -184678,6 +184770,19 @@
{}
]
],
+ "font-variant-emoji-005.html": [
+ "0f5c2d7a98a615323b1adc0babb479fdb738537d",
+ [
+ null,
+ [
+ [
+ "/css/css-fonts/font-variant-emoji-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"font-variant-emoji-1.html": [
"53cf539edd8b61a7f08f8b95ae83f4f7a5179308",
[
@@ -186484,6 +186589,19 @@
],
{}
]
+ ],
+ "flex-gap-decorations-022.html": [
+ "5f3b512ef76214b3645c329c92bd06ebf23efd9d",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/agnostic/gap-decorations-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"grid": {
@@ -186837,6 +186955,84 @@
],
{}
]
+ ],
+ "grid-gap-decorations-029.html": [
+ "6da75548d94b5e17e1ad7ba1011662c42b818d83",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/grid/grid-gap-decorations-029-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-030.html": [
+ "ef4507ef92638eeff660e67e2024bbce323c1aa8",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/grid/grid-gap-decorations-030-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-031.html": [
+ "530b661bfe32c5af7687954f3f4b2cbdfa61380a",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/grid/grid-gap-decorations-031-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-032.html": [
+ "ac2d38fdda0ec6a1f4a3b7b091d03c896e3e5e47",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/grid/grid-gap-decorations-032-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-033.html": [
+ "47ef35cc3688b2fcd2329558b1d0a27880983b38",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/grid/grid-gap-decorations-033-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-38.html": [
+ "8b87bcd4860ac50a1c2f3de98cec9599bebb77a3",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/agnostic/gap-decorations-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"multicol": {
@@ -187047,6 +187243,19 @@
],
{}
]
+ ],
+ "multicol-gap-decorations-017.html": [
+ "c7d1fe42584f77e77acd3676f249ffa6510ada3b",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
}
},
@@ -201929,6 +202138,45 @@
{}
]
],
+ "linear-gradient-body-sibling-index.html": [
+ "299b86d464ad54f383ce8f384ec6677b3d3e305b",
+ [
+ null,
+ [
+ [
+ "/css/css-images/linear-gradient-body-sibling-index-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "linear-gradient-calc-em-units.html": [
+ "e764e62890dad81adfda9d60d50d82a1e07c5de5",
+ [
+ null,
+ [
+ [
+ "/css/css-images/linear-gradient-calc-em-units-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "linear-gradient-sibling-index.html": [
+ "b92897e0697441df6876b88e53daa148a5edb009",
+ [
+ null,
+ [
+ [
+ "/css/css-images/linear-gradient-sibling-index-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"multiple-position-color-stop-conic-2.html": [
"f3171bf3fb9823095312ab080ee3d0481a8545f6",
[
@@ -256915,6 +257163,19 @@
{}
]
],
+ "letter-spacing-cursive-001.html": [
+ "5700c600981ab815e2ecf33577a6408d8e54dee1",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"letter-spacing-end-of-line-001.html": [
"645ef10509803cb86b31c7250928c007acb21431",
[
@@ -277158,6 +277419,35 @@
{}
]
],
+ "css-scale-of-clip-path.html": [
+ "dda72c0d139979213741174da8c9572f1237bcc3",
+ [
+ null,
+ [
+ [
+ "/css/css-transforms/css-scale-of-clip-path-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 40
+ ],
+ [
+ 0,
+ 3000
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"css-skew-001.html": [
"f209834121bb00ff3542029d44ba1ce878b0dd77",
[
@@ -281127,6 +281417,35 @@
{}
]
],
+ "scale-transform-filtered-text.html": [
+ "a479b12528a0bb6903d58d46a4b2a0d073b9ee97",
+ [
+ null,
+ [
+ [
+ "/css/css-transforms/scale-transform-filtered-text-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 25
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"scale-transform-overlap.html": [
"0cb8db40b66accf337babe82d281d0a77c0ffa0d",
[
@@ -328573,6 +328892,19 @@
{}
]
],
+ "backdrop-filter-scale-transform.html": [
+ "813fb95d5ad3b5e4844e480980b4c712d6b8f28d",
+ [
+ null,
+ [
+ [
+ "/css/filter-effects/backdrop-filter-scale-transform-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"backdrop-filter-svg-background-image-blur.html": [
"9cd18b0542c86911b3a0b774fe892a61102c8b85",
[
@@ -356396,7 +356728,7 @@
"the-button-element": {
"interest-target": {
"interesttarget-keyboard-invalidation.tentative.html": [
- "8c0ebd7a2cdcbab16e13618dbd5b8e36c58359f8",
+ "b6d0ff10932f1717fb038efb28c42c2bbf57cbf8",
[
null,
[
@@ -356410,19 +356742,6 @@
}
]
],
- "interesttarget-outline-appearance.tentative.html": [
- "28cb2052a8d430b5dfadd31171b17d32a567d073",
- [
- null,
- [
- [
- "/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html",
- "!="
- ]
- ],
- {}
- ]
- ],
"interesttarget-plain-inline-element.tentative.html": [
"68ce00193f70c021cc392e0e2460662d7eb38ad9",
[
@@ -372429,6 +372748,14 @@
[]
]
}
+ },
+ "translator": {
+ "resources": {
+ "util.js": [
+ "ad06086a123bccbe2c852dffd1a36ffde0613ada",
+ []
+ ]
+ }
}
},
"ambient-light": {
@@ -374690,6 +375017,10 @@
"840e187cbad1cca4ea09e144c88df2a14032136a",
[]
],
+ "WEB_FEATURES.yml": [
+ "3c4f69200f67b3cd856f56913025c14de17a0e73",
+ []
+ ],
"resources": {
"setAppBadge_iframe.html": [
"8738099658fbb2de893658e70242e855ecccd4b1",
@@ -375026,6 +375357,10 @@
"65ca96dbb9d774e97cc3a60f6b6dde952104893b",
[]
],
+ "WEB_FEATURES.yml": [
+ "d55b5faaf11be9aa92df01f814d5ce165b23025f",
+ []
+ ],
"support": {
"clear-cache-helper.sub.js": [
"5db0caf834cbf6a598f02761beda267dc8f1bcf8",
@@ -417931,6 +418266,10 @@
"8c19f1cf4c6c0173b45face28d624368d365ec70",
[]
],
+ "root-margin-001-print-ref.html": [
+ "320da2e0f551b82e2e699500179fe06db612151b",
+ []
+ ],
"rounded-clipped-border-ref.html": [
"be08126fd2c3bab356a3a4fd5ff1cc1579184662",
[]
@@ -419214,7 +419553,7 @@
[]
],
"contain-paint-stacking-context-001-ref.html": [
- "c7553716ab6c257bb0d9407582eed186bd763369",
+ "e2516f3d3788fd7f28356d266ee73e6b7ec0a4e3",
[]
],
"contain-size-block-001-ref.html": [
@@ -424631,6 +424970,10 @@
"633a94c4e51f32328bc68eeb74837aada6f4aff0",
[]
],
+ "font-variant-emoji-005-ref.html": [
+ "d4275b5c951c05ea270f1a2a474ff4ccaf9afc4a",
+ []
+ ],
"font-variant-emoji-1-notref.html": [
"bbf3654ccfcdd415fe5a28468e3329ba94ce63da",
[]
@@ -431505,6 +431848,10 @@
"gap-decorations-001-ref.html": [
"a7314fc7dca1545dacd710c261c7594117a3894a",
[]
+ ],
+ "gap-decorations-002-ref.html": [
+ "42c5ef128b47fc9cdd14c9ce4f8abdffb209d94e",
+ []
]
},
"flex": {
@@ -431669,6 +432016,26 @@
"grid-gap-decorations-027-ref.html": [
"7e0d9cbcd6ff64b17bc8fe57616a37ba29a9fd8e",
[]
+ ],
+ "grid-gap-decorations-029-ref.html": [
+ "35450e07ae5579707c94b4a0a58f29eb83d7f7fa",
+ []
+ ],
+ "grid-gap-decorations-030-ref.html": [
+ "d4953ae2ddda701324d350ccf25a113b8e67fc37",
+ []
+ ],
+ "grid-gap-decorations-031-ref.html": [
+ "0615305bc9f8de791f1c2061ad6d90039932b157",
+ []
+ ],
+ "grid-gap-decorations-032-ref.html": [
+ "f90e3dd68132078e2557f33b7e32605d278cd0eb",
+ []
+ ],
+ "grid-gap-decorations-033-ref.html": [
+ "e26143a6b93e9fdd53d4055234d89e40d98dc2af",
+ []
]
},
"multicol": {
@@ -431735,6 +432102,10 @@
"multicol-gap-decorations-016-ref.html": [
"8b2458fccce5a190c2c804b7e552dc0d85a8849a",
[]
+ ],
+ "multicol-gap-decorations-017-ref.html": [
+ "23fd089ac8e575e4035c5614c10ae55d7c3b06a4",
+ []
]
}
},
@@ -434305,10 +434676,22 @@
"a80236dcf75c22ecd8e43935d004f1fddf0550cb",
[]
],
+ "linear-gradient-body-sibling-index-ref.html": [
+ "7325685511a542964859c34a359b107823db18df",
+ []
+ ],
+ "linear-gradient-calc-em-units-ref.html": [
+ "be13be8e260ef8d89be878d811edf83411dd2cee",
+ []
+ ],
"linear-gradient-ref.html": [
"033f1767799d718f072b48b6a99a4eaf7070f90e",
[]
],
+ "linear-gradient-sibling-index-ref.html": [
+ "eea8518d95b9393a5c1e1d34afc20744b8834c34",
+ []
+ ],
"multiple-position-color-stop-conic-2-ref.html": [
"2ee92a11ee43a60031302ecb24b5a1e2865590ec",
[]
@@ -439016,7 +439399,7 @@
[]
],
"scroll-buttons-appearance-ref.html": [
- "462186407d55da46e14f5ebbc8f90218cd0b80b7",
+ "c382f738a6fc01402668747529ce7ab7b46f5f4f",
[]
],
"scroll-buttons-disabled-ref.html": [
@@ -445745,6 +446128,10 @@
"977d8211457a6e7b4976b596be91068cdf518869",
[]
],
+ "letter-spacing-cursive-001-ref.html": [
+ "720c9491b4d8cfdba5c2279dacdc297d495c2b67",
+ []
+ ],
"letter-spacing-end-of-line-001-ref.html": [
"eb474ab8d234d0836c3466e29bfe9b313e10d302",
[]
@@ -449499,6 +449886,10 @@
"54940566cd107ba443d3183dccecb505a811d14e",
[]
],
+ "css-scale-of-clip-path-ref.html": [
+ "d6fa480b0408ffc9c3687515e25a30ddc68f199f",
+ []
+ ],
"css-skew-001-ref.html": [
"70c256ebec653128a2d91555e817b54880666a35",
[]
@@ -449949,6 +450340,10 @@
]
}
},
+ "scale-transform-filtered-text-ref.html": [
+ "e8b564ce3ddd6560299d91f347b4407fe6a5db6b",
+ []
+ ],
"scale-transform-overlap-ref.html": [
"4750764ae93092e7b7e9f7d151eb1b7904c32ca8",
[]
@@ -457138,6 +457533,10 @@
"f8947e0472f489ca1a98a9e231b17e7d8ce6585e",
[]
],
+ "scrollIntoView-frame.html": [
+ "ee2be2fd3ab04ad9a1bde48ee188789d92d9ca8a",
+ []
+ ],
"simultaneousScrollIntoViews.js": [
"32de35fb544c5a83b0c8159de21f9a6ebfed19ba",
[]
@@ -457465,6 +457864,10 @@
"c92741df4300e5416cbe26339d52b819ec35347c",
[]
],
+ "backdrop-filter-scale-transform-ref.html": [
+ "d7faa0e97a175fc5dabf6f2d89ce71ba0fd498e1",
+ []
+ ],
"backdrop-filter-transform-ref.html": [
"1af8776cf0dc663ec7bac1f83ba361ccb8b2b5d4",
[]
@@ -458240,7 +458643,7 @@
[]
],
"WEB_FEATURES.yml": [
- "24027360aab4a27b72975f0d77062ffe8fb1a060",
+ "7f15b7fa475230b42981a3f92f60f434e9ccf1af",
[]
],
"prefers-color-scheme-svg-as-image-ref.html": [
@@ -460304,7 +460707,7 @@
[]
],
"testdriver.md": [
- "67757af63f2ed6af4026577dd35000c183509d44",
+ "e0fae529875ee89d5e8a2457cdab35e1866f663b",
[]
],
"testharness-api.md": [
@@ -460874,6 +461277,12 @@
]
}
},
+ "observable": {
+ "WEB_FEATURES.yml": [
+ "3e872791165e41402949da13fedd7a8780aaf660",
+ []
+ ]
+ },
"parts": {
"resources": {
"domparts-utils.js": [
@@ -461338,7 +461747,7 @@
[]
],
"element-timing-helpers.js": [
- "2c1bd195ea76f8126d739e705fed7af3a562fc45",
+ "5ff01bfa1209a26d84d69bb5a80d7fd21d671fab",
[]
],
"iframe-stores-entry.html": [
@@ -462656,7 +463065,7 @@
[]
],
"event-timing-test-utils.js": [
- "59c78ebf39c8a8e0f31aafa1eccd0809bea54376",
+ "afad67bb6fc2d90e02bf7b40633be891bb2fe3d0",
[]
],
"slow-image.py": [
@@ -464352,6 +464761,10 @@
]
},
"request": {
+ "WEB_FEATURES.yml": [
+ "69b2ea582a2281403c4899e122343262e43976db",
+ []
+ ],
"destination": {
"resources": {
"dummy": [
@@ -465226,6 +465639,10 @@
[]
],
"resources": {
+ "cached_pragma_rand.py": [
+ "18c7d25159fa3041b8aa278c8ac022003eee0e36",
+ []
+ ],
"http-cache.py": [
"3ab610dd1421cea5289ad14a8ef472ade27f07f1",
[]
@@ -465244,6 +465661,30 @@
]
}
},
+ "local-network-access": {
+ "META.yml": [
+ "4c5c6983ed0467f3ebca3182a6b5d095270f85d2",
+ []
+ ],
+ "README.md": [
+ "95066cdcd0ba6f2baed3cd02d67610420367b6df",
+ []
+ ],
+ "resources": {
+ "fetch-private.html": [
+ "b96a207ec33a13e5dd4c53083ac3d73123b23cbb",
+ []
+ ],
+ "support.sub.js": [
+ "774e34d0a6fe59bab19aca14cb71b6e520acb798",
+ []
+ ],
+ "target.py": [
+ "eabcdd47517c8938d12cd08a0d66f0db2e518456",
+ []
+ ]
+ }
+ },
"metadata": {
"META.yml": [
"85f0a7d2ee12616aa7a5698b346954829d8a8bb0",
@@ -465865,7 +466306,7 @@
[]
],
"WEB_FEATURES.yml": [
- "45e40acba1dcb6b4abe11d1478c682264a4c1e90",
+ "7faf67952b5b82107a2797706e41dfdc780ef041",
[]
],
"resources": {
@@ -471334,6 +471775,10 @@
[]
],
"wide-gamut-canvas": {
+ "WEB_FEATURES.yml": [
+ "b4d11212a6c677339784cdab33e0e31b0b948379",
+ []
+ ],
"canvas-display-p3.js": [
"c6ee97b7880a4ac2333b82b60407102045d1f509",
[]
@@ -471696,6 +472141,10 @@
"2d.path.stroke.overlap.png": [
"e2a35d48d4c4363294aec671a38cbd4b39c9a53c",
[]
+ ],
+ "WEB_FEATURES.yml": [
+ "1bbef5e88d6630d820e2206f283ac38cffceb67d",
+ []
]
},
"pixel-manipulation": {
@@ -471879,6 +472328,12 @@
[]
]
}
+ },
+ "wide-gamut-canvas": {
+ "WEB_FEATURES.yml": [
+ "b4d11212a6c677339784cdab33e0e31b0b948379",
+ []
+ ]
}
},
"offscreen": {
@@ -472358,8 +472813,20 @@
"fc7265a48c393566ad8c9fe7b73281e4f5137b21",
[]
]
+ },
+ "wide-gamut-canvas": {
+ "WEB_FEATURES.yml": [
+ "b4d11212a6c677339784cdab33e0e31b0b948379",
+ []
+ ]
}
},
+ "path-objects": {
+ "WEB_FEATURES.yml": [
+ "1bbef5e88d6630d820e2206f283ac38cffceb67d",
+ []
+ ]
+ },
"reset": {
"2d.reset.after-rasterization-expected.html": [
"3162e16e63d9fa5cc495401ca53d6c0242d3ee65",
@@ -472471,6 +472938,12 @@
"00ecdccad3743db0d0a1ec99850f80ea7964d512",
[]
]
+ },
+ "wide-gamut-canvas": {
+ "WEB_FEATURES.yml": [
+ "b4d11212a6c677339784cdab33e0e31b0b948379",
+ []
+ ]
}
},
"resources": {
@@ -477418,6 +477891,14 @@
}
}
},
+ "embedded-content": {
+ "the-img-element": {
+ "WEB_FEATURES.yml": [
+ "5716baa5def9bd2af6813751aa7a93ffba64c4cd",
+ []
+ ]
+ }
+ },
"iana": {
"application-x-www-form-urlencoded": {
"original-id.json": [
@@ -478970,6 +479451,10 @@
},
"scripting": {
"the-script-element": {
+ "WEB_FEATURES.yml": [
+ "864bd3398ee21fb62665a2d5c259a52acdd04232",
+ []
+ ],
"resources": {
"script.js": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
@@ -482984,11 +483469,7 @@
},
"interest-target": {
"interesttarget-keyboard-invalidation-ref.html": [
- "0ba07b16f497203f231d03cc7908453c6ccc43c4",
- []
- ],
- "interesttarget-outline-appearance-ref.html": [
- "33b0cf668587f182caf87dfb98665a9301fca19a",
+ "9d520943d5f542a2aeb45ac6cb1417eb20c25477",
[]
],
"resources": {
@@ -483000,6 +483481,10 @@
}
},
"the-link-element": {
+ "WEB_FEATURES.yml": [
+ "6a444ee171ad29c442d573fb2131b544820b6cad",
+ []
+ ],
"resources": {
"stylesheet.css": [
"9d9d772fb468756d1a90f72325f89cd372f812ef",
@@ -486735,7 +487220,7 @@
[]
],
"largest-contentful-paint.idl": [
- "872ba552b0d3b0398be533beb578fdedd260baea",
+ "d1630cc7daae802bf27107ce0ab07185d0746d7f",
[]
],
"layout-instability.idl": [
@@ -487059,7 +487544,7 @@
[]
],
"service-workers.idl": [
- "d9ff2f651f8235968dd29bd6d7f86e9e8fdcb4cf",
+ "34af3372401eed53328b8bc5e7ea42b87ddd9b20",
[]
],
"shape-detection-api.idl": [
@@ -487211,7 +487696,7 @@
[]
],
"webauthn.idl": [
- "a33c85e7bad86753211fa7aa9270abac18b1e54e",
+ "7fbe55e67652b3fd35079d1a06423bb441657bd5",
[]
],
"webcodecs-aac-codec-registration.idl": [
@@ -487702,7 +488187,7 @@
[]
],
"largest-contentful-paint-helpers.js": [
- "a01080c00881d7b66a80886e34367624913e1d6f",
+ "99916f5c5d31110d83c91d4ce346890efb494b12",
[]
],
"lcp-sw-from-cache.js": [
@@ -491118,7 +491603,7 @@
[]
],
"utils.js": [
- "ed58c957c97132276bb813603e1d25133cf0d860",
+ "41c76d6826658c0f73301f70ef0ae08cf84572e4",
[]
]
}
@@ -494280,6 +494765,10 @@
"da9bbc387f41ab069c27edc055962f72036b96f2",
[]
],
+ "WEB_FEATURES.yml": [
+ "f59321971a7668545949ee3212e54420e424c7ae",
+ []
+ ],
"prepare-device.js": [
"a12dbaf28717cf3776d9e34f5a12e4adaa7bae18",
[]
@@ -494388,7 +494877,7 @@
[]
],
"report-helper.js": [
- "5b5438903de11c346ac3901a9de81a96e4446386",
+ "216da22eae8c0ccde223c70a110a7a892676c14f",
[]
],
"report.py": [
@@ -495204,7 +495693,7 @@
[]
],
"api-tests-1.html": [
- "9de875b0f127776e0d60df68075402d32c195749",
+ "6ec396c221b98f282b46a366e99a76bd9daef492",
[]
],
"api-tests-2.html": [
@@ -495589,7 +496078,7 @@
[]
],
"testdriver.js": [
- "6e8410b7ea46064438c8d276274b6fbb689f81d2",
+ "992b9e3ab2ce0b63b94be2a5aa671b321f65e334",
[]
],
"testdriver.js.headers": [
@@ -495609,7 +496098,7 @@
[]
],
"testharness.js": [
- "d1d9d61eab890f2090e06a286aa76aedc98db7c7",
+ "6ccede34483b227cc41fcb15235e56aa60d4022e",
[]
],
"testharness.js.headers": [
@@ -499883,7 +500372,7 @@
[]
],
"basic-service-worker.js": [
- "17fccd448d2412287515f6176b0731189eb8eede",
+ "59d7d8bae9ee4d46d8a0bb12bcc3377d041280f4",
[]
],
"conditional-status.py": [
@@ -499895,11 +500384,11 @@
[]
],
"counting-executor.py": [
- "cbcbc8eccb9bd8cf536c56cf576a4b5ea73ca44a",
+ "3511fe4905e2d8962175f0e4bc318a13c41c35f5",
[]
],
"executor.sub.html": [
- "d27acfe100a6a3567606bd64df0b8cd1c5bdbfc1",
+ "975a3e5092ed149b687f34ba6b9c6d5af11432ea",
[]
],
"executor.sub.html.headers": [
@@ -500875,14 +501364,6 @@
[]
],
"animations": {
- "reftests": {
- "reference": {
- "green-100x100.svg": [
- "120941444a4898197d6b6001f9908a6cd48b62ba",
- []
- ]
- }
- },
"support": {
"animated-path-helpers.js": [
"8fd4492265c2eb8aa00fb173bd8d625f119adaac",
@@ -500927,6 +501408,10 @@
}
},
"embedded": {
+ "WEB_FEATURES.yml": [
+ "8482e555584bf205a6afa11836b35d046976e0df",
+ []
+ ],
"image-embedding-svg-with-near-integral-width-ref.html": [
"655d982b16ce0582f6b83e26844b2a6e2437b17b",
[]
@@ -501765,6 +502250,10 @@
}
},
"scripted": {
+ "WEB_FEATURES.yml": [
+ "864bd3398ee21fb62665a2d5c259a52acdd04232",
+ []
+ ],
"script-style-attribute-csp-ref.html": [
"a7316213f13a57fa1c3ab5c058bc9d21f14d5055",
[]
@@ -513355,7 +513844,7 @@
[]
],
"emulation.py": [
- "e587a082c037d4fdcd72441616a3800d341c981a",
+ "fd5cf733ab761639493df402268429f5ab09f528",
[]
],
"input.py": [
@@ -513714,7 +514203,7 @@
[]
],
"android_webview.py": [
- "0e02d3c02cd5456d62401423e7bb7581d70dc32f",
+ "c796be18a734cfbb33fd73b0d99a7c30512c8dd6",
[]
],
"base.py": [
@@ -513726,7 +514215,7 @@
[]
],
"chrome_android.py": [
- "820323e615ad57d89df7ccdee68a4587b8acc6fc",
+ "4ed7707c3bed88e2f5061a331e49683db8a4f583",
[]
],
"chrome_ios.py": [
@@ -513750,7 +514239,7 @@
[]
],
"firefox.py": [
- "494a7514efda2f2607c7394bca5ff9ddb19adf51",
+ "c63bfa2ceebb281e01e49a79aaf6cdeb2bbd92e5",
[]
],
"firefox_android.py": [
@@ -513826,7 +514315,7 @@
[]
],
"asyncactions.py": [
- "9925a4b511def24fda82522acb5c5f0f9f3e80a1",
+ "8397d7838a3d6bd45e28dc613322d00ff8f2aebb",
[]
],
"base.py": [
@@ -513858,7 +514347,7 @@
[]
],
"executorwebdriver.py": [
- "87403c2944d57e31c2612871262af9b77ce73235",
+ "7ca46a05a7b0f2bc3da65512fdee57080946b7d0",
[]
],
"executorwktr.py": [
@@ -513874,7 +514363,7 @@
[]
],
"protocol.py": [
- "833dff45636c7e22697e47cfe692ebecfcf2d76f",
+ "16eb3cbb4a528ac9e4fc4897aa36f2a58e6d68ec",
[]
],
"pytestrunner": {
@@ -513929,18 +514418,10 @@
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
],
- "chromium.py": [
- "95f53011bfc32de47a93e0bb7d2ac99f84be4e40",
- []
- ],
"tests": {
"__init__.py": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
- ],
- "test_chromium.py": [
- "bf815d5dc761b869f89ec71fdec66c395b453fbd",
- []
]
},
"wptreport.py": [
@@ -513989,7 +514470,7 @@
[]
],
"testdriver-extra.js": [
- "ab8b04ba3cdfc3d7c351ce99c6289de6e99b8f3e",
+ "3c2dd8b42dd5b572841b5b5529b42a17f724cef9",
[]
],
"testdriver-vendor.js": [
@@ -514017,7 +514498,7 @@
[]
],
"testrunner.py": [
- "64668fc470b730ecc664c06c0c5412a657f3d2da",
+ "2c2da790e901f8e56f5f5f77673a281530c53294",
[]
],
"tests": {
@@ -514131,7 +514612,7 @@
[]
],
"wptcommandline.py": [
- "647cc7f21b1e2f35f9111650cb6eba2dce5376a4",
+ "7bfeef317170f2032152df46d9f976a1a82cbc90",
[]
],
"wptlogging.py": [
@@ -516425,6 +516906,10 @@
"afa5e4eaf032e0ad26e730615d633ce498a73c12",
[]
],
+ "simd_select.wast.js": [
+ "e997d81f75abc7ef0ba8e6e78e5435e3bd63e13c",
+ []
+ ],
"simd_splat.wast.js": [
"3ecdc10e2791eda422bb2fa657386ea476951592",
[]
@@ -518417,7 +518902,7 @@
[]
],
"__init__.py": [
- "955335ea87e7fc427104a9a4eab5ba7c9e338558",
+ "587dc91a9387d3047fa56fa85ad80612637b24fd",
[]
],
"browser": {
@@ -518641,11 +519126,11 @@
],
"set_geolocation_override": {
"__init__.py": [
- "33dcca90f047b58e9026a104b99f537678191666",
+ "5e1fd1aa8637529a20b48356fe20e4f970b8428c",
[]
],
"conftest.py": [
- "a90895c74ed90c04b5f181af22c3bddec9ac132d",
+ "5fb9451f0a23821bbd7d25ac59efeb928f84b5ac",
[]
]
}
@@ -519964,7 +520449,7 @@
},
"resources": {
"utils.js": [
- "50d7911a9181a5139d9e16f7c866112dc54d6d01",
+ "9d5cfc70c10187743807096421975a099f22afc9",
[]
],
"utils_validation.js": [
@@ -520184,7 +520669,7 @@
[]
],
"RTCPeerConnection-insertable-streams.js": [
- "0bf820acde48058711163708b05d02e89501546b",
+ "f3873e1de4b12aa668f711dfbbf41cb9b2d0ac66",
[]
],
"RTCPeerConnection-sender-worker-single-frame.js": [
@@ -529018,7 +529503,7 @@
]
],
"idbcursor-request-source.any.js": [
- "2fe8c66f2e590b170a1456648e1dca74077464d8",
+ "8e1b34ee798a69c3d61386c5ae1f9adaeba6f21a",
[
"IndexedDB/idbcursor-request-source.any.html",
{
@@ -549735,7 +550220,7 @@
]
],
"idlharness.https.any.js": [
- "ae65eb49f2120e1a6d7222a7c0ecc9836c4ff5a8",
+ "5ddf7eab6dba2116d0d3bbc6826b176463107eb0",
[
"WebCryptoAPI/idlharness.https.any.html",
{
@@ -551569,10 +552054,10 @@
]
},
"translator": {
- "translator-bad-input.tentative.https.window.js": [
- "53a184bfd196f6006e7df9c908518ba47deacda6",
+ "translator-bad-input.https.window.js": [
+ "db8905a61f660f8dc0aa7666c044794d22683799",
[
- "ai/translator/translator-bad-input.tentative.https.window.html",
+ "ai/translator/translator-bad-input.https.window.html",
{
"script_metadata": [
[
@@ -551592,15 +552077,15 @@
}
]
],
- "translator-translate.tentative.https.window.js": [
- "a8aad5e03e1f46db43a47966d66f7aecc526b255",
+ "translator.optional.https.window.js": [
+ "96eca09d28bd61ccc4d31b746216f1f252d0bf3b",
[
- "ai/translator/translator-translate.tentative.https.window.html",
+ "ai/translator/translator.optional.https.window.html",
{
"script_metadata": [
[
"title",
- "Translate from English to Japanese"
+ "Translator Translate"
],
[
"global",
@@ -551621,6 +552106,10 @@
[
"script",
"/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "resources/util.js"
]
],
"timeout": "long"
@@ -571866,6 +572355,13 @@
{}
]
],
+ "style-src-inline-style-with-csstext.html": [
+ "5e812b4aee9d0d081673a0f333f8b29187619c3d",
+ [
+ null,
+ {}
+ ]
+ ],
"style-src-multiple-policies-multiple-hashing-algorithms.html": [
"027c61d8c632f2387408b8fb6869dee69bb8913d",
[
@@ -573017,7 +573513,7 @@
]
],
"cookieListItem_attributes.https.any.js": [
- "6716d91788db746765593a2a95d34e1ecbb4e3a5",
+ "542bd6c53870b5baaa9ac0f75c2235079b7bfe88",
[
"cookie-store/cookieListItem_attributes.https.any.html",
{
@@ -573771,7 +574267,7 @@
]
],
"httponly_cookies.https.window.js": [
- "8a10e358ef6de72d5476ae8dc8a571482881d7ef",
+ "605e94e67440aaedbcaa39f185270fe77b316ad3",
[
"cookie-store/httponly_cookies.https.window.html",
{
@@ -577594,7 +578090,7 @@
]
],
"anchor-position-grid-001.html": [
- "92fb4d275b8988641ed0736969e918703e4d649d",
+ "7bd389b39d8d6642f02181e475bbc5eaa7322f2d",
[
null,
{}
@@ -577636,7 +578132,7 @@
]
],
"anchor-position-multicol-002.html": [
- "7b2691a2b904ffb7fdc3d720b07ca454e1df7fe1",
+ "1e1f0a5c95b1b5f1d86efc5f22ffc87afbbab453",
[
null,
{}
@@ -577650,7 +578146,7 @@
]
],
"anchor-position-multicol-004.html": [
- "399494120ea0ea5da5534a0a14a9b99e598222d5",
+ "8f7a3dad12915ddbea9bd88077694434d0a17b48",
[
null,
{}
@@ -577692,7 +578188,7 @@
]
],
"anchor-position-multicol-nested-001.html": [
- "35ab2cfc15cea1fa1788f9b4cb09f9af39d079ec",
+ "c5ce41299af29008356b7a049a3d479038379fae",
[
null,
{}
@@ -581625,7 +582121,7 @@
],
"table": {
"border-spacing.html": [
- "fc5e87e35dde4b4cb2ed5c457f5cd22ec73d96b0",
+ "9fd94760681f0186f86f9a55da300250499f2a50",
[
null,
{}
@@ -581669,7 +582165,7 @@
]
],
"table-parts-offsets-vertical-rl.tentative.html": [
- "9d4a472d4382825c13af35114acc48a3b5face2a",
+ "1eb751032ca4b7598ee3a413408c61c5a592b3e4",
[
null,
{}
@@ -581846,6 +582342,13 @@
{}
]
],
+ "inline-style-background.html": [
+ "11451f8cefd3e725b017b263dded4bf9a806d785",
+ [
+ null,
+ {}
+ ]
+ ],
"layer-basic.html": [
"e214bffc25f5fc3b56480ec9c8704a80bf109c17",
[
@@ -588888,6 +589391,13 @@
{}
]
],
+ "gap-decorations-col-rule-width.html": [
+ "db7b97e74a58f30a52b22b68a92475f48f865ed7",
+ [
+ null,
+ {}
+ ]
+ ],
"gap-decorations-color-computed.html": [
"fbc3c3f4c976b344d48a9bd927547214f072e3ab",
[
@@ -595016,8 +595526,8 @@
{}
]
],
- "dashed-function-cycles.tentative.html": [
- "11e653e9b7d02d944e4bd74bda6e08e838c4ea42",
+ "dashed-function-cycles.html": [
+ "15305be2b287ca3e4fbfad928f8d101ed8463104",
[
null,
{}
@@ -595251,6 +595761,34 @@
{}
]
],
+ "getclientrects-005.html": [
+ "ee60a607dccb3fdba2ed7dc99cb344071f5bb34a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "getclientrects-006.html": [
+ "9f07a7de7444de7a2f91f97ff0a4fe44b7e177af",
+ [
+ null,
+ {}
+ ]
+ ],
+ "getclientrects-007.html": [
+ "0791c5b931fe3fade4c7b4483ef2469435ffbd77",
+ [
+ null,
+ {}
+ ]
+ ],
+ "getclientrects-008.html": [
+ "21505a7e48a2d2f9947342329de19dfde974d8e5",
+ [
+ null,
+ {}
+ ]
+ ],
"going-out-of-flow-after-spanner.html": [
"2fe0e42a7522647b7eca4db1e6f710a9975faaa4",
[
@@ -596325,6 +596863,24 @@
}
]
],
+ "scroll-button-activation-without-scroller.html": [
+ "f5951efc419d62a28f661c4f7d93cd9654b42616",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "scroll-button-disabled-no-focus.html": [
+ "a88977068742f03bdd4929ff1e3f96e581d9ba2d",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"scroll-button-display-none.html": [
"8b3068be6dad6d1ccbe1134b9833ecc1c8b0f594",
[
@@ -611456,7 +612012,7 @@
]
],
"transform.html": [
- "7a852545a74a494348d90d727fc7266140033d2f",
+ "d12714a499c75ecbae8c4586f452d335594240fb",
[
null,
{}
@@ -613525,7 +614081,7 @@
]
],
"sibling-function-descriptors.tentative.html": [
- "d31d4acf499fb62f777817f24186e394626d507e",
+ "76d2ff8ee4db660e41ede9b188465a6c31843e3b",
[
null,
{}
@@ -613545,6 +614101,20 @@
{}
]
],
+ "sibling-index-keyframe-length-value-dynamic.html": [
+ "cbd34602fb3c74f3cea8a1e2192d1b5687e38a05",
+ [
+ null,
+ {}
+ ]
+ ],
+ "sibling-index-keyframe-value-dynamic.html": [
+ "286e0d3d3e2eecdd091df74c8c47f738cb700dd1",
+ [
+ null,
+ {}
+ ]
+ ],
"tree-scoped-sibling-function.html": [
"979466bb7cf3d5e5c4e9a2681f02f969858953e6",
[
@@ -614627,6 +615197,13 @@
]
]
},
+ "start-skip-start.html": [
+ "e04979472f1725b0225cdb98bbbd5222ed98c16c",
+ [
+ null,
+ {}
+ ]
+ ],
"start-view-transtion-skips-active.html": [
"971c7b38d4c816489caab9c611adc800b3638971",
[
@@ -614703,7 +615280,7 @@
]
],
"view-transition-types-mutable-no-document-element-crashtest.html": [
- "d5c0abd652cd3c673a71979a458df8183ab057ba",
+ "3ac946b273ba9fa9f9da27b10e492420daa3430a",
[
null,
{}
@@ -617060,7 +617637,7 @@
]
],
"getBoundingClientRect-newline.html": [
- "40e29181d6fed001b641b0b0050cf21d6f3c589c",
+ "ce82b7237d003d79fe4333e5a67aa74b004bb11c",
[
null,
{}
@@ -617535,6 +618112,13 @@
{}
]
],
+ "scrollIntoView-container.html": [
+ "3b241ea22517ecc5db6f286422233ed9f25cab5f",
+ [
+ null,
+ {}
+ ]
+ ],
"scrollIntoView-fixed-outside-of-viewport.html": [
"b3d61a430a3d2b566ff73b0844a79bf5ec4e92db",
[
@@ -618029,6 +618613,13 @@
{}
]
],
+ "css-filters-opacity-hit-testing.html": [
+ "3b288fca4df13fcad7cfe0104c0f333aec73e45c",
+ [
+ null,
+ {}
+ ]
+ ],
"filter-sign-function.html": [
"97e5a26073b097728cf4571712bb9bd472ed69fd",
[
@@ -618224,7 +618815,7 @@
},
"geometry": {
"DOMMatrix-001.html": [
- "f578da076cbe6d7d7eb69b2cf438aa6f11a5c060",
+ "3436e17ced00de235f23117ed3a2bf8eba828a03",
[
null,
{}
@@ -624137,7 +624728,7 @@
}
]
],
- "overscroll-deltas.html": [
+ "overscroll-deltas.tentative.html": [
"e13e9f1cce5949da74227a1f069f64baad1f517c",
[
null,
@@ -624146,7 +624737,7 @@
}
]
],
- "overscroll-event-fired-to-document.html": [
+ "overscroll-event-fired-to-document.tentative.html": [
"c054ffca9c471f78ce5d1cbaa210fa7aad3aee3b",
[
null,
@@ -624155,7 +624746,7 @@
}
]
],
- "overscroll-event-fired-to-element-with-overscroll-behavior.html": [
+ "overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html": [
"750080e6568e863a9249bc62e52971d9459f8418",
[
null,
@@ -624164,7 +624755,7 @@
}
]
],
- "overscroll-event-fired-to-scrolled-element.html": [
+ "overscroll-event-fired-to-scrolled-element.tentative.html": [
"be4176df59d6a1d59d90beee839bc5ca6a72f1c5",
[
null,
@@ -624173,7 +624764,7 @@
}
]
],
- "overscroll-event-fired-to-window.html": [
+ "overscroll-event-fired-to-window.tentative.html": [
"ef5ae3daef8158c9424cf07ad091c6a945456d0a",
[
null,
@@ -646902,6 +647493,15 @@
}
]
],
+ "orphan-keydown.html": [
+ "0ab105d4d7284c19513a92241a9e16976fadefd0",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"pointerdown.html": [
"2eb6ae898ccd006da1633a7f812dbcfc0fcbe9f1",
[
@@ -648836,7 +649436,7 @@
]
],
"fedcm-disconnect.sub.https.html": [
- "2ea2d4a2599751cad941552964c700ced2f1b7cc",
+ "04fcd272dcf261a19cf71abb049e41c8b41abbbf",
[
null,
{
@@ -662487,6 +663087,13 @@
}
]
],
+ "pragma-no-cache-with-cache-control.html": [
+ "19a80fe5edc6fcfdaad36219bc608312f5d15a3b",
+ [
+ null,
+ {}
+ ]
+ ],
"split-cache.html": [
"c822abba3acee8db1079ad08dd7fbcbf38d9e3b9",
[
@@ -662766,6 +663373,17 @@
]
]
},
+ "local-network-access": {
+ "fetch.tentative.https.html": [
+ "9c591f309b75af6731c6d6be9c0907d3b8c22618",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ },
"metadata": {
"audio-worklet.https.html": [
"3b768ef0b5ddd2d13361629afd011e6987cb38d0",
@@ -692448,6 +693066,13 @@
},
"windows": {
"auxiliary-browsing-contexts": {
+ "named-lookup-noopener.html": [
+ "91cf6ae6ee24611856b1a5eeb87f60b99cb82d64",
+ [
+ null,
+ {}
+ ]
+ ],
"named-lookup-scoped-to-browsing-context-group.html": [
"0450d479196a19535419c286fa2447580b344b25",
[
@@ -721865,6 +722490,15 @@
}
]
],
+ "pointerdown-add-display-none.html": [
+ "653944e155b71055761ab900f9f485ba812b46d2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"pointerdown-add-overflow-hidden.html": [
"ac953adfd874b19ab42379039dc26ac0efb67b7b",
[
@@ -733709,6 +734343,15 @@
}
]
],
+ "select-input-keyboard-behavior.tentative.html": [
+ "bf3fbab9d18a4747f903d082a8c11d6ebad737aa",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"select-inside-top-layer.tentative.html": [
"6d70f3aaf8d3dc23b2f5fb784c399991913dc938",
[
@@ -740739,6 +741382,15 @@
}
]
],
+ "interesttarget-partial-interest.tentative.html": [
+ "bc7184d42d2528fe8e027e7af51463a796177ca9",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"interesttarget-popover-focus.tentative.html": [
"9dfc39a37a60d438ecf9287d0ddffc0212e7a21c",
[
@@ -748364,7 +749016,7 @@
},
"emulation": {
"set_geolocation_override.https.html": [
- "5cbcf546423c772a98fd3725531754c366ab7b91",
+ "e339f39dcd89aa311e91c744669bf2cd9aadc103",
[
null,
{
@@ -748875,7 +749527,7 @@
]
],
"input-events-spin-button-click-on-number-input-delete-document.html": [
- "fb3655398dbd1bdde84f032df392b6352b7fcafe",
+ "9e5d9b9ef99a4290b4195ff5901eab324935c3fe",
[
null,
{
@@ -750756,7 +751408,7 @@
]
],
"idlharness.html": [
- "5f5d286b356cf5dcffd76f2ed6f689804e8426ba",
+ "0dd006e711c6d7b02fcbcd4d31a5c11381fe8d69",
[
null,
{}
@@ -750959,7 +751611,7 @@
]
],
"observe-text.html": [
- "0724a0bb92bf5248938c33fe1377d2e3a23309a5",
+ "d029d500aa1217b92c3898e90a50de83a98bc9e0",
[
null,
{}
@@ -763879,7 +764531,7 @@
]
],
"paint-timing-mixin.html": [
- "c43b7668b5c9b376774672746b6f1e31e5feb3cb",
+ "048c985c7c75cc3fe717b3b836120f170e847d1e",
[
null,
{}
@@ -785589,7 +786241,7 @@
]
],
"sanitizer-basic-filtering.tentative.html": [
- "0b6924b0980d8295d02a5ed3d552ba4e58beb212",
+ "38c764ae181418014488cf86126398158e653157",
[
null,
{}
@@ -785616,6 +786268,13 @@
{}
]
],
+ "sanitizer-parseHTML.tentative.html": [
+ "c4a31e2eb0365f67479968f4ce08117d04384889",
+ [
+ null,
+ {}
+ ]
+ ],
"sanitizer-removeUnsafe.tentative.html": [
"7ad8253ad5fdec29b79c590e50e9c0d211d17031",
[
@@ -797066,7 +797725,7 @@
]
],
"innertext.tentative.html": [
- "d40b6047924834ef09137fa975cbd2d142999bcb",
+ "7716488f25a08ea62635fceec679d97650d1f383",
[
null,
{
@@ -797075,7 +797734,7 @@
]
],
"interaction-with-paint-before-back.tentative.html": [
- "7b884f2bdb38945a346c3b5a8b178c04e88989ad",
+ "5961a6ebcdfdd2b10bf16173d3f0cece2733fa1c",
[
null,
{
@@ -797255,6 +797914,19 @@
}
]
],
+ "smoke": {
+ "tentative": {
+ "basic.html": [
+ "9bfedf09b1934e00a85cd030388ed470f575f7b0",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ }
+ },
"soft-navigation-detection-main-descendent.tentative.html": [
"96ff55260c3b9553ac5735cc5fe209ee7cfd5f37",
[
@@ -797362,7 +798034,7 @@
]
],
"text-lcp-followed-by-anim-image-softnav-lcp.tentative.html": [
- "0615b513e61319d61bcbed3540aa1a5d47289cb6",
+ "b34a6e81a58333c61ccedb4e25551feba4893736",
[
null,
{
@@ -797389,7 +798061,7 @@
]
],
"visited-link.tentative.html": [
- "0bb149f00e91fc2f0033a6f763543967ef542ab2",
+ "0bb31aaac1540b3d2b9f6a3157bb43d96e430a58",
[
null,
{
@@ -798309,6 +798981,75 @@
"timeout": "long"
}
]
+ ],
+ "redirect.sub.https.html": [
+ "f56f6bf09b9f61956e9297f8098677b846270d49",
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler-synthetic",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler-to-fallback",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=no-fetch-handler",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler-synthetic",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler-to-fallback",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=no-fetch-handler",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=fetch-handler",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=fetch-handler-to-fallback",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=no-fetch-handler",
+ {
+ "timeout": "long"
+ }
+ ]
]
}
},
@@ -800074,6 +800815,26 @@
}
]
],
+ "prefetch-eagerness-pointer-down.https.html": [
+ "cbf69cefba61f23b706c9b397308625467671237",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
+ "prefetch-eagerness-pointer-hover.https.html": [
+ "f5e749b9c6f63f80c40ed9ff7cac42570f8b8d13",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
"prerender-target-hint.https.html": [
"cab8f4586c514f562976ee41acb2cd6f74568eac",
[
@@ -800151,10 +800912,12 @@
]
],
"SpeechRecognition-installOnDevice.https.html": [
- "1d1dd35edc26d75419a49120d8a76c4ea7c84233",
+ "2f5b359c571d6d9cc97815ae6ba46e4249ec569e",
[
null,
- {}
+ {
+ "testdriver": true
+ }
]
],
"SpeechRecognition-onerror.https.html": [
@@ -807083,7 +807846,7 @@
],
"crashtests": {
"garbage-collection.any.js": [
- "cf10f7f2e8317ed16dd5fe3a967c6f26efd0a335",
+ "6e9d80c41425b13800717f9e27184f64f1514752",
[
"streams/readable-streams/crashtests/garbage-collection.any.html",
{
@@ -812280,6 +813043,71 @@
}
]
],
+ "crashtests": {
+ "garbage-collection.any.js": [
+ "a3796881c9fb544a0b446db39af233b3866ae2b9",
+ [
+ "streams/writable-streams/crashtests/garbage-collection.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "/common/gc.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/writable-streams/crashtests/garbage-collection.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "/common/gc.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/writable-streams/crashtests/garbage-collection.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "/common/gc.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "streams/writable-streams/crashtests/garbage-collection.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "/common/gc.js"
+ ]
+ ]
+ }
+ ]
+ ]
+ },
"error.any.js": [
"d08c8a54863bb9693e76116946bd118592d6928c",
[
@@ -813749,6 +814577,34 @@
{}
]
],
+ "tentative": {
+ "integrity-policy": {
+ "parsing.https.html": [
+ "205854419a7d58871e39a5cfb3a86ccd38cd5492",
+ [
+ "subresource-integrity/tentative/integrity-policy/parsing.https.html?type=enforce",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "subresource-integrity/tentative/integrity-policy/parsing.https.html?type=report",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "script.https.html": [
+ "783374db920a24ae32a3492d8cfe2edc5d8eb5d3",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ]
+ }
+ },
"unencoded-digest": {
"tentative": {
"fetch.any.js": [
@@ -814694,13 +815550,6 @@
{}
]
],
- "discard-check-removal-order.html": [
- "2935a69addaabdeee2eb381de847cd7f77688ce3",
- [
- null,
- {}
- ]
- ],
"end-attribute-change-end-time.html": [
"9f05d7d405d364a1eadfa104c1c4bd90a2bf3b8c",
[
@@ -815922,7 +816771,7 @@
]
],
"idlharness.window.js": [
- "b363128c25a9068df93b26966b82b50cdd9b87f7",
+ "57beca77fd45b83f40fcdf378103d6f1c1c0940d",
[
"svg/idlharness.window.html",
{
@@ -817086,7 +817935,7 @@
]
],
"presentation-attributes-special-cases.html": [
- "7bfa001030a0e0969d845e353a9d721d9ce940a0",
+ "9a5da751ce1ace3c277bfce3bf9b99352ac7786f",
[
null,
{}
@@ -825119,6 +825968,13 @@
{}
]
],
+ "simd_select.wast.js.html": [
+ "5d50138374b1ce1edaa9d8b28d03f33b6cb6bab3",
+ [
+ null,
+ {}
+ ]
+ ],
"simd_splat.wast.js.html": [
"45204220343e96015990bb8c6374c2a98aa62382",
[
@@ -851947,7 +852803,7 @@
]
],
"conv2d.https.any.js": [
- "9fe246c9395c6cacf7e2f5245dac420e295707be",
+ "45fecb2b40cc399ace227264e881d2009d467cd2",
[
"webnn/conformance_tests/conv2d.https.any.html?cpu",
{
@@ -852058,7 +852914,7 @@
]
],
"conv_transpose2d.https.any.js": [
- "67ce5dbaf65cc99ba7f2fdd02aaf2d9b3e9022ce",
+ "a17df911e4482de7e49874d84f5818694515e722",
[
"webnn/conformance_tests/conv_transpose2d.https.any.html?cpu",
{
@@ -856147,7 +857003,7 @@
]
],
"log.https.any.js": [
- "011beef53aca200f5916dc51152fe745866989ec",
+ "8ed807b3401330e961f2ae9721f6378147580ddd",
[
"webnn/conformance_tests/log.https.any.html?cpu",
{
@@ -858136,7 +858992,7 @@
]
],
"pooling.https.any.js": [
- "f385aab1f154387bbe35b171927d29684c8d5120",
+ "8f81ff565d232dec427381dfdae638cffceb0d91",
[
"webnn/conformance_tests/pooling.https.any.html?cpu",
{
@@ -858469,7 +859325,7 @@
]
],
"qdq_subgraph.https.any.js": [
- "3b59c3bb49d6441a77e83309f48a97dd982aea74",
+ "aa816cce7fb2cd3d0a3f81d0453c8c199bf052fe",
[
"webnn/conformance_tests/qdq_subgraph.https.any.html?cpu",
{
@@ -861811,7 +862667,7 @@
]
],
"sign.https.any.js": [
- "4c3a330f850ca591bcc5a1b9c8fc784469ee821e",
+ "004c03bdf1339d74a84c95d5b03b31b56876d0fe",
[
"webnn/conformance_tests/sign.https.any.html?cpu",
{
@@ -881541,7 +882397,7 @@
],
"tentative": {
"RTCEncodedAudioFrame-clone.https.html": [
- "9f07713d4439c676fd7a5cc2f7d32af92a350e19",
+ "c93f8b3e54150b94334c33f30031d0b9f3afcd19",
[
null,
{
@@ -881550,7 +882406,7 @@
]
],
"RTCEncodedAudioFrame-metadata.https.html": [
- "435e1c067834fe2050fd5c510f95516c5e6aeb61",
+ "df4577c5614a82afd7b02d988d0f15caa3b9e848",
[
null,
{
@@ -927344,7 +928200,7 @@
]
],
"user_contexts.py": [
- "64c261637342868e90ee67a2332503e00fa96b0d",
+ "fa1e748d6b2a91addeb6c0569ebd271c00865fb8",
[
null,
{}
@@ -927424,28 +928280,35 @@
"emulation": {
"set_geolocation_override": {
"contexts.py": [
- "8a0e43475da52609a362bf5f3e0853ceb2a9725f",
+ "068bb804e73bd06e2d901363280792d479cfb38f",
[
null,
{}
]
],
"coordinates.py": [
- "b23354e9e42ef1bdd9d6684d11b782ce15f4eb8c",
+ "ea4fe643c3ecfc6e3609172706b51df17456e2e7",
+ [
+ null,
+ {}
+ ]
+ ],
+ "error.py": [
+ "27c23dc7811458feb7cd43c8a286c83809d9d2d0",
[
null,
{}
]
],
"invalid.py": [
- "e804848e0be6c483340dcd8b3b4def10dddedce9",
+ "2334d37517df00cde8f845e7ec6412d1570e405b",
[
null,
{}
]
],
"user_contexts.py": [
- "008dee5698de43a3371c1f7d697bb69014cf1b65",
+ "b3038bb59587b661e75945c5b8eeb4e943c72d9e",
[
null,
{}
diff --git a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini
deleted file mode 100644
index 88bb87548ec..00000000000
--- a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[idlharness.https.any.html]
- [idl_test setup]
- expected: FAIL
-
-
-[idlharness.https.any.worker.html]
- [idl_test setup]
- expected: FAIL
diff --git a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html.ini b/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html.ini
deleted file mode 100644
index a5cf5faf238..00000000000
--- a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-attr-blocked-src-allowed.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[style-src-attr-blocked-src-allowed.html]
- expected: TIMEOUT
- [Should fire a security policy violation event]
- expected: NOTRUN
-
- [The attribute style should not be applied]
- expected: FAIL
diff --git a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html.ini b/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html.ini
deleted file mode 100644
index 979fc151f38..00000000000
--- a/tests/wpt/meta/content-security-policy/style-src-attr-elem/style-src-elem-allowed-attr-blocked.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[style-src-elem-allowed-attr-blocked.html]
- expected: TIMEOUT
- [Should fire a security policy violation for the attribute]
- expected: NOTRUN
-
- [The attribute style should not be applied and the inline style should be applied]
- expected: FAIL
diff --git a/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini b/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini
index 0c8111987c0..c99d7bd7844 100644
--- a/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini
+++ b/tests/wpt/meta/content-security-policy/style-src/inline-style-allowed-while-cloning-objects.sub.html.ini
@@ -1,13 +1,36 @@
[inline-style-allowed-while-cloning-objects.sub.html]
- expected: TIMEOUT
- [Test that violation report event was fired]
- expected: NOTRUN
+ [non-HTML namespace]
+ expected: FAIL
- [inline-style-allowed-while-cloning-objects 12]
+ [inline-style-allowed-while-cloning-objects 1]
expected: FAIL
- [inline-style-allowed-while-cloning-objects 14]
+ [inline-style-allowed-while-cloning-objects 3]
expected: FAIL
- [non-HTML namespace]
+ [inline-style-allowed-while-cloning-objects 5]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 7]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 8]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 9]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 10]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 11]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 17]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 18]
+ expected: FAIL
+
+ [inline-style-allowed-while-cloning-objects 19]
expected: FAIL
diff --git a/tests/wpt/meta/content-security-policy/style-src/inline-style-attribute-blocked.sub.html.ini b/tests/wpt/meta/content-security-policy/style-src/inline-style-attribute-blocked.sub.html.ini
deleted file mode 100644
index 92f00acdffe..00000000000
--- a/tests/wpt/meta/content-security-policy/style-src/inline-style-attribute-blocked.sub.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[inline-style-attribute-blocked.sub.html]
- [Expecting logs: ["violated-directive=style-src-attr","PASS"\]]
- expected: FAIL
diff --git a/tests/wpt/meta/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html.ini b/tests/wpt/meta/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html.ini
deleted file mode 100644
index d910f28e56a..00000000000
--- a/tests/wpt/meta/content-security-policy/style-src/style-src-inline-style-attribute-blocked.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[style-src-inline-style-attribute-blocked.html]
- expected: TIMEOUT
- [Inline style attribute should not be applied without 'unsafe-inline']
- expected: FAIL
-
- [Should fire a securitypolicyviolation event]
- expected: NOTRUN
diff --git a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html.ini b/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html.ini
deleted file mode 100644
index 26dc98e8f62..00000000000
--- a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[style_attribute_denied_missing_unsafe_hashes.html]
- expected: TIMEOUT
- [Test that the inline style attribute is blocked]
- expected: NOTRUN
diff --git a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html.ini b/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html.ini
deleted file mode 100644
index 3031a4f6f77..00000000000
--- a/tests/wpt/meta/content-security-policy/unsafe-hashes/style_attribute_denied_wrong_hash.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[style_attribute_denied_wrong_hash.html]
- expected: TIMEOUT
- [Test that the inline style attribute is blocked]
- expected: NOTRUN
diff --git a/tests/wpt/meta/css/css-gaps/flex/flex-gap-decorations-022.html.ini b/tests/wpt/meta/css/css-gaps/flex/flex-gap-decorations-022.html.ini
new file mode 100644
index 00000000000..1d8edacc4e1
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/flex/flex-gap-decorations-022.html.ini
@@ -0,0 +1,2 @@
+[flex-gap-decorations-022.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-029.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-029.html.ini
new file mode 100644
index 00000000000..6198f1bf534
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-029.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-029.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-030.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-030.html.ini
new file mode 100644
index 00000000000..76e055a6a0a
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-030.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-030.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-031.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-031.html.ini
new file mode 100644
index 00000000000..d9765648ea7
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-031.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-031.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-032.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-032.html.ini
new file mode 100644
index 00000000000..1e5a6bc2a68
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-032.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-032.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-033.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-033.html.ini
new file mode 100644
index 00000000000..aaeff2efe72
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-033.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-033.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-38.html.ini b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-38.html.ini
new file mode 100644
index 00000000000..eb1f89bfb6d
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/grid/grid-gap-decorations-38.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-38.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/multicol/multicol-gap-decorations-017.html.ini b/tests/wpt/meta/css/css-gaps/multicol/multicol-gap-decorations-017.html.ini
new file mode 100644
index 00000000000..b4d67fce3e3
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/multicol/multicol-gap-decorations-017.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-017.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/parsing/gap-decorations-col-rule-width.html.ini b/tests/wpt/meta/css/css-gaps/parsing/gap-decorations-col-rule-width.html.ini
new file mode 100644
index 00000000000..02d385579b9
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/parsing/gap-decorations-col-rule-width.html.ini
@@ -0,0 +1,9 @@
+[gap-decorations-col-rule-width.html]
+ [`column-rule-width` should be `0px` when `column-rule-style` is `none` with single value]
+ expected: FAIL
+
+ [`column-rule-width` should be as specified regardless of `column-rule-style` with multiple values]
+ expected: FAIL
+
+ [`column-rule-width` should be as specified regardless of `column-rule-style` with multiple (repeat) values]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/linear-gradient-body-sibling-index.html.ini b/tests/wpt/meta/css/css-images/linear-gradient-body-sibling-index.html.ini
new file mode 100644
index 00000000000..638b6c21891
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/linear-gradient-body-sibling-index.html.ini
@@ -0,0 +1,2 @@
+[linear-gradient-body-sibling-index.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/linear-gradient-sibling-index.html.ini b/tests/wpt/meta/css/css-images/linear-gradient-sibling-index.html.ini
new file mode 100644
index 00000000000..d81ff383b17
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/linear-gradient-sibling-index.html.ini
@@ -0,0 +1,2 @@
+[linear-gradient-sibling-index.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-mixins/dashed-function-cycles.tentative.html.ini b/tests/wpt/meta/css/css-mixins/dashed-function-cycles.html.ini
index e16c79da6ad..7faf9c2b2e4 100644
--- a/tests/wpt/meta/css/css-mixins/dashed-function-cycles.tentative.html.ini
+++ b/tests/wpt/meta/css/css-mixins/dashed-function-cycles.html.ini
@@ -1,4 +1,4 @@
-[dashed-function-cycles.tentative.html]
+[dashed-function-cycles.html]
[Local with self-cycle]
expected: FAIL
@@ -11,7 +11,10 @@
[Local shadowing cyclic property --x]
expected: FAIL
- [Local shadowing cyclic outer local --x ]
+ [Local shadowing cyclic outer local --x]
+ expected: FAIL
+
+ [Argument shadowing cyclic outer local --x]
expected: FAIL
[Arguments shadowing cyclic properties]
@@ -53,6 +56,9 @@
[Cycle through local, other function]
expected: FAIL
+ [Cycle through local, other function, fallback in function]
+ expected: FAIL
+
[Cycle through various variables and other functions]
expected: FAIL
@@ -62,15 +68,6 @@
[Cyclic defaults]
expected: FAIL
- [Local shadowing cyclic outer local --x]
- expected: FAIL
-
- [Argument shadowing cyclic outer local --x]
- expected: FAIL
-
- [Cycle through local, other function, fallback in function]
- expected: FAIL
-
[Cyclic outer --b shadows custom property]
expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini b/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini
index 287f1c19314..3c65d9bcf19 100644
--- a/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini
+++ b/tests/wpt/meta/css/css-values/tree-counting/sibling-function-descriptors.tentative.html.ini
@@ -10,3 +10,15 @@
[sibling-count() should not be allowed in @font-face descriptors]
expected: FAIL
+
+ [sibling-index() should not be allowed in @font-palette-values descriptors]
+ expected: FAIL
+
+ [sibling-count() should not be allowed in @font-palette-values descriptors]
+ expected: FAIL
+
+ [sibling-index() should not be allowed in @counter-style descriptors]
+ expected: FAIL
+
+ [sibling-count() should not be allowed in @counter-style descriptors]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html.ini b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html.ini
new file mode 100644
index 00000000000..f61a6205280
--- /dev/null
+++ b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html.ini
@@ -0,0 +1,6 @@
+[sibling-index-keyframe-length-value-dynamic.html]
+ [Initially, the sibling-index() is 2 for #target]
+ expected: FAIL
+
+ [Removing a preceding sibling of #target reduces the sibling-index()]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html.ini b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html.ini
new file mode 100644
index 00000000000..df16c83f839
--- /dev/null
+++ b/tests/wpt/meta/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html.ini
@@ -0,0 +1,6 @@
+[sibling-index-keyframe-value-dynamic.html]
+ [Initially, the sibling-index() is 3 for #target]
+ expected: FAIL
+
+ [Removing a preceding sibling of #target reduces the sibling-index()]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/cssom-view/scrollIntoView-container.html.ini b/tests/wpt/meta/css/cssom-view/scrollIntoView-container.html.ini
new file mode 100644
index 00000000000..0e9b4a98ac4
--- /dev/null
+++ b/tests/wpt/meta/css/cssom-view/scrollIntoView-container.html.ini
@@ -0,0 +1,15 @@
+[scrollIntoView-container.html]
+ [scrollIntoView() defaults to scrolling ancestors]
+ expected: FAIL
+
+ [scrollIntoView({container: 'all'}) scrolls ancestors]
+ expected: FAIL
+
+ [scrollIntoView({container: 'nearest'}) only scrolls nearest scroll container]
+ expected: FAIL
+
+ [scrollIntoView({container: 'nearest'}) doesn't stop at itself]
+ expected: FAIL
+
+ [scrollIntoView({container: 'nearest'}) doesn't propagate to outer frames]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/filter-effects/backdrop-filter-scale-transform.html.ini b/tests/wpt/meta/css/filter-effects/backdrop-filter-scale-transform.html.ini
new file mode 100644
index 00000000000..128ff19f7aa
--- /dev/null
+++ b/tests/wpt/meta/css/filter-effects/backdrop-filter-scale-transform.html.ini
@@ -0,0 +1,2 @@
+[backdrop-filter-scale-transform.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/geometry/DOMMatrix-001.html.ini b/tests/wpt/meta/css/geometry/DOMMatrix-001.html.ini
new file mode 100644
index 00000000000..cb607530097
--- /dev/null
+++ b/tests/wpt/meta/css/geometry/DOMMatrix-001.html.ini
@@ -0,0 +1,6 @@
+[DOMMatrix-001.html]
+ [new DOMMatrix("scale(sign(1em))")]
+ expected: FAIL
+
+ [new DOMMatrixReadOnly("scale(sign(1em))")]
+ expected: FAIL
diff --git a/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini b/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini
index 3369a3a2a49..5750c2948be 100644
--- a/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini
+++ b/tests/wpt/meta/dom/events/webkit-animation-end-event.html.ini
@@ -1,28 +1,22 @@
[webkit-animation-end-event.html]
expected: TIMEOUT
- [onanimationend and onwebkitanimationend are not aliases]
- expected: FAIL
-
[dispatchEvent of a webkitAnimationEnd event does trigger a prefixed event handler or listener]
expected: FAIL
- [dispatchEvent of an animationend event does not trigger a prefixed event handler or listener]
- expected: FAIL
-
[onwebkitanimationend event handler should trigger for an animation]
- expected: FAIL
+ expected: TIMEOUT
[onwebkitanimationend event handler should not trigger if an unprefixed event handler also exists]
- expected: FAIL
+ expected: NOTRUN
[onwebkitanimationend event handler should not trigger if an unprefixed listener also exists]
- expected: FAIL
+ expected: NOTRUN
[event types for prefixed and unprefixed animationend event handlers should be named appropriately]
- expected: FAIL
+ expected: NOTRUN
[webkitAnimationEnd event listener should trigger for an animation]
- expected: TIMEOUT
+ expected: NOTRUN
[webkitAnimationEnd event listener should not trigger if an unprefixed listener also exists]
expected: NOTRUN
diff --git a/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini b/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini
index 880ef51e59d..233a98ed69b 100644
--- a/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini
+++ b/tests/wpt/meta/dom/events/webkit-animation-iteration-event.html.ini
@@ -1,28 +1,22 @@
[webkit-animation-iteration-event.html]
expected: TIMEOUT
- [onanimationiteration and onwebkitanimationiteration are not aliases]
- expected: FAIL
-
[dispatchEvent of a webkitAnimationIteration event does trigger a prefixed event handler or listener]
expected: FAIL
- [dispatchEvent of an animationiteration event does not trigger a prefixed event handler or listener]
- expected: FAIL
-
[onwebkitanimationiteration event handler should trigger for an animation]
- expected: FAIL
+ expected: TIMEOUT
[onwebkitanimationiteration event handler should not trigger if an unprefixed event handler also exists]
- expected: FAIL
+ expected: NOTRUN
[onwebkitanimationiteration event handler should not trigger if an unprefixed listener also exists]
- expected: FAIL
+ expected: NOTRUN
[event types for prefixed and unprefixed animationiteration event handlers should be named appropriately]
- expected: FAIL
+ expected: NOTRUN
[webkitAnimationIteration event listener should trigger for an animation]
- expected: TIMEOUT
+ expected: NOTRUN
[webkitAnimationIteration event listener should not trigger if an unprefixed listener also exists]
expected: NOTRUN
diff --git a/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini b/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini
index ca7e2b96918..6e3e5febb82 100644
--- a/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini
+++ b/tests/wpt/meta/dom/events/webkit-animation-start-event.html.ini
@@ -1,4 +1,5 @@
[webkit-animation-start-event.html]
+ expected: TIMEOUT
[onanimationstart and onwebkitanimationstart are not aliases]
expected: FAIL
@@ -8,32 +9,29 @@
[dispatchEvent of a webkitAnimationStart event does not trigger an unprefixed event handler or listener]
expected: FAIL
- [dispatchEvent of an animationstart event does not trigger a prefixed event handler or listener]
- expected: FAIL
-
[onwebkitanimationstart event handler should trigger for an animation]
- expected: FAIL
+ expected: TIMEOUT
[onwebkitanimationstart event handler should not trigger if an unprefixed event handler also exists]
- expected: FAIL
+ expected: NOTRUN
[onwebkitanimationstart event handler should not trigger if an unprefixed listener also exists]
- expected: FAIL
+ expected: NOTRUN
[event types for prefixed and unprefixed animationstart event handlers should be named appropriately]
- expected: FAIL
+ expected: NOTRUN
[webkitAnimationStart event listener should trigger for an animation]
- expected: FAIL
+ expected: NOTRUN
[webkitAnimationStart event listener should not trigger if an unprefixed listener also exists]
- expected: FAIL
+ expected: NOTRUN
[webkitAnimationStart event listener should not trigger if an unprefixed event handler also exists]
- expected: FAIL
+ expected: NOTRUN
[event types for prefixed and unprefixed animationstart event listeners should be named appropriately]
- expected: FAIL
+ expected: NOTRUN
[webkitAnimationStart event listener is case sensitive]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini b/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini
index b7fe8688a23..d1d6814c761 100644
--- a/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini
+++ b/tests/wpt/meta/dom/events/webkit-transition-end-event.html.ini
@@ -1,27 +1,15 @@
[webkit-transition-end-event.html]
- [dispatchEvent of an transitionend event does not trigger a prefixed event handler or listener]
- expected: FAIL
-
[onwebkittransitionend event handler should trigger for an animation]
expected: FAIL
- [onwebkittransitionend event handler should not trigger if an unprefixed listener also exists]
- expected: FAIL
-
[event types for prefixed and unprefixed transitionend event handlers should be named appropriately]
expected: FAIL
[event types for prefixed and unprefixed transitionend event listeners should be named appropriately]
expected: FAIL
- [ontransitionend and onwebkittransitionend are not aliases]
- expected: FAIL
-
[webkitTransitionEnd event listener should trigger for an animation]
expected: FAIL
[dispatchEvent of a webkitTransitionEnd event does trigger a prefixed event handler or listener]
expected: FAIL
-
- [onwebkittransitionend event handler should not trigger if an unprefixed event handler also exists]
- expected: FAIL
diff --git a/tests/wpt/meta/fetch/http-cache/pragma-no-cache-with-cache-control.html.ini b/tests/wpt/meta/fetch/http-cache/pragma-no-cache-with-cache-control.html.ini
new file mode 100644
index 00000000000..5e3ad18d789
--- /dev/null
+++ b/tests/wpt/meta/fetch/http-cache/pragma-no-cache-with-cache-control.html.ini
@@ -0,0 +1,3 @@
+[pragma-no-cache-with-cache-control.html]
+ [Response with Cache-Control: max-age=2592000, public and Pragma: no-cache should be cached]
+ expected: FAIL
diff --git a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini
index a02fcf871ab..12a2314e747 100644
--- a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini
+++ b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini
@@ -52,3 +52,6 @@
[sec-fetch-storage-access - Cross-site]
expected: FAIL
+
+ [sec-fetch-user]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini
index 2241163d563..6313c3e33dd 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini
@@ -2,8 +2,5 @@
[window.open]
expected: FAIL
- [form submission]
- expected: FAIL
-
[link click]
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 5f9a07f92f0..277436ffad2 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
@@ -1,6 +1,3 @@
[iframe-src-aboutblank-navigate-immediately.html]
[Navigating to a different document with window.open]
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/replace-before-load/a-click.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
new file mode 100644
index 00000000000..60a4fa51f8a
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
@@ -0,0 +1,3 @@
+[a-click.html]
+ [aElement.click() before the load event must NOT replace]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-top.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-top.html.ini
deleted file mode 100644
index 6e8c7d20d83..00000000000
--- a/tests/wpt/meta/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-top.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[scroll-to-top.html]
- [Fragment Navigation: When fragid is TOP scroll to the top of the document]
- expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
index a03a8322165..7a5fcb79165 100644
--- a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
+++ b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
@@ -1,3 +1,3 @@
-[traverse_the_history_3.html]
+[traverse_the_history_5.html]
[Multiple history traversals, last would be aborted]
expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html.ini b/tests/wpt/meta/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html.ini
new file mode 100644
index 00000000000..6907354e049
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html.ini
@@ -0,0 +1,7 @@
+[named-lookup-noopener.html]
+ expected: TIMEOUT
+ [Two noopener window.open() calls create separate windows]
+ expected: TIMEOUT
+
+ [Two rel=noopener <a href> clicks create separate windows]
+ expected: NOTRUN
diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini
index 8daf97ba765..673fc1e4ffd 100644
--- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini
+++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-invalid-args.html.ini
@@ -1,5 +1,5 @@
[createImageBitmap-invalid-args.html]
- expected: TIMEOUT
+ expected: ERROR
[createImageBitmap with a vector HTMLImageElement source and sw set to 0]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
index 7e036a1c4e4..5d2657041d1 100644
--- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
+++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
@@ -1,5 +1,5 @@
[createImageBitmap-transfer.html]
- expected: TIMEOUT
+ expected: ERROR
[Transfer ImageBitmap created from a vector HTMLImageElement]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
new file mode 100644
index 00000000000..5cdcce07c65
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.disconnected.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html.ini b/tests/wpt/meta/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html.ini
deleted file mode 100644
index 1a3c292f9f2..00000000000
--- a/tests/wpt/meta/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.basics.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.imageData.object.ctor.basics.html]
- [Testing different type of ImageData constructor]
- expected: FAIL
diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini
index 25375c6ea47..311e3abaf15 100644
--- a/tests/wpt/meta/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini
@@ -1657,48 +1657,27 @@
[Window interface: window must inherit property "external" with the proper type]
expected: FAIL
- [Window interface: attribute onwebkitanimationstart]
- expected: FAIL
-
[Window interface: window must inherit property "statusbar" with the proper type]
expected: FAIL
- [Document interface: new Document() must inherit property "onwebkittransitionend" with the proper type]
- expected: FAIL
-
[Document interface: calling queryCommandEnabled(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
expected: FAIL
- [Document interface: new Document() must inherit property "onwebkitanimationstart" with the proper type]
- expected: FAIL
-
[Document interface: calling queryCommandIndeterm(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
expected: FAIL
- [Document interface: iframe.contentDocument must inherit property "onwebkitanimationend" with the proper type]
- expected: FAIL
-
[Document interface: iframe.contentDocument must inherit property "dir" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onwebkitanimationiteration" with the proper type]
- expected: FAIL
-
[Window interface: window must inherit property "applicationCache" with the proper type]
expected: FAIL
- [Document interface: attribute onauxclick]
- expected: FAIL
-
[Window interface: window must inherit property "menubar" with the proper type]
expected: FAIL
[Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false]
expected: FAIL
- [Document interface: new Document() must inherit property "onwebkitanimationiteration" with the proper type]
- expected: FAIL
-
[Document interface: attribute designMode]
expected: FAIL
@@ -1714,9 +1693,6 @@
[Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on new Document() with too few arguments must throw TypeError]
expected: FAIL
- [Document interface: attribute onwebkitanimationiteration]
- expected: FAIL
-
[Document interface: operation queryCommandEnabled(DOMString)]
expected: FAIL
@@ -1741,42 +1717,24 @@
[Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type]
expected: FAIL
- [Document interface: documentWithHandlers must inherit property "onslotchange" with the proper type]
- expected: FAIL
-
[Document interface: documentWithHandlers must inherit property "alinkColor" with the proper type]
expected: FAIL
[Document interface: documentWithHandlers must inherit property "dir" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onslotchange" with the proper type]
- expected: FAIL
-
[SVGAElement includes HTMLHyperlinkElementUtils: member names are unique]
expected: FAIL
[Window interface: attribute applicationCache]
expected: FAIL
- [Document interface: iframe.contentDocument must inherit property "onwebkitanimationstart" with the proper type]
- expected: FAIL
-
- [Document interface: attribute onslotchange]
- expected: FAIL
-
[Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
expected: FAIL
[Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type]
expected: FAIL
- [Document interface: iframe.contentDocument must inherit property "onwebkitanimationiteration" with the proper type]
- expected: FAIL
-
- [Document interface: attribute onwebkittransitionend]
- expected: FAIL
-
[Document interface: iframe.contentDocument must inherit property "all" with the proper type]
expected: FAIL
@@ -1789,9 +1747,6 @@
[Document interface: attribute linkColor]
expected: FAIL
- [Window interface: attribute onwebkitanimationiteration]
- expected: FAIL
-
[Window interface: window must inherit property "scrollbars" with the proper type]
expected: FAIL
@@ -1807,18 +1762,12 @@
[Document interface: iframe.contentDocument must inherit property "designMode" with the proper type]
expected: FAIL
- [Document interface: documentWithHandlers must inherit property "onwebkitanimationiteration" with the proper type]
- expected: FAIL
-
[Window interface: attribute toolbar]
expected: FAIL
[Window interface: attribute statusbar]
expected: FAIL
- [Window interface: window must inherit property "onwebkittransitionend" with the proper type]
- expected: FAIL
-
[Document interface: new Document() must inherit property "linkColor" with the proper type]
expected: FAIL
@@ -1828,15 +1777,9 @@
[Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL
- [Window interface: attribute onwebkittransitionend]
- expected: FAIL
-
[Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
expected: FAIL
- [Document interface: new Document() must inherit property "onslotchange" with the proper type]
- expected: FAIL
-
[Document interface: documentWithHandlers must inherit property "designMode" with the proper type]
expected: FAIL
@@ -1855,9 +1798,6 @@
[Window interface: window must inherit property "personalbar" with the proper type]
expected: FAIL
- [Document interface: attribute onwebkitanimationend]
- expected: FAIL
-
[Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError]
expected: FAIL
@@ -1882,24 +1822,15 @@
[Document interface: attribute vlinkColor]
expected: FAIL
- [Window interface: window must inherit property "onauxclick" with the proper type]
- expected: FAIL
-
[Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL
- [Document interface: iframe.contentDocument must inherit property "onslotchange" with the proper type]
- expected: FAIL
-
[Document interface: new Document() must inherit property "alinkColor" with the proper type]
expected: FAIL
[Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL
- [Window interface: attribute onslotchange]
- expected: FAIL
-
[Document interface: new Document() must inherit property "all" with the proper type]
expected: FAIL
@@ -1909,24 +1840,6 @@
[Window interface: window must inherit property "print()" with the proper type]
expected: FAIL
- [Document interface: documentWithHandlers must inherit property "onauxclick" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "onwebkitanimationend" with the proper type]
- expected: FAIL
-
- [Document interface: new Document() must inherit property "onauxclick" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "onwebkitanimationstart" with the proper type]
- expected: FAIL
-
- [Document interface: attribute onwebkitanimationstart]
- expected: FAIL
-
- [Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type]
- expected: FAIL
-
[Document interface: calling queryCommandValue(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
expected: FAIL
@@ -1939,9 +1852,6 @@
[Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: attribute onauxclick]
- expected: FAIL
-
[Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL
@@ -1954,48 +1864,30 @@
[Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onwebkitanimationend" with the proper type]
- expected: FAIL
-
[Window interface: window must inherit property "toolbar" with the proper type]
expected: FAIL
[Document interface: documentWithHandlers must inherit property "linkColor" with the proper type]
expected: FAIL
- [Document interface: new Document() must inherit property "onwebkitanimationend" with the proper type]
- expected: FAIL
-
[Document interface: operation queryCommandIndeterm(DOMString)]
expected: FAIL
- [Document interface: iframe.contentDocument must inherit property "onwebkittransitionend" with the proper type]
- expected: FAIL
-
[Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: attribute onwebkitanimationend]
- expected: FAIL
-
[Document interface: calling execCommand(DOMString, optional boolean, optional DOMString) on documentWithHandlers with too few arguments must throw TypeError]
expected: FAIL
[Document interface: documentWithHandlers must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL
- [Document interface: documentWithHandlers must inherit property "onwebkittransitionend" with the proper type]
- expected: FAIL
-
[Document interface: new Document() must inherit property "vlinkColor" with the proper type]
expected: FAIL
[Window interface: window must inherit property "locationbar" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onwebkitanimationstart" with the proper type]
- expected: FAIL
-
[Document interface: documentWithHandlers must inherit property "queryCommandIndeterm(DOMString)" with the proper type]
expected: FAIL
@@ -2023,24 +1915,12 @@
[Window interface: attribute clientInformation]
expected: FAIL
- [Window interface: attribute oncontextlost]
- expected: FAIL
-
- [Window interface: attribute oncontextrestored]
- expected: FAIL
-
[Window interface: operation reportError(any)]
expected: FAIL
[Window interface: window must inherit property "clientInformation" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "oncontextlost" with the proper type]
- expected: FAIL
-
- [Window interface: window must inherit property "oncontextrestored" with the proper type]
- expected: FAIL
-
[Window interface: window must inherit property "reportError(any)" with the proper type]
expected: FAIL
@@ -2050,129 +1930,15 @@
[Document interface: attribute onvisibilitychange]
expected: FAIL
- [Document interface: attribute oncontextlost]
- expected: FAIL
-
- [Document interface: attribute oncontextrestored]
- expected: FAIL
-
[Document interface: iframe.contentDocument must inherit property "onvisibilitychange" with the proper type]
expected: FAIL
- [Document interface: iframe.contentDocument must inherit property "oncontextlost" with the proper type]
- expected: FAIL
-
- [Document interface: iframe.contentDocument must inherit property "oncontextrestored" with the proper type]
- expected: FAIL
-
[Document interface: new Document() must inherit property "onvisibilitychange" with the proper type]
expected: FAIL
- [Document interface: new Document() must inherit property "oncontextlost" with the proper type]
- expected: FAIL
-
- [Document interface: new Document() must inherit property "oncontextrestored" with the proper type]
- expected: FAIL
-
[Document interface: documentWithHandlers must inherit property "onvisibilitychange" with the proper type]
expected: FAIL
- [Document interface: documentWithHandlers must inherit property "oncontextlost" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "oncontextrestored" with the proper type]
- expected: FAIL
-
- [Window interface: attribute onbeforeinput]
- expected: FAIL
-
- [Window interface: attribute onbeforematch]
- expected: FAIL
-
- [Window interface: attribute onscrollend]
- expected: FAIL
-
- [Window interface: window must inherit property "onbeforeinput" with the proper type]
- expected: FAIL
-
- [Window interface: window must inherit property "onbeforematch" with the proper type]
- expected: FAIL
-
- [Window interface: window must inherit property "onscrollend" with the proper type]
- expected: FAIL
-
- [Document interface: attribute onbeforeinput]
- expected: FAIL
-
- [Document interface: attribute onbeforematch]
- expected: FAIL
-
- [Document interface: attribute onscrollend]
- expected: FAIL
-
- [Document interface: iframe.contentDocument must inherit property "onbeforeinput" with the proper type]
- expected: FAIL
-
- [Document interface: iframe.contentDocument must inherit property "onbeforematch" with the proper type]
- expected: FAIL
-
- [Document interface: iframe.contentDocument must inherit property "onscrollend" with the proper type]
- expected: FAIL
-
- [Document interface: new Document() must inherit property "onbeforeinput" with the proper type]
- expected: FAIL
-
- [Document interface: new Document() must inherit property "onbeforematch" with the proper type]
- expected: FAIL
-
- [Document interface: new Document() must inherit property "onscrollend" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "onbeforeinput" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "onbeforematch" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "onscrollend" with the proper type]
- expected: FAIL
-
- [Window interface: attribute oncopy]
- expected: FAIL
-
- [Window interface: attribute oncut]
- expected: FAIL
-
- [Window interface: attribute onpaste]
- expected: FAIL
-
- [Window interface: window must inherit property "oncopy" with the proper type]
- expected: FAIL
-
- [Window interface: window must inherit property "oncut" with the proper type]
- expected: FAIL
-
- [Window interface: window must inherit property "onpaste" with the proper type]
- expected: FAIL
-
- [Window interface: attribute onbeforetoggle]
- expected: FAIL
-
- [Window interface: window must inherit property "onbeforetoggle" with the proper type]
- expected: FAIL
-
- [Document interface: attribute onbeforetoggle]
- expected: FAIL
-
- [Document interface: iframe.contentDocument must inherit property "onbeforetoggle" with the proper type]
- expected: FAIL
-
- [Document interface: new Document() must inherit property "onbeforetoggle" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "onbeforetoggle" with the proper type]
- expected: FAIL
-
[Window interface: attribute navigation]
expected: FAIL
@@ -2191,18 +1957,6 @@
[Document interface: calling parseHTMLUnsafe(DOMString) on documentWithHandlers with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: attribute onpagereveal]
- expected: FAIL
-
- [Window interface: window must inherit property "onpagereveal" with the proper type]
- expected: FAIL
-
- [Window interface: attribute onpageswap]
- expected: FAIL
-
- [Window interface: window must inherit property "onpageswap" with the proper type]
- expected: FAIL
-
[Document interface: operation parseHTMLUnsafe(HTMLString)]
expected: FAIL
@@ -2227,24 +1981,6 @@
[Document interface: calling parseHTMLUnsafe((TrustedHTML or DOMString)) on documentWithHandlers with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: attribute oncommand]
- expected: FAIL
-
- [Window interface: window must inherit property "oncommand" with the proper type]
- expected: FAIL
-
- [Document interface: attribute oncommand]
- expected: FAIL
-
- [Document interface: iframe.contentDocument must inherit property "oncommand" with the proper type]
- expected: FAIL
-
- [Document interface: new Document() must inherit property "oncommand" with the proper type]
- expected: FAIL
-
- [Document interface: documentWithHandlers must inherit property "oncommand" with the proper type]
- expected: FAIL
-
[idlharness.https.html?include=HTML.*]
[HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type]
@@ -2610,12 +2346,6 @@
[HTMLImageElement interface: document.createElement("img") must inherit property "decoding" with the proper type]
expected: FAIL
- [HTMLElement interface: attribute onwebkitanimationiteration]
- expected: FAIL
-
- [HTMLElement interface: attribute onslotchange]
- expected: FAIL
-
[HTMLVideoElement interface: attribute width]
expected: FAIL
@@ -2727,9 +2457,6 @@
[HTMLAnchorElement interface: attribute type]
expected: FAIL
- [HTMLElement interface: attribute onwebkitanimationend]
- expected: FAIL
-
[HTMLInputElement interface: attribute height]
expected: FAIL
@@ -2949,9 +2676,6 @@
[HTMLElement interface: attribute tabIndex]
expected: FAIL
- [HTMLElement interface: attribute onwebkitanimationstart]
- expected: FAIL
-
[HTMLImageElement interface: new Image() must inherit property "loading" with the proper type]
expected: FAIL
@@ -3639,9 +3363,6 @@
[HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type]
expected: FAIL
- [HTMLElement interface: attribute onwebkittransitionend]
- expected: FAIL
-
[HTMLLinkElement interface: document.createElement("link") must inherit property "imageSrcset" with the proper type]
expected: FAIL
@@ -3945,12 +3666,6 @@
[HTMLSlotElement interface: calling assign((Element or Text)...) on document.createElement("slot") with too few arguments must throw TypeError]
expected: FAIL
- [HTMLElement interface: attribute oncontextlost]
- expected: FAIL
-
- [HTMLElement interface: attribute oncontextrestored]
- expected: FAIL
-
[HTMLElement interface: document.createElement("noscript") must inherit property "oncontextlost" with the proper type]
expected: FAIL
@@ -4044,15 +3759,6 @@
[HTMLElement interface: attribute inert]
expected: FAIL
- [HTMLElement interface: attribute onbeforeinput]
- expected: FAIL
-
- [HTMLElement interface: attribute onbeforematch]
- expected: FAIL
-
- [HTMLElement interface: attribute onscrollend]
- expected: FAIL
-
[HTMLElement interface: document.createElement("noscript") must inherit property "inert" with the proper type]
expected: FAIL
@@ -4317,36 +4023,12 @@
[HTMLSelectElement interface: document.createElement("select") must inherit property "showPicker()" with the proper type]
expected: FAIL
- [HTMLBodyElement interface: attribute onpagereveal]
- expected: FAIL
-
- [HTMLBodyElement interface: document.createElement("body") must inherit property "onpagereveal" with the proper type]
- expected: FAIL
-
- [HTMLFrameSetElement interface: attribute onpagereveal]
- expected: FAIL
-
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagereveal" with the proper type]
- expected: FAIL
-
[HTMLTemplateElement interface: attribute shadowRootClonable]
expected: FAIL
[HTMLTemplateElement interface: document.createElement("template") must inherit property "shadowRootClonable" with the proper type]
expected: FAIL
- [HTMLBodyElement interface: attribute onpageswap]
- expected: FAIL
-
- [HTMLBodyElement interface: document.createElement("body") must inherit property "onpageswap" with the proper type]
- expected: FAIL
-
- [HTMLFrameSetElement interface: attribute onpageswap]
- expected: FAIL
-
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type]
- expected: FAIL
-
[HTMLElement interface: attribute writingSuggestions]
expected: FAIL
@@ -5866,42 +5548,6 @@
[HTMLElement interface: attribute popover]
expected: FAIL
- [HTMLElement interface: attribute onauxclick]
- expected: FAIL
-
- [HTMLElement interface: attribute onbeforeinput]
- expected: FAIL
-
- [HTMLElement interface: attribute onbeforematch]
- expected: FAIL
-
- [HTMLElement interface: attribute onbeforetoggle]
- expected: FAIL
-
- [HTMLElement interface: attribute oncontextlost]
- expected: FAIL
-
- [HTMLElement interface: attribute oncontextrestored]
- expected: FAIL
-
- [HTMLElement interface: attribute onscrollend]
- expected: FAIL
-
- [HTMLElement interface: attribute onslotchange]
- expected: FAIL
-
- [HTMLElement interface: attribute onwebkitanimationend]
- expected: FAIL
-
- [HTMLElement interface: attribute onwebkitanimationiteration]
- expected: FAIL
-
- [HTMLElement interface: attribute onwebkitanimationstart]
- expected: FAIL
-
- [HTMLElement interface: attribute onwebkittransitionend]
- expected: FAIL
-
[HTMLElement interface: attribute enterKeyHint]
expected: FAIL
@@ -5950,42 +5596,6 @@
[HTMLElement interface: document.createElement("noscript") must inherit property "popover" with the proper type]
expected: FAIL
- [HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforeinput" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforematch" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforetoggle" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "oncontextlost" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "oncontextrestored" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onscrollend" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onslotchange" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationend" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationiteration" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationstart" with the proper type]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "onwebkittransitionend" with the proper type]
- expected: FAIL
-
[HTMLElement interface: document.createElement("noscript") must inherit property "enterKeyHint" with the proper type]
expected: FAIL
@@ -6064,12 +5674,6 @@
[HTMLBodyElement interface: attribute aLink]
expected: FAIL
- [HTMLBodyElement interface: attribute onpagereveal]
- expected: FAIL
-
- [HTMLBodyElement interface: attribute onpageswap]
- expected: FAIL
-
[HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type]
expected: FAIL
@@ -6079,12 +5683,6 @@
[HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type]
expected: FAIL
- [HTMLBodyElement interface: document.createElement("body") must inherit property "onpagereveal" with the proper type]
- expected: FAIL
-
- [HTMLBodyElement interface: document.createElement("body") must inherit property "onpageswap" with the proper type]
- expected: FAIL
-
[HTMLHeadingElement interface: attribute align]
expected: FAIL
@@ -7681,24 +7279,12 @@
[HTMLFrameSetElement interface: attribute rows]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onpagereveal]
- expected: FAIL
-
- [HTMLFrameSetElement interface: attribute onpageswap]
- expected: FAIL
-
[HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type]
expected: FAIL
[HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagereveal" with the proper type]
- expected: FAIL
-
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type]
- expected: FAIL
-
[HTMLFrameElement interface: attribute name]
expected: FAIL
@@ -7813,12 +7399,6 @@
[HTMLDialogElement interface: operation requestClose(optional DOMString)]
expected: FAIL
- [HTMLElement interface: attribute oncommand]
- expected: FAIL
-
- [HTMLElement interface: document.createElement("noscript") must inherit property "oncommand" with the proper type]
- expected: FAIL
-
[HTMLButtonElement interface: attribute command]
expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index 6a420504feb..7da2bc5ac80 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index bbc1f35d8d9..e8872b3585b 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_nonescaping-1.html]
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
index d5fd800f09d..ff6467094b8 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
@@ -1,4 +1,3 @@
[iframe_sandbox_popups_nonescaping-3.html]
- expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini b/tests/wpt/meta/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini
deleted file mode 100644
index 7682a4830bf..00000000000
--- a/tests/wpt/meta/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[reparent-form-during-planned-navigation-task.html]
- expected: TIMEOUT
- [reparent-form-during-planned-navigation-task]
- expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini b/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini
index 1abe0eb8b88..320f8cf856c 100644
--- a/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini
+++ b/tests/wpt/meta/html/semantics/forms/form-submission-0/text-plain.window.js.ini
@@ -181,3 +181,6 @@
[text/plain: non-ASCII in filename (formdata event)]
expected: FAIL
+
+ [text/plain: 0x00 in name (normal form)]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
index 095b97aa5a0..8dba4e9c469 100644
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
+++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
@@ -5,9 +5,6 @@
[Different blob URLs pointing to the same blob resolve to different modules]
expected: FAIL
- [Revoking a blob URL immediately after calling import will not fail]
- expected: FAIL
-
[blob-url.any.worker-module.html]
expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini b/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini
index bf4c7b0b9c9..3a75e5ee0ee 100644
--- a/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini
+++ b/tests/wpt/meta/html/semantics/the-button-element/command-and-commandfor/button-event-dispatch-content-attribute.html.ini
@@ -1,6 +1,3 @@
[button-event-dispatch-content-attribute.html]
[oncommand content attribute works]
expected: FAIL
-
- [oncommand content with a value of false prevents default]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html.ini b/tests/wpt/meta/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html.ini
deleted file mode 100644
index 45513bfcfe5..00000000000
--- a/tests/wpt/meta/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[interesttarget-outline-appearance.tentative.html]
- expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
index cd77f908ffb..4d4bbb8a39e 100644
--- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
@@ -11,9 +11,6 @@
[onauxclick: the default value must be null]
expected: FAIL
- [onauxclick: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onblur: must be on the appropriate locations for GlobalEventHandlers]
expected: FAIL
@@ -62,9 +59,6 @@
[oncontextlost: the default value must be null]
expected: FAIL
- [oncontextlost: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[oncontextmenu: must be on the appropriate locations for GlobalEventHandlers]
expected: FAIL
@@ -77,9 +71,6 @@
[oncontextrestored: the default value must be null]
expected: FAIL
- [oncontextrestored: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[oncuechange: must be on the appropriate locations for GlobalEventHandlers]
expected: FAIL
@@ -338,9 +329,6 @@
[onslotchange: the default value must be null]
expected: FAIL
- [onslotchange: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onstalled: must be on the appropriate locations for GlobalEventHandlers]
expected: FAIL
@@ -389,9 +377,6 @@
[onwebkitanimationend: the default value must be null]
expected: FAIL
- [onwebkitanimationend: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onwebkitanimationend: the content attribute must execute when an event is dispatched]
expected: FAIL
@@ -401,9 +386,6 @@
[onwebkitanimationiteration: the default value must be null]
expected: FAIL
- [onwebkitanimationiteration: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onwebkitanimationiteration: the content attribute must execute when an event is dispatched]
expected: FAIL
@@ -413,9 +395,6 @@
[onwebkitanimationstart: the default value must be null]
expected: FAIL
- [onwebkitanimationstart: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onwebkitanimationstart: the content attribute must execute when an event is dispatched]
expected: FAIL
@@ -425,9 +404,6 @@
[onwebkittransitionend: the default value must be null]
expected: FAIL
- [onwebkittransitionend: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onwebkittransitionend: the content attribute must execute when an event is dispatched]
expected: FAIL
@@ -443,27 +419,18 @@
[onbeforeinput: the default value must be null]
expected: FAIL
- [onbeforeinput: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onbeforematch: must be on the appropriate locations for GlobalEventHandlers]
expected: FAIL
[onbeforematch: the default value must be null]
expected: FAIL
- [onbeforematch: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[onscrollend: must be on the appropriate locations for GlobalEventHandlers]
expected: FAIL
[onscrollend: the default value must be null]
expected: FAIL
- [onscrollend: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
[oncopy: must be on the appropriate locations for GlobalEventHandlers]
expected: FAIL
@@ -488,33 +455,6 @@
[onbeforetoggle: the default value must be null]
expected: FAIL
- [onbeforetoggle: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
- [onauxclick: dispatching an Event at a <meta> element must trigger element.onauxclick]
- expected: FAIL
-
- [onbeforeinput: dispatching an Event at a <meta> element must trigger element.onbeforeinput]
- expected: FAIL
-
- [onbeforematch: dispatching an Event at a <meta> element must trigger element.onbeforematch]
- expected: FAIL
-
- [onbeforetoggle: dispatching an Event at a <meta> element must trigger element.onbeforetoggle]
- expected: FAIL
-
- [oncontextlost: dispatching an Event at a <meta> element must trigger element.oncontextlost]
- expected: FAIL
-
- [oncontextrestored: dispatching an Event at a <meta> element must trigger element.oncontextrestored]
- expected: FAIL
-
- [onscrollend: dispatching an Event at a <meta> element must trigger element.onscrollend]
- expected: FAIL
-
- [onslotchange: dispatching an Event at a <meta> element must trigger element.onslotchange]
- expected: FAIL
-
[onwebkitanimationend: dispatching an Event at a <meta> element must trigger element.onwebkitanimationend]
expected: FAIL
@@ -532,9 +472,3 @@
[oncommand: the default value must be null]
expected: FAIL
-
- [oncommand: the content attribute must be compiled into a function as the corresponding property]
- expected: FAIL
-
- [oncommand: dispatching an Event at a <meta> element must trigger element.oncommand]
- expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
index deec7c5c132..3b3a37ff7c2 100644
--- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
@@ -1,181 +1,19 @@
[event-handler-attributes-body-window.html]
- [not shadowed auxclick (document.body)]
- expected: FAIL
-
- [not shadowed contextlost (document.body)]
- expected: FAIL
-
- [not shadowed contextrestored (document.body)]
- expected: FAIL
-
- [not shadowed slotchange (document.body)]
- expected: FAIL
-
- [not shadowed webkitanimationend (document.body)]
- expected: FAIL
-
- [not shadowed webkitanimationiteration (document.body)]
- expected: FAIL
-
- [not shadowed webkitanimationstart (document.body)]
- expected: FAIL
-
- [not shadowed webkittransitionend (document.body)]
- expected: FAIL
-
- [not shadowed copy (document.body)]
- expected: FAIL
-
- [not shadowed cut (document.body)]
- expected: FAIL
-
- [not shadowed paste (document.body)]
- expected: FAIL
-
- [not shadowed auxclick (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed contextlost (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed contextrestored (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed slotchange (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed webkitanimationend (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed webkitanimationiteration (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed webkitanimationstart (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed webkittransitionend (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed copy (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed cut (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed paste (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed auxclick (window)]
- expected: FAIL
-
- [not shadowed contextlost (window)]
- expected: FAIL
-
- [not shadowed contextrestored (window)]
- expected: FAIL
-
- [not shadowed slotchange (window)]
- expected: FAIL
-
- [not shadowed webkitanimationend (window)]
- expected: FAIL
-
- [not shadowed webkitanimationiteration (window)]
- expected: FAIL
-
- [not shadowed webkitanimationstart (window)]
- expected: FAIL
-
- [not shadowed webkittransitionend (window)]
- expected: FAIL
-
- [not shadowed beforeinput (document.body)]
- expected: FAIL
-
- [not shadowed beforematch (document.body)]
- expected: FAIL
-
- [not shadowed scrollend (document.body)]
- expected: FAIL
-
- [not shadowed beforeinput (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed beforematch (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed scrollend (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed beforeinput (window)]
- expected: FAIL
-
- [not shadowed beforematch (window)]
- expected: FAIL
-
- [not shadowed scrollend (window)]
- expected: FAIL
-
- [not shadowed beforetoggle (document.body)]
- expected: FAIL
-
- [not shadowed beforetoggle (document.createElement("body"))]
- expected: FAIL
-
- [not shadowed beforetoggle (window)]
- expected: FAIL
-
- [shadowed pagereveal (document.body)]
- expected: FAIL
-
- [shadowed pagereveal removal (document.body)]
- expected: FAIL
-
- [shadowed pagereveal (document.createElement("body"))]
- expected: FAIL
-
[shadowed pagereveal removal (document.createElement("body"))]
expected: FAIL
- [shadowed pagereveal (window)]
- expected: FAIL
-
[shadowed pagereveal removal (window)]
expected: FAIL
- [shadowed pageswap (document.body)]
- expected: FAIL
-
- [shadowed pageswap removal (document.body)]
- expected: FAIL
-
- [shadowed pageswap (document.createElement("body"))]
- expected: FAIL
-
[shadowed pageswap removal (document.createElement("body"))]
expected: FAIL
- [shadowed pageswap (window)]
- expected: FAIL
-
[shadowed pageswap removal (window)]
expected: FAIL
[shadowed blur on body fires when event dispatched on window]
expected: FAIL
- [shadowed messageerror on body fires when event dispatched on window]
- expected: FAIL
-
- [shadowed pagereveal on body fires when event dispatched on window]
- expected: FAIL
-
- [shadowed pageswap on body fires when event dispatched on window]
- expected: FAIL
-
- [shadowed rejectionhandled on body fires when event dispatched on window]
- expected: FAIL
-
[shadowed focus removal (document.createElement("body"))]
expected: FAIL
@@ -206,6 +44,9 @@
[shadowed message removal (document.createElement("body"))]
expected: FAIL
+ [shadowed messageerror removal (document.createElement("body"))]
+ expected: FAIL
+
[shadowed offline removal (document.createElement("body"))]
expected: FAIL
@@ -233,6 +74,9 @@
[shadowed load removal (window)]
expected: FAIL
+ [shadowed rejectionhandled removal (document.createElement("body"))]
+ expected: FAIL
+
[shadowed resize removal (window)]
expected: FAIL
@@ -257,6 +101,9 @@
[shadowed message removal (window)]
expected: FAIL
+ [shadowed messageerror removal (window)]
+ expected: FAIL
+
[shadowed offline removal (window)]
expected: FAIL
@@ -272,17 +119,11 @@
[shadowed popstate removal (window)]
expected: FAIL
- [shadowed storage removal (window)]
+ [shadowed rejectionhandled removal (window)]
expected: FAIL
- [shadowed unload removal (window)]
- expected: FAIL
-
- [not shadowed command (document.body)]
- expected: FAIL
-
- [not shadowed command (document.createElement("body"))]
+ [shadowed storage removal (window)]
expected: FAIL
- [not shadowed command (window)]
+ [shadowed unload removal (window)]
expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
index 4484356912c..b18a8cf6d5b 100644
--- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
@@ -1,166 +1,4 @@
[event-handler-attributes-frameset-window.html]
- [not shadowed auxclick (document.body)]
- expected: FAIL
-
- [not shadowed contextlost (document.body)]
- expected: FAIL
-
- [not shadowed contextrestored (document.body)]
- expected: FAIL
-
- [not shadowed slotchange (document.body)]
- expected: FAIL
-
- [not shadowed webkitanimationend (document.body)]
- expected: FAIL
-
- [not shadowed webkitanimationiteration (document.body)]
- expected: FAIL
-
- [not shadowed webkitanimationstart (document.body)]
- expected: FAIL
-
- [not shadowed webkittransitionend (document.body)]
- expected: FAIL
-
- [not shadowed copy (document.body)]
- expected: FAIL
-
- [not shadowed cut (document.body)]
- expected: FAIL
-
- [not shadowed paste (document.body)]
- expected: FAIL
-
- [not shadowed auxclick (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed contextlost (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed contextrestored (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed slotchange (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed webkitanimationend (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed webkitanimationiteration (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed webkitanimationstart (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed webkittransitionend (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed copy (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed cut (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed paste (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed auxclick (window)]
- expected: FAIL
-
- [not shadowed contextlost (window)]
- expected: FAIL
-
- [not shadowed contextrestored (window)]
- expected: FAIL
-
- [not shadowed slotchange (window)]
- expected: FAIL
-
- [not shadowed webkitanimationend (window)]
- expected: FAIL
-
- [not shadowed webkitanimationiteration (window)]
- expected: FAIL
-
- [not shadowed webkitanimationstart (window)]
- expected: FAIL
-
- [not shadowed webkittransitionend (window)]
- expected: FAIL
-
- [not shadowed beforeinput (document.body)]
- expected: FAIL
-
- [not shadowed beforematch (document.body)]
- expected: FAIL
-
- [not shadowed scrollend (document.body)]
- expected: FAIL
-
- [not shadowed beforeinput (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed beforematch (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed scrollend (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed beforeinput (window)]
- expected: FAIL
-
- [not shadowed beforematch (window)]
- expected: FAIL
-
- [not shadowed scrollend (window)]
- expected: FAIL
-
- [not shadowed beforetoggle (document.body)]
- expected: FAIL
-
- [not shadowed beforetoggle (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed beforetoggle (window)]
- expected: FAIL
-
- [shadowed pagereveal (document.body)]
- expected: FAIL
-
- [shadowed pagereveal removal (document.body)]
- expected: FAIL
-
- [shadowed pagereveal (document.createElement("frameset"))]
- expected: FAIL
-
- [shadowed pagereveal removal (document.createElement("frameset"))]
- expected: FAIL
-
- [shadowed pagereveal (window)]
- expected: FAIL
-
- [shadowed pagereveal removal (window)]
- expected: FAIL
-
- [shadowed pageswap (document.body)]
- expected: FAIL
-
- [shadowed pageswap removal (document.body)]
- expected: FAIL
-
- [shadowed pageswap (document.createElement("frameset"))]
- expected: FAIL
-
- [shadowed pageswap removal (document.createElement("frameset"))]
- expected: FAIL
-
- [shadowed pageswap (window)]
- expected: FAIL
-
- [shadowed pageswap removal (window)]
- expected: FAIL
-
[shadowed blur on body fires when event dispatched on window]
expected: FAIL
@@ -226,12 +64,3 @@
[shadowed unload on body fires when event dispatched on window]
expected: FAIL
-
- [not shadowed command (document.body)]
- expected: FAIL
-
- [not shadowed command (document.createElement("frameset"))]
- expected: FAIL
-
- [not shadowed command (window)]
- expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
deleted file mode 100644
index db4d6e3321d..00000000000
--- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
+++ /dev/null
@@ -1,102 +0,0 @@
-[event-handler-attributes-windowless-body.html]
- [auxclick is unaffected on a windowless body]
- expected: FAIL
-
- [contextlost is unaffected on a windowless body]
- expected: FAIL
-
- [contextrestored is unaffected on a windowless body]
- expected: FAIL
-
- [slotchange is unaffected on a windowless body]
- expected: FAIL
-
- [webkitanimationend is unaffected on a windowless body]
- expected: FAIL
-
- [webkitanimationiteration is unaffected on a windowless body]
- expected: FAIL
-
- [webkitanimationstart is unaffected on a windowless body]
- expected: FAIL
-
- [webkittransitionend is unaffected on a windowless body]
- expected: FAIL
-
- [auxclick is unaffected on a windowless frameset]
- expected: FAIL
-
- [contextlost is unaffected on a windowless frameset]
- expected: FAIL
-
- [contextrestored is unaffected on a windowless frameset]
- expected: FAIL
-
- [slotchange is unaffected on a windowless frameset]
- expected: FAIL
-
- [webkitanimationend is unaffected on a windowless frameset]
- expected: FAIL
-
- [webkitanimationiteration is unaffected on a windowless frameset]
- expected: FAIL
-
- [webkitanimationstart is unaffected on a windowless frameset]
- expected: FAIL
-
- [webkittransitionend is unaffected on a windowless frameset]
- expected: FAIL
-
- [beforeinput is unaffected on a windowless body]
- expected: FAIL
-
- [beforematch is unaffected on a windowless body]
- expected: FAIL
-
- [scrollend is unaffected on a windowless body]
- expected: FAIL
-
- [beforeinput is unaffected on a windowless frameset]
- expected: FAIL
-
- [beforematch is unaffected on a windowless frameset]
- expected: FAIL
-
- [scrollend is unaffected on a windowless frameset]
- expected: FAIL
-
- [beforetoggle is unaffected on a windowless body]
- expected: FAIL
-
- [beforetoggle is unaffected on a windowless frameset]
- expected: FAIL
-
- [Return null when getting the pagereveal event handler of a windowless body]
- expected: FAIL
-
- [Ignore setting of pagereveal window event handlers on windowless body]
- expected: FAIL
-
- [Return null when getting the pagereveal event handler of a windowless frameset]
- expected: FAIL
-
- [Ignore setting of pagereveal window event handlers on windowless frameset]
- expected: FAIL
-
- [Return null when getting the pageswap event handler of a windowless body]
- expected: FAIL
-
- [Ignore setting of pageswap window event handlers on windowless body]
- expected: FAIL
-
- [Return null when getting the pageswap event handler of a windowless frameset]
- expected: FAIL
-
- [Ignore setting of pageswap window event handlers on windowless frameset]
- expected: FAIL
-
- [command is unaffected on a windowless body]
- expected: FAIL
-
- [command is unaffected on a windowless frameset]
- expected: FAIL
diff --git a/tests/wpt/meta/streams/writable-streams/crashtests/garbage-collection.any.js.ini b/tests/wpt/meta/streams/writable-streams/crashtests/garbage-collection.any.js.ini
new file mode 100644
index 00000000000..6204bdc21da
--- /dev/null
+++ b/tests/wpt/meta/streams/writable-streams/crashtests/garbage-collection.any.js.ini
@@ -0,0 +1,9 @@
+[garbage-collection.any.html]
+
+[garbage-collection.any.sharedworker.html]
+ expected: ERROR
+
+[garbage-collection.any.serviceworker.html]
+ expected: ERROR
+
+[garbage-collection.any.worker.html]
diff --git a/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/parsing.https.html.ini b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/parsing.https.html.ini
new file mode 100644
index 00000000000..8634900f9c2
--- /dev/null
+++ b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/parsing.https.html.ini
@@ -0,0 +1,9 @@
+[parsing.https.html?type=enforce]
+ [Ensure that test is working with a valid destination]
+ expected: FAIL
+
+ [Ensure that test is working with a valid destination and source]
+ expected: FAIL
+
+
+[parsing.https.html?type=report]
diff --git a/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/script.https.html.ini b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/script.https.html.ini
new file mode 100644
index 00000000000..3563393c660
--- /dev/null
+++ b/tests/wpt/meta/subresource-integrity/tentative/integrity-policy/script.https.html.ini
@@ -0,0 +1,15 @@
+[script.https.html]
+ [Ensure that a script without integrity did not run]
+ expected: FAIL
+
+ [Ensure that a script with unknown integrity algorithm did not run]
+ expected: FAIL
+
+ [Ensure that a script without integrity algorithm runs and gets reported in report-only mode]
+ expected: FAIL
+
+ [Ensure that a no-cors script gets blocked]
+ expected: FAIL
+
+ [Ensure that ReportingObserver gets called without endpoints]
+ expected: FAIL
diff --git a/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini b/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini
index 225c4d84121..205dd5886a8 100644
--- a/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini
+++ b/tests/wpt/meta/trusted-types/trusted-types-event-handlers.html.ini
@@ -23,9 +23,21 @@
[Event handler div.onpaste should be blocked.]
expected: FAIL
+ [Event handler div.onauxclick should be blocked.]
+ expected: FAIL
+
[Event handler div.onabort should be blocked.]
expected: FAIL
+ [Event handler div.onbeforeinput should be blocked.]
+ expected: FAIL
+
+ [Event handler div.onbeforematch should be blocked.]
+ expected: FAIL
+
+ [Event handler div.onbeforetoggle should be blocked.]
+ expected: FAIL
+
[Event handler div.onblur should be blocked.]
expected: FAIL
@@ -47,9 +59,18 @@
[Event handler div.onclose should be blocked.]
expected: FAIL
+ [Event handler div.oncommand should be blocked.]
+ expected: FAIL
+
[Event handler div.oncontextmenu should be blocked.]
expected: FAIL
+ [Event handler div.oncontextlost should be blocked.]
+ expected: FAIL
+
+ [Event handler div.oncontextrestored should be blocked.]
+ expected: FAIL
+
[Event handler div.oncuechange should be blocked.]
expected: FAIL
@@ -173,6 +194,9 @@
[Event handler div.onscroll should be blocked.]
expected: FAIL
+ [Event handler div.onscrollend should be blocked.]
+ expected: FAIL
+
[Event handler div.onsecuritypolicyviolation should be blocked.]
expected: FAIL
@@ -188,6 +212,9 @@
[Event handler div.onshow should be blocked.]
expected: FAIL
+ [Event handler div.onslotchange should be blocked.]
+ expected: FAIL
+
[Event handler div.onstalled should be blocked.]
expected: FAIL
@@ -229,3 +256,15 @@
[Event handler div.onselectionchange should be blocked.]
expected: FAIL
+
+ [Event handler div.onwebkitanimationend should be blocked.]
+ expected: FAIL
+
+ [Event handler div.onwebkitanimationiteration should be blocked.]
+ expected: FAIL
+
+ [Event handler div.onwebkitanimationstart should be blocked.]
+ expected: FAIL
+
+ [Event handler div.onwebkittransitionend should be blocked.]
+ expected: FAIL
diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
index 590f4ee6a07..c9d88fc368b 100644
--- a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
+++ b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
@@ -784,3 +784,15 @@
[X SNR (42.96525288004425 dB) is not greater than or equal to 65.737. Got 42.96525288004425.]
expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14650\]\t-2.7243524527875707e-5\t8.6956524848937988e-1\t8.6959249201390776e-1\t1.0000313300520867e+0\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 8.6959249201390776e-1 at index of 14650.\n\tMax RelError of 1.0000313300520867e+0 at index of 14650.\n]
+ expected: FAIL
+
+ [X SNR (42.96506816850161 dB) is not greater than or equal to 65.737. Got 42.96506816850161.]
+ expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14650\]\t-1.7532469034194946e+0\t8.6956524848937988e-1\t2.6228121519088745e+0\t3.0162338668262767e+0\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.6228121519088745e+0 at index of 14650.\n\tMax RelError of 3.0162338668262767e+0 at index of 14650.\n]
+ expected: FAIL
+
+ [X SNR (34.8385032008375 dB) is not greater than or equal to 65.737. Got 34.8385032008375.]
+ expected: FAIL
diff --git a/tests/wpt/meta/webmessaging/messageerror.html.ini b/tests/wpt/meta/webmessaging/messageerror.html.ini
deleted file mode 100644
index 9b875551f90..00000000000
--- a/tests/wpt/meta/webmessaging/messageerror.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[messageerror.html]
- [The onmessageerror content attribute must be compiled into the onmessageerror property]
- expected: FAIL
-
- [The onmessageerror content attribute must execute when an event is dispatched on the window]
- expected: FAIL
diff --git a/tests/wpt/meta/webxr/render_state_update.https.html.ini b/tests/wpt/meta/webxr/render_state_update.https.html.ini
new file mode 100644
index 00000000000..0e57356683e
--- /dev/null
+++ b/tests/wpt/meta/webxr/render_state_update.https.html.ini
@@ -0,0 +1,2 @@
+[render_state_update.https.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini
new file mode 100644
index 00000000000..24daae4c2e7
--- /dev/null
+++ b/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini
@@ -0,0 +1,3 @@
+[WorkerGlobalScope-close.html]
+ [Test sending a message after closing.]
+ expected: FAIL
diff --git a/tests/wpt/meta/xhr/formdata/append.any.js.ini b/tests/wpt/meta/xhr/formdata/append.any.js.ini
new file mode 100644
index 00000000000..e727a77e38d
--- /dev/null
+++ b/tests/wpt/meta/xhr/formdata/append.any.js.ini
@@ -0,0 +1,8 @@
+[append.any.worker.html]
+ [testFormDataAppendEmptyBlob]
+ expected: FAIL
+
+
+[append.any.html]
+ [testFormDataAppendEmptyBlob]
+ expected: FAIL
diff --git a/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js b/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js
index 2fe8c66f2e5..8e1b34ee798 100644
--- a/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js
+++ b/tests/wpt/tests/IndexedDB/idbcursor-request-source.any.js
@@ -6,21 +6,111 @@
'use strict';
-[cursor => cursor.update(0), cursor => cursor.delete()].forEach(
- func => indexeddb_test(
- (t, db) => {
- db.createObjectStore('store', {autoIncrement: true});
- },
- (t, db) => {
- const tx = db.transaction('store', 'readwrite');
- const store = tx.objectStore('store');
- store.put('value');
- store.openCursor().onsuccess = t.step_func(e => {
- const cursor = e.target.result;
- assert_equals(
- func(cursor).source, cursor,
- `${func}.source should be the cursor itself`);
+// Setup each test by populating an object store with an index for the cursor to
+// iterate and manipulate.
+function initializeDatabase(db) {
+ const store = db.createObjectStore('store', {autoIncrement: true});
+ store.createIndex('index', /*keypath=*/ 'value');
+ store.put({value: 'z'});
+ store.put({value: 'y'});
+ store.put({value: 'x'});
+ store.put({value: 'w'});
+}
+
+function isIndex(cursorSourceType) {
+ return cursorSourceType === 'IDBIndex';
+}
+
+// Return the object store or index, depending on the test's `cursorSourceType`.
+function getCursorSource(transaction, cursorSourceType) {
+ let cursorSource = transaction.objectStore('store');
+ if (isIndex(cursorSourceType)) {
+ cursorSource = cursorSource.index('index');
+ }
+ return cursorSource;
+}
+
+// Verify the request source after calling delete() or update() on the cursor.
+function cursor_request_source_test(
+ cursorSourceType, createRequestFunctionName, createRequestFunctionArgs) {
+ indexeddb_test(
+ (t, db) => initializeDatabase(db),
+ (t, db) => {
+ const tx = db.transaction('store', 'readwrite');
+ const cursorSource = getCursorSource(tx, cursorSourceType);
+
+ // Open the cursor.
+ const openCursorRequest = cursorSource.openCursor();
+ openCursorRequest.onerror =
+ t.unreached_func('The cursor must not fail to open.');
+
+ openCursorRequest.onsuccess = t.step_func(e => {
+ // Use the cursor to create a new request.
+ const cursor = e.target.result;
+ const request =
+ cursor[createRequestFunctionName](...createRequestFunctionArgs);
+ assert_equals(
+ request.source, cursor,
+ `The request's source must be the cursor itself.`);
+ t.done();
+ });
+ },
+ `The source of the request from ${cursorSourceType}::${
+ createRequestFunctionName}() is the cursor itself`);
+}
+
+// Verify the request source after calling openCursor() or openKeyCursor() and
+// then using the cursor to iterate.
+function open_cursor_request_source_test(
+ cursorSourceType, openCursorFunctionName) {
+ indexeddb_test(
+ (t, db) => initializeDatabase(db),
+ (t, db) => {
+ const tx = db.transaction('store', 'readonly');
+ const cursorSource = getCursorSource(tx, cursorSourceType);
+
+ // Open the cursor.
+ const openCursorRequest = cursorSource[openCursorFunctionName]();
+ openCursorRequest.onerror =
+ t.unreached_func('The cursor must not fail to open or iterate.');
+
+ assert_equals(
+ openCursorRequest.source, cursorSource,
+ 'The request source must be the opener of the cursor.');
+
+ // Verify the cursor's `request.source` after iterating with
+ // `advance()`, `continue()`, and `continuePrimaryKey()`.
+ let iterationCount = 0;
+ openCursorRequest.onsuccess = t.step_func(e => {
+ assert_equals(
+ openCursorRequest.source, cursorSource,
+ 'The request source must be the opener of the cursor after iterating.');
+
+ const cursor = e.target.result;
+ ++iterationCount;
+
+ if (iterationCount == 1) {
+ cursor.advance(1);
+ } else if (iterationCount == 2) {
+ cursor.continue();
+ } else if (iterationCount == 3 && isIndex(cursorSourceType)) {
+ cursor.continuePrimaryKey('z', 0);
+ } else {
t.done();
- });
- },
- `The source of the request from ${func} is the cursor itself`));
+ }
+ });
+ },
+ `${cursorSourceType}::${
+ openCursorFunctionName}'s request source must be the ${
+ cursorSourceType} instance that opened the cursor`);
+}
+
+open_cursor_request_source_test('IDBObjectStore', 'openCursor');
+open_cursor_request_source_test('IDBObjectStore', 'openKeyCursor');
+open_cursor_request_source_test('IDBIndex', 'openCursor');
+open_cursor_request_source_test('IDBIndex', 'openKeyCursor');
+
+cursor_request_source_test('IDBObjectStore', 'update', /*args=*/[0]);
+cursor_request_source_test('IDBObjectStore', 'delete', /*args=*/[]);
+cursor_request_source_test('IDBIndex', 'update', /*args=*/[0]);
+cursor_request_source_test('IDBIndex', 'delete', /*args=*/[]);
diff --git a/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js b/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js
index ae65eb49f21..5ddf7eab6db 100644
--- a/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js
+++ b/tests/wpt/tests/WebCryptoAPI/idlharness.https.any.js
@@ -5,7 +5,7 @@
// https://w3c.github.io/webcrypto/Overview.html
idl_test(
- ['WebCryptoAPI'],
+ ['webcrypto'],
['html', 'dom'],
idl_array => {
idl_array.add_objects({
diff --git a/tests/wpt/tests/ai/translator/resources/util.js b/tests/wpt/tests/ai/translator/resources/util.js
new file mode 100644
index 00000000000..ad06086a123
--- /dev/null
+++ b/tests/wpt/tests/ai/translator/resources/util.js
@@ -0,0 +1,4 @@
+async function createTranslator(options) {
+ await test_driver.bless();
+ return await Translator.create(options);
+}
diff --git a/tests/wpt/tests/ai/translator/translator-bad-input.tentative.https.window.js b/tests/wpt/tests/ai/translator/translator-bad-input.https.window.js
index 53a184bfd19..db8905a61f6 100644
--- a/tests/wpt/tests/ai/translator/translator-bad-input.tentative.https.window.js
+++ b/tests/wpt/tests/ai/translator/translator-bad-input.https.window.js
@@ -8,8 +8,7 @@
'use strict';
promise_test(async t => {
- await promise_rejects_js(
- t, TypeError, Translator.create(/*empty options*/));
+ await promise_rejects_js(t, TypeError, Translator.create(/*empty options*/));
}, 'Translator.create rejects with TypeError if no options are passed.');
promise_test(async t => {
diff --git a/tests/wpt/tests/ai/translator/translator-translate.tentative.https.window.js b/tests/wpt/tests/ai/translator/translator.optional.https.window.js
index a8aad5e03e1..96eca09d28b 100644
--- a/tests/wpt/tests/ai/translator/translator-translate.tentative.https.window.js
+++ b/tests/wpt/tests/ai/translator/translator.optional.https.window.js
@@ -1,21 +1,16 @@
-// META: title=Translate from English to Japanese
+// META: title=Translator Translate
// META: global=window
// META: timeout=long
// META: script=../resources/util.js
// META: script=../resources/language_codes.js
// META: script=/resources/testdriver.js
+// META: script=resources/util.js
//
// Setting `timeout=long` as this test may require downloading the translation
// library and the language models.
'use strict';
-async function createTranslator(options) {
- return await test_driver.bless('Create translator', async () => {
- return await Translator.create(options);
- });
-}
-
promise_test(async t => {
const languagePair = {sourceLanguage: 'en', targetLanguage: 'ja'};
@@ -141,7 +136,7 @@ promise_test(async t => {
for (let i = 0; i < translatableStrings.length; i++) {
assert_not_equals(translatedTranslatableString[i], translatableStrings[i]);
}
-}, 'Translator.translate() echos non-translatable content');
+}, 'Translator.translate() echoes non-translatable content');
promise_test(async t => {
const translator =
diff --git a/tests/wpt/tests/badging/WEB_FEATURES.yml b/tests/wpt/tests/badging/WEB_FEATURES.yml
new file mode 100644
index 00000000000..3c4f69200f6
--- /dev/null
+++ b/tests/wpt/tests/badging/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: badging
+ files: "**"
diff --git a/tests/wpt/tests/clear-site-data/WEB_FEATURES.yml b/tests/wpt/tests/clear-site-data/WEB_FEATURES.yml
new file mode 100644
index 00000000000..d55b5faaf11
--- /dev/null
+++ b/tests/wpt/tests/clear-site-data/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: clear-site-data
+ files: "**"
diff --git a/tests/wpt/tests/compat/webkit-box-ignores-flex-wrap.tentative.html b/tests/wpt/tests/compat/webkit-box-ignores-flex-wrap.tentative.html
new file mode 100644
index 00000000000..98086f83570
--- /dev/null
+++ b/tests/wpt/tests/compat/webkit-box-ignores-flex-wrap.tentative.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<link rel="help" href="https://compat.spec.whatwg.org/#valdef-flex--webkit-box">
+<link rel="match" href="green-ref.html">
+<div style="display: -webkit-box; flex-wrap: wrap; width: 50px;">
+ <div style="width: 50px; height: 100px; background: green;"></div>
+ <div style="width: 50px; height: 100px; background: green;"></div>
+</div>
diff --git a/tests/wpt/tests/content-security-policy/style-src/style-src-inline-style-with-csstext.html b/tests/wpt/tests/content-security-policy/style-src/style-src-inline-style-with-csstext.html
new file mode 100644
index 00000000000..5e812b4aee9
--- /dev/null
+++ b/tests/wpt/tests/content-security-policy/style-src/style-src-inline-style-with-csstext.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html>
+<head>
+ <meta http-equiv="Content-Security-Policy" content="style-src 'self';">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+
+ <script>
+ var t = async_test("Manipulating cssText should be allowed with 'self'");
+ document.addEventListener("securitypolicyviolation", t.unreached_func("Should not trigger a security policy violation"));
+ </script>
+</head>
+<body>
+ <div id='log'></div>
+
+ <div id="content">Lorem ipsum</div>
+
+ <script>
+ t.step(function() {
+ var contentEl = document.getElementById("content");
+ contentEl.style.cssText = 'margin-left: 2px;';
+ var marginLeftVal = getComputedStyle(contentEl).getPropertyValue('margin-left');
+ assert_equals(marginLeftVal, "2px");
+ t.done();
+ });
+ </script>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js b/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js
index 6716d91788d..542bd6c5387 100644
--- a/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js
+++ b/tests/wpt/tests/cookie-store/cookieListItem_attributes.https.any.js
@@ -207,3 +207,20 @@ promise_test(async testCase => {
const cookie = await cookieStore.get('cookie-name');
assert_equals(cookie.secure, true);
}, 'CookieListItem - secure defaults to true');
+
+promise_test(async testCase => {
+ await cookieStore.delete('cookie-name');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
+
+ let encodedCookie = encodeURIComponent(JSON.stringify("cookie-name=1; max-age=99999999999999999999999999999; path=/"));
+ await fetch(`/cookies/resources/cookie.py?set=${encodedCookie}`);
+
+ assert_equals(document.cookie, "cookie-name=1", 'The cookie was set as expected.');
+
+ const cookie = await cookieStore.get('cookie-name');
+ assert_equals(cookie.name, 'cookie-name');
+ assert_equals(cookie.value, '1');
+ assert_approx_equals(cookie.expires, kFourHundredDaysFromNow, kOneDay);
+}, "Test max-age attribute over the 400 days");
diff --git a/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js b/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js
index 8a10e358ef6..605e94e6744 100644
--- a/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js
+++ b/tests/wpt/tests/cookie-store/httponly_cookies.https.window.js
@@ -67,3 +67,33 @@ cookie_test(async t => {
'cookie1=value1; cookie2=value2; cookie3=value3',
'httpOnly is not an option for CookieStore.set()');
}, 'HttpOnly cookies can not be set by CookieStore');
+
+cookie_test(async t => {
+ await setCookieStringHttp('HTTPONLY-cookie=value; path=/; httponly');
+ assert_equals(
+ await getCookieString(),
+ undefined,
+ 'HttpOnly cookie we wrote using HTTP in cookie jar' +
+ ' is invisible to script');
+ assert_equals(
+ await getCookieStringHttp(),
+ 'HTTPONLY-cookie=value',
+ 'HttpOnly cookie we wrote using HTTP in HTTP cookie jar');
+
+ try {
+ await cookieStore.set('HTTPONLY-cookie', 'dummy');
+ } catch(e) {}
+
+ assert_equals(
+ await getCookieString(),
+ undefined,
+ 'HttpOnly cookie is not overwritten');
+
+ try {
+ await cookieStore.delete('HTTPONLY-cookie');
+ } catch(e) {}
+
+ assert_equals(await getCookieString(), undefined, 'HttpOnly cookie is not overwritten');
+
+ assert_equals(await getCookieStringHttp(), 'HTTPONLY-cookie=value', 'HttpOnly cookie is not deleted');
+}, 'HttpOnly cookies are not deleted/overwritten');
diff --git a/tests/wpt/tests/css/compositing/root-element-background-image-opaque-crash.html b/tests/wpt/tests/css/compositing/root-element-background-image-opaque-crash.html
new file mode 100644
index 00000000000..d380310d096
--- /dev/null
+++ b/tests/wpt/tests/css/compositing/root-element-background-image-opaque-crash.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<style>
+ :root {
+ background-color: rgba(255, 255, 255, 0.98);
+ background-image: url(/images/computer.jpg); /* opaque */
+ background-position: top left;
+ background-repeat: repeat;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-align/blocks/justify-items-anonymous.tentative.html b/tests/wpt/tests/css/css-align/blocks/justify-items-anonymous.tentative.html
new file mode 100644
index 00000000000..641dea1f54b
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/blocks/justify-items-anonymous.tentative.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11461">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width: 100px; height: 100px; background: red;">
+ <div style="width: 200px; justify-items: right;">
+ <span style="display: inline-block; width: 100px; height: 100px; background: green;"></span>
+ <div></div> <!-- Forces an anonymous block around <span> in most browsers. -->
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html
index 92fb4d275b8..7bd389b39d8 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-grid-001.html
@@ -75,8 +75,8 @@
<div class="target target1-l" data-offset-x=100 data-expected-height=100></div>
<div class="target target1-r" data-offset-x=404 data-expected-height=100></div>
- <div class="target target1-t" data-offset-y=0 data-expected-width=310></div>
- <div class="target target1-b" data-offset-y=95 data-expected-width=310></div>
+ <div class="target target1-t" data-offset-y=-10 data-expected-width=310></div>
+ <div class="target target1-b" data-offset-y=85 data-expected-width=310></div>
</div>
</div>
</div>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html
index 7b2691a2b90..1e1f0a5c95b 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-002.html
@@ -71,15 +71,15 @@
<!-- The containing block of querying elements is block-fragmented. -->
<div class="target target1"
- data-offset-x=18 data-offset-y=65
+ data-offset-x=128 data-offset-y=-35
data-expected-width=160 data-expected-height=100></div>
<div class="target target1-rb"
- data-offset-x=168 data-offset-y=155></div>
+ data-offset-x=278 data-offset-y=55></div>
<div class="target fixed target1"
- data-offset-x=26 data-offset-y=70
+ data-offset-x=136 data-offset-y=-30
data-expected-width=160 data-expected-height=100></div>
<div class="target fixed target1-rb"
- data-offset-x=176 data-offset-y=160></div>
+ data-offset-x=286 data-offset-y=60></div>
</div>
<!-- The containing block of querying elements is a multi-column. -->
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html
index 399494120ea..8f7a3dad129 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-004.html
@@ -69,16 +69,16 @@
<div class="anchor1" style="width: 20px"></div>
<div class="target target1"
- data-offset-x=18 data-offset-y=65
+ data-offset-x=128 data-offset-y=-35
data-expected-width=130 data-expected-height=100></div>
<div class="target target1-rb"
- data-offset-x=138 data-offset-y=155></div>
+ data-offset-x=248 data-offset-y=55></div>
</div>
<div class="target target1"
- data-offset-x=34 data-offset-y=225
+ data-offset-x=364 data-offset-y=-75
data-expected-width=130 data-expected-height=100></div>
<div class="target target1-rb"
- data-offset-x=154 data-offset-y=315></div>
+ data-offset-x=484 data-offset-y=15></div>
</div>
</body>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html
index 35ab2cfc15c..c5ce41299af 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-multicol-nested-001.html
@@ -68,8 +68,8 @@
data-expected-width=180 data-expected-height=100></div>
</div>
</div>
- <div class="target"
- data-offset-x=13 data-offset-y=97
+ <div class="target" style="background:hotpink;"
+ data-offset-x=173 data-offset-y=-3
data-expected-width=180 data-expected-height=100></div>
</div>
</div>
diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-415627003.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-415627003.html
new file mode 100644
index 00000000000..af942fbcc97
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-415627003.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/415627003">
+<style>
+ @keyframes --anim {
+ from {
+ text-size-adjust: calc(50% * sibling-index());
+ }
+ to {
+ text-size-adjust: calc(50%);
+ }
+ }
+ #target {
+ animation: --anim 2s;
+ }
+</style>
+<p>Pass if no crash</p>
+<div id="target"></div>
diff --git a/tests/wpt/tests/css/css-break/root-margin-001-print-ref.html b/tests/wpt/tests/css/css-break/root-margin-001-print-ref.html
new file mode 100644
index 00000000000..320da2e0f55
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/root-margin-001-print-ref.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<div style="height:1px;"></div>
+<div style="break-before:page; margin-top:8px;"></div>
+This text should be on the second page.
+The first page should be blank.
diff --git a/tests/wpt/tests/css/css-break/root-margin-001-print.html b/tests/wpt/tests/css/css-break/root-margin-001-print.html
new file mode 100644
index 00000000000..b2ec34fe079
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/root-margin-001-print.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Root block-start margin taller than the page</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-break/#break-margins">
+<link rel="match" href="root-margin-001-print-ref.html">
+<style>
+ html { margin-top: 10in; }
+</style>
+This text should be on the second page.
+The first page should be blank.
diff --git a/tests/wpt/tests/css/css-break/table/border-spacing.html b/tests/wpt/tests/css/css-break/table/border-spacing.html
index fc5e87e35dd..9fd94760681 100644
--- a/tests/wpt/tests/css/css-break/table/border-spacing.html
+++ b/tests/wpt/tests/css/css-break/table/border-spacing.html
@@ -5,7 +5,7 @@
.cell > div { background:white; }
</style>
<p>No red should be seen below.</p>
-<div id="multicol" style="columns:2; column-fill:auto; height:70px; width:200px; line-height:20px;">
+<div id="multicol" style="columns:2; column-fill:auto; gap:0; height:70px; width:200px; line-height:20px;">
<div style="position:relative; display:table; border-spacing:10px;">
<div class="cell" style="display:table-cell; width:30px; background:red;">
<div id="child1">1<br></div>
@@ -20,15 +20,20 @@
<script src="/resources/testharnessreport.js"></script>
<script>
test(() => {
+ assert_equals(document.getElementById("child1").offsetLeft, 10);
assert_equals(document.getElementById("child1").offsetTop, 10);
assert_equals(document.getElementById("child1").offsetHeight, 20);
+ assert_equals(document.getElementById("child2").offsetLeft, 10);
assert_equals(document.getElementById("child2").offsetTop, 30);
assert_equals(document.getElementById("child2").offsetHeight, 20);
+ assert_equals(document.getElementById("child3").offsetLeft, 10);
assert_equals(document.getElementById("child3").offsetTop, 50);
assert_equals(document.getElementById("child3").offsetHeight, 20);
- assert_equals(document.getElementById("child4").offsetTop, 70);
+ assert_equals(document.getElementById("child4").offsetLeft, 110);
+ assert_equals(document.getElementById("child4").offsetTop, 0);
assert_equals(document.getElementById("child4").offsetHeight, 20);
- assert_equals(document.getElementById("child5").offsetTop, 90);
+ assert_equals(document.getElementById("child5").offsetLeft, 110);
+ assert_equals(document.getElementById("child5").offsetTop, 20);
assert_equals(document.getElementById("child5").offsetHeight, 20);
}, "Table with border spacing");
</script>
diff --git a/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html b/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html
index 9d4a472d438..1eb751032ca 100644
--- a/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html
+++ b/tests/wpt/tests/css/css-break/table/table-parts-offsets-vertical-rl.tentative.html
@@ -37,104 +37,104 @@
<script src="/resources/testharnessreport.js"></script>
<script>
test(() => {
- assert_equals(table.offsetTop, 408, "offsetTop");
- assert_equals(table.offsetLeft, 41, "offsetLeft");
+ assert_equals(table.offsetTop, 8, "offsetTop");
+ assert_equals(table.offsetLeft, 8, "offsetLeft");
assert_equals(table.offsetWidth, 177, "offsetWidth");
assert_equals(table.offsetHeight, 184, "offsetHeight");
}, "table");
test(() => {
- assert_equals(colgroup.offsetTop, 418, "offsetTop");
- assert_equals(colgroup.offsetLeft, 51, "offsetLeft");
+ assert_equals(colgroup.offsetTop, 18, "offsetTop");
+ assert_equals(colgroup.offsetLeft, 8, "offsetLeft");
assert_equals(colgroup.offsetWidth, 157, "offsetWidth");
assert_equals(colgroup.offsetHeight, 107, "offsetHeight");
}, "colgroup");
test(() => {
- assert_equals(col.offsetTop, 418, "offsetTop");
- assert_equals(col.offsetLeft, 51, "offsetLeft");
+ assert_equals(col.offsetTop, 18, "offsetTop");
+ assert_equals(col.offsetLeft, 8, "offsetLeft");
assert_equals(col.offsetWidth, 157, "offsetWidth");
assert_equals(col.offsetHeight, 50, "offsetHeight");
}, "col");
test(() => {
- assert_equals(col2.offsetTop, 475, "offsetTop");
- assert_equals(col2.offsetLeft, 51, "offsetLeft");
+ assert_equals(col2.offsetTop, 75, "offsetTop");
+ assert_equals(col2.offsetLeft, 8, "offsetLeft");
assert_equals(col2.offsetWidth, 157, "offsetWidth");
assert_equals(col2.offsetHeight, 50, "offsetHeight");
}, "col2");
test(() => {
- assert_equals(colgroup2.offsetTop, 532, "offsetTop");
- assert_equals(colgroup2.offsetLeft, 51, "offsetLeft");
+ assert_equals(colgroup2.offsetTop, 132, "offsetTop");
+ assert_equals(colgroup2.offsetLeft, 8, "offsetLeft");
assert_equals(colgroup2.offsetWidth, 157, "offsetWidth");
assert_equals(colgroup2.offsetHeight, 50, "offsetHeight");
}, "colgroup2");
test(() => {
- assert_equals(col3.offsetTop, 532, "offsetTop");
- assert_equals(col3.offsetLeft, 51, "offsetLeft");
+ assert_equals(col3.offsetTop, 132, "offsetTop");
+ assert_equals(col3.offsetLeft, 8, "offsetLeft");
assert_equals(col3.offsetWidth, 157, "offsetWidth");
assert_equals(col3.offsetHeight, 50, "offsetHeight");
}, "col3");
test(() => {
- assert_equals(rowgroup.offsetTop, 418, "offsetTop");
- assert_equals(rowgroup.offsetLeft, 51, "offsetLeft");
+ assert_equals(rowgroup.offsetTop, 18, "offsetTop");
+ assert_equals(rowgroup.offsetLeft, 8, "offsetLeft");
assert_equals(rowgroup.offsetWidth, 157, "offsetWidth");
assert_equals(rowgroup.offsetHeight, 164, "offsetHeight");
}, "rowgroup");
test(() => {
- assert_equals(row.offsetTop, 218, "offsetTop");
- assert_equals(row.offsetLeft, 38, "offsetLeft");
+ assert_equals(row.offsetTop, 18, "offsetTop");
+ assert_equals(row.offsetLeft, 8, "offsetLeft");
assert_equals(row.offsetWidth, 100, "offsetWidth");
assert_equals(row.offsetHeight, 164, "offsetHeight");
}, "row");
test(() => {
- assert_equals(cell.offsetTop, 218, "offsetTop");
- assert_equals(cell.offsetLeft, 38, "offsetLeft");
+ assert_equals(cell.offsetTop, 18, "offsetTop");
+ assert_equals(cell.offsetLeft, 8, "offsetLeft");
assert_equals(cell.offsetWidth, 100, "offsetWidth");
assert_equals(cell.offsetHeight, 50, "offsetHeight");
}, "cell");
test(() => {
- assert_equals(content.offsetTop, 218, "offsetTop");
- assert_equals(content.offsetLeft, 38, "offsetLeft");
+ assert_equals(content.offsetTop, 18, "offsetTop");
+ assert_equals(content.offsetLeft, 8, "offsetLeft");
assert_equals(content.offsetWidth, 100, "offsetWidth");
assert_equals(content.offsetHeight, 50, "offsetHeight");
}, "content");
test(() => {
- assert_equals(cell2.offsetTop, 275, "offsetTop");
- assert_equals(cell2.offsetLeft, 38, "offsetLeft");
+ assert_equals(cell2.offsetTop, 75, "offsetTop");
+ assert_equals(cell2.offsetLeft, 8, "offsetLeft");
assert_equals(cell2.offsetWidth, 100, "offsetWidth");
assert_equals(cell2.offsetHeight, 50, "offsetHeight");
}, "cell2");
test(() => {
- assert_equals(content2.offsetTop, 275, "offsetTop");
- assert_equals(content2.offsetLeft, 38, "offsetLeft");
+ assert_equals(content2.offsetTop, 75, "offsetTop");
+ assert_equals(content2.offsetLeft, 8, "offsetLeft");
assert_equals(content2.offsetWidth, 100, "offsetWidth");
assert_equals(content2.offsetHeight, 50, "offsetHeight");
}, "content2");
test(() => {
- assert_equals(cell3.offsetTop, 332, "offsetTop");
- assert_equals(cell3.offsetLeft, 38, "offsetLeft");
+ assert_equals(cell3.offsetTop, 132, "offsetTop");
+ assert_equals(cell3.offsetLeft, 8, "offsetLeft");
assert_equals(cell3.offsetWidth, 100, "offsetWidth");
assert_equals(cell3.offsetHeight, 50, "offsetHeight");
}, "cell3");
test(() => {
- assert_equals(content3.offsetTop, 332, "offsetTop");
- assert_equals(content3.offsetLeft, 38, "offsetLeft");
+ assert_equals(content3.offsetTop, 132, "offsetTop");
+ assert_equals(content3.offsetLeft, 8, "offsetLeft");
assert_equals(content3.offsetWidth, 100, "offsetWidth");
assert_equals(content3.offsetHeight, 50, "offsetHeight");
}, "content3");
test(() => {
- assert_equals(row2.offsetTop, 418, "offsetTop");
- assert_equals(row2.offsetLeft, 51, "offsetLeft");
+ assert_equals(row2.offsetTop, 218, "offsetTop");
+ assert_equals(row2.offsetLeft, 8, "offsetLeft");
assert_equals(row2.offsetWidth, 50, "offsetWidth");
assert_equals(row2.offsetHeight, 164, "offsetHeight");
}, "row2");
test(() => {
- assert_equals(cell4.offsetTop, 418, "offsetTop");
- assert_equals(cell4.offsetLeft, 51, "offsetLeft");
+ assert_equals(cell4.offsetTop, 218, "offsetTop");
+ assert_equals(cell4.offsetLeft, 8, "offsetLeft");
assert_equals(cell4.offsetWidth, 50, "offsetWidth");
assert_equals(cell4.offsetHeight, 50, "offsetHeight");
}, "cell4");
test(() => {
- assert_equals(content4.offsetTop, 418, "offsetTop");
- assert_equals(content4.offsetLeft, 51, "offsetLeft");
+ assert_equals(content4.offsetTop, 218, "offsetTop");
+ assert_equals(content4.offsetLeft, 8, "offsetLeft");
assert_equals(content4.offsetWidth, 50, "offsetWidth");
assert_equals(content4.offsetHeight, 50, "offsetHeight");
}, "content4");
diff --git a/tests/wpt/tests/css/css-cascade/inline-style-background.html b/tests/wpt/tests/css/css-cascade/inline-style-background.html
new file mode 100644
index 00000000000..11451f8cefd
--- /dev/null
+++ b/tests/wpt/tests/css/css-cascade/inline-style-background.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<head>
+ <link rel="help" href="https://crbug.com/40934009">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <div id="d" style="background:revert">Test passes if it does not crash.</div>
+ <script>
+ test(() => {
+ d.offsetTop;
+ d.style.background = "url(dummy.png)";
+ d.offsetLeft;
+ });
+ </script>
+</body>
diff --git a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html
index c7553716ab6..e2516f3d378 100644
--- a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html
+++ b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001-ref.html
@@ -1,62 +1,13 @@
<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset="utf-8">
- <title>CSS Reftest Reference</title>
- <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com">
- <style>
- div {
- position: relative;
- width: 100px;
- }
- #div1,
- #div3 {
- background-color: #cfc;
- }
- #div1 {
- z-index: 5;
- }
- #div2 {
- z-index: 1;
- background-color: #fdd;
- height: 100px;
- top: -20px;
- }
- #div2_1 {
- background-color: #ffc;
- z-index: 6;
- top: -10px;
- }
- #div2_2 {
- z-index: 3;
- position: absolute;
- top: -15px;
- width: 40px;
- height: 100px;
- background-color: #ddf;
- }
- #div3 {
- z-index: 2;
- top: -50px;
- }
- </style>
-</head>
-<body>
- <div id="div1">
- <br/><br/>
- </div>
-
- <div id="div2">
- <div id="div2_1">
- <br/><br/>
- </div>
-
- <div id="div2_2">
- </div>
- </div>
-
- <div id="div3">
- <br/><br/>
- </div>
-</body>
-</html>
+<meta charset="utf-8">
+<title>Paint Containment Stacking Context Reference</title>
+<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com">
+<style>
+ div {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ }
+</style>
+<div></div>
+Test succeeds if there is no red.
diff --git a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html
index 71102b6c73a..5e588cb6174 100644
--- a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html
+++ b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001a.html
@@ -1,66 +1,32 @@
<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset="utf-8">
- <title>CSS Test: 'contain: paint' with stacking contents. Z-index is defined only for siblings and children.</title>
- <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com">
-
- <link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43">
- <link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint">
- <link rel="match" href="contain-paint-stacking-context-001-ref.html">
- <style>
- div {
- position: relative;
- width: 100px;
- }
- #div1,
- #div3 {
- background-color: #cfc;
- }
- #div1 {
- z-index: 5;
- }
- #div2 {
- contain: paint;
- background-color: #fdd;
- height: 100px;
- top: -20px;
- }
- #div2_1 {
- background-color: #ffc;
- z-index: 6;
- top: -10px;
- }
- #div2_2 {
- z-index: 3;
- position: absolute;
- top: -15px;
- width: 40px;
- height: 100px;
- background-color: #ddf;
- }
- #div3 {
- z-index: 2;
- top: -50px;
- }
- </style>
-</head>
-<body>
- <div id="div1">
- <br/><br/>
- </div>
-
- <div id="div2">
- <div id="div2_1">
- <br/><br/>
- </div>
-
- <div id="div2_2">
- </div>
- </div>
-
- <div id="div3">
- <br/><br/>
- </div>
-</body>
-</html>
+<title>'contain: paint' establishes stacking context.</title>
+<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43">
+<link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint">
+<link rel="match" href="contain-paint-stacking-context-001-ref.html">
+<style>
+ div {
+ width: 100px;
+ height: 100px;
+ }
+ #front {
+ background-color: green;
+ /* makes a stacking context and puts this on top */
+ position: absolute;
+ z-index: 10;
+ }
+ #back {
+ contain: paint;
+ }
+ #notOnTop {
+ background-color: red;
+ /* z-index is higher than on #front, but this should still be covered up because it is inside #back, which has 'contain: paint' */
+ position: absolute;
+ z-index: 1000;
+ }
+</style>
+<div id="front"></div>
+<div id="back">
+ <div id="notOnTop"></div>
+</div>
+Test succeeds if there is no red.
diff --git a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html
index 0c4d3323bf7..e03323782a7 100644
--- a/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html
+++ b/tests/wpt/tests/css/css-contain/contain-paint-stacking-context-001b.html
@@ -1,66 +1,32 @@
<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset="utf-8">
- <title>CSS Test: 'will-change: contain' with stacking contents. Z-index is defined only for siblings and children.</title>
- <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com">
-
- <link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43">
- <link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint">
- <link rel="match" href="contain-paint-stacking-context-001-ref.html">
- <style>
- div {
- position: relative;
- width: 100px;
- }
- #div1,
- #div3 {
- background-color: #cfc;
- }
- #div1 {
- z-index: 5;
- }
- #div2 {
- will-change: contain;
- background-color: #fdd;
- height: 100px;
- top: -20px;
- }
- #div2_1 {
- background-color: #ffc;
- z-index: 6;
- top: -10px;
- }
- #div2_2 {
- z-index: 3;
- position: absolute;
- top: -15px;
- width: 40px;
- height: 100px;
- background-color: #ddf;
- }
- #div3 {
- z-index: 2;
- top: -50px;
- }
- </style>
-</head>
-<body>
- <div id="div1">
- <br/><br/>
- </div>
-
- <div id="div2">
- <div id="div2_1">
- <br/><br/>
- </div>
-
- <div id="div2_2">
- </div>
- </div>
-
- <div id="div3">
- <br/><br/>
- </div>
-</body>
-</html>
+<title>'will-change: contain' establishes stacking context.</title>
+<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43">
+<link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint">
+<link rel="match" href="contain-paint-stacking-context-001-ref.html">
+<style>
+ div {
+ width: 100px;
+ height: 100px;
+ }
+ #front {
+ background-color: green;
+ /* makes a stacking context and puts this on top */
+ position: absolute;
+ z-index: 10;
+ }
+ #back {
+ will-change: contain;
+ }
+ #notOnTop {
+ background-color: red;
+ /* z-index is higher than on #front, but this should still be covered up because it is inside #back, which has 'will-change: contain' */
+ position: absolute;
+ z-index: 1000;
+ }
+</style>
+<div id="front"></div>
+<div id="back">
+ <div id="notOnTop"></div>
+</div>
+Test succeeds if there is no red.
diff --git a/tests/wpt/tests/css/css-fonts/font-variant-emoji-005-ref.html b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005-ref.html
new file mode 100644
index 00000000000..d4275b5c951
--- /dev/null
+++ b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="UTF-8" />
+<title>CSS Fonts reference</title>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+
+<style>
+body { background: white; }
+p { font: 16px/3 serif; }
+span { color: white; font: 25px Ahem; }
+span span { color: initial; font-variant-emoji: emoji; }
+</style>
+
+<h4>Only lines 3 and 4 should show a keycap numeral:</h4>
+
+<p>1. text: <span>X</span></p>
+
+<p>2. unicode: <span>X</span></p>
+
+<p>3. emoji: <span>X<span>3&#xfe0f;&#x20e3;</span>X</span></p>
+
+<p>4. with VS16: <span>X<span>4&#xfe0f;&#x20e3;</span>X</span></p>
+
+<p>5. emoji, with VS15: <span>X</span></p>
diff --git a/tests/wpt/tests/css/css-fonts/font-variant-emoji-005.html b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005.html
new file mode 100644
index 00000000000..0f5c2d7a98a
--- /dev/null
+++ b/tests/wpt/tests/css/css-fonts/font-variant-emoji-005.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset="UTF-8" />
+<title>CSS Fonts: font-variant-emoji web font test</title>
+<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#font-variant-emoji-prop" />
+<link rel="help" href="https://www.unicode.org/reports/tr51/tr51-25.html#Emoji_Properties_and_Data_Files" />
+<link rel="match" href="font-variant-emoji-005-ref.html"/>
+<meta name="assert" content="Digit-keycap sequences render as emoji if required, in preference to using the named font"/>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+
+<style>
+body { background: white; }
+p { font: 16px/3 serif; }
+/* A color-emoji glyph in the span will be visible despite the white color;
+ * if color-emoji presentation is not used, the span will be invisible.
+ */
+span { color: white; font: 25px Ahem; }
+</style>
+
+<h4>Only lines 3 and 4 should show a keycap numeral:</h4>
+
+<p>1. text: <span style="font-variant-emoji: text">X1&#x20e3;X</span></p>
+
+<p>2. unicode: <span style="font-variant-emoji: unicode">X2&#x20e3;X</span></p>
+
+<p>3. emoji: <span style="font-variant-emoji: emoji">X3&#x20e3;X</span></p>
+
+<p>4. with VS16: <span style="font-variant-emoji: normal">X4&#xfe0f;&#x20e3;X</span></p>
+
+<p>5. emoji, with VS15: <span style="font-variant-emoji: emoji">X5&#xfe0e;&#x20e3;X</span></p>
diff --git a/tests/wpt/tests/css/css-gaps/agnostic/gap-decorations-002-ref.html b/tests/wpt/tests/css/css-gaps/agnostic/gap-decorations-002-ref.html
new file mode 100644
index 00000000000..42c5ef128b4
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/agnostic/gap-decorations-002-ref.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ display: flex;
+ width: 120px;
+ height: 110px;
+ column-gap: 20px;
+ row-gap: 10px;
+ flex-wrap: wrap;
+ }
+
+ .item {
+ background: skyblue;
+ height: 50px;
+ width: 50px;
+ margin: 0;
+ }
+
+ .row-gap {
+ position: absolute;
+ top: 50px;
+ background: gold;
+ width: 120px;
+ height: 10px;
+ }
+
+ .column-gap {
+ position: absolute;
+ top: 0px;
+ left: 50px;
+ background: blue;
+ height: 110px;
+ width: 20px;
+ }
+
+</style>
+<div class="container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
+
+<div class="row-gap"></div>
+<div class="column-gap"></div>
diff --git a/tests/wpt/tests/css/css-gaps/flex/flex-gap-decorations-022.html b/tests/wpt/tests/css/css-gaps/flex/flex-gap-decorations-022.html
new file mode 100644
index 00000000000..5f3b512ef76
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/flex/flex-gap-decorations-022.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: flex column gaps are painted with different sized gaps and row-rule-outset 0.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="../agnostic/gap-decorations-002-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .flex-container {
+ height: 110px;
+ width: 120px;
+
+ display: flex;
+
+ column-gap: 20px;
+ row-gap: 10px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 20px;
+
+ row-rule-color: gold;
+ row-rule-style: solid;
+ row-rule-width: 10px;
+
+ row-rule-break: intersection;
+ row-rule-outset: 0;
+
+ flex-wrap: wrap;
+ }
+
+ .flex-item {
+ background: skyblue;
+ width: 50px;
+ }
+</style>
+<div class="flex-container">
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029-ref.html
new file mode 100644
index 00000000000..35450e07ae5
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029-ref.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ grid-template-rows: 100px 100px 100px;
+ width: 120px;
+ height: 120px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .row-gap {
+ position: absolute;
+ width: 320px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ top: 102.5px;
+ }
+
+ .row-gap2 {
+ top: 212.5px;
+ }
+
+ .col-gap {
+ position: absolute;
+ top: 0px;
+ width: 0px;
+ height: 320px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1 {
+ left: 102.5px;
+ }
+
+ .col-gap2 {
+ left: 212.5px;
+ }
+</style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029.html
new file mode 100644
index 00000000000..6da75548d94
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-029.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Gaps are painted when items overflow container.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-029-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ grid-template-rows: 100px 100px 100px;
+ width: 120px;
+ height: 120px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030-ref.html
new file mode 100644
index 00000000000..d4953ae2ddd
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ width: 120px;
+ height: 120px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .col-gap {
+ position: absolute;
+ top: 0px;
+ width: 0px;
+ height: 120px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1 {
+ left: 102.5px;
+ }
+
+ .col-gap2 {
+ left: 212.5px;
+ }
+</style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030.html
new file mode 100644
index 00000000000..ef4507ef926
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-030.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Gaps are painted when items overflow container - no row gaps.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-030-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ width: 120px;
+ height: 120px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031-ref.html
new file mode 100644
index 00000000000..0615305bc9f
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-rows: 100px 100px 100px;
+ grid-auto-flow: column;
+ width: 120px;
+ height: 120px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .row-gap {
+ position: absolute;
+ width: 120px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ top: 102.5px;
+ }
+
+ .row-gap2 {
+ top: 212.5px;
+ }
+</style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031.html
new file mode 100644
index 00000000000..530b661bfe3
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-031.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Gaps are painted when items overflow container - no column gaps.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-031-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-rows: 100px 100px 100px;
+ grid-auto-flow: column;
+ width: 120px;
+ height: 120px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032-ref.html
new file mode 100644
index 00000000000..f90e3dd6813
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032-ref.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ overflow: hidden;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ grid-template-rows: repeat(6, 100px);
+ width: 120px;
+ height: 120px;
+ }
+
+ .row-gap {
+ position: absolute;
+ width: 320px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ top: 102.5px;
+ }
+
+ .row-gap2 {
+ top: 212.5px;
+ }
+
+ .row-gap3 {
+ top: 322.5px;
+ }
+
+ .row-gap4 {
+ top: 432.5px;
+ }
+
+ .row-gap5 {
+ top: 542.5px;
+ }
+
+ .col-gap {
+ position: absolute;
+ top: 0px;
+ width: 0px;
+ height: 650px;
+ border-left: solid 10px blue;
+ }
+
+ .col-gap1 {
+ left: 100px;
+ }
+
+ .col-gap2 {
+ left: 210px;
+ }
+</style>
+<div class="grid-container"></div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+<div class="row-gap row-gap3"> </div>
+<div class="row-gap row-gap4"> </div>
+<div class="row-gap row-gap5"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032.html
new file mode 100644
index 00000000000..ac2d38fdda0
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-032.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Gaps are painted when rows are dynamically added and overflow container.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-032-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ overflow: hidden;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ grid-template-rows: 100px;
+ width: 120px;
+ height: 120px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ }
+
+</style>
+
+<body>
+ <div class="grid-container"></div>
+<script>
+ const grid = document.querySelector('.grid-container');
+ grid.style.gridTemplateRows = 'repeat(6, 100px)';
+
+ grid.style.rowRuleColor = 'red';
+ grid.style.rowRuleStyle = 'solid';
+ grid.style.rowRuleWidth = '5px';
+</script>
+</body>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033-ref.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033-ref.html
new file mode 100644
index 00000000000..e26143a6b93
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033-ref.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ overflow: hidden;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: repeat(3, 50px);
+ grid-template-rows: repeat(6, 50px);
+ width: 50px;
+ height: 50px;
+ }
+
+ .row-gap {
+ position: absolute;
+ width: 170px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ top: 52.5px;
+ }
+
+ .row-gap2 {
+ top: 112.5px;
+ }
+
+ .row-gap3 {
+ top: 172.5px;
+ }
+
+ .row-gap4 {
+ top: 232.5px;
+ }
+
+ .row-gap5 {
+ top: 195px;
+ border-bottom: solid 200px red; /*expand the last row gap's height*/
+ }
+
+ .col-gap {
+ position: absolute;
+ top: 0px;
+ width: 0px;
+ height: 350px;
+ border-left: solid 10px blue;
+ }
+
+ .col-gap1 {
+ left: 50px;
+ }
+
+ .col-gap2 {
+ left: 110px;
+ }
+</style>
+<div class="grid-container"></div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+<div class="row-gap row-gap3"> </div>
+<div class="row-gap row-gap4"> </div>
+<div class="row-gap row-gap5"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033.html
new file mode 100644
index 00000000000..47ef35cc368
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-033.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Decorations are painted when rule thickness is greater than gap size.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-033-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ overflow: hidden;
+ }
+
+ .grid-container {
+ display: grid;
+ gap: 10px;
+ grid-template-columns: repeat(3, 50px);
+ grid-template-rows: repeat(6, 50px);
+ width: 50px;
+ height: 50px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ }
+
+</style>
+
+<body>
+ <div class="grid-container"></div>
+<script>
+ const grid = document.querySelector('.grid-container');
+
+ grid.style.rowRuleColor = 'red';
+ grid.style.rowRuleStyle = 'solid';
+ grid.style.rowRuleWidth = 'repeat(4, 5px) 200px';
+</script>
+</body>
diff --git a/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-38.html b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-38.html
new file mode 100644
index 00000000000..8b87bcd4860
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/grid/grid-gap-decorations-38.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: grid column gaps are painted with different sized gaps and column-rule-outset 0.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="../agnostic/gap-decorations-002-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ height: 110px;
+ width: 120px;
+
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+
+ column-gap: 20px;
+ row-gap: 10px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 20px;
+
+ row-rule-color: gold;
+ row-rule-style: solid;
+ row-rule-width: 10px;
+
+ row-rule-break: intersection;
+ row-rule-outset: 0;
+ }
+
+ .grid-item {
+ background: skyblue;
+ }
+</style>
+<div class="grid-container">
+ <div class="grid-item"></div>
+ <div class="grid-item"></div>
+ <div class="grid-item"></div>
+ <div class="grid-item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html
new file mode 100644
index 00000000000..23fd089ac8e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 210px;
+ height: 130px;
+ column-gap: 20px;
+ display: flex;
+ }
+
+ .items {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 56.666px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 210px;
+ background: gold;
+ left: 2px;
+ top: 62px;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 130px;
+ width: 20px;
+ background: blue;
+ top: 2px;
+ }
+</style>
+
+<div class="container">
+ <div class="items"></div>
+ <div class="items"></div>
+ <div class="items"></div>
+</div>
+<div class="row-gap"></div>
+<div class="column-gap" style="left:58.666px;"></div>
+<div class="column-gap" style="left:135.332px;"></div>
diff --git a/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017.html b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017.html
new file mode 100644
index 00000000000..c7d1fe42584
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/multicol/multicol-gap-decorations-017.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap and with different sized gaps and row-rule-outset 0.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-017-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 210px;
+ height: 130px;
+ column-count: 3;
+ column-width: 56.666px;
+ column-height: 60px;
+ column-gap: 20px;
+ row-gap: 10px;
+ column-rule-width: 20px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+
+ row-rule-break: intersection;
+ row-rule-outset: 0;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/parsing/gap-decorations-col-rule-width.html b/tests/wpt/tests/css/css-gaps/parsing/gap-decorations-col-rule-width.html
new file mode 100644
index 00000000000..db7b97e74a5
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/parsing/gap-decorations-col-rule-width.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Gap Decorations: Ensure getComputedStyle for column-rule-width is as specified with multiple values</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#column-row-rule-width">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<script src="/resources/testharness.js" type="text/javascript"></script>
+<script src="/resources/testharnessreport.js" type="text/javascript"></script>
+</head>
+<body>
+<div id="target1"></div>
+<div id="target2"></div>
+<div id="target3"></div>
+<style>
+ #target1 {
+ column-rule-width: thin;
+ }
+
+ #target2 {
+ column-rule-width: 5px 10px 15px;
+ }
+
+ #target3 {
+ column-rule-width: repeat(auto, 5px);
+ }
+</style>
+<script>
+ test(function() {
+ const containerStyle = window.getComputedStyle(document.querySelector('#target1'));
+ const columnRuleWidth = containerStyle.getPropertyValue('column-rule-width');
+ assert_equals(columnRuleWidth, '0px');
+
+ }, "`column-rule-width` should be `0px` when `column-rule-style` is `none` with single value");
+
+ test(function() {
+ const containerStyle = window.getComputedStyle(document.querySelector('#target2'));
+ const columnRuleWidth = containerStyle.getPropertyValue('column-rule-width');
+ assert_equals(columnRuleWidth, '5px 10px 15px');
+
+ }, "`column-rule-width` should be as specified regardless of `column-rule-style` with multiple values");
+
+ test(function() {
+ const containerStyle = window.getComputedStyle(document.querySelector('#target3'));
+ const columnRuleWidth = containerStyle.getPropertyValue('column-rule-width');
+ assert_equals(columnRuleWidth, 'repeat(auto, 5px)');
+
+ }, "`column-rule-width` should be as specified regardless of `column-rule-style` with multiple (repeat) values");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index-ref.html b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index-ref.html
new file mode 100644
index 00000000000..7325685511a
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>CSS Test Reference</title>
+<style>
+ body {
+ background-position: top left;
+ background-repeat: no-repeat;
+ background-size: 100px 100px;
+ background-image: linear-gradient(blue 40px, yellow);
+ }
+</style>
+<body>
diff --git a/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index.html b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index.html
new file mode 100644
index 00000000000..299b86d464a
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/linear-gradient-body-sibling-index.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>CSS Images Test: Linear gradient with sibling-index()</title>
+<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients">
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<link rel="match" href="linear-gradient-body-sibling-index-ref.html">
+<link rel="assert" content"sibling-index() is 2 for body">
+<style>
+ body {
+ background-position: top left;
+ background-repeat: no-repeat;
+ background-size: 100px 100px;
+ background-image: linear-gradient(blue calc(20px * sibling-index()), yellow);
+ }
+</style>
+<body>
diff --git a/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units-ref.html b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units-ref.html
new file mode 100644
index 00000000000..be13be8e260
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<title>CSS Test Reference</title>
+<style>
+ div { width: 100px; height: 100px; }
+</style>
+<div style="background: linear-gradient(blue 20px, yellow)"></div>
+<div style="background: linear-gradient(blue 60px, yellow)"></div>
diff --git a/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units.html b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units.html
new file mode 100644
index 00000000000..e764e62890d
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/linear-gradient-calc-em-units.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>CSS Images Test: Linear gradient with em in calc()</title>
+<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients">
+<link rel="match" href="linear-gradient-calc-em-units-ref.html">
+<style>
+ div {
+ width: 100px;
+ height: 100px;
+ background: linear-gradient(blue calc(2em), yellow);
+ }
+ #em1 {
+ font-size: 10px;
+ }
+ #em2 {
+ font-size: 30px;
+ }
+</style>
+<div id="em1"></div>
+<div id="em2"></div>
diff --git a/tests/wpt/tests/css/css-images/linear-gradient-sibling-index-ref.html b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index-ref.html
new file mode 100644
index 00000000000..eea8518d95b
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<title>CSS Test Reference</title>
+<style>
+ div { width: 100px; height: 100px; }
+</style>
+<div style="background: linear-gradient(blue 20px, yellow)"></div>
+<div style="background: linear-gradient(blue 50px, yellow)"></div>
diff --git a/tests/wpt/tests/css/css-images/linear-gradient-sibling-index.html b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index.html
new file mode 100644
index 00000000000..b92897e0697
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/linear-gradient-sibling-index.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>CSS Images Test: Linear gradient with sibling-index()</title>
+<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients">
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<link rel="match" href="linear-gradient-sibling-index-ref.html">
+<style>
+ .grad {
+ width: 100px;
+ height: 100px;
+ background: linear-gradient(blue calc(10px * sibling-index()), yellow);
+ }
+</style>
+<div>
+ <div></div>
+ <div class="grad"></div>
+ <div></div>
+ <div></div>
+ <div class="grad"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-mixins/dashed-function-cycles.tentative.html b/tests/wpt/tests/css/css-mixins/dashed-function-cycles.html
index 11e653e9b7d..15305be2b28 100644
--- a/tests/wpt/tests/css/css-mixins/dashed-function-cycles.tentative.html
+++ b/tests/wpt/tests/css/css-mixins/dashed-function-cycles.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<title>Custom Functions: Handling cycles</title>
-<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#cycles">
-<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11500">
+<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#evaluating-custom-functions">
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#cyclic-substitution-contexts">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/utils.js"></script>
diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-005.html b/tests/wpt/tests/css/css-multicol/getclientrects-005.html
new file mode 100644
index 00000000000..ee60a607dcc
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/getclientrects-005.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<title>getClientRects on fragmented table-column and table-column-group</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects">
+<link rel="help" href="https://drafts.csswg.org/css-multicol/">
+<style>
+ body {
+ margin: 8px;
+ }
+</style>
+<div style="columns:6; gap:20px; inline-size:580px; column-rule:solid; column-fill:auto; block-size:100px; background:yellow;">
+ <div style="block-size:110px;"></div>
+ <div style="display:table; inline-size:100%; border-spacing:5px; border:2px solid; background:pink;">
+ <div style="display:table-caption; block-size:100px;"></div>
+ <div style="display:table-caption; caption-side:bottom; block-size:100px;"></div>
+ <div id="col1" style="display:table-column; inline-size:15px; background:blue;"></div>
+ <div id="col2" style="display:table-column; background:lime;"></div>
+ <div id="group" style="display:table-column-group;">
+ <div id="col3" style="display:table-column; inline-size:20px; background:hotpink;"></div>
+ <div id="col4" style="display:table-column; inline-size:10px; background:cyan;" id="col2"></div>
+ </div>
+ <div style="display:table-row-group;">
+ <div style="display:table-cell;">
+ <div style="block-size:5px;"></div>
+ </div>
+ </div>
+ <div style="display:table-row-group;">
+ <div style="display:table-cell;">
+ <div style="block-size:240px;"></div>
+ </div>
+ <div style="display:table-cell;"></div>
+ <div style="display:table-cell;"></div>
+ <div style="display:table-cell;"></div>
+ </div>
+ </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(()=> {
+ let rects = col1.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 215);
+ assert_equals(rects[0].top, 25);
+ assert_equals(rects[0].width, 15);
+ assert_equals(rects[0].height, 83);
+
+ assert_equals(rects[1].left, 315);
+ assert_equals(rects[1].top, 8);
+ assert_equals(rects[1].width, 15);
+ assert_equals(rects[1].height, 100);
+
+ assert_equals(rects[2].left, 415);
+ assert_equals(rects[2].top, 8);
+ assert_equals(rects[2].width, 15);
+ assert_equals(rects[2].height, 67);
+ }, "#col1");
+
+ test(()=> {
+ let rects = col2.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 235);
+ assert_equals(rects[0].top, 25);
+ assert_equals(rects[0].width, 10);
+ assert_equals(rects[0].height, 83);
+
+ assert_equals(rects[1].left, 335);
+ assert_equals(rects[1].top, 8);
+ assert_equals(rects[1].width, 10);
+ assert_equals(rects[1].height, 100);
+
+ assert_equals(rects[2].left, 435);
+ assert_equals(rects[2].top, 8);
+ assert_equals(rects[2].width, 10);
+ assert_equals(rects[2].height, 67);
+ }, "#col2");
+
+ test(()=> {
+ let rects = col3.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 250);
+ assert_equals(rects[0].top, 25);
+ assert_equals(rects[0].width, 20);
+ assert_equals(rects[0].height, 83);
+
+ assert_equals(rects[1].left, 350);
+ assert_equals(rects[1].top, 8);
+ assert_equals(rects[1].width, 20);
+ assert_equals(rects[1].height, 100);
+
+ assert_equals(rects[2].left, 450);
+ assert_equals(rects[2].top, 8);
+ assert_equals(rects[2].width, 20);
+ assert_equals(rects[2].height, 67);
+ }, "#col3");
+
+ test(()=> {
+ let rects = col4.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 275);
+ assert_equals(rects[0].top, 25);
+ assert_equals(rects[0].width, 10);
+ assert_equals(rects[0].height, 83);
+
+ assert_equals(rects[1].left, 375);
+ assert_equals(rects[1].top, 8);
+ assert_equals(rects[1].width, 10);
+ assert_equals(rects[1].height, 100);
+
+ assert_equals(rects[2].left, 475);
+ assert_equals(rects[2].top, 8);
+ assert_equals(rects[2].width, 10);
+ assert_equals(rects[2].height, 67);
+ }, "#col4");
+
+ test(()=> {
+ let rects = group.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 250);
+ assert_equals(rects[0].top, 25);
+ assert_equals(rects[0].width, 35);
+ assert_equals(rects[0].height, 83);
+
+ assert_equals(rects[1].left, 350);
+ assert_equals(rects[1].top, 8);
+ assert_equals(rects[1].width, 35);
+ assert_equals(rects[1].height, 100);
+
+ assert_equals(rects[2].left, 450);
+ assert_equals(rects[2].top, 8);
+ assert_equals(rects[2].width, 35);
+ assert_equals(rects[2].height, 67);
+ }, "#group");
+</script>
diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-006.html b/tests/wpt/tests/css/css-multicol/getclientrects-006.html
new file mode 100644
index 00000000000..9f07a7de744
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/getclientrects-006.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<title>getClientRects on fragmented table-column and table-column-group, vertical-rl</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects">
+<link rel="help" href="https://drafts.csswg.org/css-multicol/">
+<style>
+ body {
+ margin: 8px;
+ }
+</style>
+<div style="writing-mode:vertical-rl; columns:6; gap:20px; inline-size:580px; column-rule:solid; column-fill:auto; block-size:100px; background:yellow;">
+ <div style="block-size:110px;"></div>
+ <div style="display:table; inline-size:100%; border-spacing:5px; border:2px solid; background:pink;">
+ <div style="display:table-caption; block-size:100px;"></div>
+ <div style="display:table-caption; caption-side:bottom; block-size:100px;"></div>
+ <div id="col1" style="display:table-column; inline-size:15px; background:blue;"></div>
+ <div id="col2" style="display:table-column; background:lime;"></div>
+ <div id="group" style="display:table-column-group;">
+ <div id="col3" style="display:table-column; inline-size:20px; background:hotpink;"></div>
+ <div id="col4" style="display:table-column; inline-size:10px; background:cyan;" id="col2"></div>
+ </div>
+ <div style="display:table-row-group;">
+ <div style="display:table-cell;">
+ <div style="block-size:5px;"></div>
+ </div>
+ </div>
+ <div style="display:table-row-group;">
+ <div style="display:table-cell;">
+ <div style="block-size:240px;"></div>
+ </div>
+ <div style="display:table-cell;"></div>
+ <div style="display:table-cell;"></div>
+ <div style="display:table-cell;"></div>
+ </div>
+ </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(()=> {
+ let rects = col1.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 8);
+ assert_equals(rects[0].top, 215);
+ assert_equals(rects[0].width, 83);
+ assert_equals(rects[0].height, 15);
+
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].top, 315);
+ assert_equals(rects[1].width, 100);
+ assert_equals(rects[1].height, 15);
+
+ assert_equals(rects[2].left, 41);
+ assert_equals(rects[2].top, 415);
+ assert_equals(rects[2].width, 67);
+ assert_equals(rects[2].height, 15);
+ }, "#col1");
+
+ test(()=> {
+ let rects = col2.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 8);
+ assert_equals(rects[0].top, 235);
+ assert_equals(rects[0].width, 83);
+ assert_equals(rects[0].height, 10);
+
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].top, 335);
+ assert_equals(rects[1].width, 100);
+ assert_equals(rects[1].height, 10);
+
+ assert_equals(rects[2].left, 41);
+ assert_equals(rects[2].top, 435);
+ assert_equals(rects[2].width, 67);
+ assert_equals(rects[2].height, 10);
+ }, "#col2");
+
+ test(()=> {
+ let rects = col3.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 8);
+ assert_equals(rects[0].top, 250);
+ assert_equals(rects[0].width, 83);
+ assert_equals(rects[0].height, 20);
+
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].top, 350);
+ assert_equals(rects[1].width, 100);
+ assert_equals(rects[1].height, 20);
+
+ assert_equals(rects[2].left, 41);
+ assert_equals(rects[2].top, 450);
+ assert_equals(rects[2].width, 67);
+ assert_equals(rects[2].height, 20);
+ }, "#col3");
+
+ test(()=> {
+ let rects = col4.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 8);
+ assert_equals(rects[0].top, 275);
+ assert_equals(rects[0].width, 83);
+ assert_equals(rects[0].height, 10);
+
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].top, 375);
+ assert_equals(rects[1].width, 100);
+ assert_equals(rects[1].height, 10);
+
+ assert_equals(rects[2].left, 41);
+ assert_equals(rects[2].top, 475);
+ assert_equals(rects[2].width, 67);
+ assert_equals(rects[2].height, 10);
+ }, "#col4");
+
+ test(()=> {
+ let rects = group.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 8);
+ assert_equals(rects[0].top, 250);
+ assert_equals(rects[0].width, 83);
+ assert_equals(rects[0].height, 35);
+
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].top, 350);
+ assert_equals(rects[1].width, 100);
+ assert_equals(rects[1].height, 35);
+
+ assert_equals(rects[2].left, 41);
+ assert_equals(rects[2].top, 450);
+ assert_equals(rects[2].width, 67);
+ assert_equals(rects[2].height, 35);
+ }, "#group");
+</script>
diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-007.html b/tests/wpt/tests/css/css-multicol/getclientrects-007.html
new file mode 100644
index 00000000000..0791c5b931f
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/getclientrects-007.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<title>getClientRects on fragmented table-column and table-column-group, vertical-lr</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects">
+<link rel="help" href="https://drafts.csswg.org/css-multicol/">
+<style>
+ body {
+ margin: 8px;
+ }
+</style>
+<div style="float:left; writing-mode:vertical-lr; columns:6; gap:20px; inline-size:580px; column-rule:solid; column-fill:auto; block-size:100px; background:yellow;">
+ <div style="block-size:110px;"></div>
+ <div style="display:table; inline-size:100%; border-spacing:5px; border:2px solid; background:pink;">
+ <div style="display:table-caption; block-size:100px;"></div>
+ <div style="display:table-caption; caption-side:bottom; block-size:100px;"></div>
+ <div id="col1" style="display:table-column; inline-size:15px; background:blue;"></div>
+ <div id="col2" style="display:table-column; background:lime;"></div>
+ <div id="group" style="display:table-column-group;">
+ <div id="col3" style="display:table-column; inline-size:20px; background:hotpink;"></div>
+ <div id="col4" style="display:table-column; inline-size:10px; background:cyan;" id="col2"></div>
+ </div>
+ <div style="display:table-row-group;">
+ <div style="display:table-cell;">
+ <div style="block-size:5px;"></div>
+ </div>
+ </div>
+ <div style="display:table-row-group;">
+ <div style="display:table-cell;">
+ <div style="block-size:240px;"></div>
+ </div>
+ <div style="display:table-cell;"></div>
+ <div style="display:table-cell;"></div>
+ <div style="display:table-cell;"></div>
+ </div>
+ </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(()=> {
+ let rects = col1.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].top, 215);
+ assert_equals(rects[0].left, 25);
+ assert_equals(rects[0].height, 15);
+ assert_equals(rects[0].width, 83);
+
+ assert_equals(rects[1].top, 315);
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].height, 15);
+ assert_equals(rects[1].width, 100);
+
+ assert_equals(rects[2].top, 415);
+ assert_equals(rects[2].left, 8);
+ assert_equals(rects[2].height, 15);
+ assert_equals(rects[2].width, 67);
+ }, "#col1");
+
+ test(()=> {
+ let rects = col2.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].top, 235);
+ assert_equals(rects[0].left, 25);
+ assert_equals(rects[0].height, 10);
+ assert_equals(rects[0].width, 83);
+
+ assert_equals(rects[1].top, 335);
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].height, 10);
+ assert_equals(rects[1].width, 100);
+
+ assert_equals(rects[2].top, 435);
+ assert_equals(rects[2].left, 8);
+ assert_equals(rects[2].height, 10);
+ assert_equals(rects[2].width, 67);
+ }, "#col2");
+
+ test(()=> {
+ let rects = col3.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].top, 250);
+ assert_equals(rects[0].left, 25);
+ assert_equals(rects[0].height, 20);
+ assert_equals(rects[0].width, 83);
+
+ assert_equals(rects[1].top, 350);
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].height, 20);
+ assert_equals(rects[1].width, 100);
+
+ assert_equals(rects[2].top, 450);
+ assert_equals(rects[2].left, 8);
+ assert_equals(rects[2].height, 20);
+ assert_equals(rects[2].width, 67);
+ }, "#col3");
+
+ test(()=> {
+ let rects = col4.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].top, 275);
+ assert_equals(rects[0].left, 25);
+ assert_equals(rects[0].height, 10);
+ assert_equals(rects[0].width, 83);
+
+ assert_equals(rects[1].top, 375);
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].height, 10);
+ assert_equals(rects[1].width, 100);
+
+ assert_equals(rects[2].top, 475);
+ assert_equals(rects[2].left, 8);
+ assert_equals(rects[2].height, 10);
+ assert_equals(rects[2].width, 67);
+ }, "#col4");
+
+ test(()=> {
+ let rects = group.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].top, 250);
+ assert_equals(rects[0].left, 25);
+ assert_equals(rects[0].height, 35);
+ assert_equals(rects[0].width, 83);
+
+ assert_equals(rects[1].top, 350);
+ assert_equals(rects[1].left, 8);
+ assert_equals(rects[1].height, 35);
+ assert_equals(rects[1].width, 100);
+
+ assert_equals(rects[2].top, 450);
+ assert_equals(rects[2].left, 8);
+ assert_equals(rects[2].height, 35);
+ assert_equals(rects[2].width, 67);
+ }, "#group");
+</script>
diff --git a/tests/wpt/tests/css/css-multicol/getclientrects-008.html b/tests/wpt/tests/css/css-multicol/getclientrects-008.html
new file mode 100644
index 00000000000..21505a7e48a
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/getclientrects-008.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<title>getClientRects on monolithic elements and their container</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getclientrects">
+<link rel="help" href="https://drafts.csswg.org/css-multicol/">
+<style>
+ body {
+ margin: 8px;
+ }
+</style>
+<div style="columns:3; column-fill:auto; gap:10px; width:320px; height:100px; background:yellow;">
+ <div id="container" style="background:gray;">
+ <div id="monolith1" style="contain:size; width:50%; height:250px; background:cyan;"></div>
+ <div id="monolith2" style="contain:size; width:50%; height:50px; background:black;"></div>
+ <div id="monolith3" style="contain:size; width:50%; height:250px; background:hotpink;"></div>
+ </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(()=> {
+ let rects = monolith1.getClientRects();
+ assert_equals(rects.length, 1);
+ assert_equals(rects[0].left, 8);
+ assert_equals(rects[0].top, 8);
+ assert_equals(rects[0].width, 50);
+ assert_equals(rects[0].height, 250);
+ }, "#monolith1");
+
+ test(()=> {
+ let rects = monolith2.getClientRects();
+ assert_equals(rects.length, 1);
+ assert_equals(rects[0].left, 118);
+ assert_equals(rects[0].top, 8);
+ assert_equals(rects[0].width, 50);
+ assert_equals(rects[0].height, 50);
+ }, "#monolith2");
+
+ test(()=> {
+ let rects = monolith3.getClientRects();
+ assert_equals(rects.length, 1);
+ assert_equals(rects[0].left, 228);
+ assert_equals(rects[0].top, 8);
+ assert_equals(rects[0].width, 50);
+ assert_equals(rects[0].height, 250);
+ }, "#monolith3");
+
+ test(()=> {
+ let rects = container.getClientRects();
+ assert_equals(rects.length, 3);
+
+ assert_equals(rects[0].left, 8);
+ assert_equals(rects[0].top, 8);
+ assert_equals(rects[0].width, 100);
+ assert_equals(rects[0].height, 250);
+
+ assert_equals(rects[1].left, 118);
+ assert_equals(rects[1].top, 8);
+ assert_equals(rects[1].width, 100);
+ assert_equals(rects[1].height, 100);
+
+ assert_equals(rects[2].left, 228);
+ assert_equals(rects[2].top, 8);
+ assert_equals(rects[2].width, 100);
+ assert_equals(rects[2].height, 250);
+ }, "#container");
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-activation-without-scroller.html b/tests/wpt/tests/css/css-overflow/scroll-button-activation-without-scroller.html
new file mode 100644
index 00000000000..f5951efc419
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-button-activation-without-scroller.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: ::scroll-button() activation without scroller shouldn't crash</title>
+<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-buttons">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<style>
+div::scroll-button(inline-start) {
+ content: "";
+ height: 100px;
+ width: 100px;
+}
+</style>
+<div></div>
+<script>
+ promise_test(async t => {
+ await new test_driver.Actions()
+ .pointerMove(50, 50)
+ .pointerDown()
+ .pointerUp()
+ .pointerDown()
+ .pointerUp()
+ .send();
+ const kTab = '\uE004';
+ const kEnter = '\uE007';
+ await new test_driver.Actions()
+ .keyDown(kTab)
+ .keyUp(kTab)
+ .keyDown(kEnter)
+ .keyUp(kEnter)
+ .send();
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-disabled-no-focus.html b/tests/wpt/tests/css/css-overflow/scroll-button-disabled-no-focus.html
new file mode 100644
index 00000000000..a8897706874
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-button-disabled-no-focus.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: disabled ::scroll-button() shouldn't be focusable</title>
+<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-buttons">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<style>
+div::scroll-button(inline-start) {
+ content: "";
+ background-color: green;
+}
+
+div::scroll-button(inline-start):focus {
+ background-color: red;
+}
+</style>
+<div id="target"></div>
+<script>
+ promise_test(async t => {
+ const kTab = '\uE004';
+ await new test_driver.Actions()
+ .keyDown(kTab)
+ .keyUp(kTab)
+ .send();
+ assert_equals(getComputedStyle(target, "::scroll-button(inline-start)").backgroundColor, "rgb(0, 128, 0)");
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html b/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html
index 462186407d5..c382f738a6f 100644
--- a/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html
+++ b/tests/wpt/tests/css/css-overflow/scroll-buttons-appearance-ref.html
@@ -7,4 +7,4 @@
<p>Test passes if there are two buttons, the first one using appearance auto
and the second using appearance: none.</p>
<div></div>
-<button>appearance: auto</button><button class="none">appearance: none</button>
+<button disabled="true">appearance: auto</button><button disabled="true" class="none">appearance: none</button>
diff --git a/tests/wpt/tests/css/css-scroll-anchoring/table-col-and-dead-row-group-crash.html b/tests/wpt/tests/css/css-scroll-anchoring/table-col-and-dead-row-group-crash.html
new file mode 100644
index 00000000000..e6e90a63a34
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-anchoring/table-col-and-dead-row-group-crash.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/416061199">
+<div style="display:table;">
+ <div style="display:table-column-group;"></div>
+ <div id="e13" style="display:table-row-group;">
+ <div style="height:200vh;"></div>
+ x
+ </div>
+</div>
+<script>
+ window.scroll(0, 100);
+ e13.style.display = "none";
+</script>
diff --git a/tests/wpt/tests/css/css-text/letter-spacing/letter-spacing-cursive-001.html b/tests/wpt/tests/css/css-text/letter-spacing/letter-spacing-cursive-001.html
new file mode 100644
index 00000000000..5700c600981
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/letter-spacing/letter-spacing-cursive-001.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<head>
+<meta charset="utf-8">
+<title>
+CSS Text Test - Letter-spacing should not be applied for Cursive Scripts.
+</title>
+<link rel="author" title="Sejal Anand" href="mailto:sejalanand@microsoft.com">
+<link rel="help" href="https://www.w3.org/TR/css-text-3/#cursive-tracking">
+<link rel="match" href="reference/letter-spacing-cursive-001-ref.html">
+<meta name="assert" content="Letter-spacing must not be applied to Arabic text,
+ preserving cursive connections.">
+<style>
+div {
+ margin: 1em;
+ font: 24px serif;
+ white-space: nowrap;
+ display: inline-block;
+ outline: 1px solid gray;
+}
+.letterspacing {
+ letter-spacing: 10px; /* Should NOT affect Arabic text */
+}
+</style>
+</head>
+<body>
+<p>
+The following test will pass if no spacing appears between letters within
+Arabic words. Both Arabic texts should display identically.
+</p>
+<div class="letterspacing">
+<span>مرحباً</span>
+</div>
+<br>
+<div>
+<span>مرحباً</span>
+</div>
+<br>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html b/tests/wpt/tests/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html
new file mode 100644
index 00000000000..720c9491b4d
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/letter-spacing/reference/letter-spacing-cursive-001-ref.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<head>
+<meta charset="utf-8">
+<title>
+CSS Text Test - Letter-spacing should not be applied for Cursive Scripts.
+</title>
+<link rel="author" title="Sejal Anand" href="mailto:sejalanand@microsoft.com">
+<style>
+div {
+ margin: 1em;
+ font: 24px serif;
+ white-space: nowrap;
+ display: inline-block;
+ outline: 1px solid gray;
+}
+</style>
+</head>
+<body>
+<p>
+The following test will pass if no spacing appears between letters within
+Arabic words. Both Arabic texts should display identically.
+</p>
+<div>
+<span>مرحباً</span>
+</div>
+<br>
+<div>
+<span>مرحباً</span>
+</div>
+<br>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path-ref.html b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path-ref.html
new file mode 100644
index 00000000000..d6fa480b040
--- /dev/null
+++ b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path-ref.html
@@ -0,0 +1,20 @@
+<!doctype HTML>
+<style>
+.tile {
+ width: 620px;
+ height: 671px;
+ position: absolute;
+ clip-path: circle(50%);
+ background-color: lightblue;
+}
+#container {
+ transform: scale(0.25);
+ position: relative;
+ left: -200px;
+ will-change: transform;
+}
+</style>
+<div id=container>
+ <div class="tile" style="top: 520px;"></div>
+ <div class="tile" style="top: 688px; left: 390px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path.html b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path.html
new file mode 100644
index 00000000000..dda72c0d139
--- /dev/null
+++ b/tests/wpt/tests/css/css-transforms/css-scale-of-clip-path.html
@@ -0,0 +1,23 @@
+<!doctype HTML>
+<link rel="author" title="Chris Harrelson">
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/">
+<link rel="match" href="css-scale-of-clip-path-ref.html">
+<meta name=fuzzy content="maxDifference=0-40;totalPixels=0-3000">
+<style>
+.tile {
+ width: 620px;
+ height: 671px;
+ position: absolute;
+ clip-path: circle(50%);
+ background-color: lightblue;
+}
+#container {
+ transform: scale(0.25);
+ position: relative;
+ left: -200px;
+}
+</style>
+<div id=container>
+ <div class="tile" style="top: 520px;"></div>
+ <div class="tile" style="top: 688px; left: 390px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text-ref.html b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text-ref.html
new file mode 100644
index 00000000000..e8b564ce3dd
--- /dev/null
+++ b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<style>
+ #container {
+ transform: scale(0.5);
+ background-color: lightblue;
+ font-size: 80px;
+ }
+ #animated, #content {
+ will-change: transform;
+ }
+</style>
+<div id=container>
+ <div id=content>
+ <div id=animated>Text</div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text.html b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text.html
new file mode 100644
index 00000000000..a479b12528a
--- /dev/null
+++ b/tests/wpt/tests/css/css-transforms/scale-transform-filtered-text.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<link rel="author" href="mailto:chrishtr@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/">
+<meta name="assert" content="Text is not blurry under w/filter and animation.">
+<link rel="match" href="scale-transform-filtered-text-ref.html">
+<meta name=fuzzy content="maxDifference=0-25;totalPixels=0-500">
+<style>
+ #container {
+ transform: scale(0.5);
+ background-color: lightblue;
+ font-size: 80px;
+ }
+ #content {
+ filter: blur(0px);
+ }
+ #animated {
+ will-change: transform;
+ }
+</style>
+<div id=container>
+ <div id=content>
+ <div id=animated>Text</div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html
index 7a852545a74..d12714a499c 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/transform.html
@@ -18,4 +18,8 @@ runPropertyTests('transform', [
{ syntax: '<transform>' },
]);
+runUnsupportedPropertyTests('transform', [
+ 'matrix(sibling-index(), 2, 3, 4, 5 ,6)'
+]);
+
</script>
diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html
index d31d4acf499..76d2ff8ee4d 100644
--- a/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html
+++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html
@@ -4,7 +4,7 @@
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10982">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<style id="test_sheet">
+<style id="page_sheet">
@page {
margin: 100px;
margin: calc(0px * sibling-index());
@@ -13,33 +13,131 @@
margin: 100px;
margin: calc(0px * sibling-count());
}
+</style>
+<style id="font_face_sheet">
@font-face {
font-family: my-font;
font-weight: 300;
font-weight: calc(max(0 * sibling-index(), 400));
+ font-feature-settings: "vert" 2;
+ font-feature-settings: "vert" calc(max(sibling-index(), 1));
}
@font-face {
font-family: my-font;
font-weight: 300;
font-weight: calc(max(0 * sibling-count(), 400));
+ font-feature-settings: "vert" 2;
+ font-feature-settings: "vert" calc(max(sibling-count(), 1));
+ }
+</style>
+<style id="font_palette_sheet">
+ @font-palette-values --foo {
+ font-family: my-font;
+ base-palette: 1;
+ base-palette: calc(max(sibling-index(), 2));
+ override-colors: 1 green;
+ override-colors: sibling-index() red;
+ }
+ @font-palette-values --foo {
+ font-family: my-font;
+ base-palette: 1;
+ base-palette: calc(max(sibling-count(), 2));
+ override-colors: 1 green;
+ override-colors: sibling-count() red;
+ }
+</style>
+<style id="counter_style_sheet">
+ @counter-style --foo {
+ system: fixed 1;
+ system: fixed calc(max(sibling-index(), 2));
+ negative: --pass;
+ negative: linear-gradient(red calc(20px * sibling-index()), pink);
+ prefix: --pass;
+ prefix: linear-gradient(red calc(20px * sibling-index()), pink);
+ suffix: --pass;
+ suffix: linear-gradient(red calc(20px * sibling-index()), pink);
+ range: 1 infinite;
+ range: calc(max(sibling-index(), 2)) infinite;
+ pad: 1 --pass;
+ pad: 1 linear-gradient(red calc(20px * sibling-index()), pink);
+ pad: calc(max(sibling-index(), 2)) --fail;
+ symbols: --pass;
+ symbols: linear-gradient(red calc(20px * sibling-index()), pink);
+ }
+ @counter-style --foo {
+ system: fixed 1;
+ system: fixed calc(max(sibling-count(), 2));
+ negative: --pass;
+ negative: linear-gradient(green, green);
+ negative: linear-gradient(red calc(20px * sibling-count()), pink);
+ prefix: --pass;
+ prefix: linear-gradient(red calc(20px * sibling-count()), pink);
+ suffix: --pass;
+ suffix: linear-gradient(red calc(20px * sibling-count()), pink);
+ range: 1 infinite;
+ range: calc(max(sibling-count(), 2)) infinite;
+ pad: 1 --pass;
+ pad: 1 linear-gradient(red calc(20px * sibling-count()), pink);
+ pad: calc(max(sibling-count(), 2)) --fail;
+ symbols: --pass;
+ symbols: linear-gradient(red calc(20px * sibling-count()), pink);
}
</style>
<script>
- const rules = test_sheet.sheet.cssRules;
+ const page_rules = page_sheet.sheet.cssRules;
test(() => {
- assert_equals(rules[0].style.margin, "100px");
+ assert_equals(page_rules[0].style.margin, "100px");
}, "sibling-index() should not be allowed in @page properties");
test(() => {
- assert_equals(rules[1].style.margin, "100px");
+ assert_equals(page_rules[1].style.margin, "100px");
}, "sibling-count() should not be allowed in @page properties");
+ const font_face_rules = font_face_sheet.sheet.cssRules;
+
test(() => {
- assert_equals(rules[2].style.fontWeight, "300");
+ assert_equals(font_face_rules[0].style.fontWeight, "300");
+ assert_equals(font_face_rules[0].style.fontFeatureSettings, "\"vert\" 2");
}, "sibling-index() should not be allowed in @font-face descriptors");
test(() => {
- assert_equals(rules[3].style.fontWeight, "300");
+ assert_equals(font_face_rules[1].style.fontWeight, "300");
+ assert_equals(font_face_rules[1].style.fontFeatureSettings, "\"vert\" 2");
}, "sibling-count() should not be allowed in @font-face descriptors");
+
+ const font_palette_rules = font_palette_sheet.sheet.cssRules;
+
+ test(() => {
+ assert_equals(font_palette_rules[0].basePalette, "1");
+ assert_equals(font_palette_rules[0].overrideColors, "1 green");
+ }, "sibling-index() should not be allowed in @font-palette-values descriptors");
+
+ test(() => {
+ assert_equals(font_palette_rules[1].basePalette, "1");
+ assert_equals(font_palette_rules[1].overrideColors, "1 green");
+ }, "sibling-count() should not be allowed in @font-palette-values descriptors");
+
+ const counter_style_rules = counter_style_sheet.sheet.cssRules;
+
+ test(() => {
+ assert_equals(counter_style_rules[0].system, "fixed 1");
+ assert_equals(counter_style_rules[0].negative, "--pass");
+ assert_equals(counter_style_rules[0].prefix, "--pass");
+ assert_equals(counter_style_rules[0].suffix, "--pass");
+ assert_equals(counter_style_rules[0].range, "1 infinite");
+ assert_equals(counter_style_rules[0].pad, "1 --pass");
+ assert_equals(counter_style_rules[0].symbols, "--pass");
+ }, "sibling-index() should not be allowed in @counter-style descriptors");
+
+ test(() => {
+ assert_equals(counter_style_rules[1].system, "fixed 1");
+ assert_equals(counter_style_rules[1].negative, "--pass");
+ assert_equals(counter_style_rules[1].prefix, "--pass");
+ assert_equals(counter_style_rules[1].suffix, "--pass");
+ assert_equals(counter_style_rules[1].range, "1 infinite");
+ assert_equals(counter_style_rules[1].pad, "1 --pass");
+ assert_equals(counter_style_rules[1].symbols, "--pass");
+ }, "sibling-count() should not be allowed in @counter-style descriptors");
+
</script>
diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html
new file mode 100644
index 00000000000..cbd34602fb3
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-length-value-dynamic.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: sibling-index() changing length value during @keyframes animation</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes --anim {
+ from {
+ top: calc(100px * sibling-index());
+ }
+ to {
+ top: 0px;
+ }
+ }
+ #target {
+ animation: --anim 1000s step-end;
+ position: absolute;
+ top: 13px;
+ width: 100px;
+ height: 100px;
+ }
+</style>
+<div>
+ <div id="rm"></div>
+ <div id="target"></div>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(target).top, "200px");
+ }, "Initially, the sibling-index() is 2 for #target");
+
+ test(() => {
+ rm.remove();
+ assert_equals(getComputedStyle(target).top, "100px");
+ }, "Removing a preceding sibling of #target reduces the sibling-index()");
+
+</script>
diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html
new file mode 100644
index 00000000000..286e0d3d3e2
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: sibling-index() changing value during @keyframes animation</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes --anim {
+ from {
+ z-index: sibling-index();
+ }
+ to {
+ z-index: 1;
+ }
+ }
+ #target {
+ animation: --anim 1000s step-end;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ background: red;
+ }
+ #abs {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ z-index: 3;
+ background: green;
+ }
+</style>
+<p>You should see a green square below.</p>
+<div>
+ <div id="rm"></div>
+ <div id="abs"></div>
+ <div id="target"></div>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(target).zIndex, "3");
+ }, "Initially, the sibling-index() is 3 for #target");
+
+ test(() => {
+ rm.remove();
+ assert_equals(getComputedStyle(target).zIndex, "2");
+ }, "Removing a preceding sibling of #target reduces the sibling-index()");
+
+</script>
diff --git a/tests/wpt/tests/css/css-view-transitions/root-preserve3d-crash.html b/tests/wpt/tests/css/css-view-transitions/root-preserve3d-crash.html
new file mode 100644
index 00000000000..11232801875
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/root-preserve3d-crash.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1963368">
+<style>
+ * {
+ border-style: double !important;
+ -webkit-transform-style: preserve-3d !important;
+ }
+</style>
+<script>
+ document.addEventListener("DOMContentLoaded", async () => {
+ document.startViewTransition(undefined)
+ })
+</script>
diff --git a/tests/wpt/tests/css/css-view-transitions/root-replace-crash.html b/tests/wpt/tests/css/css-view-transitions/root-replace-crash.html
new file mode 100644
index 00000000000..165eec41b6b
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/root-replace-crash.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <script>
+ document.addEventListener("DOMContentLoaded", async () => {
+ const tt = document.createElementNS("http://www.w3.org/1999/xhtml", "tt")
+ tt.popover = "manual"
+ const viewTransition = document.startViewTransition(undefined)
+ await viewTransition.updateCallbackDone
+ for (let i = 0; i < 2; i++) {
+ document.replaceChild(tt, document.childNodes[(2324524876 % document.childNodes.length)])
+ }
+ })
+ </script>
+ <head>
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html b/tests/wpt/tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html
new file mode 100644
index 00000000000..a2faafc1694
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/scoped/crashtests/shadow-dom.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="test-wait">
+<body>
+<meter><div id="node1"></div></meter>
+<div>
+ <template shadowrootmode="open"></template>
+ <div id="node2"></div>
+</div>
+<div style="display:none">
+ <div id="node3"></div>
+</div>
+<script>
+ const tr1 = node1.startViewTransition();
+ const tr2 = node2.startViewTransition();
+ const tr3 = node3.startViewTransition();
+ onload = async () => {
+ await tr1.finished;
+ await tr2.finished;
+ await tr3.finished;
+ document.documentElement.classList.remove('test-wait');
+ }
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/start-skip-start.html b/tests/wpt/tests/css/css-view-transitions/start-skip-start.html
new file mode 100644
index 00000000000..e04979472f1
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/start-skip-start.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Test start skip and then start on a view transition</title>
+ <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
+</head>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+ :root {
+ view-transition-name: none;
+ }
+ #target {
+ width: 100px;
+ height: 100px;
+ background: blue;
+ contain: paint;
+ view-transition-name: target;
+ }
+ #target.update-1 {
+ height: 150px;
+ }
+ #target.update-2 {
+ height: 200px;
+ }
+</style>
+
+<body>
+ <div id="target"></div>
+</body>
+<script>
+ promise_test(async t => {
+ let rejected_promise_tally = 0;
+ const target = document.getElementById("target");
+ assert_implements(document.startViewTransition,
+ "Missing document.startViewTransition");
+
+ const verifyAbortedTransition = (promise) => {
+ return promise.then(
+ () => { assert_not_reached('transition aborted') },
+ (reason) => {
+ assert_true(reason instanceof DOMException);
+ assert_equals(reason.code, DOMException.ABORT_ERR);
+ rejected_promise_tally++;
+ });
+ };
+
+ const vt1 = document.startViewTransition(() => {
+ target.className = 'update-1';
+ });
+
+ vt1.skipTransition();
+ const vt2 = document.startViewTransition(() => {
+ assert_equals(target.className, 'update-1');
+ target.className = 'update-2';
+ });
+
+ vt2.skipTransition();
+ const vt3 = document.startViewTransition(() => {
+ assert_equals(target.className, 'update-2');
+ });
+
+ await verifyAbortedTransition(vt1.ready);
+ await verifyAbortedTransition(vt2.ready);
+ await vt3.ready;
+
+ assert_equals(rejected_promise_tally, 2,
+ 'first 2 transitions were skipped');
+ const sizeTransformAnimations = document.getAnimations().filter(a => {
+ return 'height' in a.effect.getKeyframes()[0];
+ });
+ assert_equals(sizeTransformAnimations.length, 1);
+ const startingHeight =
+ sizeTransformAnimations[0].effect.getKeyframes()[0].height;
+
+ assert_equals(startingHeight, '200px',
+ 'Height change applied before capture');
+
+ }, 'Synchronously starting a view transition blocks on DOM callback for ' +
+ 'previously skipped transitions');
+
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html b/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html
index d5c0abd652c..3ac946b273b 100644
--- a/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html
+++ b/tests/wpt/tests/css/css-view-transitions/view-transition-types-mutable-no-document-element-crashtest.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://www.w3.org/TR/css-transitions-2/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/dom/events/scrolling/scroll_support.js"></script>
<style>
::view-transition-group(*),
@@ -14,14 +15,18 @@
</style>
<script>
- test(() => {
- assert_implements(document.startViewTransition);
+promise_test(async () => {
+ assert_implements(document.startViewTransition);
- const { types } = document.startViewTransition();
- document.documentElement.remove();
- types.add("a");
- assert_array_equals([...types], ["a"]);
- }, "ViewTransitionTypeSet should not crash when documentElement is null");
+ await new Promise((r) => requestAnimationFrame(() => {
+ waitForCompositorReady().then(r);
+ }));
+
+ const { types } = document.startViewTransition();
+ document.documentElement.remove();
+ types.add("a");
+ assert_array_equals([...types], ["a"]);
+}, "ViewTransitionTypeSet should not crash when documentElement is null");
</script>
</html>
diff --git a/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html b/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html
index 40e29181d6f..ce82b7237d0 100644
--- a/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html
+++ b/tests/wpt/tests/css/cssom-view/getBoundingClientRect-newline.html
@@ -5,17 +5,14 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
-div {
+div[contenteditable] {
white-space: pre;
- font-family: Ahem;
- font-size: 10px;
- line-height: 1;
+ font: 10px/1 Ahem;
width: 10ch;
}
</style>
<body>
<div contenteditable></div>
-</body>
<script>
function getBoundingClientRect(node, offset) {
const range = document.createRange();
@@ -37,3 +34,4 @@ test(function() {
assert_less_than(rect6.y, rect7.y);
}, 'Range.getBoundingClientRect() should return the first position of the next line when the collapsed range is a newline character');
</script>
+</body>
diff --git a/tests/wpt/tests/css/cssom-view/resources/scrollIntoView-frame.html b/tests/wpt/tests/css/cssom-view/resources/scrollIntoView-frame.html
new file mode 100644
index 00000000000..ee2be2fd3ab
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/resources/scrollIntoView-frame.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="viewport" content="initial-scale=1">
+<style>
+body {
+ height: 600px;
+}
+#target {
+ position: absolute;
+ top: 400px;
+ height: 200px;
+}
+</style>
+<body>
+<div id="target"></div>
+</body>
diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-container.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-container.html
new file mode 100644
index 00000000000..3b241ea2251
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-container.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<title>CSSOM View - scrollIntoView container option</title>
+<meta charset="utf-8">
+<meta name="viewport" content="initial-scale=1">
+<link rel="author" title="Rob Flack" href="mailto:flackr@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+.scroller {
+ overflow: auto;
+ height: 200px;
+}
+.spacer {
+ height: 400px;
+}
+#target {
+ height: 200px;
+}
+</style>
+<script>
+let setFrameLoaded = null;
+let frameLoaded = new Promise(resolve => {
+ setFrameLoaded = resolve;
+});
+</script>
+<div id="outer" class="scroller">
+ <div class="spacer"></div>
+ <div id="inner" class="scroller">
+ <div class="spacer"></div>
+ <div id="target"></div>
+ <iframe id="frame" height="200" src="resources/scrollIntoView-frame.html" onload="setFrameLoaded()"></iframe>
+ </div>
+</div>
+<script>
+const outer = document.getElementById('outer');
+const inner = document.getElementById('inner');
+const target = document.getElementById('target');
+
+function reset() {
+ outer.scrollTop = 0;
+ inner.scrollTop = 0;
+}
+
+test(() => {
+ reset();
+ target.scrollIntoView();
+ assert_equals(inner.scrollTop, 400, '#inner scrollTop');
+ assert_equals(outer.scrollTop, 400, '#outer scrollTop');
+}, `scrollIntoView() defaults to scrolling ancestors`);
+
+test(() => {
+ reset();
+ target.scrollIntoView({container: 'all'});
+ assert_equals(inner.scrollTop, 400, '#inner scrollTop');
+ assert_equals(outer.scrollTop, 400, '#outer scrollTop');
+}, `scrollIntoView({container: 'all'}) scrolls ancestors`);
+
+test(() => {
+ reset();
+ target.scrollIntoView({container: 'nearest'});
+ assert_equals(inner.scrollTop, 400, '#inner scrollTop');
+ assert_equals(outer.scrollTop, 0, '#outer scrollTop');
+}, `scrollIntoView({container: 'nearest'}) only scrolls nearest scroll container`);
+
+test(() => {
+ reset();
+ inner.scrollIntoView({container: 'nearest'});
+ assert_equals(outer.scrollTop, 400, '#outer scrollTop');
+ assert_equals(inner.scrollTop, 0, '#inner scrollTop');
+}, `scrollIntoView({container: 'nearest'}) doesn't stop at itself`);
+
+promise_test(async () => {
+ reset();
+ await frameLoaded;
+ const frameDoc = document.getElementById("frame").contentDocument;
+ const frameTarget = frameDoc.getElementById("target");
+ frameTarget.scrollIntoView({container: 'nearest'});
+ assert_equals(frameDoc.scrollingElement.scrollTop, 400, 'frame scrollingElement scrollTop');
+ assert_equals(inner.scrollTop, 0, '#inner scrollTop');
+ assert_equals(outer.scrollTop, 0, '#outer scrollTop');
+}, `scrollIntoView({container: 'nearest'}) doesn't propagate to outer frames`);
+
+</script>
diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform-ref.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform-ref.html
new file mode 100644
index 00000000000..d7faa0e97a1
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<style>
+ #container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ transform: scale(1.1);
+ }
+
+ #backdropfilter {
+ background: black;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ }
+</style>
+<div id=container>
+ <div id=backdropfilter></div>
+</div>
+
diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform.html
new file mode 100644
index 00000000000..813fb95d5ad
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-scale-transform.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<link rel="author" href="mailto:chrishtr@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filter-scale-transform-ref.html">
+<style>
+ #container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ transform: scale(1.1);
+ }
+
+ #backdropfilter {
+ backdrop-filter: invert(100%);
+ position: relative;
+ width: 100%;
+ height: 100%;
+ }
+</style>
+<div id=container>
+ <div id=backdropfilter></div>
+</div>
+
diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-transform-popover-crash.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-transform-popover-crash.html
new file mode 100644
index 00000000000..582f0c11965
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-transform-popover-crash.html
@@ -0,0 +1,17 @@
+<lijnk rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1845184">
+<style>
+* {
+ min-width: 1952643579% !important;
+ transform: skew(0, 1.8turn) scale(1.5794431017420837e+38) translate(215mm, 62%) scaleY(55498.5);
+ border-top-left-radius: 98779902.05ch;
+ backdrop-filter: sepia() invert(870236770%) drop-shadow(16Q -79.35pc 125vw hsla(-1.93deg, 66%, 84%));
+}
+</style>
+<script>
+window.addEventListener("load", () => {
+ let a = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas")
+ document.documentElement.appendChild(a)
+ a.popover = "a"
+ a.togglePopover(true)
+})
+</script>
diff --git a/tests/wpt/tests/css/filter-effects/css-filters-opacity-hit-testing.html b/tests/wpt/tests/css/filter-effects/css-filters-opacity-hit-testing.html
new file mode 100644
index 00000000000..3b288fca4df
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/css-filters-opacity-hit-testing.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>Elements with 'opacity: 0' should respond to hit testing.</title>
+<link rel="author" title="Psychpsyo" href="psychpsyo@gmail.com">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ div {
+ width: 100px;
+ height: 100px;
+ opacity: 0;
+ }
+</style>
+<div></div>
+<script>
+ test(() => {
+ assert_equals(document.elementFromPoint(50, 50).tagName, "DIV", "element with 'opacity: 0' doesn't respond to hit testing");
+ });
+</script>
diff --git a/tests/wpt/tests/css/geometry/DOMMatrix-001.html b/tests/wpt/tests/css/geometry/DOMMatrix-001.html
index f578da076cb..3436e17ced0 100644
--- a/tests/wpt/tests/css/geometry/DOMMatrix-001.html
+++ b/tests/wpt/tests/css/geometry/DOMMatrix-001.html
@@ -113,6 +113,8 @@
['translateX (5px)',
'scale(2 2) translateX(5) translateY(5)',
'scale(2, 2), translateX(5) ,translateY(5)',
+ 'scale(sign(1em))',
+ 'scale(sibling-index())',
'translateX(5em)',
'translateX(5ex)',
'translateX(5ch)',
@@ -130,10 +132,14 @@
'translateX(5vmin)',
'translateX(5vmax)',
'translateX(5%)',
+ 'translateX(calc(10px * sign(1em - 10px)))',
+ 'translateX(calc(10px * sibling-index()))',
'rotate(5)',
'rotate(5, 5, 5)',
'rotate(5, 5px, 5px)',
'rotate(5deg, 5px, 5px)',
+ 'rotate(calc(5deg * sign(1em - 10px)))',
+ 'rotate(calc(5deg * sibling-index()))',
' ',
'/**/',
'\0',
diff --git a/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml b/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml
index 24027360aab..7f15b7fa475 100644
--- a/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml
+++ b/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml
@@ -25,3 +25,7 @@ features:
- name: update
files:
- update-media-feature.html
+- name: scripting
+ files:
+ - scripting.html
+ - scripting-*
diff --git a/tests/wpt/tests/docs/writing-tests/testdriver.md b/tests/wpt/tests/docs/writing-tests/testdriver.md
index 67757af63f2..e0fae529875 100644
--- a/tests/wpt/tests/docs/writing-tests/testdriver.md
+++ b/tests/wpt/tests/docs/writing-tests/testdriver.md
@@ -313,3 +313,11 @@ The module provides access to [Web Bluetooth](https://webbluetoothcg.github.io/w
.. js:autofunction:: test_driver.bidi.bluetooth.simulate_preconnected_peripheral
.. js:autofunction:: test_driver.bidi.bluetooth.request_device_prompt_updated
```
+
+### Emulation ###
+
+Emulation of browser APIs via [WebDriver BiDi Emulation](https://www.w3.org/TR/webdriver-bidi/#module-emulation).
+
+```eval_rst
+.. js:autofunction:: test_driver.bidi.emulation.set_geolocation_override
+```
diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.html b/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.tentative.html
index e13e9f1cce5..e13e9f1cce5 100644
--- a/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.html
+++ b/tests/wpt/tests/dom/events/scrolling/overscroll-deltas.tentative.html
diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.tentative.html
index c054ffca9c4..c054ffca9c4 100644
--- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.html
+++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-document.tentative.html
diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html
index 750080e6568..750080e6568 100644
--- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.html
+++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.tentative.html
diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.tentative.html
index be4176df59d..be4176df59d 100644
--- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.html
+++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.tentative.html
diff --git a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.html b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.tentative.html
index ef5ae3daef8..ef5ae3daef8 100644
--- a/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.html
+++ b/tests/wpt/tests/dom/events/scrolling/overscroll-event-fired-to-window.tentative.html
diff --git a/tests/wpt/tests/dom/observable/WEB_FEATURES.yml b/tests/wpt/tests/dom/observable/WEB_FEATURES.yml
new file mode 100644
index 00000000000..3e872791165
--- /dev/null
+++ b/tests/wpt/tests/dom/observable/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: observable
+ files: "**"
diff --git a/tests/wpt/tests/element-timing/resources/element-timing-helpers.js b/tests/wpt/tests/element-timing/resources/element-timing-helpers.js
index 2c1bd195ea7..5ff01bfa120 100644
--- a/tests/wpt/tests/element-timing/resources/element-timing-helpers.js
+++ b/tests/wpt/tests/element-timing/resources/element-timing-helpers.js
@@ -19,7 +19,7 @@ function checkElementInternal(entry, expectedUrl, expectedIdentifier, expectedID
assert_greater_than_equal(entry.paintTime, beforeRender, 'paintTime should represent the time when the UA started painting');
// PaintTimingMixin
- if ("presentationTime" in entry) {
+ if ("presentationTime" in entry && entry.presentationTime !== null) {
assert_greater_than(entry.presentationTime, entry.paintTime);
assert_equals(entry.presentationTime, entry.renderTime);
} else {
diff --git a/tests/wpt/tests/event-timing/orphan-keydown.html b/tests/wpt/tests/event-timing/orphan-keydown.html
new file mode 100644
index 00000000000..0ab105d4d72
--- /dev/null
+++ b/tests/wpt/tests/event-timing/orphan-keydown.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<meta charset=utf-8 />
+<title>Event Timing: orphan keydown.</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>
+<script src=resources/event-timing-test-utils.js></script>
+
+<body>
+ <button id='target'>Click me</button>
+
+ <script>
+ let observedEntries = [];
+ const map = new Map();
+ const events = ['keydown'];
+
+ promise_test(async t => {
+ assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
+
+ const callback = (entryList) => {observedEntries = observedEntries.concat(entryList.getEntries().filter(filterAndAddToMap(events, map))); };
+ const readyToResolve = () => { return observedEntries.length >= 1; };
+ const observerPromise = createPerformanceObserverPromise(['event'], callback, readyToResolve);
+
+ await interactAndObserve('orphan-keydown', document.getElementById('target'), observerPromise);
+
+ assert_equals(observedEntries.length, 1, "Keydown without a keyup should be fired properly.");
+ assert_greater_than(map.get('keydown'), 0, "Should have a non-trivial interactionId.")
+ }, "Event Timing: Orphan keydown should be measured as an interaction.");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js b/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js
index 59c78ebf39c..afad67bb6fc 100644
--- a/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js
+++ b/tests/wpt/tests/event-timing/resources/event-timing-test-utils.js
@@ -554,6 +554,17 @@ async function interactAndObserve(interactionType, target, observerPromise, key
interactionPromise = textSelectionAndBlockMain(target, 30);
break;
}
+ case 'orphan-keydown': {
+ addListeners(target, ['keydown']);
+ interactionPromise = new test_driver.Actions()
+ .pointerMove(0, 0, {origin: target})
+ .pointerDown()
+ .pointerUp()
+ .addTick()
+ .keyDown('a')
+ .send();
+ break;
+ }
}
return Promise.all([interactionPromise, observerPromise]);
}
diff --git a/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html b/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html
index 2ea2d4a2599..04fcd272dcf 100644
--- a/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html
+++ b/tests/wpt/tests/fedcm/fedcm-disconnect.sub.https.html
@@ -13,6 +13,7 @@ import {fedcm_test,
mark_signed_in,
disconnect_options,
fedcm_get_and_select_first_account,
+ fedcm_select_account_promise,
request_options_with_mediation_required,
alt_manifest_origin,
alt_request_options_with_mediation_required,
@@ -82,4 +83,20 @@ fedcm_test(async t => {
await IdentityCredential.disconnect(disconnect_options("1"));
return IdentityCredential.disconnect(alt_disconnect_options("2"));
}, 'Disconnect is bound to each IDP');
+
+fedcm_test(async t => {
+ await mark_signed_in(alt_manifest_origin);
+ // Get at least one connected account that can be disconnected.
+ await fedcm_get_and_select_first_account(t, alt_request_options_with_mediation_required());
+
+ // Pending get request.
+ const credentialPromise = navigator.credentials.get(alt_request_options_with_mediation_required());
+
+ // Disconnect the one connected account.
+ await IdentityCredential.disconnect(alt_disconnect_options("1234"));
+
+ // Select an account to resolve the pending get request.
+ fedcm_select_account_promise(t, 0);
+ return credentialPromise;
+}, 'Test that disconnect succeeds when there is a pending get request and the get request succeeds after the disconnect');
</script>
diff --git a/tests/wpt/tests/fetch/api/request/WEB_FEATURES.yml b/tests/wpt/tests/fetch/api/request/WEB_FEATURES.yml
new file mode 100644
index 00000000000..69b2ea582a2
--- /dev/null
+++ b/tests/wpt/tests/fetch/api/request/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: fetch-priority
+ files:
+ - request-init-priority.any.js
diff --git a/tests/wpt/tests/fetch/http-cache/pragma-no-cache-with-cache-control.html b/tests/wpt/tests/fetch/http-cache/pragma-no-cache-with-cache-control.html
new file mode 100644
index 00000000000..19a80fe5edc
--- /dev/null
+++ b/tests/wpt/tests/fetch/http-cache/pragma-no-cache-with-cache-control.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTTP Cache: Cache-Control with Pragma: no-cache</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+promise_test(async t => {
+ // According to https://www.rfc-editor.org/rfc/rfc9111.html#name-pragma
+ // the pragma header is deprecated.
+ // When there's a mismatch between pragma and Cache-Control then the latter
+ // should be respected, and the resource should be cached.
+ const url = 'resources/cached_pragma_rand.py'
+
+ // First fetch to populate the cache
+ const response1 = await fetch(url, { cache: 'default' });
+ assert_true(response1.ok, 'First fetch should succeed');
+ const text1 = await response1.text();
+
+ // Second fetch should be served from cache
+ const response2 = await fetch(url, { cache: 'default' });
+ assert_true(response2.ok, 'Second fetch should succeed');
+ const text2 = await response2.text();
+
+ assert_equals(text1, text2, 'Responses should be identical, indicating caching');
+}, 'Response with Cache-Control: max-age=2592000, public and Pragma: no-cache should be cached');
+</script>
+</body>
diff --git a/tests/wpt/tests/fetch/http-cache/resources/cached_pragma_rand.py b/tests/wpt/tests/fetch/http-cache/resources/cached_pragma_rand.py
new file mode 100644
index 00000000000..18c7d25159f
--- /dev/null
+++ b/tests/wpt/tests/fetch/http-cache/resources/cached_pragma_rand.py
@@ -0,0 +1,14 @@
+def main(request, response):
+ # Disable non-standard XSS protection
+ response.headers.set(b"X-XSS-Protection", b"0")
+ response.headers.set(b"Content-Type", b"text/html")
+
+ # Set caching headers
+ # According to rfc9111 Pragma: no-cache is deprecated, so we expect
+ # Cache-Control to take precedence when there's a mismatch.
+ response.headers.set(b"Cache-Control", b"max-age=2592000, public")
+ response.headers.set(b"Pragma", b"no-cache")
+
+ # Include a timestamp to verify caching behavior
+ import time
+ response.content = f"Timestamp: {time.time()}".encode('utf-8')
diff --git a/tests/wpt/tests/fetch/local-network-access/META.yml b/tests/wpt/tests/fetch/local-network-access/META.yml
new file mode 100644
index 00000000000..4c5c6983ed0
--- /dev/null
+++ b/tests/wpt/tests/fetch/local-network-access/META.yml
@@ -0,0 +1,5 @@
+spec: https://wicg.github.io/local-network-access/
+suggested_reviewers:
+ - cthomp
+ - camillelamy
+ - hchao
diff --git a/tests/wpt/tests/fetch/local-network-access/README.md b/tests/wpt/tests/fetch/local-network-access/README.md
new file mode 100644
index 00000000000..95066cdcd0b
--- /dev/null
+++ b/tests/wpt/tests/fetch/local-network-access/README.md
@@ -0,0 +1,11 @@
+# Local Network Access tests
+
+This directory contains tests for Local Network Access' integration with
+the Fetch specification.
+
+See also:
+
+* [Explainer](https://github.com/explainers-by-googlers/local-network-access)
+
+Local Network Access replaced [Private Network
+Access](https://wicg.github.io/local-network-access/).
diff --git a/tests/wpt/tests/fetch/local-network-access/fetch.tentative.https.html b/tests/wpt/tests/fetch/local-network-access/fetch.tentative.https.html
new file mode 100644
index 00000000000..9c591f309b7
--- /dev/null
+++ b/tests/wpt/tests/fetch/local-network-access/fetch.tentative.https.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>LNA Fetch tests: HTTPS </title>
+<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/support.sub.js"></script>
+<script>
+ "use strict";
+
+ promise_test(t => {
+ const sourceUrl = resolveUrl("resources/fetch-private.html",
+ sourceResolveOptions({ server: Server.HTTPS_PUBLIC }));
+
+ function checkResult(evt) {
+ checkTestResult(evt.data, FetchTestResult.SUCCESS);
+ t.done();
+ }
+
+ const promise = new Promise((resolve) => {
+ window.addEventListener('message', resolve, {once: true});
+ }).then(checkResult);
+ const popup = window.open(sourceUrl);
+ t.add_cleanup(() => popup.close());
+
+ return promise;
+ }, 'LNA Public to private with permission');
+
+ promise_test(t => {
+ // TODO(crbug.com/406991278): consider moving permission url param into
+ // options
+ const sourceUrl = resolveUrl("resources/fetch-private.html?permission=denied",
+ sourceResolveOptions({ server: Server.HTTPS_PUBLIC }));
+
+ function checkResult(evt) {
+ checkTestResult(evt.data, FetchTestResult.FAILURE);
+ t.done();
+ }
+
+ const promise = new Promise((resolve) => {
+ window.addEventListener('message', resolve, {once: true});
+ }).then(checkResult);
+ const popup = window.open(sourceUrl);
+ t.add_cleanup(() => popup.close());
+
+ return promise;
+ }, 'LNA Public to private with permission denied');
+</script>
+</body>
diff --git a/tests/wpt/tests/fetch/local-network-access/resources/fetch-private.html b/tests/wpt/tests/fetch/local-network-access/resources/fetch-private.html
new file mode 100644
index 00000000000..b96a207ec33
--- /dev/null
+++ b/tests/wpt/tests/fetch/local-network-access/resources/fetch-private.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Fetch Private resource</title>
+
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="support.sub.js"></script>
+<script>
+"use strict";
+
+// Set the 'local-network-access' permission then attempt to fetch a resource
+// in the private address space.
+//
+// By default, 'local-network-access' permission is set to 'granted'. This can
+// be changed by passing in a different value via the 'permission' URL parameter.
+// Valid values:
+//
+// * granted
+// * denied
+// * prompt
+Promise.resolve().then(async () => {
+
+ const window_url = new URL(window.location.href);
+ let permission_value = 'granted';
+ if (window_url.searchParams.has('permission')) {
+ permission_value = window_url.searchParams.get('permission');
+ }
+
+ test_driver.set_test_context(opener);
+ await test_driver.set_permission({ name: 'local-network-access' }, permission_value);
+
+ const target = {
+ server: Server.HTTPS_PRIVATE,
+ behavior: { response: ResponseBehavior.allowCrossOrigin() },
+ };
+ const targetUrl = resolveTargetUrl(target);
+
+ fetch(targetUrl)
+ .then(async function(response) {
+ const body = await response.text();
+ const message = {
+ ok: response.ok,
+ type: response.type,
+ body: body,
+ };
+ opener.postMessage(message, "*");
+ })
+ .catch(error => {
+ opener.postMessage({ error: error.toString() }, "*");
+ });
+});
+</script>
diff --git a/tests/wpt/tests/fetch/local-network-access/resources/support.sub.js b/tests/wpt/tests/fetch/local-network-access/resources/support.sub.js
new file mode 100644
index 00000000000..774e34d0a6f
--- /dev/null
+++ b/tests/wpt/tests/fetch/local-network-access/resources/support.sub.js
@@ -0,0 +1,186 @@
+// Maps protocol (without the trailing colon) and address space to port.
+const SERVER_PORTS = {
+ "http": {
+ "local": {{ports[http][0]}},
+ "private": {{ports[http-private][0]}},
+ "public": {{ports[http-public][0]}},
+ },
+ "https": {
+ "local": {{ports[https][0]}},
+ "other-local": {{ports[https][1]}},
+ "private": {{ports[https-private][0]}},
+ "public": {{ports[https-public][0]}},
+ },
+ "ws": {
+ "local": {{ports[ws][0]}},
+ },
+ "wss": {
+ "local": {{ports[wss][0]}},
+ },
+};
+
+// A `Server` is a web server accessible by tests. It has the following shape:
+//
+// {
+// addressSpace: the IP address space of the server ("local", "private" or
+// "public"),
+// name: a human-readable name for the server,
+// port: the port on which the server listens for connections,
+// protocol: the protocol (including trailing colon) spoken by the server,
+// }
+//
+// Constants below define the available servers, which can also be accessed
+// programmatically with `get()`.
+class Server {
+ // Maps the given `protocol` (without a trailing colon) and `addressSpace` to
+ // a server. Returns null if no such server exists.
+ static get(protocol, addressSpace) {
+ const ports = SERVER_PORTS[protocol];
+ if (ports === undefined) {
+ return null;
+ }
+
+ const port = ports[addressSpace];
+ if (port === undefined) {
+ return null;
+ }
+
+ return {
+ addressSpace,
+ name: `${protocol}-${addressSpace}`,
+ port,
+ protocol: protocol + ':',
+ };
+ }
+
+ static HTTP_LOCAL = Server.get("http", "local");
+ static HTTP_PRIVATE = Server.get("http", "private");
+ static HTTP_PUBLIC = Server.get("http", "public");
+ static HTTPS_LOCAL = Server.get("https", "local");
+ static OTHER_HTTPS_LOCAL = Server.get("https", "other-local");
+ static HTTPS_PRIVATE = Server.get("https", "private");
+ static HTTPS_PUBLIC = Server.get("https", "public");
+ static WS_LOCAL = Server.get("ws", "local");
+ static WSS_LOCAL = Server.get("wss", "local");
+};
+
+// Resolves a URL relative to the current location, returning an absolute URL.
+//
+// `url` specifies the relative URL, e.g. "foo.html" or "http://foo.example".
+// `options`, if defined, should have the following shape:
+//
+// {
+// // Optional. Overrides the protocol of the returned URL.
+// protocol,
+//
+// // Optional. Overrides the port of the returned URL.
+// port,
+//
+// // Extra headers.
+// headers,
+//
+// // Extra search params.
+// searchParams,
+// }
+//
+function resolveUrl(url, options) {
+ const result = new URL(url, window.location);
+ if (options === undefined) {
+ return result;
+ }
+
+ const { port, protocol, headers, searchParams } = options;
+ if (port !== undefined) {
+ result.port = port;
+ }
+ if (protocol !== undefined) {
+ result.protocol = protocol;
+ }
+ if (headers !== undefined) {
+ const pipes = [];
+ for (key in headers) {
+ pipes.push(`header(${key},${headers[key]})`);
+ }
+ result.searchParams.append("pipe", pipes.join("|"));
+ }
+ if (searchParams !== undefined) {
+ for (key in searchParams) {
+ result.searchParams.append(key, searchParams[key]);
+ }
+ }
+
+ return result;
+}
+
+// Computes options to pass to `resolveUrl()` for a source document's URL.
+//
+// `server` identifies the server from which to load the document.
+// `treatAsPublic`, if set to true, specifies that the source document should
+// be artificially placed in the `public` address space using CSP.
+function sourceResolveOptions({ server, treatAsPublic }) {
+ const options = {...server};
+ if (treatAsPublic) {
+ options.headers = { "Content-Security-Policy": "treat-as-public-address" };
+ }
+ return options;
+}
+
+// Computes the URL of a target handler configured with the given options.
+//
+// `server` identifies the server from which to load the resource.
+// `behavior` specifies the behavior of the target server. It may contain:
+// - `response`: The result of calling one of `ResponseBehavior`'s methods.
+// - `redirect`: A URL to which the target should redirect GET requests.
+function resolveTargetUrl({ server, behavior }) {
+ if (server === undefined) {
+ throw new Error("no server specified.");
+ }
+ const options = {...server};
+ if (behavior) {
+ const { response, redirect } = behavior;
+ options.searchParams = {
+ ...response,
+ };
+ if (redirect !== undefined) {
+ options.searchParams.redirect = redirect;
+ }
+ }
+
+ return resolveUrl("target.py", options);
+}
+
+// Methods generate behavior specifications for how `resources/target.py`
+// should behave upon receiving a regular (non-preflight) request.
+const ResponseBehavior = {
+ // The response should succeed without CORS headers.
+ default: () => ({}),
+
+ // The response should succeed with CORS headers.
+ allowCrossOrigin: () => ({ "final-headers": "cors" }),
+};
+
+const FetchTestResult = {
+ SUCCESS: {
+ ok: true,
+ body: "success",
+ },
+ OPAQUE: {
+ ok: false,
+ type: "opaque",
+ body: "",
+ },
+ FAILURE: {
+ error: "TypeError: Failed to fetch",
+ },
+};
+
+// Helper function for checking results from fetch tests.
+function checkTestResult(actual, expected) {
+ assert_equals(actual.error, expected.error, "error mismatch");
+ assert_equals(actual.ok, expected.ok, "response ok mismatch");
+ assert_equals(actual.body, expected.body, "response body mismatch");
+
+ if (expected.type !== undefined) {
+ assert_equals(type, expected.type, "response type mismatch");
+ }
+}
diff --git a/tests/wpt/tests/fetch/local-network-access/resources/target.py b/tests/wpt/tests/fetch/local-network-access/resources/target.py
new file mode 100644
index 00000000000..eabcdd47517
--- /dev/null
+++ b/tests/wpt/tests/fetch/local-network-access/resources/target.py
@@ -0,0 +1,105 @@
+# This endpoint responds to requests for a target of a (possible) LNA request.
+#
+# Its behavior can be configured with various search/GET parameters, all of
+# which are optional:
+#
+# - final-headers: Valid values are:
+# - cors: this endpoint responds with valid CORS headers to CORS-enabled
+# non-preflight requests. These should be sufficient for non-preflighted
+# CORS-enabled requests to succeed.
+# - sw: this endpoint responds with a valid Service-Worker header to allow
+# for the request to serve as a Service worker script resource. This is
+# only valid in conjunction with the cors value above.
+# - unspecified: this endpoint responds with no CORS headers to non-preflight
+# requests. This should fail CORS-enabled requests, but be sufficient for
+# no-CORS requests.
+#
+# The following parameters only affect non-preflight responses:
+#
+# - redirect: If set, the response code is set to 301 and the `Location`
+# response header is set to this value.
+# - mime-type: If set, the `Content-Type` response header is set to this value.
+# - file: Specifies a path (relative to this file's directory) to a file. If
+# set, the response body is copied from this file.
+# - random-js-prefix: If set to any value, the response body is prefixed with
+# a Javascript comment line containing a random value. This is useful in
+# service worker tests, since service workers are only updated if the new
+# script is not byte-for-byte identical with the old script.
+# - body: If set and `file` is not, the response body is set to this value.
+#
+
+import os
+import random
+
+from wptserve.utils import isomorphic_encode
+
+_ACAO = ("Access-Control-Allow-Origin", "*")
+_ACAH = ("Access-Control-Allow-Headers", "Service-Worker")
+
+def _get_response_headers(method, mode, origin):
+ acam = ("Access-Control-Allow-Methods", method)
+
+ if mode == b"cors":
+ return [acam, _ACAO]
+
+ if mode == b"cors+sw":
+ return [acam, _ACAO, _ACAH]
+
+ if mode == b"navigation":
+ return [
+ acam,
+ ("Access-Control-Allow-Origin", origin),
+ ("Access-Control-Allow-Credentials", "true"),
+ ]
+
+ return []
+
+
+def _is_loaded_in_fenced_frame(request):
+ return request.GET.get(b"is-loaded-in-fenced-frame")
+
+def _final_response_body(request):
+ file_name = None
+ if file_name is None:
+ file_name = request.GET.get(b"file")
+ if file_name is None:
+ return request.GET.get(b"body") or "success"
+
+ prefix = b""
+ if request.GET.get(b"random-js-prefix"):
+ value = random.randint(0, 1000000000)
+ prefix = isomorphic_encode("// Random value: {}\n\n".format(value))
+
+ path = os.path.join(os.path.dirname(isomorphic_encode(__file__)), file_name)
+ with open(path, 'rb') as f:
+ contents = f.read()
+
+ return prefix + contents
+
+def _handle_final_request(request, response):
+ mode = request.GET.get(b"final-headers")
+ origin = request.headers.get("Origin")
+ headers = _get_response_headers(request.method, mode, origin)
+
+ redirect = request.GET.get(b"redirect")
+ if redirect is not None:
+ headers.append(("Location", redirect))
+ return (301, headers, b"")
+
+ mime_type = request.GET.get(b"mime-type")
+ if mime_type is not None:
+ headers.append(("Content-Type", mime_type),)
+
+ if _is_loaded_in_fenced_frame(request):
+ headers.append(("Supports-Loading-Mode", "fenced-frame"))
+
+ body = _final_response_body(request)
+ return (headers, body)
+
+
+def main(request, response):
+ try:
+ return _handle_final_request(request, response)
+ except BaseException as e:
+ # Surface exceptions to the client, where they show up as assertion errors.
+ return (500, [("X-exception", str(e))], "exception: {}".format(e))
diff --git a/tests/wpt/tests/file-system-access/WEB_FEATURES.yml b/tests/wpt/tests/file-system-access/WEB_FEATURES.yml
index 45e40acba1d..7faf67952b5 100644
--- a/tests/wpt/tests/file-system-access/WEB_FEATURES.yml
+++ b/tests/wpt/tests/file-system-access/WEB_FEATURES.yml
@@ -1,3 +1,7 @@
features:
- name: file-system-access
files: "**"
+- name: origin-private-file-system
+ files:
+ - getDirectory.https.any.js
+ - opaque-origin.https.window.js
diff --git a/tests/wpt/tests/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html b/tests/wpt/tests/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html
new file mode 100644
index 00000000000..91cf6ae6ee2
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>Named lookup does not work with noopener</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script>
+<link rel="help" href="https://github.com/whatwg/html/issues/11291">
+
+<body>
+<script>
+
+promise_test(async t => {
+ const windowName = 'named-window';
+
+ const rcHelper = new RemoteContextHelper();
+ const rcPopup1 = await rcHelper.addWindow(undefined, { target: windowName, features: 'noopener' });
+ const rcPopup2 = await rcHelper.addWindow(undefined, { target: windowName, features: 'noopener' });
+
+ // If both scripts execute, then the windows are separate, and the test passes.
+ // If the window is reused, then rcPopup1 will not be able to execute script, and so the test will timeout.
+
+ assert_equals(await rcPopup1.executeScript(() => window.name), windowName);
+ assert_equals(await rcPopup2.executeScript(() => window.name), windowName);
+}, 'Two noopener window.open() calls create separate windows');
+
+promise_test(async t => {
+ const windowName = 'named-window-2';
+
+ function executorCreator(url) {
+ const a = document.createElement("a");
+ a.href = url;
+ a.rel = 'noopener';
+ a.target = windowName;
+ document.body.append(a);
+ a.click();
+ }
+
+ const rcHelper = new RemoteContextHelper();
+ const rcPopup1 = await rcHelper.createContext({ executorCreator });
+ const rcPopup2 = await rcHelper.createContext({ executorCreator });
+
+ // If both scripts execute, then the windows are separate, and the test passes.
+ // If the window is reused, then rcPopup1 will not be able to execute script, and so the test will timeout.
+
+ assert_equals(await rcPopup1.executeScript(() => window.name), windowName);
+ assert_equals(await rcPopup2.executeScript(() => window.name), windowName);
+}, 'Two rel=noopener <a href> clicks create separate windows');
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml
new file mode 100644
index 00000000000..b4d11212a6c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: canvas-2d-color-management
+ files: "**"
diff --git a/tests/wpt/tests/html/canvas/element/path-objects/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/path-objects/WEB_FEATURES.yml
new file mode 100644
index 00000000000..1bbef5e88d6
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/path-objects/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: canvas-roundrect
+ files:
+ - 2d.path.roundrect.*
diff --git a/tests/wpt/tests/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml
new file mode 100644
index 00000000000..b4d11212a6c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: canvas-2d-color-management
+ files: "**"
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml
new file mode 100644
index 00000000000..b4d11212a6c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: canvas-2d-color-management
+ files: "**"
diff --git a/tests/wpt/tests/html/canvas/offscreen/path-objects/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/path-objects/WEB_FEATURES.yml
new file mode 100644
index 00000000000..1bbef5e88d6
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/path-objects/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: canvas-roundrect
+ files:
+ - 2d.path.roundrect.*
diff --git a/tests/wpt/tests/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml
new file mode 100644
index 00000000000..b4d11212a6c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: canvas-2d-color-management
+ files: "**"
diff --git a/tests/wpt/tests/html/editing/dnd/platform/pointerdown-add-display-none.html b/tests/wpt/tests/html/editing/dnd/platform/pointerdown-add-display-none.html
new file mode 100644
index 00000000000..653944e155b
--- /dev/null
+++ b/tests/wpt/tests/html/editing/dnd/platform/pointerdown-add-display-none.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<head>
+<title>Test dragging still occurs when pointerdown adds display:none to the dragged element</title>
+<style>
+.dragging {
+ display: none;
+}
+
+#dragBox {
+ width: 200px;
+ height: 200px;
+ background-color: #4CAF50;
+ color: white;
+ border-radius: 8px;
+ cursor: grab;
+ user-select: none;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.inner {
+ background: rgba(255, 255, 255, 0.2);
+ padding: 10px;
+ margin-top: 10px;
+ border-radius: 4px;
+}
+</style>
+</head>
+<body>
+<div id="dragBox" draggable="true">
+ Drag me
+ <div class="inner" id="innerButton">Click or press here</div>
+</div>
+<script>
+
+promise_test(function() {
+ return new Promise(r => {
+ innerButton.addEventListener("pointerdown", function() {
+ innerButton.classList.add("dragging");
+ });
+
+ dragBox.addEventListener("dragstart", function(e) {
+ assert_equals(e.target, dragBox);
+ r();
+ });
+
+ const buttonRect = innerButton.getBoundingClientRect();
+ new test_driver.Actions()
+ .pointerMove(0, 0, {origin: innerButton})
+ .pointerDown()
+ .pointerMove(buttonRect.left + 10, buttonRect.top + 10)
+ .pointerUp()
+ .send();
+ });
+}, "dragstart should still fire when the dragged element gets display:none in its pointerdown");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/html/embedded-content/the-img-element/WEB_FEATURES.yml b/tests/wpt/tests/html/embedded-content/the-img-element/WEB_FEATURES.yml
new file mode 100644
index 00000000000..5716baa5def
--- /dev/null
+++ b/tests/wpt/tests/html/embedded-content/the-img-element/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: fetch-priority
+ files:
+ - attr-img-fetchpriority.html
diff --git a/tests/wpt/tests/html/scripting/the-script-element/WEB_FEATURES.yml b/tests/wpt/tests/html/scripting/the-script-element/WEB_FEATURES.yml
new file mode 100644
index 00000000000..864bd3398ee
--- /dev/null
+++ b/tests/wpt/tests/html/scripting/the-script-element/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: fetch-priority
+ files:
+ - attr-script-fetchpriority.html
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-input-keyboard-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-input-keyboard-behavior.tentative.html
new file mode 100644
index 00000000000..bf3fbab9d18
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-input-keyboard-behavior.tentative.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/402429384">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+
+<style>
+select, ::picker(select) {
+ appearance: base-select;
+}
+</style>
+
+<select>
+ <div id=inputwrapper></div>
+ <option class=one>one</option>
+ <option class=two>two</option>
+</select>
+
+<script>
+const select = document.querySelector('select');
+const optionOne = select.querySelector('option.one');
+const optionTwo = select.querySelector('option.two');
+const input = document.createElement('input');
+document.getElementById('inputwrapper').appendChild(input);
+
+function pressKey(key) {
+ return (new test_driver.Actions()
+ .keyDown(key)
+ .keyUp(key))
+ .send();
+}
+const spaceKey = '\uE00D';
+const arrowDown = '\uE015';
+const arrowUp = '\uE013';
+
+promise_test(async () => {
+ assert_equals(getComputedStyle(select).appearance, 'base-select',
+ 'appearance: base-select must be supported for this test to run.');
+
+ select.focus();
+ await pressKey(spaceKey);
+ assert_true(select.matches(':open'),
+ 'select should be open after pressing space.');
+ assert_equals(document.activeElement, input,
+ 'input should be focused after opening select.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionOne,
+ 'first option should be focused after arrow down from input.');
+
+ await pressKey(arrowUp);
+ assert_equals(document.activeElement, input,
+ 'input should be focused after arrow up from first option.');
+}, 'Keyboard behavior of <input> in <select>.');
+</script>
diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html
index 0ba07b16f49..9d520943d5f 100644
--- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html
+++ b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation-ref.html
@@ -7,21 +7,24 @@
<button id=hasinterest>Button</button>
<button class=otherselector>Button</button>
<button class=otherselector>Button</button>
-<div id=target>Target</div>
+<div popover id=target>Target</div>
<style>
#hasinterest {
- background-color: red;
- outline: solid 3px -webkit-focus-ring-color;
+ background-color: purple;
}
.otherselector {
background-color: green;
}
#target {
background-color: yellow;
+ inset:auto;
+ top:50px;
+ left:0;
}
</style>
<script>
+ target.showPopover();
hasinterest.focus();
</script>
diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html
index 8c0ebd7a2cd..b6d0ff10932 100644
--- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html
+++ b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html
@@ -13,7 +13,7 @@
<button id=b3 interesttarget=target>Button</button>
<button id=b4>Button</button>
<button id=b5>Button</button>
-<div id=target>Target</div>
+<div popover id=target>Target</div>
<style>
:has-interest {
@@ -22,18 +22,24 @@
:has-interest:has-partial-interest {
background-color: red;
}
- :has-partial-interest + button {
+ /* Test complicated combinators: */
+ :has-interest + button {
background-color: green;
}
:root:has(:has-interest) #b5 {
background-color: green;
}
- :target-of-interest:target-of-partial-interest {
+ :target-of-interest {
background-color: yellow;
}
[interesttarget] {
interest-target-delay: 0s;
}
+ #target {
+ inset:auto;
+ top:50px;
+ left:0;
+ }
</style>
<script>
diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html
deleted file mode 100644
index 33b0cf66858..00000000000
--- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8" />
-<link rel="author" href="mailto:masonf@chromium.org">
-
-<button id=non_interesttarget_button>Interesttarget Button</button>
-
-<script>
- document.querySelector('#non_interesttarget_button').focus();
-</script>
diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html
deleted file mode 100644
index 28cb2052a8d..00000000000
--- a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance.tentative.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8" />
-<link rel="author" href="mailto:masonf@chromium.org">
-<link rel="help" href="https://open-ui.org/components/interest-invokers.explainer/" />
-<link rel="mismatch" href="interesttarget-outline-appearance-ref.html">
-
-<button interesttarget=target>Interesttarget Button</button>
-
-<style>
- /* Outline style should apply even when the element doesn't have interest. */
- :has-interest { background-color: red; }
-</style>
-
-<script>
- document.querySelector('[interesttarget]').focus();
-</script>
diff --git a/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html
new file mode 100644
index 00000000000..bc7184d42d2
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel="help" href="https://open-ui.org/components/interest-invokers.explainer/" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/invoker-utils.js"></script>
+
+<button id=invoker interesttarget=target>Button</button>
+<div id=target popover>Popover with <button id=contained>button</button></div>
+
+<style>
+ [interesttarget] {
+ interest-target-delay: 0s;
+ }
+</style>
+
+<script>
+ let expectInterest;
+ let expectPartial;
+ let eventCount = 0;
+ function checkInterest(e) {
+ const notStr = expectInterest ? "" : "not ";
+ const event = e instanceof Event ? `${e.type} event` : e;
+ assert_equals(invoker.matches(':has-interest'),expectInterest,`target should ${notStr}gain interest (${event})`);
+ assert_equals(invoker.matches(':has-partial-interest'),expectInterest&&expectPartial,`Interest should ${expectPartial ? "" : "not "}be partial (${event})`);
+ assert_equals(target.matches(':popover-open'),expectInterest,`popover should ${notStr}be open (${event})`);
+ ++eventCount;
+ }
+
+ promise_test(async function (t) {
+ invoker.addEventListener('focus',checkInterest);
+ target.addEventListener('interest',(e) => {
+ checkInterest(e);
+ expectInterest = true;
+ expectPartial = true;
+ });
+
+ expectInterest = false;
+ expectPartial = false;
+ await focusOn(invoker);
+ assert_equals(eventCount,2,'focus and interest should both have fired');
+ assert_true(expectInterest,'the interest event should set this');
+ checkInterest('before hot key');
+ await sendShowInterestHotkey();
+ expectPartial = false;
+ checkInterest('after hot key');
+ },'Partial interest timing should not be observable');
+</script>
diff --git a/tests/wpt/tests/html/semantics/the-link-element/WEB_FEATURES.yml b/tests/wpt/tests/html/semantics/the-link-element/WEB_FEATURES.yml
new file mode 100644
index 00000000000..6a444ee171a
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/the-link-element/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: fetch-priority
+ files:
+ - attr-link-fetchpriority.html
diff --git a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html
index 5cbcf546423..e339f39dcd8 100644
--- a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html
+++ b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html
@@ -13,10 +13,6 @@
descriptor: {name: "geolocation"},
state: "granted",
});
-
- // Ensure any previously set geolocation emulations are cleared.
- await test_driver.bidi.emulation.set_geolocation_override(
- {coordinates: null});
});
/** Get the current geolocation or error */
@@ -24,13 +20,13 @@
return new Promise(
resolve => window.navigator.geolocation.getCurrentPosition(
position => resolve(position.coords.toJSON()),
- error => resolve({code: error.code, message: error.message}),
+ error => resolve({code: error.code}),
// Fail fast if geolocation is not available.
{timeout: 500}
))
}
- /** Asserts that relevant coordinate properties match */
+ /** Asserts that coordinate or error matches the expected value */
function assert_coordinates_match(actual, expected) {
for (const key in expected) {
assert_equals(actual[key], expected[key],
@@ -49,6 +45,11 @@
};
promise_test(async (t) => {
+ t.add_cleanup(async () => {
+ await test_driver.bidi.emulation.set_geolocation_override(
+ {coordinates: null});
+ });
+
// Get the initial geolocation (might be error).
const initial_coords = await get_current_geolocation();
@@ -66,6 +67,28 @@
await test_driver.bidi.emulation.set_geolocation_override(
{coordinates: null});
// Assert coordinates are set to the original value.
- assert_coordinates_match(await get_current_geolocation(), initial_coords);
+ assert_coordinates_match(await get_current_geolocation(),
+ initial_coords);
}, "emulate geolocation and clear override");
+
+ promise_test(async (t) => {
+ // Emulate position unavailable.
+ await test_driver.bidi.emulation.set_geolocation_override({
+ error: {type: 'positionUnavailable'},
+ });
+
+ // Get the geolocation after setting the override.
+ const error = await get_current_geolocation();
+
+ assert_equals(error.code, 2,
+ `Geolocation should be unavailable with code POSITION_UNAVAILABLE = 2`);
+ }, "emulate geolocation position unavailable");
+
+ promise_test(async (t) => {
+ assert_throws_js(Error,
+ () => test_driver.bidi.emulation.set_geolocation_override({
+ error: {type: 'positionUnavailable'},
+ coordinates: SOME_COORDINATES
+ }), "Setting both `coordinates` and `error` should fail");
+ }, "cannot set `coordinates` and `error` simultaneously");
</script>
diff --git a/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html b/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html
index fb3655398db..9e5d9b9ef99 100644
--- a/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html
+++ b/tests/wpt/tests/input-events/input-events-spin-button-click-on-number-input-delete-document.html
@@ -21,7 +21,7 @@
promise_test(async function () {
await loadIframe(
- "<input type='number' style='width: 100px; height: 20px'>"
+ "<input type='number' style='width: 100px; height: 20px' value='5'>"
);
const inputElement = frame.contentDocument.querySelector("input");
@@ -38,12 +38,14 @@
events.push("change");
});
+ assert_equals(inputElement.value, "5", "Original value should be 5");
+
// Roughly get the offset to the spin up arrow button's center point within
// the iframe's viewport. Note that this is fragile and might need specific
// coordinates for each browser and maybe platform.
const rect = inputElement.getBoundingClientRect();
- const x = rect.x + rect.width - 10;
- const y = rect.y + Math.round(rect.height / 4);
+ const x = Math.round(rect.x + rect.width - 5);
+ const y = Math.round(rect.y + (3 * rect.height) / 4);
const actions = new test_driver.Actions()
.setContext(frame.contentWindow)
@@ -52,6 +54,7 @@
.pointerUp();
await actions.send();
+ assert_equals(inputElement.value, "6", "Value should increase after clicking the up arrow");
assert_array_equals(events, ['beforeinput']);
assert_false(document.body.contains(frame));
}, "Number input should not crash and not fire subsequent events when event handler removes document");
diff --git a/tests/wpt/tests/interfaces/largest-contentful-paint.idl b/tests/wpt/tests/interfaces/largest-contentful-paint.idl
index 872ba552b0d..d1630cc7daa 100644
--- a/tests/wpt/tests/interfaces/largest-contentful-paint.idl
+++ b/tests/wpt/tests/interfaces/largest-contentful-paint.idl
@@ -5,7 +5,6 @@
[Exposed=Window]
interface LargestContentfulPaint : PerformanceEntry {
- readonly attribute DOMHighResTimeStamp renderTime;
readonly attribute DOMHighResTimeStamp loadTime;
readonly attribute unsigned long size;
readonly attribute DOMString id;
@@ -13,3 +12,5 @@ interface LargestContentfulPaint : PerformanceEntry {
readonly attribute Element? element;
[Default] object toJSON();
};
+
+LargestContentfulPaint includes PaintTimingMixin;
diff --git a/tests/wpt/tests/interfaces/service-workers.idl b/tests/wpt/tests/interfaces/service-workers.idl
index d9ff2f651f8..34af3372401 100644
--- a/tests/wpt/tests/interfaces/service-workers.idl
+++ b/tests/wpt/tests/interfaces/service-workers.idl
@@ -34,7 +34,7 @@ interface ServiceWorkerRegistration : EventTarget {
readonly attribute USVString scope;
readonly attribute ServiceWorkerUpdateViaCache updateViaCache;
- [NewObject] Promise<undefined> update();
+ [NewObject] Promise<ServiceWorkerRegistration> update();
[NewObject] Promise<boolean> unregister();
// event
diff --git a/tests/wpt/tests/interfaces/webauthn.idl b/tests/wpt/tests/interfaces/webauthn.idl
index a33c85e7bad..7fbe55e6765 100644
--- a/tests/wpt/tests/interfaces/webauthn.idl
+++ b/tests/wpt/tests/interfaces/webauthn.idl
@@ -311,22 +311,37 @@ enum PublicKeyCredentialHint {
partial dictionary AuthenticationExtensionsClientInputs {
DOMString appid;
};
+partial dictionary AuthenticationExtensionsClientInputsJSON {
+ DOMString appid;
+};
partial dictionary AuthenticationExtensionsClientOutputs {
boolean appid;
};
+partial dictionary AuthenticationExtensionsClientOutputsJSON {
+ boolean appid;
+};
partial dictionary AuthenticationExtensionsClientInputs {
DOMString appidExclude;
};
+partial dictionary AuthenticationExtensionsClientInputsJSON {
+ DOMString appidExclude;
+};
partial dictionary AuthenticationExtensionsClientOutputs {
boolean appidExclude;
};
+partial dictionary AuthenticationExtensionsClientOutputsJSON {
+ boolean appidExclude;
+};
partial dictionary AuthenticationExtensionsClientInputs {
boolean credProps;
};
+partial dictionary AuthenticationExtensionsClientInputsJSON {
+ boolean credProps;
+};
dictionary CredentialPropertiesOutput {
boolean rk;
@@ -335,33 +350,57 @@ dictionary CredentialPropertiesOutput {
partial dictionary AuthenticationExtensionsClientOutputs {
CredentialPropertiesOutput credProps;
};
+partial dictionary AuthenticationExtensionsClientOutputsJSON {
+ CredentialPropertiesOutput credProps;
+};
dictionary AuthenticationExtensionsPRFValues {
required BufferSource first;
BufferSource second;
};
+dictionary AuthenticationExtensionsPRFValuesJSON {
+ required Base64URLString first;
+ Base64URLString second;
+};
dictionary AuthenticationExtensionsPRFInputs {
AuthenticationExtensionsPRFValues eval;
record<DOMString, AuthenticationExtensionsPRFValues> evalByCredential;
};
+dictionary AuthenticationExtensionsPRFInputsJSON {
+ AuthenticationExtensionsPRFValuesJSON eval;
+ record<DOMString, AuthenticationExtensionsPRFValuesJSON> evalByCredential;
+};
partial dictionary AuthenticationExtensionsClientInputs {
AuthenticationExtensionsPRFInputs prf;
};
+partial dictionary AuthenticationExtensionsClientInputsJSON {
+ AuthenticationExtensionsPRFInputsJSON prf;
+};
dictionary AuthenticationExtensionsPRFOutputs {
boolean enabled;
AuthenticationExtensionsPRFValues results;
};
+dictionary AuthenticationExtensionsPRFOutputsJSON {
+ boolean enabled;
+ AuthenticationExtensionsPRFValuesJSON results;
+};
partial dictionary AuthenticationExtensionsClientOutputs {
AuthenticationExtensionsPRFOutputs prf;
};
+partial dictionary AuthenticationExtensionsClientOutputsJSON {
+ AuthenticationExtensionsPRFOutputsJSON prf;
+};
partial dictionary AuthenticationExtensionsClientInputs {
AuthenticationExtensionsLargeBlobInputs largeBlob;
};
+partial dictionary AuthenticationExtensionsClientInputsJSON {
+ AuthenticationExtensionsLargeBlobInputsJSON largeBlob;
+};
enum LargeBlobSupport {
"required",
@@ -373,13 +412,26 @@ dictionary AuthenticationExtensionsLargeBlobInputs {
boolean read;
BufferSource write;
};
+dictionary AuthenticationExtensionsLargeBlobInputsJSON {
+ DOMString support;
+ boolean read;
+ Base64URLString write;
+};
partial dictionary AuthenticationExtensionsClientOutputs {
AuthenticationExtensionsLargeBlobOutputs largeBlob;
};
+partial dictionary AuthenticationExtensionsClientOutputsJSON {
+ AuthenticationExtensionsLargeBlobOutputsJSON largeBlob;
+};
dictionary AuthenticationExtensionsLargeBlobOutputs {
boolean supported;
ArrayBuffer blob;
boolean written;
};
+dictionary AuthenticationExtensionsLargeBlobOutputsJSON {
+ boolean supported;
+ Base64URLString blob;
+ boolean written;
+};
diff --git a/tests/wpt/tests/largest-contentful-paint/idlharness.html b/tests/wpt/tests/largest-contentful-paint/idlharness.html
index 5f5d286b356..0dd006e711c 100644
--- a/tests/wpt/tests/largest-contentful-paint/idlharness.html
+++ b/tests/wpt/tests/largest-contentful-paint/idlharness.html
@@ -10,7 +10,7 @@
idl_test(
['largest-contentful-paint'],
- ['performance-timeline', 'dom', 'hr-time'],
+ ['performance-timeline', 'dom', 'hr-time', 'paint-timing'],
async (idl_array, t) => {
idl_array.add_objects({
LargestContentfulPaint: ['lcp']
diff --git a/tests/wpt/tests/largest-contentful-paint/observe-text.html b/tests/wpt/tests/largest-contentful-paint/observe-text.html
index 0724a0bb92b..d029d500aa1 100644
--- a/tests/wpt/tests/largest-contentful-paint/observe-text.html
+++ b/tests/wpt/tests/largest-contentful-paint/observe-text.html
@@ -26,7 +26,7 @@ p {
// PaintTimingMixin
assert_greater_than_equal(entry.paintTime, beforeRender, 'paintTime should represent the time when the UA started painting');
- if ("presentationTime" in entry) {
+ if ("presentationTime" in entry && entry.presentationTime !== null) {
assert_greater_than(entry.presentationTime, entry.paintTime);
assert_equals(entry.presentationTime, entry.renderTime);
} else {
diff --git a/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js b/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js
index a01080c0088..99916f5c5d3 100644
--- a/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js
+++ b/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js
@@ -55,7 +55,7 @@ function checkImage(entry, expectedUrl, expectedID, expectedSize, timeLowerBound
assert_greater_than_equal(entry.paintTime, timeLowerBound, 'paintTime should represent the time when the UA started painting');
// PaintTimingMixin
- if ("presentationTime" in entry) {
+ if ("presentationTime" in entry && entry.presentationTime !== null) {
assert_greater_than(entry.presentationTime, entry.paintTime);
assert_equals(entry.presentationTime, entry.renderTime);
} else {
diff --git a/tests/wpt/tests/paint-timing/paint-timing-mixin.html b/tests/wpt/tests/paint-timing/paint-timing-mixin.html
index c43b7668b5c..048c985c7c7 100644
--- a/tests/wpt/tests/paint-timing/paint-timing-mixin.html
+++ b/tests/wpt/tests/paint-timing/paint-timing-mixin.html
@@ -26,7 +26,7 @@
});
const entry = await performance_entry_promise;
assert_greater_than(entry.paintTime, reference_time);
- if ("presentationTime" in entry) {
+ if ("presentationTime" in entry && entry.presentationTime !== null) {
assert_greater_than(entry.presentationTime, entry.paintTime);
assert_equals(entry.presentationTime, entry.startTime);
} else {
diff --git a/tests/wpt/tests/paint-timing/resources/utils.js b/tests/wpt/tests/paint-timing/resources/utils.js
index ed58c957c97..41c76d68266 100644
--- a/tests/wpt/tests/paint-timing/resources/utils.js
+++ b/tests/wpt/tests/paint-timing/resources/utils.js
@@ -51,7 +51,7 @@ async function test_fcp(label, before_assert_fcp_func) {
main.className = 'contentful';
const entry = await assertFirstContentfulPaint(t);
if ("paintTime" in entry) {
- if ("presentationTime" in entry) {
+ if ("presentationTime" in entry && entry.presentationTime !== null) {
assert_greater_than(entry.presentationTime, entry.paintTime);
assert_equals(entry.startTime, entry.presentationTime);
} else {
diff --git a/tests/wpt/tests/remote-playback/WEB_FEATURES.yml b/tests/wpt/tests/remote-playback/WEB_FEATURES.yml
new file mode 100644
index 00000000000..f59321971a7
--- /dev/null
+++ b/tests/wpt/tests/remote-playback/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: remote-playback
+ files: "**"
diff --git a/tests/wpt/tests/reporting/resources/report-helper.js b/tests/wpt/tests/reporting/resources/report-helper.js
index 5b5438903de..216da22eae8 100644
--- a/tests/wpt/tests/reporting/resources/report-helper.js
+++ b/tests/wpt/tests/reporting/resources/report-helper.js
@@ -40,7 +40,9 @@ function checkReportExists(reports, type, url) {
function getReport(reports, type, document_url, subresource_url) {
for (const report of reports) {
if (report.type !== type) continue;
- if (report.body.documentURL === document_url && report.body.subresourceURL == subresource_url) return report;
+ if (report.body.documentURL === document_url
+ && (report.body.subresourceURL == subresource_url
+ || report.body.blockedURL == subresource_url)) return report;
}
return null;
}
diff --git a/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html b/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html
index 9de875b0f12..6ec396c221b 100644
--- a/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html
+++ b/tests/wpt/tests/resources/test/tests/functional/api-tests-1.html
@@ -132,7 +132,13 @@
{
assert_less_than(10, 11, "10 is less than 11")
}
- test(basicAssertApproxEquals, "basic assert_less_than test");
+ test(basicAssertLessThan, "basic assert_less_than test");
+
+ function bigintAssertLessThan()
+ {
+ assert_less_than(10n, 11n, "10n is less than 11n")
+ }
+ test(bigintAssertLessThan, "bigint assert_less_than test");
function basicAssertGreaterThan()
{
@@ -140,12 +146,24 @@
}
test(basicAssertGreaterThan, "assert_greater_than expected to fail");
+ function bigintAssertGreaterThan()
+ {
+ assert_greater_than(10n, 11n, "10n is not greater than 11n");
+ }
+ test(bigintAssertGreaterThan, "bigint assert_greater_than expected to fail");
+
function basicAssertGreaterThanEqual()
{
assert_greater_than_equal(10, 10, "10 is greater than or equal to 10")
}
test(basicAssertGreaterThanEqual, "basic assert_greater_than_equal test");
+ function bigintAssertGreaterThanEqual()
+ {
+ assert_greater_than_equal(10n, 10n, "10n is greater than or equal to 10n")
+ }
+ test(bigintAssertGreaterThanEqual, "bigint assert_greater_than_equal test");
+
function basicAssertLessThanEqual()
{
assert_greater_than_equal('10', 10, "'10' is not a number")
@@ -464,6 +482,12 @@
},
{
"status_string": "FAIL",
+ "name": "bigint assert_greater_than expected to fail",
+ "message": "assert_greater_than: 10n is not greater than 11n expected a number greater than 11n but got 10n",
+ "properties": {}
+ },
+ {
+ "status_string": "FAIL",
"name": "assert_less_than_equal expected to fail",
"message": "assert_greater_than_equal: '10' is not a number expected a number but got a \"string\"",
"properties": {}
@@ -518,12 +542,24 @@
},
{
"status_string": "PASS",
+ "name": "bigint assert_greater_than_equal test",
+ "message": null,
+ "properties": {}
+ },
+ {
+ "status_string": "PASS",
"name": "basic assert_less_than test",
"message": null,
"properties": {}
},
{
"status_string": "PASS",
+ "name": "bigint assert_less_than test",
+ "message": null,
+ "properties": {}
+ },
+ {
+ "status_string": "PASS",
"name": "body element fires the onload event set from the attribute",
"message": null,
"properties": {}
@@ -745,13 +781,22 @@
"status": 0
},
{
- "assert_name": "assert_approx_equals",
+ "assert_name": "assert_less_than",
"test": "basic assert_less_than test",
"args": [
"10",
"11",
- "1",
- "\"10 is approximately (+/- 1) 11\""
+ "\"10 is less than 11\""
+ ],
+ "status": 0
+ },
+ {
+ "assert_name": "assert_less_than",
+ "test": "bigint assert_less_than test",
+ "args": [
+ "10n",
+ "11n",
+ "\"10n is less than 11n\""
],
"status": 0
},
@@ -766,6 +811,16 @@
"status": 1
},
{
+ "assert_name": "assert_greater_than",
+ "test": "bigint assert_greater_than expected to fail",
+ "args": [
+ "10n",
+ "11n",
+ "\"10n is not greater than 11n\""
+ ],
+ "status": 1
+ },
+ {
"assert_name": "assert_greater_than_equal",
"test": "basic assert_greater_than_equal test",
"args": [
@@ -777,6 +832,16 @@
},
{
"assert_name": "assert_greater_than_equal",
+ "test": "bigint assert_greater_than_equal test",
+ "args": [
+ "10n",
+ "10n",
+ "\"10n is greater than or equal to 10n\""
+ ],
+ "status": 0
+ },
+ {
+ "assert_name": "assert_greater_than_equal",
"test": "assert_less_than_equal expected to fail",
"args": [
"\"10\"",
diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js
index 6e8410b7ea4..992b9e3ab2c 100644
--- a/tests/wpt/tests/resources/testdriver.js
+++ b/tests/wpt/tests/resources/testdriver.js
@@ -280,8 +280,14 @@
* @param {object} params - Parameters for the command.
* @param {null|object} params.coordinates - The optional
* geolocation coordinates to set. Matches the
- * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#type-emulation-GeolocationCoordinates>`_
- * value. If null or omitted, the emulation will be removed.
+ * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#commands-emulationsetgeolocationoverride>`_
+ * value. If null or omitted and the `params.error` is set, the
+ * emulation will be removed. Mutually exclusive with
+ * `params.error`.
+ * @param {object} params.error - The optional
+ * geolocation error to emulate. Matches the
+ * `emulation.GeolocationPositionError <https://w3c.github.io/webdriver-bidi/#commands-emulationsetgeolocationoverride>`_
+ * value. Mutually exclusive with `params.coordinates`.
* @param {null|Array.<(Context)>} [params.contexts] The
* optional contexts parameter specifies which browsing contexts
* to set the geolocation override on. It should be either an
diff --git a/tests/wpt/tests/resources/testharness.js b/tests/wpt/tests/resources/testharness.js
index d1d9d61eab8..6ccede34483 100644
--- a/tests/wpt/tests/resources/testharness.js
+++ b/tests/wpt/tests/resources/testharness.js
@@ -1400,6 +1400,8 @@
return "-0";
}
return String(val);
+ case "bigint":
+ return String(val) + 'n';
case "object":
if (val === null) {
return "null";
@@ -1771,20 +1773,25 @@
/**
* Assert that ``actual`` is a number less than ``expected``.
*
- * @param {number} actual - Test value.
- * @param {number} expected - Number that ``actual`` must be less than.
+ * @param {number|bigint} actual - Test value.
+ * @param {number|bigint} expected - Value that ``actual`` must be less than.
* @param {string} [description] - Description of the condition being tested.
*/
function assert_less_than(actual, expected, description)
{
/*
- * Test if a primitive number is less than another
+ * Test if a primitive number (or bigint) is less than another
*/
- assert(typeof actual === "number",
+ assert(typeof actual === "number" || typeof actual === "bigint",
"assert_less_than", description,
"expected a number but got a ${type_actual}",
{type_actual:typeof actual});
+ assert(typeof actual === typeof expected,
+ "assert_less_than", description,
+ "expected a ${type_expected} but got a ${type_actual}",
+ {type_expected:typeof expected, type_actual:typeof actual});
+
assert(actual < expected,
"assert_less_than", description,
"expected a number less than ${expected} but got ${actual}",
@@ -1795,20 +1802,25 @@
/**
* Assert that ``actual`` is a number greater than ``expected``.
*
- * @param {number} actual - Test value.
- * @param {number} expected - Number that ``actual`` must be greater than.
+ * @param {number|bigint} actual - Test value.
+ * @param {number|bigint} expected - Value that ``actual`` must be greater than.
* @param {string} [description] - Description of the condition being tested.
*/
function assert_greater_than(actual, expected, description)
{
/*
- * Test if a primitive number is greater than another
+ * Test if a primitive number (or bigint) is greater than another
*/
- assert(typeof actual === "number",
+ assert(typeof actual === "number" || typeof actual === "bigint",
"assert_greater_than", description,
"expected a number but got a ${type_actual}",
{type_actual:typeof actual});
+ assert(typeof actual === typeof expected,
+ "assert_greater_than", description,
+ "expected a ${type_expected} but got a ${type_actual}",
+ {type_expected:typeof expected, type_actual:typeof actual});
+
assert(actual > expected,
"assert_greater_than", description,
"expected a number greater than ${expected} but got ${actual}",
@@ -1820,21 +1832,31 @@
* Assert that ``actual`` is a number greater than ``lower`` and less
* than ``upper`` but not equal to either.
*
- * @param {number} actual - Test value.
- * @param {number} lower - Number that ``actual`` must be greater than.
- * @param {number} upper - Number that ``actual`` must be less than.
+ * @param {number|bigint} actual - Test value.
+ * @param {number|bigint} lower - Value that ``actual`` must be greater than.
+ * @param {number|bigint} upper - Value that ``actual`` must be less than.
* @param {string} [description] - Description of the condition being tested.
*/
function assert_between_exclusive(actual, lower, upper, description)
{
/*
- * Test if a primitive number is between two others
+ * Test if a primitive number (or bigint) is between two others
*/
- assert(typeof actual === "number",
+ assert(typeof lower === typeof upper,
+ "assert_between_exclusive", description,
+ "expected lower (${type_lower}) and upper (${type_upper}) types to match (test error)",
+ {type_lower:typeof lower, type_upper:typeof upper});
+
+ assert(typeof actual === "number" || typeof actual === "bigint",
"assert_between_exclusive", description,
"expected a number but got a ${type_actual}",
{type_actual:typeof actual});
+ assert(typeof actual === typeof lower,
+ "assert_between_exclusive", description,
+ "expected a ${type_lower} but got a ${type_actual}",
+ {type_lower:typeof lower, type_actual:typeof actual});
+
assert(actual > lower && actual < upper,
"assert_between_exclusive", description,
"expected a number greater than ${lower} " +
@@ -1846,21 +1868,26 @@
/**
* Assert that ``actual`` is a number less than or equal to ``expected``.
*
- * @param {number} actual - Test value.
- * @param {number} expected - Number that ``actual`` must be less
+ * @param {number|bigint} actual - Test value.
+ * @param {number|bigint} expected - Value that ``actual`` must be less
* than or equal to.
* @param {string} [description] - Description of the condition being tested.
*/
function assert_less_than_equal(actual, expected, description)
{
/*
- * Test if a primitive number is less than or equal to another
+ * Test if a primitive number (or bigint) is less than or equal to another
*/
- assert(typeof actual === "number",
+ assert(typeof actual === "number" || typeof actual === "bigint",
"assert_less_than_equal", description,
"expected a number but got a ${type_actual}",
{type_actual:typeof actual});
+ assert(typeof actual === typeof expected,
+ "assert_less_than_equal", description,
+ "expected a ${type_expected} but got a ${type_actual}",
+ {type_expected:typeof expected, type_actual:typeof actual});
+
assert(actual <= expected,
"assert_less_than_equal", description,
"expected a number less than or equal to ${expected} but got ${actual}",
@@ -1871,21 +1898,26 @@
/**
* Assert that ``actual`` is a number greater than or equal to ``expected``.
*
- * @param {number} actual - Test value.
- * @param {number} expected - Number that ``actual`` must be greater
+ * @param {number|bigint} actual - Test value.
+ * @param {number|bigint} expected - Value that ``actual`` must be greater
* than or equal to.
* @param {string} [description] - Description of the condition being tested.
*/
function assert_greater_than_equal(actual, expected, description)
{
/*
- * Test if a primitive number is greater than or equal to another
+ * Test if a primitive number (or bigint) is greater than or equal to another
*/
- assert(typeof actual === "number",
+ assert(typeof actual === "number" || typeof actual === "bigint",
"assert_greater_than_equal", description,
"expected a number but got a ${type_actual}",
{type_actual:typeof actual});
+ assert(typeof actual === typeof expected,
+ "assert_greater_than_equal", description,
+ "expected a ${type_expected} but got a ${type_actual}",
+ {type_expected:typeof expected, type_actual:typeof actual});
+
assert(actual >= expected,
"assert_greater_than_equal", description,
"expected a number greater than or equal to ${expected} but got ${actual}",
@@ -1897,21 +1929,31 @@
* Assert that ``actual`` is a number greater than or equal to ``lower`` and less
* than or equal to ``upper``.
*
- * @param {number} actual - Test value.
- * @param {number} lower - Number that ``actual`` must be greater than or equal to.
- * @param {number} upper - Number that ``actual`` must be less than or equal to.
+ * @param {number|bigint} actual - Test value.
+ * @param {number|bigint} lower - Value that ``actual`` must be greater than or equal to.
+ * @param {number|bigint} upper - Value that ``actual`` must be less than or equal to.
* @param {string} [description] - Description of the condition being tested.
*/
function assert_between_inclusive(actual, lower, upper, description)
{
/*
- * Test if a primitive number is between to two others or equal to either of them
+ * Test if a primitive number (or bigint) is between to two others or equal to either of them
*/
- assert(typeof actual === "number",
+ assert(typeof lower === typeof upper,
+ "assert_between_inclusive", description,
+ "expected lower (${type_lower}) and upper (${type_upper}) types to match (test error)",
+ {type_lower:typeof lower, type_upper:typeof upper});
+
+ assert(typeof actual === "number" || typeof actual === "bigint",
"assert_between_inclusive", description,
"expected a number but got a ${type_actual}",
{type_actual:typeof actual});
+ assert(typeof actual === typeof lower,
+ "assert_between_inclusive", description,
+ "expected a ${type_lower} but got a ${type_actual}",
+ {type_lower:typeof lower, type_actual:typeof actual});
+
assert(actual >= lower && actual <= upper,
"assert_between_inclusive", description,
"expected a number greater than or equal to ${lower} " +
diff --git a/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html b/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html
index 0b6924b0980..38c764ae181 100644
--- a/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html
+++ b/tests/wpt/tests/sanitizer-api/sanitizer-basic-filtering.tentative.html
@@ -273,6 +273,15 @@ for(const group of
div.setHTMLUnsafe(testcase.data, config);
assert_testcase(div, testcase);
}, `setHTMLUnsafe testcase ${group.id}/${index}, "${testcase.data}"`);
+
+ // parseHTML and parseHTMLUnsafe need to allow "html" and "body" for these
+ // tests to be useful. Update the config, if necessary.
+ if (config && config["sanitizer"] && config["sanitizer"]["elements"]) {
+ config["sanitizer"] = new Sanitizer(config["sanitizer"]);
+ config["sanitizer"].allowElement("body");
+ config["sanitizer"].allowElement("html");
+ }
+
test(_ => {
assert_testcase(
Document.parseHTML(testcase.data, config).body, testcase);
diff --git a/tests/wpt/tests/sanitizer-api/sanitizer-parseHTML.tentative.html b/tests/wpt/tests/sanitizer-api/sanitizer-parseHTML.tentative.html
new file mode 100644
index 00000000000..c4a31e2eb03
--- /dev/null
+++ b/tests/wpt/tests/sanitizer-api/sanitizer-parseHTML.tentative.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<head>
+<title>Testcases for parseHTML and parseHTMLUnsafe</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/html5lib-testcase-support.js"></script>
+<!--
+ This is a set of basic Sanitizer test cases using the parseHTML and
+ parseHTMLUnsafe methods.
+-->
+<script id="all" type="html5lib-testcases">
+#data
+text
+#document
+| <html>
+| <head>
+| <body>
+| "text"
+
+#data
+<div>text
+#config
+{ "elements": ["html", "body", "div"] }
+#document
+| <html>
+| <body>
+| <div>
+| "text"
+
+#data
+<div>text
+#config
+{ "elements": ["body", "div"] }
+#document
+
+#data
+<div>text
+#config
+{ "elements": ["html", "div"] }
+#document
+| <html>
+
+</script>
+<script id="safe" type="html5lib-testcases">
+#data
+<script>hello
+#document
+| <html>
+| <head>
+| <body>
+
+#data
+<html onload="2+2"><body onload="3+3"><div>hello
+#document
+| <html>
+| <head>
+| <body>
+| <div>
+| "hello"
+
+</script>
+<script id="unsafe" type="html5lib-testcases">
+#data
+<script>hello
+#document
+| <html>
+| <head>
+| <script>
+| "hello"
+| <body>
+
+#data
+<html onload="2+2"><body onload="3+3"><div>hello
+#document
+| <html>
+| onload="2+2"
+| <head>
+| <body>
+| onload="3+3"
+| <div>
+| "hello"
+
+</script>
+<script id="document" type="html5lib-testcases">
+#data
+<!DOCTYPE html>
+text
+#document
+| <!DOCTYPE html "" "">
+| <html>
+| <head>
+| <body>
+| "text"
+
+</script>
+<script>
+function test_safe(testcase, index) {
+ let config = undefined;
+ try {
+ config = { sanitizer: JSON.parse(testcase.config) };
+ } catch { /* config remains undefined */ }
+ test(_ => {
+ assert_testcase(Document.parseHTML(testcase.data, config), testcase);
+ }, `parseHTML testcase ${index}, "${testcase.data}"`);
+}
+function test_unsafe(testcase, index) {
+ let config = undefined;
+ try {
+ config = { sanitizer: JSON.parse(testcase.config) };
+ } catch { /* config remains undefined */ }
+ test(_ => {
+ assert_testcase(Document.parseHTMLUnsafe(testcase.data, config), testcase);
+ }, `parseHTMLUnsafe testcase ${index}, "${testcase.data}"`);
+}
+
+const all = parse_html5lib_testcases(
+ document.getElementById("all").textContent);
+const safe = parse_html5lib_testcases(
+ document.getElementById("safe").textContent);
+const unsafe = parse_html5lib_testcases(
+ document.getElementById("unsafe").textContent);
+all.forEach(test_safe);
+all.forEach(test_unsafe);
+safe.forEach(test_safe);
+unsafe.forEach(test_unsafe);
+
+
+// DOM only supports Document Type Declarations as children of documents. This
+// trips up the assert_testcase implementation, so we'll handle that seperately.
+parse_html5lib_testcases(
+ document.getElementById("document").textContent).
+ forEach((testcase, index) => {
+ test(_ => {
+ const tree = build_node_tree(new Document(), testcase.document);
+ assert_subtree_equals(Document.parseHTMLUnsafe(testcase.data, {}), tree);
+ }, `parseHTMLUnsafe full document testcase ${index}, "${testcase.data}"`);
+ test(_ => {
+ const tree = build_node_tree(new Document(), testcase.document);
+ assert_subtree_equals(Document.parseHTML(testcase.data, {}), tree);
+ }, `parseHTML full document testcase ${index}, "${testcase.data}"`);
+});
+</script>
+</head>
+<body>
+</body>
diff --git a/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html
index d40b6047924..7716488f25a 100644
--- a/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html
+++ b/tests/wpt/tests/soft-navigation-heuristics/innertext.tentative.html
@@ -20,13 +20,18 @@
const link = document.getElementById("link");
testSoftNavigation({
addContent: async () => {
- document.getElementById("softnav-content").innerText =
- "Lorem Ipsum dolor sit amet";
+ document.getElementById("softnav-content").innerText =
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, ' +
+ 'sed do eiusmod tempor incididunt ut labore et dolore magna ' +
+ 'aliqua. Ut enim ad minim veniam, quis nostrud exercitation ' +
+ 'ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis ' +
+ 'aute irure dolor in reprehenderit in voluptate velit esse ' +
+ 'cillum dolore eu fugiat nulla pariatur. Excepteur sint ' +
+ 'occaecat cupidatat non proident, sunt in culpa qui officia ' +
+ 'deserunt mollit anim id est laborum.';
},
link: link,
test: "Soft navigation when only innerText was modified"});
</script>
</body>
</html>
-
-
diff --git a/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html
index 7b884f2bdb3..5961a6ebcdf 100644
--- a/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html
+++ b/tests/wpt/tests/soft-navigation-heuristics/interaction-with-paint-before-back.tentative.html
@@ -1,73 +1,93 @@
-<!DOCTYPE HTML>
+<!doctype html>
<html>
-<head>
-<meta charset="utf-8">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="resources/soft-navigation-helper.js"></script>
-</head>
-<body>
- <main id=main>
- <div>
- <a id=link><img src="/images/lcp-256x256.png" id="img"></a>
- <a id=not_nav><img src="/images/lcp-16x16.png"></a>
+ <head>
+ <meta charset="utf-8" />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ </head>
+ <body>
+ <div id="main">
+ <div id="almost_soft_nav_div">
+ A click will almost initiate a soft nav, by (1) mutating the DOM by adding an image; (2)
+ causing the image to be painted.
+ </div>
+ <div id="soft_nav_div">
+ A click will initiate a soft nav, by (1) mutating the DOM by adding an image; (2) causing
+ the image to be painted; (3) updating the URL via history.back(), but without causing a hard
+ navigation.
+ </div>
</div>
- </main>
- <script>
- // Push state a couple of times
- history.pushState({}, "", "foobar.html");
- history.pushState({}, "", "anotherOne.html");
+ <script>
+ promise_test(
+ async (t) => {
+ // Setup a click handler for 'almost_soft_nav_div', which adds a
+ // specific, identifiable image 'almost_soft_nav_img' to the document.
+ document.getElementById("almost_soft_nav_div").addEventListener("click", () => {
+ const img = new Image();
+ img.src = "/images/lcp-133x106.png";
+ img.elementTiming = "almost_soft_nav_img";
+ document.getElementById("main").appendChild(img);
+ });
- (async () => {
- const link = document.getElementById("link");
- // Trigger a user interaction that doesn't result in a soft navigation, but
- // does paint.
- await (async () => {
- const not_nav = document.getElementById("not_nav");
- let non_soft_nav_click;
- const non_soft_nav_click_promise =
- new Promise(r => { non_soft_nav_click = r; });
- not_nav.addEventListener("click", () => {
- addImageToMain("lcp-133x106.png", "not_soft_nav_image");
- (new PerformanceObserver(non_soft_nav_click)).observe({type: "element"});
- });
- if (test_driver) {
- test_driver.click(not_nav);
- }
- await non_soft_nav_click_promise;
- })();
- const url = URL + "?" + counter;
- link.addEventListener("click", () => {
- // Add an LCP element.
- const img = new Image();
- img.src = '/images/lcp-100x500.png' + "?" + Math.random();
- document.getElementById("main").appendChild(img);
- history.back();
- });
- promise_test(async t => {
- const soft_nav_promise = waitOnSoftNav();
- if (test_driver) {
- test_driver.click(link);
- }
- await soft_nav_promise;
- assert_equals(
- document.softNavigations, 1,
- 'Single Soft Navigation detected');
- const [entries, options] = await new Promise(resolve => {
- (new PerformanceObserver((list, obs, options) => resolve(
- [list.getEntries(), options]))).observe(
- {type: 'soft-navigation', buffered: true});
+ // Also set up a click handler for 'soft_nav_div', for adding
+ // another image, but in addition to what we do for the almost soft nav
+ // above, also let the handler change the URL, by invoking
+ // history.back(). We prepare with pushState for the history.back()
+ // invocation, to avoid triggering a hard navigation.
+ const test_origin = new URL(location.href).origin;
+ history.pushState({}, "", "/foo.html"); // We will observe this below.
+ history.pushState({}, "", "/bar.html"); // Prep for history.back().
+ document.getElementById("soft_nav_div").addEventListener("click", () => {
+ const img = new Image();
+ img.src = "/images/lcp-133x106.png";
+ document.getElementById("main").appendChild(img);
+ history.back(); // URL change triggering the soft nav
});
- assert_equals(entries.length, 1,
- "Performance observer got an entry");
- }, "Ensure that soft navigation entry emitted through a synchronous " +
- "event that modified DOM and committed a same document navigation, " +
- "and that was preceded by a user intreaction that resulted in a " +
- "contentful paint is properly detected.");
- })();
- </script>
-</body>
+ // Now, click almost_soft_nav_div, and observe that time image
+ // was rendered but no soft nav was triggered.
+ {
+ const element_timing_promise = new Promise((resolve) => {
+ new PerformanceObserver(resolve).observe({ type: "element", buffered: true });
+ });
+ if (test_driver) {
+ test_driver.click(almost_soft_nav_div);
+ }
+ // Returns entries of type PerformanceElementTiming, see
+ // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceElementTiming.
+ const entries = (await element_timing_promise).getEntries();
+ assert_equals(entries.length, 1);
+ assert_equals(
+ entries[0].identifier,
+ "almost_soft_nav_img",
+ "Image based on the user interaction was painted.",
+ );
+ assert_equals(document.softNavigations, 0, "No soft navigation detected.");
+ }
+
+ // Now, click soft_nav_div, and observe the detected soft navigation.
+ {
+ const soft_nav_promise = new Promise((resolve) => {
+ new PerformanceObserver(resolve).observe({ type: "soft-navigation", buffered: true });
+ });
+ if (test_driver) {
+ test_driver.click(soft_nav_div);
+ }
+ // Returns entries of type SoftNavigationEntry, see
+ // https://github.com/WICG/soft-navigations/
+ const entries = (await soft_nav_promise).getEntries();
+ assert_equals(document.softNavigations, 1, "Single soft navigation detected");
+ assert_equals(entries.length, 1, "Performance observer got an entry");
+ assert_equals(entries[0].name, test_origin + "/foo.html");
+ }
+ },
+ "Ensure that soft navigation entry emitted through a synchronous " +
+ "event that modified DOM and committed a same document navigation, " +
+ "and that was preceded by a user interaction that resulted in a " +
+ "contentful paint is properly detected.",
+ );
+ </script>
+ </body>
</html>
diff --git a/tests/wpt/tests/soft-navigation-heuristics/smoke/tentative/basic.html b/tests/wpt/tests/soft-navigation-heuristics/smoke/tentative/basic.html
new file mode 100644
index 00000000000..9bfedf09b19
--- /dev/null
+++ b/tests/wpt/tests/soft-navigation-heuristics/smoke/tentative/basic.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Soft Navigation Detection: The Basics.</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>
+ // The click handler is triggered by user interaction; it modifies
+ // the DOM, causing a paint, and also changes the URL.
+ // This constitutes a soft navigation.
+ function clickHandler() {
+ const greeting = document.createElement("div");
+ greeting.textContent = "Hello, World.";
+ document.body.appendChild(greeting);
+ history.pushState({}, "", "/greeting.html");
+ }
+ </script>
+ </head>
+ <body>
+ <div id="click-target" onclick="clickHandler()">Click here!</div>
+
+ <script>
+ test(() => {
+ const observer = new PerformanceObserver(() => {});
+ observer.observe({ type: "soft-navigation", buffered: true });
+ const records = observer.takeRecords();
+ observer.disconnect();
+ assert_equals(records.length, 0, "Expecting empty list.");
+ }, "No soft navigation detection without user interaction.");
+
+ promise_test(async (t) => {
+ const test_origin = new URL(location.href).origin;
+
+ let entries;
+ new PerformanceObserver((list, observer) => {
+ entries = list.getEntries();
+ observer.disconnect();
+ }).observe({ type: "soft-navigation" });
+
+ // Initiate the user interaction to trigger the soft navigation.
+ if (test_driver) {
+ test_driver.click(document.getElementById("click-target"));
+ }
+
+ await t.step_wait(
+ () => entries !== undefined,
+ "Waiting for entries from PerformanceObserver.",
+ );
+
+ // Now check there's one entry, and it's fields.
+ // The SoftNavigationEntry instance is spec'd in
+ // https://github.com/WICG/soft-navigations/
+ assert_equals(entries.length, 1, "Expecting one soft navigation entry.");
+
+ const expected_url = new URL("/greeting.html", test_origin);
+ assert_equals(
+ entries[0].name,
+ expected_url.toString(),
+ "Soft navigation should record destination URL as its name.",
+ );
+ }, "Detect soft navigation after a click.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html
index 0615b513e61..b34a6e81a58 100644
--- a/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html
+++ b/tests/wpt/tests/soft-navigation-heuristics/text-lcp-followed-by-anim-image-softnav-lcp.tentative.html
@@ -21,12 +21,15 @@
addContent: async () => {
const main = document.getElementById("main");
main.removeChild(document.getElementsByTagName("div")[0]);
- await addImageToMain("anim-gr.png");
+ const img = new Image(500, 500);
+ img.src = "/images/anim-gr.png?" + Math.random();
+ img.id = "imagelcp";
+ img.setAttribute("elementtiming", "imagelcp");
+ main.appendChild(img);
},
link: link,
- test: "Test that a text LCP followup by a smaller soft navigation image"
- + " LCP properly queues an LCP entry"});
+ test: "Test that a text LCP followup by an animaged image "
+ + " properly queues a soft navigation entry"});
</script>
</body>
</html>
-
diff --git a/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html
index 0bb149f00e9..0bb31aaac15 100644
--- a/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html
+++ b/tests/wpt/tests/soft-navigation-heuristics/visited-link.tentative.html
@@ -24,7 +24,15 @@
}));
const main = document.getElementById("main");
const div = document.createElement("div");
- const text = document.createTextNode("Lorem Ipsum");
+ const text = document.createTextNode(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, ' +
+ 'sed do eiusmod tempor incididunt ut labore et dolore magna ' +
+ 'aliqua. Ut enim ad minim veniam, quis nostrud exercitation ' +
+ 'ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis ' +
+ 'aute irure dolor in reprehenderit in voluptate velit esse ' +
+ 'cillum dolore eu fugiat nulla pariatur. Excepteur sint ' +
+ 'occaecat cupidatat non proident, sunt in culpa qui officia ' +
+ 'deserunt mollit anim id est laborum.');
div.appendChild(text);
main.appendChild(div);
}
diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js b/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js
index 17fccd448d2..59d7d8bae9e 100644
--- a/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js
+++ b/tests/wpt/tests/speculation-rules/prefetch/resources/basic-service-worker.js
@@ -32,6 +32,13 @@ if (swOption !== 'no-fetch-handler') {
if (swOption === 'fetch-handler') {
event.respondWith(fetch(event.request));
+ } else if (swOption === 'fetch-handler-synthetic') {
+ const finalUrl = new URL(event.request.url).searchParams.get('location');
+ if (finalUrl) {
+ event.respondWith(Response.redirect(finalUrl));
+ } else {
+ // Fallback to the network.
+ }
} else if (swOption === 'fetch-handler-modify-url') {
// The "Sec-Purpose: prefetch" header is dropped in fetch-handler-modify-*
// cases in Step 33 of // https://fetch.spec.whatwg.org/#dom-request
diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py b/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py
index cbcbc8eccb9..3511fe4905e 100644
--- a/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py
+++ b/tests/wpt/tests/speculation-rules/prefetch/resources/counting-executor.py
@@ -21,6 +21,11 @@ def main(request, response):
request_count["prefetch" if prefetch else "nonPrefetch"] += 1
request.server.stash.put(uuid, request_count)
+ if b"location" in request.GET:
+ response.status = 302
+ response.headers.set(b"Location", request.GET[b"location"])
+ return
+
response.content = template(
request,
open(os.path.join(os.path.dirname(__file__), "executor.sub.html"), "rb").read())
diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html b/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html
index d27acfe100a..975a3e5092e 100644
--- a/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html
+++ b/tests/wpt/tests/speculation-rules/prefetch/resources/executor.sub.html
@@ -1,5 +1,8 @@
<!DOCTYPE html>
<script src="/common/dispatcher/dispatcher.js" nonce="abc"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
<script src="utils.sub.js" nonce="abc"></script>
<script nonce="abc">
// For a given string `str` that is escaped by WPT's `.sub.html` or
@@ -45,6 +48,39 @@ Object.keys(requestHeaders).forEach(key => {
}
});
+// Add a link to the page in order to use during the test
+function add_link(id, url) {
+ const link_element = document.createElement("a");
+ const link_text = document.createTextNode(url);
+ link_element.setAttribute("href", url);
+ link_element.setAttribute("id", id);
+ link_element.appendChild(link_text);
+ document.body.appendChild(link_element);
+}
+
+// "id" is the id of the link that we need to hover on in order
+// to start the prefetch
+async function start_non_eager_prefetch_on_hover(id) {
+ let target = document.getElementById(id);
+
+ test_driver.set_test_context(window.opener);
+ // Inject the inputs to run this test.
+ await new test_driver.Actions().addPointer("mouse").pointerMove(0, 0, {origin: target}).send();
+}
+
+// "id" is the id of the link that we need to press on in order
+// to start the prefetch
+async function start_non_eager_prefetch_on_pointerdown(id) {
+ let target = document.getElementById(id);
+
+ test_driver.set_test_context(window.opener);
+ // Inject the inputs to run this test.
+ // Move mouse pointer outside of the anchor so that we don't start the
+ // navigation before making sure the prefetch request started server-side.
+ await new test_driver.Actions().addPointer("mouse").pointerMove(0, 0, {origin: target}).pointerDown().pointerMove(0, 0).pointerUp().send();
+}
+
+
// The fetch request's URL sent to the server.
window.requestUrl = reverse_html_escape(
"{{location[server]}}{{location[path]}}{{location[query]}}");
diff --git a/tests/wpt/tests/speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html b/tests/wpt/tests/speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html
new file mode 100644
index 00000000000..f56f6bf09b9
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="../../../resources/utils.js"></script>
+<script src="../../resources/utils.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+
+<meta name="variant" content="?origin=same-site&sc=in-in&sw=fetch-handler">
+<meta name="variant" content="?origin=same-site&sc=in-in&sw=fetch-handler-to-fallback">
+<meta name="variant" content="?origin=same-site&sc=in-in&sw=fetch-handler-synthetic">
+<meta name="variant" content="?origin=same-site&sc=in-in&sw=no-fetch-handler">
+
+<meta name="variant" content="?origin=same-site&sc=in-out&sw=fetch-handler">
+<meta name="variant" content="?origin=same-site&sc=in-out&sw=fetch-handler-to-fallback">
+<meta name="variant" content="?origin=same-site&sc=in-out&sw=fetch-handler-synthetic">
+<meta name="variant" content="?origin=same-site&sc=in-out&sw=no-fetch-handler">
+
+<meta name="variant" content="?origin=same-site&sc=out-in&sw=fetch-handler">
+<meta name="variant" content="?origin=same-site&sc=out-in&sw=fetch-handler-to-fallback">
+<meta name="variant" content="?origin=same-site&sc=out-in&sw=no-fetch-handler">
+
+<script>
+setup(() => assertSpeculationRulesIsSupported());
+
+const originOption = new URL(location.href).searchParams.get('origin');
+const swOption = new URL(location.href).searchParams.get('sw');
+
+// We use a short name `sc` to avoid long file names https://crbug.com/40469687
+const scopeOption = new URL(location.href).searchParams.get('sc');
+
+promise_test(async t => {
+ const hostname = originOption === 'cross-site' ? '{{hosts[alt][www]}}'
+ : undefined;
+ const win = await spawnWindow(t, { protocol: 'https', hostname: hostname });
+
+ const finalUrl = win.getExecutorURL({ executor: 'counting-executor.py', protocol: 'https', page: 2 });
+ const initialUrl = new URL('../../resources/counting-executor.py', location.href);
+ // Assign a different UUID to track the number of requests to server
+ // separately for the initialUrl and finalUrl.
+ initialUrl.searchParams.set('uuid', token());
+ initialUrl.searchParams.set('location', finalUrl);
+
+ const swUrl = new URL('../../resources/basic-service-worker.js?sw=' + swOption, location.href).href;
+
+ let sw1;
+ if (scopeOption === 'in-in' || scopeOption === 'in-out') {
+ // Register a SW for `initialUrl`.
+ const reg = await service_worker_unregister_and_register(
+ t, swUrl + '&sw1', initialUrl);
+ sw1 = reg.installing;
+ await wait_for_state(t, reg.installing, 'activated');
+ }
+
+ let sw2;
+ if (scopeOption === 'in-in' || scopeOption === 'out-in') {
+ // Register a SW for `finalUrl`.
+ const reg = await service_worker_unregister_and_register(
+ t, swUrl + '&sw2', finalUrl);
+ sw2 = reg.installing;
+ await wait_for_state(t, reg.installing, 'activated');
+ }
+
+ // Start speculation rules prefetch and navigate to the URL.
+ await win.forceSinglePrefetch(initialUrl);
+
+ await win.navigate(initialUrl, {expectedDestinationUrl: finalUrl});
+
+ const initialRequestCount = await (await fetch(initialUrl + '&check')).json();
+ const finalRequestCount = await (await fetch(finalUrl + '&check')).json();
+
+ const headers = await win.execute_script(() => {
+ return requestHeaders;
+ }, []);
+
+ const controllerUrl = await win.execute_script(() => {
+ return navigator.serviceWorker.controller ?
+ navigator.serviceWorker.controller.scriptURL :
+ undefined;
+ }, []);
+
+ if (sw2) {
+ // The navigated page should be controlled by the ServiceWorker,
+ // regardless of whether prefetch is performed/used.
+ assert_equals(controllerUrl, swUrl + '&sw2');
+ } else {
+ assert_equals(controllerUrl, undefined);
+ }
+
+ // In any cases prefetch + redirects + ServiceWorker fails and prefetched
+ // results aren't served.
+ assert_not_prefetched(headers, "Prefetched result should not be served.");
+
+ if (swOption === 'fetch-handler-synthetic') {
+ // Synthetic redirect response from ServiceWorker prevents the initial
+ // prefetch/non-prefetch requests to the server.
+ assert_equals(initialRequestCount.prefetch, 0,
+ 'prefetch requests to initial URL should not be sent to the server.');
+ assert_equals(initialRequestCount.nonPrefetch, 0,
+ 'a non-prefetch requests to initial URL should not be sent to the server.');
+ } else {
+ // Otherwise, the initial prefetch request (either with or without
+ // ServiceWorker interception) anyway reaches the server, and then
+ // re-requested as a non-prefetch request on navigation.
+ assert_equals(initialRequestCount.prefetch, 1,
+ 'prefetch requests to initial URL should be sent to the server.');
+ assert_equals(initialRequestCount.nonPrefetch, 1,
+ 'a non-prefetch requests to initial URL should be sent to the server.');
+ }
+
+ // Prefetch requests to the URL after redirects shouldn't be sent to server
+ // because prefetch should fail immediately on receiving redirects.
+ assert_equals(finalRequestCount.prefetch, 0,
+ 'prefetch requests should not be sent to the server.');
+ // Instead, a single non-prefetch request should be sent.
+ assert_equals(finalRequestCount.nonPrefetch, 1,
+ 'a non-prefetch request should be sent to the server.');
+
+}, "Prefetch with ServiceWorker (" + swOption + ")");
+</script>
diff --git a/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https.html b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https.html
new file mode 100644
index 00000000000..cbf69cefba6
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>Sec-Speculation-Tags request headers</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script>
+<script src="/speculation-rules/prerender/resources/utils.js"></script>
+<script src="/speculation-rules/resources/utils.js"></script>
+<script src="/speculation-rules/prefetch/resources/utils.sub.js"></script>
+<script>
+"use strict";
+
+setup(() => assertSpeculationRulesIsSupported());
+
+promise_test(async t => {
+ const agent = await spawnWindow(t);
+ const nextUrl = agent.getExecutorURL({ page: 2 });
+ await agent.forceSpeculationRules({
+ prefetch: [
+ {source: "list", "tag": "conservative",
+ "eagerness": "conservative", urls: [nextUrl]},
+ {source: "list", "tag": "moderate",
+ "eagerness": "moderate", urls: [nextUrl]}
+ ]
+ });
+
+ const linkId = 'target';
+ await agent.execute_script(async (linkId, nextUrl) => {
+ add_link(linkId, nextUrl);
+ }, [linkId, nextUrl]);
+
+ await agent.execute_script(async (linkId) => {
+ await start_non_eager_prefetch_on_pointerdown(linkId);
+ }, [linkId]);
+ await agent.navigate(nextUrl);
+
+ const headers = await agent.getRequestHeaders();
+ assert_prefetched(headers, "must be prefetched");
+ assert_equals(headers.sec_speculation_tags, "\"conservative\", \"moderate\"", "Sec-Speculation-Tags");
+}, "Sec-Speculation-Tags prefetch with eagerness triggered by point down");
+
+</script>
diff --git a/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https.html b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https.html
new file mode 100644
index 00000000000..f5e749b9c6f
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<title>Sec-Speculation-Tags request headers</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script>
+<script src="/speculation-rules/prerender/resources/utils.js"></script>
+<script src="/speculation-rules/resources/utils.js"></script>
+<script src="/speculation-rules/prefetch/resources/utils.sub.js"></script>
+<script>
+"use strict";
+
+setup(() => assertSpeculationRulesIsSupported());
+
+promise_test(async t => {
+ const agent = await spawnWindow(t);
+ const nextUrl = agent.getExecutorURL({ page: 2 });
+ await agent.forceSpeculationRules({
+ prefetch: [
+ {source: "list", "tag": "conservative",
+ "eagerness": "conservative", urls: [nextUrl]},
+ {source: "list", "tag": "moderate",
+ "eagerness": "moderate", urls: [nextUrl]}
+ ]
+ });
+
+ const linkId = 'target';
+ await agent.execute_script(async (linkId, nextUrl) => {
+ add_link(linkId, nextUrl);
+ }, [linkId, nextUrl]);
+
+ await agent.execute_script(async (linkId) => {
+ await start_non_eager_prefetch_on_hover(linkId);
+ }, [linkId]);
+
+ // TODO(crbug.com/381687257): Remove this when 0ms hover trigger is supported.
+ // Wait for longer than 200 ms for the onhover trigger to fire.
+ await new Promise(resolve => t.step_timeout(resolve, 500));
+ await agent.navigate(nextUrl);
+
+ const headers = await agent.getRequestHeaders();
+ assert_prefetched(headers, "must be prefetched");
+ assert_equals(headers.sec_speculation_tags, "\"moderate\"", "Sec-Speculation-Tags");
+}, "Sec-Speculation-Tags prefetch with eagerness triggered by point hover");
+
+</script>
diff --git a/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html b/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html
index 1d1dd35edc2..2f5b359c571 100644
--- a/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html
+++ b/tests/wpt/tests/speech-api/SpeechRecognition-installOnDevice.https.html
@@ -2,17 +2,39 @@
<title>SpeechRecognition installOnDevice</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>
promise_test(async (t) => {
const validLang = "en-US";
const invalidLang = "invalid language code";
- window.SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
+ const validDownloadableLang = "fr-FR";
+ window.SpeechRecognition =
+ window.SpeechRecognition || window.webkitSpeechRecognition;
- // Test that it returns a promise.
- const validResultPromise = SpeechRecognition.installOnDevice(validLang);
+ // Attempt to call installOnDevice directly, without a user gesture with a
+ // language that is downloadable but not installed.
+ const installWithoutUserGesturePromise =
+ SpeechRecognition.installOnDevice(validDownloadableLang);
+
+ // Assert that the promise rejects with NotAllowedError.
+ await promise_rejects_dom(
+ t,
+ "NotAllowedError",
+ window.DOMException,
+ installWithoutUserGesturePromise,
+ "SpeechRecognition.installOnDevice() must reject with NotAllowedError if " +
+ "called without a user gesture."
+ );
+
+ // Test that it returns a promise when called with a valid language.
+ const validResultPromise = test_driver.bless(
+ "Call SpeechRecognition.installOnDevice with a valid language",
+ () => SpeechRecognition.installOnDevice(validLang)
+ );
assert_true(
validResultPromise instanceof Promise,
- "installOnDevice should return a Promise."
+ "installOnDevice (with gesture) should return a Promise."
);
// Verify the resolved value is a boolean.
@@ -22,15 +44,17 @@ promise_test(async (t) => {
"The resolved value of the installOnDevice promise should be a boolean."
);
- // Verify that the method returns true when called with a supported language code.
+ // Verify that the method returns true when called with a supported language.
assert_equals(
validResult,
true,
- "installOnDevice should resolve with `true` when called with a supported language code."
+ "installOnDevice should resolve with `true` when called with a " +
+ "supported language code."
);
// Verify that the newly installed language pack is available.
- const availableOnDeviceResultPromise = SpeechRecognition.availableOnDevice(validLang);
+ const availableOnDeviceResultPromise =
+ SpeechRecognition.availableOnDevice(validLang);
assert_true(
availableOnDeviceResultPromise instanceof Promise,
"availableOnDevice should return a Promise."
@@ -42,28 +66,58 @@ promise_test(async (t) => {
"The resolved value of the availableOnDevice promise should be a string."
);
- assert_true(availableOnDeviceResult === "available",
- "The resolved value of the availableOnDevice promise should be available."
+ assert_true(
+ availableOnDeviceResult === "available",
+ "The resolved value of the availableOnDevice promise should be 'available'."
);
- // Verify that installing an already installed language pack resolves to true.
- const secondResultPromise = SpeechRecognition.installOnDevice(validLang);
+ // Verify that installing an already installed language resolves to true.
+ const secondResultPromise = test_driver.bless(
+ "Call SpeechRecognition.installOnDevice for an already installed language",
+ () => SpeechRecognition.installOnDevice(validLang)
+ );
+ assert_true(
+ secondResultPromise instanceof Promise,
+ "installOnDevice (with gesture, for already installed language) should " +
+ "return a Promise."
+ );
const secondResult = await secondResultPromise;
+ assert_true(
+ typeof secondResult === "boolean",
+ "The resolved value of the second installOnDevice promise should be a " +
+ "boolean."
+ );
assert_equals(
secondResult,
true,
- "installOnDevice should resolve with `true` if the language is already installed."
+ "installOnDevice should resolve with `true` if the language is already " +
+ "installed."
);
- // Test that it returns a promise.
- const invalidResultPromise = SpeechRecognition.installOnDevice(invalidLang);
+ // Test that it returns a promise and resolves to false for unsupported lang.
+ const invalidResultPromise = test_driver.bless(
+ "Call SpeechRecognition.installOnDevice with an unsupported language code",
+ () => SpeechRecognition.installOnDevice(invalidLang)
+ );
+ assert_true(
+ invalidResultPromise instanceof Promise,
+ "installOnDevice (with gesture, for unsupported language) should return " +
+ "a Promise."
+ );
const invalidResult = await invalidResultPromise;
+ assert_true(
+ typeof invalidResult === "boolean",
+ "The resolved value of the installOnDevice promise (unsupported language) " +
+ "should be a boolean."
+ );
assert_equals(
invalidResult,
false,
- "installOnDevice should resolve with `false` when called with an unsupported language code."
+ "installOnDevice should resolve with `false` when called with an " +
+ "unsupported language code."
);
-}, "SpeechRecognition.installOnDevice resolves with a boolean value.");
+}, "SpeechRecognition.installOnDevice resolves with a boolean value " +
+ "(with user gesture).");
promise_test(async (t) => {
const iframe = document.createElement("iframe");
@@ -78,7 +132,13 @@ promise_test(async (t) => {
t,
"InvalidStateError",
frameDOMException,
- frameSpeechRecognition.installOnDevice("en-US"),
+ test_driver.bless(
+ "Call SpeechRecognition.installOnDevice in a detached frame context",
+ () => {
+ return frameSpeechRecognition.installOnDevice("en-US");
+ }
+ )
);
-}, "SpeechRecognition.installOnDevice rejects in a detached context.");
+}, "SpeechRecognition.installOnDevice rejects in a detached context " +
+ "(with user gesture).");
</script>
diff --git a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
index cf10f7f2e83..6e9d80c4142 100644
--- a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
+++ b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
@@ -14,35 +14,6 @@ promise_test(async () => {
await garbageCollect();
}, 'Garbage-collecting a stream along with its reader should not crash');
-
-// See https://crbug.com/390646657 for details.
-promise_test(async () => {
- const written = new WritableStream({
- write(chunk) {
- return new Promise(resolve => {});
- }
- }).getWriter().write('just nod if you can hear me');
- for (let i = 0; i < 5; ++i)
- await garbageCollect();
-}, 'Garbage-collecting a stream writer with a pending write should not crash');
-
-
-promise_test(async () => {
- const closed = new WritableStream({
- write(chunk) { }
- }).getWriter().closed;
- for (let i = 0; i < 5; ++i)
- await garbageCollect();
-}, 'Garbage-collecting a stream writer should not crash with closed promise is retained');
-
-promise_test(async () => {
- const ready = new WritableStream({
- write(chunk) { }
- }, {highWaterMark: 0}).getWriter().ready;
- for (let i = 0; i < 5; ++i)
- await garbageCollect();
-}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied');
-
promise_test(async () => {
let reader = new ReadableStream({
pull() { }
diff --git a/tests/wpt/tests/streams/writable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/writable-streams/crashtests/garbage-collection.any.js
new file mode 100644
index 00000000000..a3796881c9f
--- /dev/null
+++ b/tests/wpt/tests/streams/writable-streams/crashtests/garbage-collection.any.js
@@ -0,0 +1,43 @@
+// META: global=window,worker
+// META: script=/common/gc.js
+'use strict';
+
+// See https://crbug.com/390646657 for details.
+promise_test(async () => {
+ const written = new WritableStream({
+ write(chunk) {
+ return new Promise(resolve => {});
+ }
+ }).getWriter().write('just nod if you can hear me');
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer with a pending write should not crash');
+
+promise_test(async () => {
+ const closed = new WritableStream({
+ write(chunk) { }
+ }).getWriter().closed;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer should not crash with closed promise is retained');
+
+promise_test(async () => {
+ let writer = new WritableStream({
+ write(chunk) { return new Promise(resolve => {}); },
+ close() { return new Promise(resolve => {}); }
+ }).getWriter();
+ writer.write('is there anyone home?');
+ writer.close();
+ writer = null;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer should not crash with close promise pending');
+
+promise_test(async () => {
+ const ready = new WritableStream({
+ write(chunk) { }
+ }, {highWaterMark: 0}).getWriter().ready;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied');
+
diff --git a/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/parsing.https.html b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/parsing.https.html
new file mode 100644
index 00000000000..205854419a7
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/parsing.https.html
@@ -0,0 +1,119 @@
+<!doctype html>
+<head>
+ <meta name="timeout" content="long">
+ <meta name="variant" content="?type=enforce">
+ <meta name="variant" content="?type=report">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/dispatcher/dispatcher.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/reporting/resources/report-helper.js"></script>
+</head>
+<body>
+<script>
+
+ const run_test = (test_case) => {
+ promise_test(async () => {
+ const REMOTE_EXECUTOR =
+ `/common/dispatcher/remote-executor.html?pipe=`;
+
+ let header_name = "Integrity-Policy";
+ const params = new URLSearchParams(location.search);
+ if (params.get('type') === "report") {
+ if (test_case.expected.blocked) {
+ return;
+ }
+ header_name += "-Report-Only";
+ }
+ const iframe_uuid = token();
+ const header =
+ `header(${header_name},${test_case.header_value})`;
+ const iframe_url =
+ `${REMOTE_EXECUTOR}${encodeURIComponent(header)}&uuid=${iframe_uuid}`;
+
+ const iframe = document.createElement('iframe');
+ iframe.src = iframe_url;
+ document.body.appendChild(iframe);
+
+ // Execute code directly from the iframe.
+ const ctx = new RemoteContext(iframe_uuid);
+ const result = await ctx.execute_script(async (test_case) => {
+ const resource_url = "/content-security-policy/resources/ran.js";
+ let report_observed_promise;
+
+ // Load a script with no integrity. If there's a policy in place, it
+ // would be blocked.
+ const loaded = await new Promise(resolve => {
+ const script = document.createElement('script');
+ script.onload = () => { resolve(true); };
+ script.onerror = () => { resolve(false); };
+ script.src = resource_url;
+ document.body.appendChild(script);
+ });
+ return { blocked: !loaded, ran: window.ran };
+ }, [test_case]);
+ assert_equals(!result.blocked, !!result.ran);
+ assert_equals(result.blocked, test_case.expected.blocked);
+ }, test_case.description);
+ };
+
+ const test_cases = [
+ {
+ description: "Ensure that test is working with a valid destination",
+ header_value: "blocked-destinations=\\(script\\)",
+ expected: {blocked: true},
+ },
+ {
+ description: "Ensure that test is working with a valid destination and source",
+ header_value: "blocked-destinations=\\(script\\)\\, sources=\\(inline\\)",
+ expected: {blocked: true},
+ },
+ {
+ description: "Ensure that an empty header does not block",
+ header_value: "",
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that a destination header with a token value does not parse",
+ header_value: "blocked-destinations=script",
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that a destination header with an inner list of strings does not parse",
+ header_value: 'blocked-destinations=\\("script"\\)',
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that a destination header with an inner list of single-quote strings does not parse",
+ header_value: "blocked-destinations=\\('script'\\)",
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that a destination header with an unclosed inner list does not parse",
+ header_value: "blocked-destinations=\\(script",
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that a destination header with a malformed inner list does not parse",
+ header_value: "blocked-destinations=\\(script\\,style\\)",
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that an unknown destination does not enforce a policy",
+ header_value: "blocked-destinations=\\(style\\)",
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that an unknown source causes the policy to not be enforced",
+ header_value: "blocked-destinations=\\(script\\)\\, sources=\\(telepathy\\)",
+ expected: {blocked: false},
+ },
+ {
+ description: "Ensure that an invalid source causes the policy to not be enforced",
+ header_value: "blocked-destinations=\\(script\\)\\, sources=\\(invalid",
+ expected: {blocked: false},
+ },
+ ];
+ test_cases.map(run_test);
+</script>
+
diff --git a/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/script.https.html b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/script.https.html
new file mode 100644
index 00000000000..783374db920
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/tentative/integrity-policy/script.https.html
@@ -0,0 +1,239 @@
+<!doctype html>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/reporting/resources/report-helper.js"></script>
+
+<body>
+<script>
+ const {ORIGIN} = get_host_info();
+ const getAbsoluteUrl = url => {
+ return new URL(url, window.location.href).href;
+ }
+
+ const check_report = async (reporting_endpoint, reporting_uuid, iframe_url, url, report_only) => {
+ const reports = await pollReports(reporting_endpoint, reporting_uuid);
+ const abs_iframe_url = getAbsoluteUrl(iframe_url);
+ checkReportExists(reports, 'integrity-violation', abs_iframe_url);
+ const abs_blocked_url = getAbsoluteUrl(url);
+ const report = getReport(reports, 'integrity-violation', abs_iframe_url, abs_blocked_url);
+ assert_not_equals(report, null);
+ assert_equals(report.body.documentURL, abs_iframe_url);
+ assert_equals(report.body.blockedURL, abs_blocked_url);
+ assert_equals(report.body.destination, "script");
+ assert_equals(report.body.reportOnly, report_only);
+ };
+ const blob = new Blob([`window.ran=true;`],
+ { type: 'application/javascript' });
+
+ const blob_url = URL.createObjectURL(blob);
+
+ // Generated using https://sha2.it/ed25519.html (In Chrome Canary, with Experimental Web Platform Features enabled)
+ const signature = encodeURIComponent(
+ 'header(Unencoded-Digest, sha-384=:tqyFpeo21WFM8HDeUtLqH20GUq\/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak:)' +
+ '|header(Signature-Input, signature=\\("unencoded-digest";sf\\); keyid="JrQLj5P\/89iXES9+vFgrIy29clF9CC\/oPPsw3c5D0bs="; tag="sri")' +
+ '|header(Signature, signature=:qM19uLskHm2TQG5LJcH/hY0n0BWWzYOJztVWYlwk0cZb3u0JdgUMre1J4Jn8Tma0x2u5/kPBfbXRMbB+X+vTBw==:)');
+
+ const test_cases = [
+ {
+ description: "Ensure that a script without integrity did not run",
+ url: "/content-security-policy/resources/ran.js",
+ cross_origin: true,
+ integrity: "",
+ policy_violation: true,
+ block: true,
+ endpoints: true,
+ expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false },
+ },
+ {
+ description: "Ensure that a script with unknown integrity algorithm did not run",
+ url: "/content-security-policy/resources/ran.js",
+ cross_origin: true,
+ integrity: "foobar-AAAAAAAAAAAAAAAAAAAa",
+ policy_violation: true,
+ block: true,
+ endpoints: true,
+ expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false },
+ },
+ {
+ description: "Ensure that a script without integrity algorithm runs and gets reported in report-only mode",
+ url: "/content-security-policy/resources/ran.js",
+ cross_origin: true,
+ integrity: "",
+ policy_violation: true,
+ block: false,
+ endpoints: true,
+ expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: true },
+ },
+ {
+ description: "Ensure that a no-cors script gets blocked",
+ url: "/content-security-policy/resources/ran.js",
+ cross_origin: false,
+ integrity: "sha384-tqyFpeo21WFM8HDeUtLqH20GUq/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak",
+ policy_violation: true,
+ block: true,
+ endpoints: true,
+ expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false },
+ },
+ {
+ description: "Ensure that ReportingObserver gets called without endpoints",
+ url: "/content-security-policy/resources/ran.js",
+ cross_origin: false,
+ integrity: "sha384-tqyFpeo21WFM8HDeUtLqH20GUq/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak",
+ policy_violation: true,
+ block: true,
+ endpoints: false,
+ expected: {blocked: ORIGIN + "/content-security-policy/resources/ran.js", ran: false },
+ },
+ {
+ description: "Ensure that a script with integrity runs",
+ url: "/content-security-policy/resources/ran.js",
+ cross_origin: true,
+ integrity: "sha384-tqyFpeo21WFM8HDeUtLqH20GUq/q3D1R6mqTzW3RtyTZ3dAYZJhC1wUcnkgOE2ak",
+ policy_violation: false,
+ block: true,
+ endpoints: true,
+ expected: {blocked: "", ran: true },
+ },
+ {
+ description: "Ensure that a script with signature integrity runs",
+ url: "/content-security-policy/resources/ran.js?pipe=" + signature,
+ cross_origin: true,
+ integrity: "ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=",
+ policy_violation: false,
+ block: true,
+ endpoints: true,
+ expected: {blocked: "", ran: true },
+ },
+ {
+ description: "Ensure that a data URI script with no integrity runs",
+ url: "data:application/javascript,window.ran=true",
+ cross_origin: true,
+ integrity: "",
+ policy_violation: false,
+ block: true,
+ endpoints: true,
+ expected: {blocked: "", ran: true },
+ },
+ {
+ description: "Ensure that a no-CORS data URI script with no integrity runs",
+ url: "data:application/javascript,window.ran=true",
+ cross_origin: false,
+ integrity: "",
+ policy_violation: false,
+ block: true,
+ endpoints: true,
+ expected: {blocked: "", ran: true },
+ },
+ {
+ description: "Ensure that a blob URL script with no integrity runs",
+ url: blob_url,
+ cross_origin: true,
+ integrity: "",
+ policy_violation: false,
+ block: true,
+ endpoints: true,
+ expected: {blocked: "", ran: true },
+ },
+ {
+ description: "Ensure that a no-CORS blob URL script with no integrity runs",
+ url: blob_url,
+ cross_origin: false,
+ integrity: "",
+ policy_violation: false,
+ block: true,
+ endpoints: true,
+ expected: {blocked: "", ran: true },
+ }
+ ];
+ test_cases.map(test_case => {
+ promise_test(async () => {
+ const REMOTE_EXECUTOR =
+ `/common/dispatcher/remote-executor.html?pipe=`;
+ const iframe_uuid = token();
+
+ const params = new URLSearchParams(location.search);
+ if (params.get('type') === "report") {
+ if (test_case.expected.blocked) {
+ return;
+ }
+ header_name += "-Report-Only";
+ }
+ const reporting_uuid_1 = token();
+ const reporting_uuid_2 = token();
+ const reporting_uuid_3 = token();
+ const reporting_endpoint = `${ORIGIN}/reporting/resources/report.py`;
+ let header = "";
+ if (test_case.block) {
+ header +=
+ `header(Integrity-Policy,blocked-destinations=\\(script\\)\\, endpoints=\\(integrity-endpoint-1 integrity-endpoint-2\\))`;
+ }
+ header +=
+ `|header(Integrity-Policy-Report-Only,blocked-destinations=\\(script\\)\\, endpoints=\\(integrity-endpoint-3\\))`;
+ if (test_case.endpoints) {
+ header +=
+ `|header(Reporting-Endpoints, integrity-endpoint-1=\"${reporting_endpoint}?reportID=${reporting_uuid_1}\"\\, ` +
+ `integrity-endpoint-2=\"${reporting_endpoint}?reportID=${reporting_uuid_2}\"\\, ` +
+ `integrity-endpoint-3=\"${reporting_endpoint}?reportID=${reporting_uuid_3}\")`;
+ }
+ const iframe_url = `${REMOTE_EXECUTOR}${encodeURIComponent(header)}&uuid=${iframe_uuid}`;
+
+ const iframe = document.createElement('iframe');
+ iframe.src = iframe_url;
+ document.body.appendChild(iframe);
+
+ // Execute code directly from the iframe.
+ const ctx = new RemoteContext(iframe_uuid);
+ const result = await ctx.execute_script(async (test_case) => {
+ window.ran = false;
+ let report_observed_promise;
+ if (test_case.policy_violation) {
+ report_observed_promise = new Promise(r => {
+ (new ReportingObserver((reports, observer) => {
+ reports.forEach(report => {
+ if (report.body.blockedURL.endsWith(test_case.url)) {
+ r(report.body);
+ observer.disconnect();
+ }
+ });
+ })).observe('integrity-violation');
+ });
+ }
+
+ // Load the script
+ await new Promise(resolve => {
+ const script = document.createElement('script');
+ if (test_case.cross_origin) {
+ script.crossOrigin="anonymous";
+ }
+ if (test_case.integrity) {
+ script.integrity = test_case.integrity;
+ }
+ script.onload = resolve;
+ script.onerror = resolve;
+ script.src = test_case.url;
+ document.body.appendChild(script);
+ });
+ const report_body = await report_observed_promise;
+ return { body: report_body, ran: window.ran };
+ }, [test_case]);
+ assert_equals(result.ran, test_case.expected.ran);
+ if (test_case.policy_violation) {
+ assert_equals(result.body.blockedURL, test_case.expected.blocked);
+ assert_true(result.body.documentURL.endsWith(iframe_url));
+ assert_equals(result.body.destination, "script");
+ assert_equals(result.body.reportOnly, !test_case.block);
+ }
+ if (test_case.endpoints && test_case.policy_violation) {
+ if (test_case.block) {
+ await check_report(reporting_endpoint, reporting_uuid_1, iframe_url, test_case.url, !test_case.block);
+ await check_report(reporting_endpoint, reporting_uuid_2, iframe_url, test_case.url, !test_case.block);
+ }
+ await check_report(reporting_endpoint, reporting_uuid_3, iframe_url, test_case.url, true);
+ }
+ }, test_case.description);
+ });
+</script>
diff --git a/tests/wpt/tests/svg/animations/discard-check-removal-order.html b/tests/wpt/tests/svg/animations/discard-check-removal-order.html
deleted file mode 100644
index 2935a69adda..00000000000
--- a/tests/wpt/tests/svg/animations/discard-check-removal-order.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<title>This tests for the remove order of discard elements.</title>
-<link rel="help" href="https://svgwg.org/specs/animations/#DiscardElement">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
-
-<body>
- <div id="removeOrder"></div>
- <svg id="svg" width="400" height="400">
- <rect id="rect" width="100" height="100" fill="green" />
- <animate id="animate" href="#rect" attributeName="x" from="0" to="300" dur="10s" />
- </svg>
- <script>
- const rootSVGElement = document.querySelector('svg');
-
- let removedNodes = new Array();
- let callback = function(mutations) {
- mutations.forEach(function(mutation) {
- let nodeList = mutation.removedNodes;
- for (let i = 0; i < nodeList.length; ++i) {
- removedNodes.push(nodeList[i].nodeName);
- }
- });
- };
- let observer = new MutationObserver(callback);
- observer.observe(rootSVGElement, { 'childList': true, 'subtree': true });
-
- function checkRemovedNodes(array) {
- assert_array_equals(removedNodes, array, 'removed nodes');
- }
-
- function discardElement(id) {
- let discard = createSVGElement("discard");
- discard.setAttribute("href", "#" + id);
- rootSVGElement.appendChild(discard);
- }
-
- discardElement("animate");
- discardElement("rect");
-
- smil_async_test(t => {
- runAnimationTest(t, [
- // [animationId, time, sampleCallback]
- ['anim', 1, checkRemovedNodes.bind(this, ['animate', 'discard', 'rect', 'discard'])],
- ]);
- });
- window.animationStartsImmediately = true;
- </script>
-</body>
-</html>
diff --git a/tests/wpt/tests/svg/animations/reftests/reference/green-100x100.svg b/tests/wpt/tests/svg/animations/reftests/reference/green-100x100.svg
deleted file mode 100644
index 120941444a4..00000000000
--- a/tests/wpt/tests/svg/animations/reftests/reference/green-100x100.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg">
- <rect width="100" height="100" fill="green"/>
-</svg>
diff --git a/tests/wpt/tests/svg/embedded/WEB_FEATURES.yml b/tests/wpt/tests/svg/embedded/WEB_FEATURES.yml
new file mode 100644
index 00000000000..8482e555584
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: fetch-priority
+ files:
+ - attr-image-fetchpriority.html
diff --git a/tests/wpt/tests/svg/idlharness.window.js b/tests/wpt/tests/svg/idlharness.window.js
index b363128c25a..57beca77fd4 100644
--- a/tests/wpt/tests/svg/idlharness.window.js
+++ b/tests/wpt/tests/svg/idlharness.window.js
@@ -42,7 +42,6 @@ const elements = [
'script',
'animate',
'set',
- 'discard',
'animateMotion',
'mpath',
'animateTransform',
@@ -111,7 +110,6 @@ idl_test(
SVGGElement: ['objects.g'],
SVGDefsElement: ['objects.defs'],
SVGDescElement: ['objects.desc'],
- SVGDiscardElement: ['objects.discard'],
SVGTitleElement: ['objects.title'],
SVGSymbolElement: ['objects.symbol'],
SVGUseElement: ['objects.use'],
@@ -168,7 +166,6 @@ idl_test(
SVGViewElement: ['objects.view'],
SVGScriptElement: ['objects.script'],
SVGAnimateElement: ['objects.animate'],
- SVGDiscardElement: ['objects.discard'],
SVGSetElement: ['objects.set'],
SVGAnimateMotionElement: ['objects.animateMotion'],
SVGMPathElement: ['objects.mpath'],
diff --git a/tests/wpt/tests/svg/scripted/WEB_FEATURES.yml b/tests/wpt/tests/svg/scripted/WEB_FEATURES.yml
new file mode 100644
index 00000000000..864bd3398ee
--- /dev/null
+++ b/tests/wpt/tests/svg/scripted/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: fetch-priority
+ files:
+ - attr-script-fetchpriority.html
diff --git a/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html b/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html
index 7bfa001030a..9a5da751ce1 100644
--- a/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html
+++ b/tests/wpt/tests/svg/styling/presentation-attributes-special-cases.html
@@ -98,7 +98,7 @@ if (CSS.supports("d", "initial")) {
// animation elements.
if (CSS.supports("fill", "initial")) {
- for (let e of ["animate", "animateMotion", "animateTransform", "discard", "set"]) {
+ for (let e of ["animate", "animateMotion", "animateTransform", "set"]) {
test(function() {
assertPresentationAttributeIsNotSupported(e, "fill", "blue", "fill");
}, `fill presentation attribute not supported on ${e}`);
diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py
index e587a082c03..fd5cf733ab7 100644
--- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py
+++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py
@@ -35,11 +35,16 @@ class Emulation(BidiModule):
def set_geolocation_override(
self,
coordinates: Union[CoordinatesOptions, Undefined] = UNDEFINED,
+ error: Optional[Dict[str, Any]] = None,
contexts: Optional[List[str]] = None,
user_contexts: Optional[List[str]] = None,
) -> Mapping[str, Any]:
- params: MutableMapping[str, Any] = {"coordinates": coordinates}
+ params: MutableMapping[str, Any] = {}
+ if coordinates is not UNDEFINED:
+ params["coordinates"] = coordinates
+ if error is not None:
+ params["error"] = error
if contexts is not None:
params["contexts"] = contexts
if user_contexts is not None:
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py
index 0e02d3c02cd..c796be18a73 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/android_webview.py
@@ -88,7 +88,6 @@ class SystemWebViewShell(ChromeAndroidBrowserBase):
def __init__(self, logger, binary, webdriver_binary="chromedriver",
adb_binary=None,
- remote_queue=None,
device_serial=None,
webdriver_args=None,
stackwalk_binary=None,
@@ -96,7 +95,7 @@ class SystemWebViewShell(ChromeAndroidBrowserBase):
"""Creates a new representation of Chrome. The `binary` argument gives
the browser binary to use for testing."""
super().__init__(logger,
- webdriver_binary, adb_binary, remote_queue,
+ webdriver_binary, adb_binary,
device_serial, webdriver_args, stackwalk_binary,
symbols_path)
self.binary = binary
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
index 820323e615a..4ed7707c3be 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -3,7 +3,7 @@
import mozprocess
import subprocess
-from .base import cmd_arg, require_arg
+from .base import OutputHandler, cmd_arg, require_arg
from .base import get_timeout_multiplier # noqa: F401
from .base import WebDriverBrowser # noqa: F401
from .chrome import executor_kwargs as chrome_executor_kwargs
@@ -79,10 +79,9 @@ def env_options():
class LogcatRunner:
- def __init__(self, logger, browser, remote_queue):
+ def __init__(self, logger, browser):
self.logger = logger
self.browser = browser
- self.remote_queue = remote_queue
def start(self):
try:
@@ -99,43 +98,31 @@ class LogcatRunner:
self.logger.error("Failed to clear logcat buffer")
self._cmd = self.browser.logcat_cmd()
+ self._output_handler = OutputHandler(self.logger, self._cmd)
self._proc = mozprocess.ProcessHandler(
self._cmd,
- processOutputLine=self.on_output,
+ processOutputLine=self._output_handler,
storeOutput=False)
self._proc.run()
-
- def _send_message(self, command, *args):
- try:
- self.remote_queue.put((command, args))
- except AssertionError:
- self.logger.warning("Error when send to remote queue")
+ self._output_handler.after_process_start(self._proc.pid)
+ self._output_handler.start()
def stop(self, force=False):
if self.is_alive():
kill_result = self._proc.kill()
if force and kill_result != 0:
self._proc.kill(9)
+ self._output_handler.after_process_stop()
def is_alive(self):
return hasattr(self._proc, "proc") and self._proc.poll() is None
- def on_output(self, line):
- data = {
- "action": "process_output",
- "process": "LOGCAT",
- "command": "logcat",
- "data": line
- }
- self._send_message("log", data)
-
class ChromeAndroidBrowserBase(WebDriverBrowser):
def __init__(self,
logger,
webdriver_binary="chromedriver",
adb_binary=None,
- remote_queue=None,
device_serial=None,
webdriver_args=None,
stackwalk_binary=None,
@@ -148,15 +135,11 @@ class ChromeAndroidBrowserBase(WebDriverBrowser):
self.device_serial = device_serial
self.stackwalk_binary = stackwalk_binary
self.symbols_path = symbols_path
- self.remote_queue = remote_queue
-
- if self.remote_queue is not None:
- self.logcat_runner = LogcatRunner(self.logger, self, self.remote_queue)
+ self.logcat_runner = LogcatRunner(self.logger, self)
def setup(self):
self.setup_adb_reverse()
- if self.remote_queue is not None:
- self.logcat_runner.start()
+ self.logcat_runner.start()
def _adb_run(self, args):
cmd = [self.adb_binary]
@@ -176,8 +159,7 @@ class ChromeAndroidBrowserBase(WebDriverBrowser):
super().cleanup()
self._adb_run(['forward', '--remove-all'])
self._adb_run(['reverse', '--remove-all'])
- if self.remote_queue is not None:
- self.logcat_runner.stop(force=True)
+ self.logcat_runner.stop(force=True)
def executor_browser(self):
cls, kwargs = super().executor_browser()
@@ -231,13 +213,12 @@ class ChromeAndroidBrowser(ChromeAndroidBrowserBase):
def __init__(self, logger, package_name,
webdriver_binary="chromedriver",
adb_binary=None,
- remote_queue = None,
device_serial=None,
webdriver_args=None,
stackwalk_binary=None,
symbols_path=None):
super().__init__(logger,
- webdriver_binary, adb_binary, remote_queue,
+ webdriver_binary, adb_binary,
device_serial, webdriver_args, stackwalk_binary,
symbols_path)
self.package_name = package_name
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
index 494a7514efd..c63bfa2ceeb 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -220,6 +220,7 @@ def run_info_extras(logger, default_prefs=None, **kwargs):
not bool_pref("fission.disableSessionHistoryInParent")),
"swgl": bool_pref("gfx.webrender.software"),
"privateBrowsing": bool_pref("browser.privatebrowsing.autostart"),
+ "remoteAsyncEvents": bool_pref("remote.events.async.wheel.enabled"),
"incOriginInit": os.environ.get("MOZ_ENABLE_INC_ORIGIN_INIT") == "1",
}
rv.update(run_info_browser_version(**kwargs))
@@ -250,6 +251,7 @@ def update_properties():
"swgl",
"asan",
"tsan",
+ "remoteAsyncEvents",
"sessionHistoryInParent",
"subsuite"], {
"os": ["version"],
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
index 9925a4b511d..8397d7838a3 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
@@ -1,4 +1,5 @@
# mypy: allow-untyped-defs
+from webdriver.bidi.undefined import UNDEFINED
webdriver = None
@@ -7,6 +8,22 @@ def do_delayed_imports():
global webdriver
import webdriver
+
+def get_browsing_context_id(context):
+ """
+ :param context: Either a string representing the browsing context id, or a
+ BiDi serialized window proxy object. In the latter case, the value is
+ extracted from the serialized object.
+ :return: The browsing context id.
+ """
+ if isinstance(context, str):
+ return context
+ elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
+ # Context can be a serialized WindowProxy.
+ return context.browsing_context
+ raise ValueError("Unexpected context type: %s" % context)
+
+
class BidiBluetoothHandleRequestDevicePrompt:
name = "bidi.bluetooth.handle_request_device_prompt"
@@ -16,18 +33,10 @@ class BidiBluetoothHandleRequestDevicePrompt:
self.protocol = protocol
async def __call__(self, payload):
- if payload["context"] is None:
+ if "context" not in payload:
raise ValueError("Missing required parameter: context")
- context = payload["context"]
- if isinstance(context, str):
- pass
- elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
- # Context can be a serialized WindowProxy.
- context = context.browsing_context
- else:
- raise ValueError("Unexpected context type: %s" % context)
-
+ context = get_browsing_context_id(payload["context"])
prompt = payload["prompt"]
accept = payload["accept"]
device = payload["device"]
@@ -42,17 +51,10 @@ class BidiBluetoothSimulateAdapterAction:
self.protocol = protocol
async def __call__(self, payload):
- if payload["context"] is None:
+ if "context" not in payload:
raise ValueError("Missing required parameter: context")
- context = payload["context"]
- if isinstance(context, str):
- pass
- elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
- # Context can be a serialized WindowProxy.
- context = context.browsing_context
- else:
- raise ValueError("Unexpected context type: %s" % context)
+ context = get_browsing_context_id(payload["context"])
state = payload["state"]
return await self.protocol.bidi_bluetooth.simulate_adapter(context,
@@ -68,17 +70,9 @@ class BidiBluetoothSimulatePreconnectedPeripheralAction:
self.protocol = protocol
async def __call__(self, payload):
- if payload["context"] is None:
+ if "context" not in payload:
raise ValueError("Missing required parameter: context")
-
- context = payload["context"]
- if isinstance(context, str):
- pass
- elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
- # Context can be a serialized WindowProxy.
- context = context.browsing_context
- else:
- raise ValueError("Unexpected context type: %s" % context)
+ context = get_browsing_context_id(payload["context"])
address = payload["address"]
name = payload["name"]
@@ -97,22 +91,29 @@ class BidiEmulationSetGeolocationOverrideAction:
self.protocol = protocol
async def __call__(self, payload):
- coordinates = payload['coordinates']
+ if "error" in payload and "coordinates" in payload:
+ raise ValueError(
+ "Params `error` and `coordinates` are mutually exclusive")
+
+ # If `error` is present, set it. Otherwise, do not pass it (error: None).
+ # Note, unlike `coordinates`, `error` cannot be `UNDEFINED`. It's either
+ # `None` and it's not passed, or some dict value which is passed.
+ error = payload['error'] if 'error' in payload else None
+ # If `error` is present, do not pass `coordinates` (coordinates: UNDEFINED).
+ # Otherwise, remove emulation (coordinates: None).
+ coordinates = payload['coordinates'] if 'coordinates' in payload else (
+ None if error is None else UNDEFINED)
+
+ if "contexts" not in payload:
+ raise ValueError("Missing required parameter: contexts")
contexts = []
for context in payload["contexts"]:
- # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the
- # value is extracted from the serialized object.
- if isinstance(context, str):
- contexts.append(context)
- elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
- contexts.append(context.browsing_context)
- else:
- raise ValueError("Unexpected context type: %s" % context)
+ contexts.append(get_browsing_context_id(context))
if len(contexts) == 0:
raise ValueError("At least one context must be provided")
return await self.protocol.bidi_emulation.set_geolocation_override(
- coordinates, contexts)
+ coordinates, error, contexts)
class BidiSessionSubscribeAction:
@@ -126,17 +127,10 @@ class BidiSessionSubscribeAction:
async def __call__(self, payload):
events = payload["events"]
contexts = None
- if payload["contexts"] is not None:
+ if "contexts" in payload and payload["contexts"] is not None:
contexts = []
for context in payload["contexts"]:
- # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the
- # value is extracted from the serialized object.
- if isinstance(context, str):
- contexts.append(context)
- elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
- contexts.append(context.browsing_context)
- else:
- raise ValueError("Unexpected context type: %s" % context)
+ contexts.append(get_browsing_context_id(context))
return await self.protocol.bidi_events.subscribe(events, contexts)
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index 87403c2944d..7ca46a05a7b 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -272,9 +272,9 @@ class WebDriverBidiEmulationProtocolPart(BidiEmulationProtocolPart):
def setup(self):
self.webdriver = self.parent.webdriver
- async def set_geolocation_override(self, coordinates, contexts):
+ async def set_geolocation_override(self, coordinates, error, contexts):
return await self.webdriver.bidi_session.emulation.set_geolocation_override(
- coordinates=coordinates, contexts=contexts)
+ coordinates=coordinates, error=error, contexts=contexts)
class WebDriverBidiPermissionsProtocolPart(BidiPermissionsProtocolPart):
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
index 833dff45636..16eb3cbb4a5 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
@@ -5,7 +5,10 @@ import traceback
from http.client import HTTPConnection
from abc import ABCMeta, abstractmethod
-from typing import Any, Awaitable, Callable, ClassVar, List, Mapping, Optional, Tuple, Type
+from typing import Any, Awaitable, Callable, ClassVar, List, Mapping, Optional, \
+ Tuple, Type, Union
+
+from webdriver.bidi.undefined import Undefined
def merge_dicts(target, source):
@@ -452,7 +455,8 @@ class BidiEmulationProtocolPart(ProtocolPart):
@abstractmethod
async def set_geolocation_override(self,
- coordinates: Optional[Mapping[str, Any]],
+ coordinates: Optional[Union[Mapping[str, Any], Undefined]],
+ error: Optional[Mapping[str, Any]],
contexts: List[str]) -> None:
pass
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/chromium.py
deleted file mode 100644
index 95f53011bfc..00000000000
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/chromium.py
+++ /dev/null
@@ -1,338 +0,0 @@
-# mypy: allow-untyped-defs
-
-import functools
-import json
-import time
-
-from collections import defaultdict
-from mozlog.formatters import base
-
-from wptrunner.wptmanifest import serializer
-
-_escape_heading = functools.partial(serializer.escape, extras="]")
-
-
-class ChromiumFormatter(base.BaseFormatter): # type: ignore
- """Formatter to produce results matching the Chromium JSON Test Results format.
- https://chromium.googlesource.com/chromium/src/+/master/docs/testing/json_test_results_format.md
-
- Notably, each test has an "artifacts" field that is a dict consisting of
- "log": a list of strings (one per subtest + one for harness status, see
- _append_test_message for the format)
- "screenshots": a list of strings in the format of "url: base64"
-
- """
-
- def __init__(self):
- # Whether the run was interrupted, either by the test runner or user.
- self.interrupted = False
-
- # A map of test status to the number of tests that had that status.
- self.num_failures_by_status = defaultdict(int)
-
- # Start time, expressed as offset since UNIX epoch in seconds. Measured
- # from the first `suite_start` event.
- self.start_timestamp_seconds = None
-
- # A map of test names to test start timestamps, expressed in seconds
- # since UNIX epoch. Only contains tests that are currently running
- # (i.e., have not received the `test_end` event).
- self.test_starts = {}
-
- # Trie of test results. Each directory in the test name is a node in
- # the trie and the leaf contains the dict of per-test data.
- self.tests = {}
-
- # Two dictionaries keyed by test name. Values are lists of strings:
- # actual metadata content and other messages, respectively.
- # See _append_test_message for examples.
- self.actual_metadata = defaultdict(list)
- self.messages = defaultdict(list)
-
- # List of tests that have failing subtests.
- self.tests_with_subtest_fails = set()
-
- # Browser log for the current test under execution.
- # These logs are from ChromeDriver's stdout/err, so we cannot say for
- # sure which test a message is from, but instead we correlate them based
- # on timing.
- self.browser_log = []
-
- def _append_test_message(self, test, subtest, wpt_actual_status, message):
- r"""
- Appends the message data for a test or subtest.
-
- :param str test: the name of the test
- :param str subtest: the name of the subtest with the message. Will be
- None if this is called for a test.
- :param str wpt_actual_status: the test status as reported by WPT
- :param str message: the string to append to the message for this test
-
- Example actual_metadata of a test with a subtest:
- "[test_name]\n expected: OK\n"
- " [subtest_name]\n expected: FAIL\n"
-
- NOTE: throughout this function we output a key called "expected" but
- fill it in with the actual status. This is by design. The goal of this
- output is to look exactly like WPT's expectation metadata so that it
- can be easily diff-ed.
-
- Messages are appended verbatim to self.messages[test].
- """
- if subtest:
- result = " [%s]\n expected: %s\n" % (_escape_heading(subtest),
- wpt_actual_status)
- self.actual_metadata[test].append(result)
- if message:
- self.messages[test].append("%s: %s\n" % (subtest, message))
- else:
- # No subtest, so this is the top-level test. The result must be
- # prepended to the list, so that it comes before any subtest.
- test_name_last_part = test.split("/")[-1]
- result = "[%s]\n expected: %s\n" % (
- _escape_heading(test_name_last_part), wpt_actual_status)
- self.actual_metadata[test].insert(0, result)
- if message:
- self.messages[test].insert(0, "Harness: %s\n" % message)
-
- def _append_artifact(self, cur_dict, artifact_name, artifact_value):
- """
- Appends artifacts to the specified dictionary.
- :param dict cur_dict: the test leaf dictionary to append to
- :param str artifact_name: the name of the artifact
- :param str artifact_value: the value of the artifact
- """
- assert isinstance(artifact_value, str), "artifact_value must be a str"
- if "artifacts" not in cur_dict.keys():
- cur_dict["artifacts"] = defaultdict(list)
- cur_dict["artifacts"][artifact_name].append(artifact_value)
-
- def _store_test_result(self, name, actual, expected, actual_metadata,
- messages, wpt_actual, subtest_failure,
- duration=None, reftest_screenshots=None):
- """
- Stores the result of a single test in |self.tests|
-
- :param str name: name of the test.
- :param str actual: actual status of the test.
- :param str expected: expected statuses of the test.
- :param list actual_metadata: a list of metadata items.
- :param list messages: a list of test messages.
- :param str wpt_actual: actual status reported by wpt, may differ from |actual|.
- :param bool subtest_failure: whether this test failed because of subtests.
- :param Optional[float] duration: time it took in seconds to run this test.
- :param Optional[list] reftest_screenshots: see executors/base.py for definition.
- """
- # The test name can contain a leading / which will produce an empty
- # string in the first position of the list returned by split. We use
- # filter(None) to remove such entries.
- name_parts = filter(None, name.split("/"))
- cur_dict = self.tests
- for name_part in name_parts:
- cur_dict = cur_dict.setdefault(name_part, {})
- # Splitting and joining the list of statuses here avoids the need for
- # recursively postprocessing the |tests| trie at shutdown. We assume the
- # number of repetitions is typically small enough for the quadratic
- # runtime to not matter.
- statuses = cur_dict.get("actual", "").split()
- statuses.append(actual)
- cur_dict["actual"] = " ".join(statuses)
- cur_dict["expected"] = expected
- if duration is not None:
- # Record the time to run the first invocation only.
- cur_dict.setdefault("time", duration)
- durations = cur_dict.setdefault("times", [])
- durations.append(duration)
- if subtest_failure:
- self._append_artifact(cur_dict, "wpt_subtest_failure", "true")
- if wpt_actual != actual:
- self._append_artifact(cur_dict, "wpt_actual_status", wpt_actual)
- if wpt_actual == 'CRASH':
- for line in self.browser_log:
- self._append_artifact(cur_dict, "wpt_crash_log", line)
- for metadata in actual_metadata:
- self._append_artifact(cur_dict, "wpt_actual_metadata", metadata)
- for message in messages:
- self._append_artifact(cur_dict, "wpt_log", message)
-
- # Store screenshots (if any).
- for item in reftest_screenshots or []:
- if not isinstance(item, dict):
- # Skip the relation string.
- continue
- data = "%s: %s" % (item["url"], item["screenshot"])
- self._append_artifact(cur_dict, "screenshots", data)
-
- # Figure out if there was a regression, unexpected status, or flake.
- # This only happens for tests that were run
- if actual != "SKIP":
- if actual not in expected:
- cur_dict["is_unexpected"] = True
- if actual != "PASS":
- cur_dict["is_regression"] = True
- if len(set(statuses)) > 1:
- cur_dict["is_flaky"] = True
-
- # Update the count of how many tests ran with each status. Only includes
- # the first invocation's result in the totals.
- if len(statuses) == 1:
- self.num_failures_by_status[actual] += 1
-
- def _map_status_name(self, status):
- """
- Maps a WPT status to a Chromium status.
-
- Chromium has five main statuses that we have to map to:
- CRASH: the test harness crashed
- FAIL: the test did not run as expected
- PASS: the test ran as expected
- SKIP: the test was not run
- TIMEOUT: the did not finish in time and was aborted
-
- :param str status: the string status of a test from WPT
- :return: a corresponding string status for Chromium
- """
- if status == "OK":
- return "PASS"
- if status == "NOTRUN":
- return "SKIP"
- if status == "EXTERNAL-TIMEOUT":
- return "TIMEOUT"
- if status in ("ERROR", "PRECONDITION_FAILED"):
- return "FAIL"
- if status == "INTERNAL-ERROR":
- return "CRASH"
- # Any other status just gets returned as-is.
- return status
-
- def _get_expected_status_from_data(self, actual_status, data):
- """
- Gets the expected statuses from a |data| dictionary.
-
- If there is no expected status in data, the actual status is returned.
- This is because mozlog will delete "expected" from |data| if it is the
- same as "status". So the presence of "expected" implies that "status" is
- unexpected. Conversely, the absence of "expected" implies the "status"
- is expected. So we use the "expected" status if it's there or fall back
- to the actual status if it's not.
-
- If the test has multiple statuses, it will have other statuses listed as
- "known_intermittent" in |data|. If these exist, they will be added to
- the returned status with spaced in between.
-
- :param str actual_status: the actual status of the test
- :param data: a data dictionary to extract expected status from
- :return str: the expected statuses as a string
- """
- expected_statuses = self._map_status_name(data["expected"]) if "expected" in data else actual_status
- if data.get("known_intermittent"):
- all_statsues = {self._map_status_name(other_status) for other_status in data["known_intermittent"]}
- all_statsues.add(expected_statuses)
- expected_statuses = " ".join(sorted(all_statsues))
- return expected_statuses
-
- def _get_time(self, data):
- """Get the timestamp of a message in seconds since the UNIX epoch."""
- maybe_timestamp_millis = data.get("time")
- if maybe_timestamp_millis is not None:
- return float(maybe_timestamp_millis) / 1000
- return time.time()
-
- def _time_test(self, test_name, data):
- """Time how long a test took to run.
-
- :param str test_name: the name of the test to time
- :param data: a data dictionary to extract the test end timestamp from
- :return Optional[float]: a nonnegative duration in seconds or None if
- the measurement is unavailable or invalid
- """
- test_start = self.test_starts.pop(test_name, None)
- if test_start is not None:
- # The |data| dictionary only provides millisecond resolution
- # anyway, so further nonzero digits are unlikely to be meaningful.
- duration = round(self._get_time(data) - test_start, 3)
- if duration >= 0:
- return duration
- return None
-
- def suite_start(self, data):
- if self.start_timestamp_seconds is None:
- self.start_timestamp_seconds = self._get_time(data)
- if 'run_info' in data:
- self.flag_specific = data['run_info'].get('flag_specific', '')
-
- def test_start(self, data):
- test_name = data["test"]
- self.test_starts[test_name] = self._get_time(data)
-
- def test_status(self, data):
- test_name = data["test"]
- wpt_actual_status = data["status"]
- actual_status = self._map_status_name(wpt_actual_status)
- expected_statuses = self._get_expected_status_from_data(actual_status, data)
-
- is_unexpected = actual_status not in expected_statuses
- if is_unexpected and test_name not in self.tests_with_subtest_fails:
- self.tests_with_subtest_fails.add(test_name)
- # We should always get a subtest in the data dict, but it's technically
- # possible that it's missing. Be resilient here.
- subtest_name = data.get("subtest", "UNKNOWN SUBTEST")
- self._append_test_message(test_name, subtest_name,
- wpt_actual_status, data.get("message", ""))
-
- def test_end(self, data):
- test_name = data["test"]
- # Save the status reported by WPT since we might change it when
- # reporting to Chromium.
- wpt_actual_status = data["status"]
- actual_status = self._map_status_name(wpt_actual_status)
- expected_statuses = self._get_expected_status_from_data(actual_status, data)
- duration = self._time_test(test_name, data)
- subtest_failure = False
- if test_name in self.tests_with_subtest_fails:
- subtest_failure = True
- # Clean up the test list to avoid accumulating too many.
- self.tests_with_subtest_fails.remove(test_name)
- # This test passed but it has failing subtests. Since we can only
- # report a single status to Chromium, we choose FAIL to indicate
- # that something about this test did not run correctly.
- if actual_status == "PASS":
- actual_status = "FAIL"
-
- self._append_test_message(test_name, None, wpt_actual_status,
- data.get("message", ""))
- self._store_test_result(test_name,
- actual_status,
- expected_statuses,
- self.actual_metadata[test_name],
- self.messages[test_name],
- wpt_actual_status,
- subtest_failure,
- duration,
- data.get("extra", {}).get("reftest_screenshots"))
-
- # Remove the test from dicts to avoid accumulating too many.
- self.actual_metadata.pop(test_name)
- self.messages.pop(test_name)
-
- # New test, new browser logs.
- self.browser_log = []
-
- def shutdown(self, data):
- # Create the final result dictionary
- final_result = {
- # There are some required fields that we just hard-code.
- "interrupted": False,
- "path_delimiter": "/",
- "version": 3,
- "seconds_since_epoch": self.start_timestamp_seconds,
- "num_failures_by_type": self.num_failures_by_status,
- "flag_name": self.flag_specific,
- "tests": self.tests
- }
- return json.dumps(final_result)
-
- def process_output(self, data):
- cmd = data.get("command", "")
- if any(c in cmd for c in ["chromedriver", "logcat"]):
- self.browser_log.append(data['data'])
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
deleted file mode 100644
index bf815d5dc76..00000000000
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
+++ /dev/null
@@ -1,828 +0,0 @@
-# mypy: ignore-errors
-
-import json
-import sys
-from os.path import dirname, join
-from io import StringIO
-
-from mozlog import handlers, structuredlog
-import pytest
-
-sys.path.insert(0, join(dirname(__file__), "..", ".."))
-from formatters.chromium import ChromiumFormatter
-
-
-@pytest.fixture
-def logger():
- test_logger = structuredlog.StructuredLogger("test_a")
- try:
- yield test_logger
- finally:
- # Loggers of the same name share state globally:
- # https://searchfox.org/mozilla-central/rev/1c54648c082efdeb08cf6a5e3a8187e83f7549b9/testing/mozbase/mozlog/mozlog/structuredlog.py#195-196
- #
- # Resetting the state here ensures the logger will not be shut down in
- # the next test.
- test_logger.reset_state()
-
-
-def test_chromium_required_fields(logger, capfd):
- # Test that the test results contain a handful of required fields.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # output a bunch of stuff
- logger.suite_start(["test-id-1"], run_info={}, time=123)
- logger.test_start("test-id-1")
- logger.test_end("test-id-1", status="PASS", expected="PASS")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_obj = json.load(output)
-
- # Check for existence of required fields
- assert "interrupted" in output_obj
- assert "path_delimiter" in output_obj
- assert "version" in output_obj
- assert "num_failures_by_type" in output_obj
- assert "tests" in output_obj
-
- test_obj = output_obj["tests"]["test-id-1"]
- assert "actual" in test_obj
- assert "expected" in test_obj
-
-
-def test_time_per_test(logger, capfd):
- # Test that the formatter measures time per test correctly.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- logger.suite_start(["test-id-1", "test-id-2"], run_info={}, time=50)
- logger.test_start("test-id-1", time=100)
- logger.test_start("test-id-2", time=200)
- logger.test_end("test-id-1", status="PASS", expected="PASS", time=300)
- logger.test_end("test-id-2", status="PASS", expected="PASS", time=199)
- logger.suite_end()
-
- logger.suite_start(["test-id-1"], run_info={}, time=400)
- logger.test_start("test-id-1", time=500)
- logger.test_end("test-id-1", status="PASS", expected="PASS", time=600)
- logger.suite_end()
-
- # Write the final results.
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_obj = json.load(output)
-
- test1_obj = output_obj["tests"]["test-id-1"]
- test2_obj = output_obj["tests"]["test-id-2"]
- # Test 1 run 1: 300ms - 100ms = 0.2s
- # Test 1 run 2: 600ms - 500ms = 0.1s
- assert test1_obj["time"] == pytest.approx(0.2)
- assert len(test1_obj["times"]) == 2
- assert test1_obj["times"][0] == pytest.approx(0.2)
- assert test1_obj["times"][1] == pytest.approx(0.1)
- assert "time" not in test2_obj
- assert "times" not in test2_obj
-
-
-def test_chromium_test_name_trie(logger, capfd):
- # Ensure test names are broken into directories and stored in a trie with
- # test results at the leaves.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # output a bunch of stuff
- logger.suite_start(["/foo/bar/test-id-1", "/foo/test-id-2"], run_info={},
- time=123)
- logger.test_start("/foo/bar/test-id-1")
- logger.test_end("/foo/bar/test-id-1", status="TIMEOUT", expected="FAIL")
- logger.test_start("/foo/test-id-2")
- logger.test_end("/foo/test-id-2", status="ERROR", expected="TIMEOUT")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_obj = json.load(output)
-
- # Ensure that the test names are broken up by directory name and that the
- # results are stored at the leaves.
- test_obj = output_obj["tests"]["foo"]["bar"]["test-id-1"]
- assert test_obj["actual"] == "TIMEOUT"
- assert test_obj["expected"] == "FAIL"
-
- test_obj = output_obj["tests"]["foo"]["test-id-2"]
- # The ERROR status is mapped to FAIL for Chromium
- assert test_obj["actual"] == "FAIL"
- assert test_obj["expected"] == "TIMEOUT"
-
-
-def test_num_failures_by_type(logger, capfd):
- # Test that the number of failures by status type is correctly calculated.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run some tests with different statuses: 3 passes, 1 timeout
- logger.suite_start(["t1", "t2", "t3", "t4"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="PASS", expected="PASS")
- logger.test_start("t2")
- logger.test_end("t2", status="PASS", expected="PASS")
- logger.test_start("t3")
- logger.test_end("t3", status="PASS", expected="FAIL")
- logger.test_start("t4")
- logger.test_end("t4", status="TIMEOUT", expected="CRASH")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- num_failures_by_type = json.load(output)["num_failures_by_type"]
-
- # We expect 3 passes and 1 timeout, nothing else.
- assert sorted(num_failures_by_type.keys()) == ["PASS", "TIMEOUT"]
- assert num_failures_by_type["PASS"] == 3
- assert num_failures_by_type["TIMEOUT"] == 1
-
-
-def test_subtest_messages(logger, capfd):
- # Tests accumulation of test output
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run two tests with subtest messages. The subtest name should be included
- # in the output. We should also tolerate missing messages and subtest names
- # with unusual characters.
- logger.suite_start(["t1", "t2"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_status("t1", status="FAIL", subtest="t1_a",
- message="t1_a_message")
- # Subtest name includes a backslash and two closing square brackets.
- logger.test_status("t1", status="PASS", subtest=r"t1_\[]]b",
- message="t1_b_message")
- logger.test_end("t1", status="PASS", expected="PASS")
- logger.test_start("t2")
- # Subtests with empty messages should not be ignored.
- logger.test_status("t2", status="PASS", subtest="t2_a")
- # A test-level message will also be appended
- logger.test_end("t2", status="TIMEOUT", expected="PASS",
- message="t2_message")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- t1_artifacts = output_json["tests"]["t1"]["artifacts"]
- assert t1_artifacts["wpt_actual_metadata"] == [
- "[t1]\n expected: PASS\n",
- " [t1_a]\n expected: FAIL\n",
- " [t1_\\\\[\\]\\]b]\n expected: PASS\n",
- ]
- assert t1_artifacts["wpt_log"] == [
- "t1_a: t1_a_message\n",
- # Only humans will read the log, so there's no need to escape
- # characters here.
- "t1_\\[]]b: t1_b_message\n",
- ]
- assert t1_artifacts["wpt_subtest_failure"] == ["true"]
- t2_artifacts = output_json["tests"]["t2"]["artifacts"]
- assert t2_artifacts["wpt_actual_metadata"] == [
- "[t2]\n expected: TIMEOUT\n",
- " [t2_a]\n expected: PASS\n",
- ]
- assert t2_artifacts["wpt_log"] == [
- "Harness: t2_message\n"
- ]
- assert "wpt_subtest_failure" not in t2_artifacts.keys()
-
-
-def test_subtest_failure(logger, capfd):
- # Tests that a test fails if a subtest fails
-
- # Set up the handler.
- output = StringIO()
- formatter = ChromiumFormatter()
- logger.add_handler(handlers.StreamHandler(output, formatter))
-
- # Run a test with some subtest failures.
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_status("t1", status="FAIL", subtest="t1_a",
- message="t1_a_message")
- logger.test_status("t1", status="PASS", subtest="t1_b",
- message="t1_b_message")
- logger.test_status("t1", status="TIMEOUT", subtest="t1_c",
- message="t1_c_message")
-
- # Make sure the test name was added to the set of tests with subtest fails
- assert "t1" in formatter.tests_with_subtest_fails
-
- # The test status is reported as a pass here because the harness was able to
- # run the test to completion.
- logger.test_end("t1", status="PASS", expected="PASS", message="top_message")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- t1_artifacts = test_obj["artifacts"]
- assert t1_artifacts["wpt_actual_metadata"] == [
- "[t1]\n expected: PASS\n",
- " [t1_a]\n expected: FAIL\n",
- " [t1_b]\n expected: PASS\n",
- " [t1_c]\n expected: TIMEOUT\n",
- ]
- assert t1_artifacts["wpt_log"] == [
- "Harness: top_message\n",
- "t1_a: t1_a_message\n",
- "t1_b: t1_b_message\n",
- "t1_c: t1_c_message\n",
- ]
- assert t1_artifacts["wpt_subtest_failure"] == ["true"]
- # The status of the test in the output is a failure because subtests failed,
- # despite the harness reporting that the test passed. But the harness status
- # is logged as an artifact.
- assert t1_artifacts["wpt_actual_status"] == ["PASS"]
- assert test_obj["actual"] == "FAIL"
- assert test_obj["expected"] == "PASS"
- # Also ensure that the formatter cleaned up its internal state
- assert "t1" not in formatter.tests_with_subtest_fails
-
-
-def test_expected_subtest_failure(logger, capfd):
- # Tests that an expected subtest failure does not cause the test to fail
-
- # Set up the handler.
- output = StringIO()
- formatter = ChromiumFormatter()
- logger.add_handler(handlers.StreamHandler(output, formatter))
-
- # Run a test with some expected subtest failures.
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_status("t1", status="FAIL", expected="FAIL", subtest="t1_a",
- message="t1_a_message")
- logger.test_status("t1", status="PASS", subtest="t1_b",
- message="t1_b_message")
- logger.test_status("t1", status="TIMEOUT", expected="TIMEOUT", subtest="t1_c",
- message="t1_c_message")
-
- # The subtest failures are all expected so this test should not be added to
- # the set of tests with subtest failures.
- assert "t1" not in formatter.tests_with_subtest_fails
-
- # The test status is reported as a pass here because the harness was able to
- # run the test to completion.
- logger.test_end("t1", status="OK", expected="OK")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- assert test_obj["artifacts"]["wpt_actual_metadata"] == [
- "[t1]\n expected: OK\n",
- " [t1_a]\n expected: FAIL\n",
- " [t1_b]\n expected: PASS\n",
- " [t1_c]\n expected: TIMEOUT\n",
- ]
- assert test_obj["artifacts"]["wpt_log"] == [
- "t1_a: t1_a_message\n",
- "t1_b: t1_b_message\n",
- "t1_c: t1_c_message\n",
- ]
- # The status of the test in the output is a pass because the subtest
- # failures were all expected.
- assert test_obj["actual"] == "PASS"
- assert test_obj["expected"] == "PASS"
-
-
-def test_unexpected_subtest_pass(logger, capfd):
- # A subtest that unexpectedly passes is considered a failure condition.
-
- # Set up the handler.
- output = StringIO()
- formatter = ChromiumFormatter()
- logger.add_handler(handlers.StreamHandler(output, formatter))
-
- # Run a test with a subtest that is expected to fail but passes.
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_status("t1", status="PASS", expected="FAIL", subtest="t1_a",
- message="t1_a_message")
-
- # Since the subtest behaviour is unexpected, it's considered a failure, so
- # the test should be added to the set of tests with subtest failures.
- assert "t1" in formatter.tests_with_subtest_fails
-
- # The test status is reported as a pass here because the harness was able to
- # run the test to completion.
- logger.test_end("t1", status="PASS", expected="PASS")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- t1_artifacts = test_obj["artifacts"]
- assert t1_artifacts["wpt_actual_metadata"] == [
- "[t1]\n expected: PASS\n",
- " [t1_a]\n expected: PASS\n",
- ]
- assert t1_artifacts["wpt_log"] == [
- "t1_a: t1_a_message\n",
- ]
- assert t1_artifacts["wpt_subtest_failure"] == ["true"]
- # Since the subtest status is unexpected, we fail the test. But we report
- # wpt_actual_status as an artifact
- assert t1_artifacts["wpt_actual_status"] == ["PASS"]
- assert test_obj["actual"] == "FAIL"
- assert test_obj["expected"] == "PASS"
- # Also ensure that the formatter cleaned up its internal state
- assert "t1" not in formatter.tests_with_subtest_fails
-
-
-def test_expected_test_fail(logger, capfd):
- # Check that an expected test-level failure is treated as a Pass
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run some tests with different statuses: 3 passes, 1 timeout
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="ERROR", expected="ERROR")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- # The test's actual and expected status should map from "ERROR" to "FAIL"
- assert test_obj["actual"] == "FAIL"
- assert test_obj["expected"] == "FAIL"
- # ..and this test should not be a regression nor unexpected
- assert "is_regression" not in test_obj
- assert "is_unexpected" not in test_obj
-
-
-def test_unexpected_test_fail(logger, capfd):
- # Check that an unexpected test-level failure is marked as unexpected and
- # as a regression.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run some tests with different statuses: 3 passes, 1 timeout
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="ERROR", expected="OK")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- # The test's actual and expected status should be mapped, ERROR->FAIL and
- # OK->PASS
- assert test_obj["actual"] == "FAIL"
- assert test_obj["expected"] == "PASS"
- # ..and this test should be a regression and unexpected
- assert test_obj["is_regression"] is True
- assert test_obj["is_unexpected"] is True
-
-
-def test_flaky_test_expected(logger, capfd):
- # Check that a flaky test with multiple possible statuses is seen as
- # expected if its actual status is one of the possible ones.
-
- # set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run a test that is known to be flaky
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="ERROR", expected="OK", known_intermittent=["ERROR", "TIMEOUT"])
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- # The test's statuses are all mapped, changing ERROR->FAIL and OK->PASS
- assert test_obj["actual"] == "FAIL"
- # All the possible statuses are merged and sorted together into expected.
- assert test_obj["expected"] == "FAIL PASS TIMEOUT"
- # ...this is not a regression or unexpected because the actual status is one
- # of the expected ones
- assert "is_regression" not in test_obj
- assert "is_unexpected" not in test_obj
-
-
-def test_flaky_test_unexpected(logger, capfd):
- # Check that a flaky test with multiple possible statuses is seen as
- # unexpected if its actual status is NOT one of the possible ones.
-
- # set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run a test that is known to be flaky
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="ERROR", expected="OK", known_intermittent=["TIMEOUT"])
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- # The test's statuses are all mapped, changing ERROR->FAIL and OK->PASS
- assert test_obj["actual"] == "FAIL"
- # All the possible statuses are merged and sorted together into expected.
- assert test_obj["expected"] == "PASS TIMEOUT"
- # ...this is a regression and unexpected because the actual status is not
- # one of the expected ones
- assert test_obj["is_regression"] is True
- assert test_obj["is_unexpected"] is True
-
-
-def test_precondition_failed(logger, capfd):
- # Check that a failed precondition gets properly handled.
-
- # set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run a test with a precondition failure
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="PRECONDITION_FAILED", expected="OK")
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- # The precondition failure should map to FAIL status, but we should also
- # have an artifact containing the original PRECONDITION_FAILED status.
- assert test_obj["actual"] == "FAIL"
- assert test_obj["artifacts"]["wpt_actual_status"] == ["PRECONDITION_FAILED"]
- # ...this is an unexpected regression because we expected a pass but failed
- assert test_obj["is_regression"] is True
- assert test_obj["is_unexpected"] is True
-
-
-def test_repeated_test_statuses(logger, capfd):
- # Check that the logger outputs all statuses from multiple runs of a test.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run a test suite for the first time.
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="PASS", expected="PASS", known_intermittent=[])
- logger.suite_end()
-
- # Run the test suite for the second time.
- logger.suite_start(["t1"], run_info={}, time=456)
- logger.test_start("t1")
- logger.test_end("t1", status="FAIL", expected="PASS", known_intermittent=[])
- logger.suite_end()
-
- # Write the final results.
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- status_totals = output_json["num_failures_by_type"]
- assert status_totals["PASS"] == 1
- # A missing result type is the same as being present and set to zero (0).
- assert status_totals.get("FAIL", 0) == 0
-
- # The actual statuses are accumulated in a ordered space-separated list.
- test_obj = output_json["tests"]["t1"]
- assert test_obj["actual"] == "PASS FAIL"
- assert test_obj["expected"] == "PASS"
-
-
-def test_flaky_test_detection(logger, capfd):
- # Check that the logger detects flakiness for a test run multiple times.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- logger.suite_start(["t1", "t2"], run_info={})
- logger.test_start("t1")
- logger.test_start("t2")
- logger.test_end("t1", status="FAIL", expected="PASS")
- logger.test_end("t2", status="FAIL", expected="FAIL")
- logger.suite_end()
-
- logger.suite_start(["t1", "t2"], run_info={})
- logger.test_start("t1")
- logger.test_start("t2")
- logger.test_end("t1", status="PASS", expected="PASS")
- logger.test_end("t2", status="FAIL", expected="FAIL")
- logger.suite_end()
-
- # Write the final results.
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- # We consider a test flaky if it runs multiple times and produces more than
- # one kind of result.
- test1_obj = output_json["tests"]["t1"]
- test2_obj = output_json["tests"]["t2"]
- assert test1_obj["is_flaky"] is True
- assert "is_flaky" not in test2_obj
-
-
-def test_known_intermittent_empty(logger, capfd):
- # If the known_intermittent list is empty, we want to ensure we don't append
- # any extraneous characters to the output.
-
- # set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run a test and include an empty known_intermittent list
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="OK", expected="OK", known_intermittent=[])
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- # Both actual and expected statuses get mapped to Pass. No extra whitespace
- # anywhere.
- assert test_obj["actual"] == "PASS"
- assert test_obj["expected"] == "PASS"
-
-
-def test_known_intermittent_duplicate(logger, capfd):
- # We don't want to have duplicate statuses in the final "expected" field.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # There are two duplications in this input:
- # 1. known_intermittent already contains expected;
- # 2. both statuses in known_intermittent map to FAIL in Chromium.
- # In the end, we should only get one FAIL in Chromium "expected".
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="ERROR", expected="ERROR", known_intermittent=["FAIL", "ERROR"])
- logger.suite_end()
- logger.shutdown()
-
- # Check nothing got output to stdout/stderr.
- # (Note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # Check the actual output of the formatter.
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- assert test_obj["actual"] == "FAIL"
- # No duplicate "FAIL" in "expected".
- assert test_obj["expected"] == "FAIL"
-
-
-def test_reftest_screenshots(logger, capfd):
- # reftest_screenshots, if present, should be plumbed into artifacts.
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- # Run a reftest with reftest_screenshots.
- logger.suite_start(["t1"], run_info={}, time=123)
- logger.test_start("t1")
- logger.test_end("t1", status="FAIL", expected="PASS", extra={
- "reftest_screenshots": [
- {"url": "foo.html", "hash": "HASH1", "screenshot": "DATA1"},
- "!=",
- {"url": "foo-ref.html", "hash": "HASH2", "screenshot": "DATA2"},
- ]
- })
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- assert test_obj["artifacts"]["screenshots"] == [
- "foo.html: DATA1",
- "foo-ref.html: DATA2",
- ]
-
-
-def test_process_output_crashing_test(logger, capfd):
- """Test that chromedriver logs are preserved for crashing tests"""
-
- # Set up the handler.
- output = StringIO()
- logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
-
- logger.suite_start(["t1", "t2", "t3"], run_info={}, time=123)
-
- logger.test_start("t1")
- logger.process_output(100, "This message should be recorded", "/some/path/to/chromedriver --some-flag")
- logger.process_output(101, "This message should not be recorded", "/some/other/process --another-flag")
- logger.process_output(100, "This message should also be recorded", "/some/path/to/chromedriver --some-flag")
- logger.test_end("t1", status="CRASH", expected="CRASH")
-
- logger.test_start("t2")
- logger.process_output(100, "Another message for the second test", "/some/path/to/chromedriver --some-flag")
- logger.test_end("t2", status="CRASH", expected="PASS")
-
- logger.test_start("t3")
- logger.process_output(100, "This test fails", "/some/path/to/chromedriver --some-flag")
- logger.process_output(100, "But the output should not be captured", "/some/path/to/chromedriver --some-flag")
- logger.process_output(100, "Because it does not crash", "/some/path/to/chromedriver --some-flag")
- logger.test_end("t3", status="FAIL", expected="PASS")
-
- logger.suite_end()
- logger.shutdown()
-
- # check nothing got output to stdout/stderr
- # (note that mozlog outputs exceptions during handling to stderr!)
- captured = capfd.readouterr()
- assert captured.out == ""
- assert captured.err == ""
-
- # check the actual output of the formatter
- output.seek(0)
- output_json = json.load(output)
-
- test_obj = output_json["tests"]["t1"]
- assert test_obj["artifacts"]["wpt_crash_log"] == [
- "This message should be recorded",
- "This message should also be recorded"
- ]
-
- test_obj = output_json["tests"]["t2"]
- assert test_obj["artifacts"]["wpt_crash_log"] == [
- "Another message for the second test"
- ]
-
- test_obj = output_json["tests"]["t3"]
- assert "wpt_crash_log" not in test_obj["artifacts"]
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
index ab8b04ba3cd..3c2dd8b42dd 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
@@ -263,11 +263,14 @@
window.test_driver_internal.bidi.emulation.set_geolocation_override =
function (params) {
+ if ('coordinates' in params && 'error' in params) {
+ throw new Error(
+ "`coordinates` and `error` are mutually exclusive in set_geolocation_override");
+ }
+
return create_action("bidi.emulation.set_geolocation_override", {
// Default to the current window.
contexts: [window],
- // Default to no coordinates.
- coordinates: null,
...(params ?? {})
});
}
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py
index 64668fc470b..2c2da790e90 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py
@@ -601,7 +601,7 @@ class TestRunnerManager(threading.Thread):
assert self.browser.browser is not None
self.browser.browser.cleanup()
impl = self.test_implementations[(self.state.subsuite, self.state.test_type)]
- browser = impl.browser_cls(self.logger, remote_queue=self.command_queue,
+ browser = impl.browser_cls(self.logger,
**impl.browser_kwargs)
browser.setup()
self.browser = BrowserManager(self.logger,
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py
index 647cc7f21b1..7bfeef31717 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -11,7 +11,7 @@ from typing import Mapping, Optional
from . import config
from . import products
from . import wpttest
-from .formatters import chromium, wptreport, wptscreenshot
+from .formatters import wptreport, wptscreenshot
def abs_path(path):
@@ -418,7 +418,6 @@ scheme host and port.""")
"Cache API (default: %s)" % wptscreenshot.DEFAULT_API,
{"wptscreenshot"}, "store")
- commandline.log_formatters["chromium"] = (chromium.ChromiumFormatter, "Chromium Layout Tests format")
commandline.log_formatters["wptreport"] = (wptreport.WptreportFormatter, "wptreport format")
commandline.log_formatters["wptscreenshot"] = (wptscreenshot.WptscreenshotFormatter, "wpt.fyi screenshots")
diff --git a/tests/wpt/tests/wasm/core/js/simd/simd_select.wast.js b/tests/wpt/tests/wasm/core/js/simd/simd_select.wast.js
new file mode 100644
index 00000000000..e997d81f75a
--- /dev/null
+++ b/tests/wpt/tests/wasm/core/js/simd/simd_select.wast.js
@@ -0,0 +1,24 @@
+(function simd_select_wast_js() {
+
+// simd_select.wast:3
+let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x88\x80\x80\x80\x00\x01\x60\x03\x7b\x7b\x7f\x01\x7b\x03\x82\x80\x80\x80\x00\x01\x00\x07\x93\x80\x80\x80\x00\x01\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x00\x0a\x8f\x80\x80\x80\x00\x01\x89\x80\x80\x80\x00\x00\x20\x00\x20\x01\x20\x02\x1b\x0b");
+
+// simd_select.wast:9
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xfd\x0c\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\x41\x01\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("1 2 3 4"), v128("5 6 7 8"), 1]), v128("1 2 3 4"))
+
+// simd_select.wast:18
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xfd\x0c\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\x41\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("1 2 3 4"), v128("5 6 7 8"), 0]), v128("5 6 7 8"))
+
+// simd_select.wast:27
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x00\x00\x80\x3f\x00\x00\x00\x40\x00\x00\x40\x40\x00\x00\x80\x40\xfd\x0c\x00\x00\xa0\x40\x00\x00\xc0\x40\x00\x00\xe0\x40\x00\x00\x00\x41\x41\x7f\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x00\x00\x80\x3f\x00\x00\x00\x40\x00\x00\x40\x40\x00\x00\x80\x40\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("1_065_353_216 1_073_741_824 1_077_936_128 1_082_130_432"), v128("1_084_227_584 1_086_324_736 1_088_421_888 1_090_519_040"), -1]), v128("1. 2. 3. 4."))
+
+// simd_select.wast:36
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x00\x00\xc0\xbf\x00\x00\x20\xc0\x00\x00\x60\xc0\x00\x00\x90\xc0\xfd\x0c\x00\x00\x18\x41\x00\x00\x08\x41\x00\x00\xf0\x40\x00\x00\xd0\x40\x41\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x00\x00\x18\x41\x00\x00\x08\x41\x00\x00\xf0\x40\x00\x00\xd0\x40\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("-1_077_936_128 -1_071_644_672 -1_067_450_368 -1_064_304_640"), v128("1_092_091_904 1_091_043_328 1_089_470_464 1_087_373_312"), 0]), v128("9.5 8.5 7.5 6.5"))
+
+// simd_select.wast:45
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe3\x80\x80\x80\x00\x01\xdd\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\xfd\x0c\x10\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x41\xfb\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("67_305_985 134_678_021 202_050_057 269_422_093"), v128("219_025_168 151_653_132 84_281_096 16_909_060"), 123]), v128("1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"))
+
+// simd_select.wast:54
+run(() => call(instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\xa6\x80\x80\x80\x00\x07\x60\x00\x00\x60\x01\x7f\x01\x6f\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x02\x6f\x6f\x01\x7f\x60\x02\x70\x70\x01\x7f\x60\x03\x7b\x7b\x7f\x01\x7b\x02\x8b\x81\x80\x80\x00\x06\x06\x6d\x6f\x64\x75\x6c\x65\x0f\x73\x65\x6c\x65\x63\x74\x5f\x76\x31\x32\x38\x5f\x69\x33\x32\x00\x06\x08\x73\x70\x65\x63\x74\x65\x73\x74\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x69\x73\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x02\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x69\x73\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x03\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0c\x65\x71\x5f\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x04\x08\x73\x70\x65\x63\x74\x65\x73\x74\x0a\x65\x71\x5f\x66\x75\x6e\x63\x72\x65\x66\x00\x05\x03\x82\x80\x80\x80\x00\x01\x00\x07\x87\x80\x80\x80\x00\x01\x03\x72\x75\x6e\x00\x06\x0a\xe2\x80\x80\x80\x00\x01\xdc\x80\x80\x80\x00\x00\x02\x40\xfd\x0c\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xfd\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x10\x00\xfd\x0c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x4e\xfd\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x23\xfd\x63\x45\x0d\x00\x0f\x0b\x00\x0b", exports($1)), "run", [])); // assert_return(() => call($1, "select_v128_i32", [v128("16_843_009 16_843_009 16_843_009 16_843_009"), v128("0 0 0 0"), 0]), v128("0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"))
+reinitializeRegistry();
+})();
diff --git a/tests/wpt/tests/wasm/core/simd/simd_select.wast.js.html b/tests/wpt/tests/wasm/core/simd/simd_select.wast.js.html
new file mode 100644
index 00000000000..5d50138374b
--- /dev/null
+++ b/tests/wpt/tests/wasm/core/simd/simd_select.wast.js.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>WebAssembly Web Platform Test</title>
+ </head>
+ <body>
+
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="../js/harness/async_index.js"></script>
+
+ <div id=log></div>
+ <script src="../js/simd/simd_select.wast.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/webdriver/tests/bidi/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/__init__.py
index 955335ea87e..587dc91a938 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/__init__.py
@@ -132,7 +132,7 @@ def assert_handle(obj: Mapping[str, Any], should_contain_handle: bool) -> None:
assert "handle" not in obj, f"Result should not contain `handle`. Actual: {obj}"
-async def create_console_api_message(bidi_session, context: str, text: str):
+async def create_console_api_message(bidi_session, context: Any, text: str):
await bidi_session.script.call_function(
function_declaration="""(text) => console.log(text)""",
arguments=[{"type": "string", "value": text}],
@@ -142,7 +142,7 @@ async def create_console_api_message(bidi_session, context: str, text: str):
return text
-async def get_device_pixel_ratio(bidi_session, context: str) -> float:
+async def get_device_pixel_ratio(bidi_session, context: Any) -> float:
result = await bidi_session.script.call_function(
function_declaration="""() => {
return window.devicePixelRatio;
@@ -167,7 +167,7 @@ async def get_element_dimensions(bidi_session, context, element):
return remote_mapping_to_dict(result["value"])
-async def get_viewport_dimensions(bidi_session, context: str,
+async def get_viewport_dimensions(bidi_session, context: Any,
with_scrollbar: bool = True, quirk_mode: bool = False):
if with_scrollbar:
expression = """
@@ -198,7 +198,7 @@ async def get_viewport_dimensions(bidi_session, context: str,
return remote_mapping_to_dict(result["value"])
-async def get_document_dimensions(bidi_session, context: str):
+async def get_document_dimensions(bidi_session, context: Any):
expression = """
({
height: document.documentElement.scrollHeight,
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py
index 64c26163734..fa1e748d6b2 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py
@@ -1,11 +1,13 @@
import pytest
+from webdriver.bidi.modules.script import ContextTarget
from webdriver.bidi.undefined import UNDEFINED
from ... import get_device_pixel_ratio, get_viewport_dimensions
-
pytestmark = pytest.mark.asyncio
+CONTEXT_LOAD_EVENT = "browsingContext.load"
+
async def test_set_to_user_context(bidi_session, new_tab, create_user_context):
user_context = await create_user_context()
@@ -55,6 +57,48 @@ async def test_set_to_user_context(bidi_session, new_tab, create_user_context):
)
+async def test_set_to_user_context_window_open(
+ bidi_session,
+ new_tab,
+ create_user_context,
+ inline,
+ subscribe_events,
+ wait_for_event,
+ wait_for_future_safe,
+):
+ user_context = await create_user_context()
+ context_in_user_context_1 = await bidi_session.browsing_context.create(
+ user_context=user_context, type_hint="tab"
+ )
+
+ test_viewport = {"width": 250, "height": 300}
+ await bidi_session.browsing_context.set_viewport(
+ user_contexts=[user_context], viewport=test_viewport
+ )
+ assert (
+ await get_viewport_dimensions(bidi_session, context_in_user_context_1)
+ == test_viewport
+ )
+
+ await subscribe_events(events=[CONTEXT_LOAD_EVENT])
+
+ # Assert that tabs opened via window.open in the same user context
+ # successfully load and have the right viewport set.
+ on_load = wait_for_event(CONTEXT_LOAD_EVENT)
+ result = await bidi_session.script.evaluate(
+ await_promise=False,
+ expression=f"""window.open('{inline("popup")}')""",
+ target=ContextTarget(context_in_user_context_1["context"]),
+ )
+ event = await wait_for_future_safe(on_load)
+
+ contexts = await bidi_session.browsing_context.get_tree(root=event["context"])
+ assert len(contexts) == 1
+ popup_context = contexts[0]
+
+ assert await get_viewport_dimensions(bidi_session, popup_context) == test_viewport
+
+
async def test_set_to_default_user_context(bidi_session, new_tab, create_user_context):
user_context = await create_user_context()
context_in_user_context_1 = await bidi_session.browsing_context.create(
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py
index 33dcca90f04..5e1fd1aa863 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/__init__.py
@@ -1,28 +1 @@
-from webdriver.bidi.modules.script import ContextTarget
-
-from ... import remote_mapping_to_dict
-
-
TEST_COORDINATES = {"latitude": 10, "longitude": 15, "accuracy": 0.5}
-
-
-async def get_current_geolocation(bidi_session, context):
- # Per geolocation spec, the geolocation coordinates are returned
- # only for an active browsing context. It might be required to
- # re-activate the previously active tab in the test.
- await bidi_session.browsing_context.activate(context=context["context"])
-
- result = await bidi_session.script.call_function(
- function_declaration="""() =>
- new Promise(
- resolve => window.navigator.geolocation.getCurrentPosition(
- position => resolve(position.coords.toJSON()),
- error => resolve({code: error.code, message: error.message}),
- {timeout: 500}
- ))
- """,
- target=ContextTarget(context["context"]),
- await_promise=True,
- )
-
- return remote_mapping_to_dict(result["value"])
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py
index a90895c74ed..5fb9451f0a2 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/conftest.py
@@ -1,6 +1,35 @@
import pytest_asyncio
-from ... import get_context_origin
+from webdriver.bidi.modules.script import ContextTarget
+
+from ... import get_context_origin, remote_mapping_to_dict
+
+
+@pytest_asyncio.fixture
+async def get_current_geolocation(bidi_session, configuration):
+ async def get_current_geolocation(context):
+ # Per geolocation spec, the geolocation coordinates are returned
+ # only for an active browsing context. It might be required to
+ # re-activate the previously active tab in the test.
+ await bidi_session.browsing_context.activate(context=context["context"])
+
+ result = await bidi_session.script.call_function(
+ function_declaration="""(multiplier) =>
+ new Promise(
+ resolve => window.navigator.geolocation.getCurrentPosition(
+ position => resolve(position.coords.toJSON()),
+ error => resolve({code: error.code}),
+ {timeout: 500 * multiplier}
+ ))
+ """,
+ arguments=[{"type": "number", "value": configuration["timeout_multiplier"]}],
+ target=ContextTarget(context["context"]),
+ await_promise=True,
+ )
+
+ return remote_mapping_to_dict(result["value"])
+
+ return get_current_geolocation
@pytest_asyncio.fixture
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py
index 8a0e43475da..068bb804e73 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/contexts.py
@@ -2,14 +2,14 @@ import pytest
from webdriver.bidi.modules.emulation import CoordinatesOptions
-from . import get_current_geolocation, TEST_COORDINATES
+from . import TEST_COORDINATES
pytestmark = pytest.mark.asyncio
async def test_contexts(
- bidi_session, new_tab, top_context, url, set_geolocation_permission
+ bidi_session, new_tab, top_context, url, get_current_geolocation, set_geolocation_permission
):
test_url = url("/common/blank.html")
await bidi_session.browsing_context.navigate(
@@ -24,12 +24,10 @@ async def test_contexts(
)
await set_geolocation_permission(new_tab)
- default_coordinates = await get_current_geolocation(bidi_session, new_tab)
+ default_coordinates = await get_current_geolocation(new_tab)
assert default_coordinates != TEST_COORDINATES
- assert (
- await get_current_geolocation(bidi_session, top_context) == default_coordinates
- )
+ assert await get_current_geolocation(top_context) == default_coordinates
# Set geolocation override.
await bidi_session.emulation.set_geolocation_override(
@@ -41,24 +39,20 @@ async def test_contexts(
),
)
- assert await get_current_geolocation(bidi_session, new_tab) == TEST_COORDINATES
- assert (
- await get_current_geolocation(bidi_session, top_context) == default_coordinates
- )
+ assert await get_current_geolocation(new_tab) == TEST_COORDINATES
+ assert await get_current_geolocation(top_context) == default_coordinates
# Reset geolocation override.
await bidi_session.emulation.set_geolocation_override(
contexts=[new_tab["context"]], coordinates=None
)
- assert await get_current_geolocation(bidi_session, new_tab) == default_coordinates
- assert (
- await get_current_geolocation(bidi_session, top_context) == default_coordinates
- )
+ assert await get_current_geolocation(new_tab) == default_coordinates
+ assert await get_current_geolocation(top_context) == default_coordinates
async def test_multiple_contexts(
- bidi_session, new_tab, url, set_geolocation_permission
+ bidi_session, new_tab, url, get_current_geolocation, set_geolocation_permission
):
new_context = await bidi_session.browsing_context.create(type_hint="tab")
test_url = url("/common/blank.html")
@@ -74,12 +68,10 @@ async def test_multiple_contexts(
)
await set_geolocation_permission(new_tab)
- default_coordinates = await get_current_geolocation(bidi_session, new_tab)
+ default_coordinates = await get_current_geolocation(new_tab)
assert default_coordinates != TEST_COORDINATES
- assert (
- await get_current_geolocation(bidi_session, new_context) == default_coordinates
- )
+ assert await get_current_geolocation(new_context) == default_coordinates
# Set geolocation override.
await bidi_session.emulation.set_geolocation_override(
@@ -91,8 +83,8 @@ async def test_multiple_contexts(
),
)
- assert await get_current_geolocation(bidi_session, new_tab) == TEST_COORDINATES
- assert await get_current_geolocation(bidi_session, new_context) == TEST_COORDINATES
+ assert await get_current_geolocation(new_tab) == TEST_COORDINATES
+ assert await get_current_geolocation(new_context) == TEST_COORDINATES
# Reset geolocation override.
await bidi_session.emulation.set_geolocation_override(
@@ -101,7 +93,5 @@ async def test_multiple_contexts(
# The new coordinates can be different from the initial ones if the position
# was not available at the beginning.
- assert await get_current_geolocation(bidi_session, new_tab) != TEST_COORDINATES
- assert (
- await get_current_geolocation(bidi_session, new_context) != TEST_COORDINATES
- )
+ assert await get_current_geolocation(new_tab) != TEST_COORDINATES
+ assert await get_current_geolocation(new_context) != TEST_COORDINATES
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py
index b23354e9e42..ea4fe643c3e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/coordinates.py
@@ -4,7 +4,6 @@ from webdriver.bidi.modules.emulation import CoordinatesOptions
from webdriver.bidi.modules.script import ContextTarget
from ... import remote_mapping_to_dict
-from . import get_current_geolocation
pytestmark = pytest.mark.asyncio
@@ -22,7 +21,12 @@ pytestmark = pytest.mark.asyncio
],
)
async def test_get_current_position(
- bidi_session, new_tab, url, set_geolocation_permission, test_coordinates
+ bidi_session,
+ new_tab,
+ url,
+ get_current_geolocation,
+ set_geolocation_permission,
+ test_coordinates,
):
test_url = url("/common/blank.html")
await bidi_session.browsing_context.navigate(
@@ -32,7 +36,7 @@ async def test_get_current_position(
)
await set_geolocation_permission(new_tab)
- default_coordinates = await get_current_geolocation(bidi_session, new_tab)
+ default_coordinates = await get_current_geolocation(new_tab)
# Set default accuracy value.
if "accuracy" not in test_coordinates:
@@ -44,7 +48,7 @@ async def test_get_current_position(
contexts=[new_tab["context"]], coordinates=test_coordinates
)
- assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates
+ assert await get_current_geolocation(new_tab) == test_coordinates
async def test_watch_position(
@@ -132,7 +136,7 @@ async def test_watch_position(
async def test_persists_on_reload(
- bidi_session, url, new_tab, set_geolocation_permission
+ bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission
):
test_url = url("/common/blank.html")
await bidi_session.browsing_context.navigate(
@@ -153,17 +157,17 @@ async def test_persists_on_reload(
),
)
- assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates
+ assert await get_current_geolocation(new_tab) == test_coordinates
await bidi_session.browsing_context.reload(
context=new_tab["context"], wait="complete"
)
- assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates
+ assert await get_current_geolocation(new_tab) == test_coordinates
async def test_persists_on_navigation(
- bidi_session, url, new_tab, set_geolocation_permission
+ bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission
):
test_url = url("/common/blank.html")
await bidi_session.browsing_context.navigate(
@@ -184,7 +188,7 @@ async def test_persists_on_navigation(
),
)
- assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates
+ assert await get_current_geolocation(new_tab) == test_coordinates
await bidi_session.browsing_context.navigate(
context=new_tab["context"],
@@ -192,4 +196,24 @@ async def test_persists_on_navigation(
wait="complete",
)
- assert await get_current_geolocation(bidi_session, new_tab) == test_coordinates
+ assert await get_current_geolocation(new_tab) == test_coordinates
+
+
+async def test_reset_without_override(
+ bidi_session, new_tab, url, get_current_geolocation, set_geolocation_permission
+):
+ test_url = url("/common/blank.html")
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=test_url,
+ wait="complete",
+ )
+ await set_geolocation_permission(new_tab)
+
+ default_coordinates = await get_current_geolocation(new_tab)
+
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[new_tab["context"]], coordinates=None
+ )
+
+ assert await get_current_geolocation(new_tab) == default_coordinates
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/error.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/error.py
new file mode 100644
index 00000000000..27c23dc7811
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/error.py
@@ -0,0 +1,123 @@
+import pytest
+
+from webdriver.bidi.modules.script import ContextTarget
+
+from ... import remote_mapping_to_dict
+
+pytestmark = pytest.mark.asyncio
+
+ERROR = {"type": "positionUnavailable"}
+EXPECTED_ERROR = {"code": 2}
+
+
+async def test_get_current_position(bidi_session, new_tab, url,
+ get_current_geolocation, set_geolocation_permission):
+ test_url = url("/common/blank.html")
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=test_url,
+ wait="complete",
+ )
+ await set_geolocation_permission(new_tab)
+
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[new_tab["context"]], error=ERROR
+ )
+
+ assert await get_current_geolocation(new_tab) == EXPECTED_ERROR
+
+
+async def test_watch_position(
+ bidi_session,
+ new_tab,
+ url,
+ subscribe_events,
+ wait_for_event,
+ wait_for_future_safe,
+ set_geolocation_permission,
+):
+ await subscribe_events(["script.message"])
+
+ test_url = url("/common/blank.html")
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=test_url,
+ wait="complete",
+ )
+ await set_geolocation_permission(new_tab)
+
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[new_tab["context"]],
+ error=ERROR
+ )
+
+ on_script_message = wait_for_event("script.message")
+ await bidi_session.browsing_context.activate(context=new_tab["context"])
+ await bidi_session.script.call_function(
+ arguments=[{"type": "channel", "value": {"channel": "channel_name"}}],
+ function_declaration="""(channel) =>
+ window.navigator.geolocation.watchPosition(
+ (result) => channel("unexpected result"),
+ (error) => channel({code: error.code})
+ )
+ """,
+ target=ContextTarget(new_tab["context"]),
+ await_promise=False,
+ )
+ event_data = await wait_for_future_safe(on_script_message)
+
+ assert remote_mapping_to_dict(event_data["data"]["value"]) == EXPECTED_ERROR
+
+
+async def test_persists_on_reload(
+ bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission
+):
+ test_url = url("/common/blank.html")
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=test_url,
+ wait="complete",
+ )
+ await set_geolocation_permission(new_tab)
+
+ # Set geolocation override.
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[new_tab["context"]],
+ error=ERROR,
+ )
+
+ assert await get_current_geolocation(new_tab) == EXPECTED_ERROR
+
+ await bidi_session.browsing_context.reload(
+ context=new_tab["context"], wait="complete"
+ )
+
+ assert await get_current_geolocation(new_tab) == EXPECTED_ERROR
+
+
+async def test_persists_on_navigation(
+ bidi_session, url, new_tab, get_current_geolocation, set_geolocation_permission
+):
+ test_url = url("/common/blank.html")
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=test_url,
+ wait="complete",
+ )
+ await set_geolocation_permission(new_tab)
+
+ # Set geolocation override.
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[new_tab["context"]],
+ error=ERROR,
+ )
+
+ assert await get_current_geolocation(new_tab) == EXPECTED_ERROR
+
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=url("/webdriver/tests/support/html/default.html"),
+ wait="complete",
+ )
+
+ assert await get_current_geolocation(new_tab) == EXPECTED_ERROR
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
index e804848e0be..2334d37517d 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
@@ -2,7 +2,6 @@ import pytest
import webdriver.bidi.error as error
from webdriver.bidi.modules.emulation import CoordinatesOptions
-from webdriver.bidi.undefined import UNDEFINED
pytestmark = pytest.mark.asyncio
@@ -75,7 +74,7 @@ async def test_params_contexts_iframe(bidi_session, new_tab, get_test_page):
)
-@pytest.mark.parametrize("value", [UNDEFINED, False, 42, "foo", []])
+@pytest.mark.parametrize("value", [False, 42, "foo", []])
async def test_params_coordinates_invalid_type(bidi_session, top_context, value):
with pytest.raises(error.InvalidArgumentException):
await bidi_session.emulation.set_geolocation_override(
@@ -333,3 +332,60 @@ async def test_params_user_contexts_entry_invalid_value(bidi_session, value):
},
user_contexts=[value],
)
+
+
+async def test_params_coordinates_and_error(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates={
+ "latitude": 10,
+ "longitude": 10,
+ },
+ error={"type": "positionUnavailable"}
+ )
+
+
+async def test_params_no_coordinates_no_error(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ )
+
+
+@pytest.mark.parametrize("value", [False, 42, "foo", []])
+async def test_params_error_invalid_type(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ error=value,
+ )
+
+
+async def test_params_error_empty_object(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ error={},
+ )
+
+
+@pytest.mark.parametrize("value", [None, False, 42, {}, []])
+async def test_params_error_type_invalid_type(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ error={
+ "type": value
+ },
+ )
+
+
+async def test_params_error_type_invalid_value(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ error={
+ "type": "unknownError",
+ },
+ )
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py
index 008dee5698d..b3038bb5958 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/user_contexts.py
@@ -2,14 +2,19 @@ import pytest
from webdriver.bidi.modules.emulation import CoordinatesOptions
-from . import get_current_geolocation, TEST_COORDINATES
+from . import TEST_COORDINATES
pytestmark = pytest.mark.asyncio
async def test_user_contexts(
- bidi_session, url, create_user_context, new_tab, set_geolocation_permission
+ bidi_session,
+ url,
+ create_user_context,
+ new_tab,
+ get_current_geolocation,
+ set_geolocation_permission,
):
user_context = await create_user_context()
context_in_user_context_1 = await bidi_session.browsing_context.create(
@@ -29,12 +34,10 @@ async def test_user_contexts(
await set_geolocation_permission(new_tab)
await set_geolocation_permission(new_tab, user_context)
- default_coordinates = await get_current_geolocation(
- bidi_session, context_in_user_context_1
- )
+ default_coordinates = await get_current_geolocation(context_in_user_context_1)
assert default_coordinates != TEST_COORDINATES
- assert await get_current_geolocation(bidi_session, new_tab) == default_coordinates
+ assert await get_current_geolocation(new_tab) == default_coordinates
# Set geolocation override.
await bidi_session.emulation.set_geolocation_override(
@@ -46,11 +49,8 @@ async def test_user_contexts(
),
)
- assert (
- await get_current_geolocation(bidi_session, context_in_user_context_1)
- == TEST_COORDINATES
- )
- assert await get_current_geolocation(bidi_session, new_tab) == default_coordinates
+ assert await get_current_geolocation(context_in_user_context_1) == TEST_COORDINATES
+ assert await get_current_geolocation(new_tab) == default_coordinates
# Create a new context in the user context.
context_in_user_context_2 = await bidi_session.browsing_context.create(
@@ -62,14 +62,16 @@ async def test_user_contexts(
wait="complete",
)
- assert (
- await get_current_geolocation(bidi_session, context_in_user_context_2)
- == TEST_COORDINATES
- )
+ assert await get_current_geolocation(context_in_user_context_2) == TEST_COORDINATES
async def test_set_to_default_user_context(
- bidi_session, new_tab, create_user_context, url, set_geolocation_permission
+ bidi_session,
+ new_tab,
+ create_user_context,
+ url,
+ get_current_geolocation,
+ set_geolocation_permission,
):
user_context = await create_user_context()
context_in_user_context_1 = await bidi_session.browsing_context.create(
@@ -89,7 +91,7 @@ async def test_set_to_default_user_context(
await set_geolocation_permission(new_tab)
await set_geolocation_permission(new_tab, user_context)
- default_coordinates = await get_current_geolocation(bidi_session, new_tab)
+ default_coordinates = await get_current_geolocation(new_tab)
assert default_coordinates != TEST_COORDINATES
await bidi_session.emulation.set_geolocation_override(
@@ -103,10 +105,9 @@ async def test_set_to_default_user_context(
# Make sure that the geolocation changes are only applied to the context associated with default user context.
assert (
- await get_current_geolocation(bidi_session, context_in_user_context_1)
- == default_coordinates
+ await get_current_geolocation(context_in_user_context_1) == default_coordinates
)
- assert await get_current_geolocation(bidi_session, new_tab) == TEST_COORDINATES
+ assert await get_current_geolocation(new_tab) == TEST_COORDINATES
# Create a new context in the default context.
context_in_default_context_2 = await bidi_session.browsing_context.create(
@@ -120,8 +121,7 @@ async def test_set_to_default_user_context(
)
assert (
- await get_current_geolocation(bidi_session, context_in_default_context_2)
- == TEST_COORDINATES
+ await get_current_geolocation(context_in_default_context_2) == TEST_COORDINATES
)
# Reset geolocation override.
@@ -131,7 +131,11 @@ async def test_set_to_default_user_context(
async def test_set_to_multiple_user_contexts(
- bidi_session, create_user_context, url, set_geolocation_permission
+ bidi_session,
+ create_user_context,
+ url,
+ get_current_geolocation,
+ set_geolocation_permission,
):
user_context_1 = await create_user_context()
context_in_user_context_1 = await bidi_session.browsing_context.create(
@@ -164,18 +168,17 @@ async def test_set_to_multiple_user_contexts(
),
)
- assert (
- await get_current_geolocation(bidi_session, context_in_user_context_1)
- == TEST_COORDINATES
- )
- assert (
- await get_current_geolocation(bidi_session, context_in_user_context_2)
- == TEST_COORDINATES
- )
+ assert await get_current_geolocation(context_in_user_context_1) == TEST_COORDINATES
+ assert await get_current_geolocation(context_in_user_context_2) == TEST_COORDINATES
async def test_set_to_user_context_and_then_to_context(
- bidi_session, create_user_context, url, new_tab, set_geolocation_permission
+ bidi_session,
+ create_user_context,
+ url,
+ new_tab,
+ get_current_geolocation,
+ set_geolocation_permission,
):
user_context = await create_user_context()
context_in_user_context_1 = await bidi_session.browsing_context.create(
@@ -195,9 +198,7 @@ async def test_set_to_user_context_and_then_to_context(
await set_geolocation_permission(new_tab)
await set_geolocation_permission(new_tab, user_context)
- default_coordinates = await get_current_geolocation(
- bidi_session, context_in_user_context_1
- )
+ default_coordinates = await get_current_geolocation(context_in_user_context_1)
assert default_coordinates != TEST_COORDINATES
@@ -222,7 +223,7 @@ async def test_set_to_user_context_and_then_to_context(
),
)
assert (
- await get_current_geolocation(bidi_session, context_in_user_context_1)
+ await get_current_geolocation(context_in_user_context_1)
== new_geolocation_coordinates
)
@@ -232,7 +233,7 @@ async def test_set_to_user_context_and_then_to_context(
# Make sure that after reload the geolocation is still updated.
assert (
- await get_current_geolocation(bidi_session, context_in_user_context_1)
+ await get_current_geolocation(context_in_user_context_1)
== new_geolocation_coordinates
)
@@ -246,10 +247,7 @@ async def test_set_to_user_context_and_then_to_context(
wait="complete",
)
# Make sure that the geolocation override for the user context is applied.
- assert (
- await get_current_geolocation(bidi_session, context_in_user_context_2)
- == TEST_COORDINATES
- )
+ assert await get_current_geolocation(context_in_user_context_2) == TEST_COORDINATES
await bidi_session.emulation.set_geolocation_override(
contexts=[context_in_user_context_1["context"]],
@@ -258,6 +256,5 @@ async def test_set_to_user_context_and_then_to_context(
# Make sure that the geolocation override was reset.
assert (
- await get_current_geolocation(bidi_session, context_in_user_context_1)
- == default_coordinates
+ await get_current_geolocation(context_in_user_context_1) == default_coordinates
)
diff --git a/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js b/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js
index 9fe246c9395..45fecb2b40c 100644
--- a/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/conv2d.https.any.js
@@ -1105,6 +1105,1011 @@ const conv2dTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name':
+ 'conv2d float16 4D both input and filter non-constant tensors default options',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.6123046875, 0.8857421875, 0.13671875,
+ 0.564453125, 0.896484375, 0.367919921875,
+ 0.68115234375, 0.047943115234375, 0.33349609375,
+ 0.1988525390625, 0.41162109375, 0.079345703125,
+ 0.42724609375, 0.53564453125, 0.59130859375,
+ 0.2841796875, 0.414794921875, 0.0269012451171875,
+ 0.362060546875, 0.99462890625, 0.07183837890625,
+ 0.1220703125, 0.84228515625, 0.453857421875,
+ 0.21533203125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375,
+ 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125,
+ 0.56884765625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [{'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 1.5322265625, 1.357421875, 1.3642578125, 1.0712890625, 1.1259765625,
+ 1.4716796875, 1.0791015625, 1.1552734375, 1.6572265625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D both input and filter constant tensors default options',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.6123046875, 0.8857421875, 0.13671875,
+ 0.564453125, 0.896484375, 0.367919921875,
+ 0.68115234375, 0.047943115234375, 0.33349609375,
+ 0.1988525390625, 0.41162109375, 0.079345703125,
+ 0.42724609375, 0.53564453125, 0.59130859375,
+ 0.2841796875, 0.414794921875, 0.0269012451171875,
+ 0.362060546875, 0.99462890625, 0.07183837890625,
+ 0.1220703125, 0.84228515625, 0.453857421875,
+ 0.21533203125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'},
+ 'constant': true
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375,
+ 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125,
+ 0.56884765625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [{'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 1.5322265625, 1.357421875, 1.3642578125, 1.0712890625, 1.1259765625,
+ 1.4716796875, 1.0791015625, 1.1552734375, 1.6572265625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'conv2d float16 4D input and filter tensors default options',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.6123046875, 0.8857421875, 0.13671875,
+ 0.564453125, 0.896484375, 0.367919921875,
+ 0.68115234375, 0.047943115234375, 0.33349609375,
+ 0.1988525390625, 0.41162109375, 0.079345703125,
+ 0.42724609375, 0.53564453125, 0.59130859375,
+ 0.2841796875, 0.414794921875, 0.0269012451171875,
+ 0.362060546875, 0.99462890625, 0.07183837890625,
+ 0.1220703125, 0.84228515625, 0.453857421875,
+ 0.21533203125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375,
+ 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125,
+ 0.56884765625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [{'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 1.5322265625, 1.357421875, 1.3642578125, 1.0712890625, 1.1259765625,
+ 1.4716796875, 1.0791015625, 1.1552734375, 1.6572265625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'conv2d float16 4D input and filter tensors options.padding',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.6123046875, 0.8857421875, 0.13671875,
+ 0.564453125, 0.896484375, 0.367919921875,
+ 0.68115234375, 0.047943115234375, 0.33349609375,
+ 0.1988525390625, 0.41162109375, 0.079345703125,
+ 0.42724609375, 0.53564453125, 0.59130859375,
+ 0.2841796875, 0.414794921875, 0.0269012451171875,
+ 0.362060546875, 0.99462890625, 0.07183837890625,
+ 0.1220703125, 0.84228515625, 0.453857421875,
+ 0.21533203125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375,
+ 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125,
+ 0.56884765625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'padding': [1, 1, 1, 1]}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 1.0390625, 0.8828125, 1.06640625, 0.814453125,
+ 0.67724609375, 1.0537109375, 1.5322265625, 1.357421875,
+ 1.3642578125, 1.1962890625, 0.80810546875, 1.0712890625,
+ 1.1259765625, 1.4716796875, 0.96044921875, 0.5888671875,
+ 1.0791015625, 1.1552734375, 1.6572265625, 1.201171875,
+ 0.316650390625, 0.75439453125, 0.77294921875, 0.97314453125,
+ 0.90234375
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'conv2d float16 4D input and filter tensors options.strides',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.6123046875, 0.8857421875, 0.13671875,
+ 0.564453125, 0.896484375, 0.367919921875,
+ 0.68115234375, 0.047943115234375, 0.33349609375,
+ 0.1988525390625, 0.41162109375, 0.079345703125,
+ 0.42724609375, 0.53564453125, 0.59130859375,
+ 0.2841796875, 0.414794921875, 0.0269012451171875,
+ 0.362060546875, 0.99462890625, 0.07183837890625,
+ 0.1220703125, 0.84228515625, 0.453857421875,
+ 0.21533203125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375,
+ 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125,
+ 0.56884765625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'strides': [2, 2]}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [1.5322265625, 1.3642578125, 1.0791015625, 1.6572265625],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'conv2d float16 4D input and filter tensors options.dilations',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.6123046875, 0.8857421875, 0.13671875,
+ 0.564453125, 0.896484375, 0.367919921875,
+ 0.68115234375, 0.047943115234375, 0.33349609375,
+ 0.1988525390625, 0.41162109375, 0.079345703125,
+ 0.42724609375, 0.53564453125, 0.59130859375,
+ 0.2841796875, 0.414794921875, 0.0269012451171875,
+ 0.362060546875, 0.99462890625, 0.07183837890625,
+ 0.1220703125, 0.84228515625, 0.453857421875,
+ 0.21533203125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.38037109375, 0.52783203125, 0.219482421875, 0.366943359375,
+ 0.33984375, 0.419921875, 0.380615234375, 0.1944580078125,
+ 0.56884765625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'dilations': [2, 2]}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [1.3603515625],
+ 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'depthwise conv2d float16 4D input and filter tensors options.groups= input_channels',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.8447265625, 0.943359375, 0.65576171875, 0.6982421875,
+ 0.99951171875, 0.2366943359375, 0.367431640625, 0.261962890625,
+ 0.62548828125, 0.84033203125, 0.37841796875, 0.454345703125,
+ 0.253173828125, 0.578125, 0.54150390625, 0.37841796875
+ ],
+ 'descriptor': {shape: [1, 4, 2, 2], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.272216796875, 0.28125, 0.8544921875, 0.1796875, 0.7763671875,
+ 0.51416015625, 0.63720703125, 0.1280517578125, 0.83740234375,
+ 0.57275390625, 0.09857177734375, 0.5927734375, 0.58984375,
+ 0.96923828125, 0.2318115234375, 0.1480712890625
+ ],
+ 'descriptor': {shape: [4, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'groups': 4}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [1.1806640625, 1.1650390625, 1.3115234375, 0.89111328125],
+ 'descriptor': {shape: [1, 4, 1, 1], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.inputLayout=\'nchw\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125,
+ 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375,
+ 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625
+ ],
+ 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'inputLayout': 'nchw'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125,
+ 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375,
+ 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125,
+ 0.693359375, 1.037109375, 0.82861328125, 0.353271484375,
+ 1.1787109375, 0.8125, 0.81640625, 0.67822265625,
+ 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125,
+ 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375,
+ 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625
+ ],
+ 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'inputLayout': 'nhwc'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.962890625, 0.8017578125, 0.7412109375,
+ 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375,
+ 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125,
+ 0.693359375, 1.1787109375, 0.9169921875, 1.037109375,
+ 0.8125, 1.0830078125, 0.82861328125, 0.81640625,
+ 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.filterLayout=\'oihw\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125,
+ 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375,
+ 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625
+ ],
+ 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'filterLayout': 'oihw'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125,
+ 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375,
+ 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125,
+ 0.693359375, 1.037109375, 0.82861328125, 0.353271484375,
+ 1.1787109375, 0.8125, 0.81640625, 0.67822265625,
+ 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.filterLayout=\'hwio\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625,
+ 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375,
+ 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625
+ ],
+ 'descriptor': {shape: [2, 2, 1, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'filterLayout': 'hwio'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125,
+ 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375,
+ 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125,
+ 0.693359375, 1.037109375, 0.82861328125, 0.353271484375,
+ 1.1787109375, 0.8125, 0.81640625, 0.67822265625,
+ 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.filterLayout=\'ohwi\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125,
+ 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375,
+ 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625
+ ],
+ 'descriptor': {shape: [3, 2, 2, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'filterLayout': 'ohwi'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125,
+ 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375,
+ 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125,
+ 0.693359375, 1.037109375, 0.82861328125, 0.353271484375,
+ 1.1787109375, 0.8125, 0.81640625, 0.67822265625,
+ 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.filterLayout=\'ihwo\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625,
+ 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375,
+ 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625
+ ],
+ 'descriptor': {shape: [1, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'filterLayout': 'ihwo'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.7412109375, 0.289794921875, 0.405517578125,
+ 0.962890625, 0.91064453125, 0.4833984375, 0.488037109375,
+ 0.8017578125, 0.62744140625, 0.448486328125, 0.87158203125,
+ 0.693359375, 1.037109375, 0.82861328125, 0.353271484375,
+ 1.1787109375, 0.8125, 0.81640625, 0.67822265625,
+ 0.9169921875, 1.0830078125, 1.2353515625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'oihw\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125,
+ 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375,
+ 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625
+ ],
+ 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'inputLayout': 'nhwc', 'filterLayout': 'oihw'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.962890625, 0.8017578125, 0.7412109375,
+ 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375,
+ 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125,
+ 0.693359375, 1.1787109375, 0.9169921875, 1.037109375,
+ 0.8125, 1.0830078125, 0.82861328125, 0.81640625,
+ 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'hwio\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625,
+ 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375,
+ 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625
+ ],
+ 'descriptor': {shape: [2, 2, 1, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'inputLayout': 'nhwc', 'filterLayout': 'hwio'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.962890625, 0.8017578125, 0.7412109375,
+ 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375,
+ 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125,
+ 0.693359375, 1.1787109375, 0.9169921875, 1.037109375,
+ 0.8125, 1.0830078125, 0.82861328125, 0.81640625,
+ 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'ohwi\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125,
+ 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375,
+ 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625
+ ],
+ 'descriptor': {shape: [3, 2, 2, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'inputLayout': 'nhwc', 'filterLayout': 'ohwi'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.962890625, 0.8017578125, 0.7412109375,
+ 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375,
+ 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125,
+ 0.693359375, 1.1787109375, 0.9169921875, 1.037109375,
+ 0.8125, 1.0830078125, 0.82861328125, 0.81640625,
+ 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors options.inputLayout=\'nhwc\' and options.filterLayout=\'ihwo\'',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.6953125, 0.30712890625, 0.96728515625,
+ 0.50732421875, 0.432373046875, 0.10833740234375, 0.0814208984375,
+ 0.98486328125, 0.3203125, 0.5302734375, 0.42822265625
+ ],
+ 'descriptor': {shape: [1, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'inputLayout': 'nhwc', 'filterLayout': 'ihwo'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.884765625, 0.962890625, 0.8017578125, 0.7412109375,
+ 0.91064453125, 0.62744140625, 0.289794921875, 0.4833984375,
+ 0.448486328125, 0.405517578125, 0.488037109375, 0.87158203125,
+ 0.693359375, 1.1787109375, 0.9169921875, 1.037109375,
+ 0.8125, 1.0830078125, 0.82861328125, 0.81640625,
+ 1.2353515625, 0.353271484375, 0.67822265625, 0.98095703125
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'conv2d float16 4D input and filter tensors 1D options.bias',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.7529296875, 0.751953125, 0.5947265625, 0.21630859375,
+ 0.07586669921875, 0.151123046875, 0.12127685546875, 0.53662109375,
+ 0.59375, 0.9912109375, 0.363037109375, 0.92919921875,
+ 0.227294921875, 0.54150390625, 0.08447265625, 0.6767578125,
+ 0.619140625, 0.392822265625
+ ],
+ 'descriptor': {shape: [2, 1, 3, 3], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.1453857421875, 0.96728515625, 0.10833740234375, 0.3203125,
+ 0.6953125, 0.50732421875, 0.0814208984375, 0.5302734375,
+ 0.30712890625, 0.432373046875, 0.98486328125, 0.42822265625
+ ],
+ 'descriptor': {shape: [3, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ },
+ 'conv2dBias': {
+ 'data': [0.8134765625, 0.83935546875, 0.494384765625],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'},
+ {'options': {'bias': 'conv2dBias'}}
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 1.6982421875, 1.5546875, 1.103515625, 1.21875,
+ 1.8017578125, 1.75, 1.322265625, 1.3271484375,
+ 1.2958984375, 1.1220703125, 0.94287109375, 1.3662109375,
+ 1.5068359375, 1.8505859375, 1.6416015625, 1.1669921875,
+ 2.017578125, 1.65234375, 1.6552734375, 1.517578125,
+ 1.4111328125, 1.5771484375, 1.7294921875, 1.4755859375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'conv2d float16 4D input and filter tensors all options',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ 0.0997314453125, 0.53759765625, 0.3056640625,
+ 0.72216796875, 0.5068359375, 0.32373046875,
+ 0.8720703125, 0.2098388671875, 0.50537109375,
+ 0.0268707275390625, 0.5498046875, 0.0643310546875,
+ 0.156005859375, 0.11968994140625, 0.0361328125,
+ 0.414306640625, 0.24169921875, 0.67724609375,
+ 0.208740234375, 0.10980224609375, 0.7451171875,
+ 0.744140625, 0.787109375, 0.5888671875,
+ 0.11016845703125, 0.904296875, 0.11724853515625,
+ 0.85107421875, 0.424560546875, 0.0253753662109375,
+ 0.74755859375, 0.464599609375, 0.0304107666015625,
+ 0.42431640625, 0.384765625, 0.75830078125,
+ 0.990234375, 0.03717041015625, 0.014495849609375,
+ 0.826171875, 0.210693359375, 0.65673828125,
+ 0.258544921875, 0.480224609375, 0.97021484375,
+ 0.296875, 0.75244140625, 0.029632568359375,
+ 0.09027099609375, 0.7783203125
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.638671875, 0.07763671875, 0.129150390625, 0.456298828125,
+ 0.404296875, 0.59423828125, 0.1424560546875, 0.90380859375
+ ],
+ 'descriptor': {shape: [2, 2, 1, 2], dataType: 'float16'},
+ 'constant': true
+ },
+ 'conv2dBias': {
+ 'data': [0.54248046875, 0.8408203125],
+ 'descriptor': {shape: [2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, {
+ 'options': {
+ 'padding': [1, 0, 0, 1],
+ 'strides': [1, 1],
+ 'dilations': [1, 1],
+ 'groups': 2,
+ 'inputLayout': 'nchw',
+ 'filterLayout': 'hwio',
+ 'bias': 'conv2dBias'
+ }
+ }
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ 0.6591796875, 0.80322265625, 0.76904296875, 0.90673828125,
+ 0.74755859375, 0.9306640625, 1.3076171875, 0.98779296875,
+ 1.27734375, 0.876953125, 1.09375, 1.1748046875,
+ 0.82177734375, 0.92236328125, 0.57421875, 1.103515625,
+ 0.7978515625, 0.9609375, 0.7236328125, 0.60986328125,
+ 1.2451171875, 1.197265625, 1.404296875, 0.94384765625,
+ 0.6572265625, 1.484375, 1.6796875, 1.73046875,
+ 1.1162109375, 0.85595703125, 1.8291015625, 1.5419921875,
+ 1.501953125, 1.4853515625, 1.0712890625, 2.45703125,
+ 1.5126953125, 1.072265625, 1.8046875, 1.361328125,
+ 2.0703125, 1.55859375, 1.4384765625, 2.380859375,
+ 1.4814453125, 2.013671875, 1.4833984375, 1.1796875,
+ 2.078125, 1.37890625
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'conv2d float16 4D input and filter tensors, both negative input tensor and options.bias',
+ 'graph': {
+ 'inputs': {
+ 'conv2dInput': {
+ 'data': [
+ -0.80712890625, -0.8837890625, -0.77001953125,
+ -0.564453125, -0.397216796875, -0.1083984375,
+ -0.5517578125, -0.3955078125, -0.057586669921875,
+ -0.5146484375, -0.2132568359375, -0.95068359375,
+ -0.80419921875, -0.86474609375, -0.9609375,
+ -0.326416015625, -0.06884765625, -0.3203125,
+ -0.269287109375, -0.343017578125, -0.89892578125,
+ -0.90380859375, -0.63671875, -0.20068359375,
+ -0.787109375, -0.3466796875, -0.060028076171875,
+ -0.14990234375, -0.6484375, -0.8935546875,
+ -0.81494140625, -0.642578125, -0.032745361328125,
+ -0.6611328125, -0.58447265625, -0.09918212890625,
+ -0.166015625, -0.95068359375, -0.30517578125,
+ -0.62109375, -0.5400390625, -0.420166015625,
+ -0.188232421875, -0.35888671875, -0.71142578125,
+ -0.375, -0.7109375, -0.360595703125,
+ -0.546875, -0.032257080078125
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ },
+ 'conv2dFilter': {
+ 'data': [
+ 0.638671875, 0.07763671875, 0.129150390625, 0.456298828125,
+ 0.404296875, 0.59423828125, 0.1424560546875, 0.90380859375
+ ],
+ 'descriptor': {shape: [2, 2, 1, 2], dataType: 'float16'},
+ 'constant': true
+ },
+ 'conv2dBias': {
+ 'data': [-0.375, -0.436279296875],
+ 'descriptor': {shape: [2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'conv2dInput'}, {'filter': 'conv2dFilter'}, {
+ 'options': {
+ 'padding': [1, 0, 0, 1],
+ 'groups': 2,
+ 'filterLayout': 'hwio',
+ 'bias': 'conv2dBias'
+ }
+ }
+ ],
+ 'outputs': 'conv2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'conv2dOutput': {
+ 'data': [
+ -0.8271484375, -0.841796875, -0.7666015625, -0.65966796875,
+ -0.53564453125, -1.126953125, -1.318359375, -1.107421875,
+ -0.88330078125, -0.8369140625, -0.7373046875, -1.27734375,
+ -1.0830078125, -0.96484375, -1.091796875, -0.77587890625,
+ -1.1591796875, -1.16796875, -1.208984375, -1.126953125,
+ -1.0849609375, -0.91650390625, -0.900390625, -0.78466796875,
+ -0.912109375, -0.69677734375, -0.607421875, -1.111328125,
+ -1.62890625, -0.96728515625, -1.5556640625, -0.9208984375,
+ -1.3603515625, -1.8154296875, -0.85302734375, -1.001953125,
+ -1.458984375, -1.5810546875, -1.4970703125, -0.8505859375,
+ -1.220703125, -1.302734375, -1.0859375, -1.599609375,
+ -0.9072265625, -1.53515625, -1.302734375, -1.3232421875,
+ -1.142578125, -0.5107421875
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js b/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js
index 67ce5dbaf65..a17df911e44 100644
--- a/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/conv_transpose2d.https.any.js
@@ -1578,6 +1578,1670 @@ const convTranspose2dTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name':
+ 'convTranspose2d float16 4D both input and filter non-constant tensors default options',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'}, {'filter': 'convTranspose2dFilter'}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.1934814453125, 0.544921875, 0.356689453125, 0.18017578125,
+ 0.27880859375, 0.155517578125, 0.005138397216796875,
+ 0.0777587890625, 0.0008726119995117188
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D both input and filter constant tensors default options',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'}, {'filter': 'convTranspose2dFilter'}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.1934814453125, 0.544921875, 0.356689453125, 0.18017578125,
+ 0.27880859375, 0.155517578125, 0.005138397216796875,
+ 0.0777587890625, 0.0008726119995117188
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors default options',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'}, {'filter': 'convTranspose2dFilter'}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.1934814453125, 0.544921875, 0.356689453125, 0.18017578125,
+ 0.27880859375, 0.155517578125, 0.005138397216796875,
+ 0.0777587890625, 0.0008726119995117188
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.padding',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.58740234375, 0.60791015625, 0.0172882080078125, 0.261474609375
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.329345703125, 0.5869140625, 0.297119140625, 0.003337860107421875
+ ],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'padding': [1, 1, 1, 1]}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [0.27880859375],
+ 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 input tensors options.padding is the same upper padding',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],
+ 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'}, {
+ 'options': {
+ 'outputSizes': [6, 6],
+ 'groups': 1,
+ 'strides': [2, 2],
+ 'dilations': [1, 1],
+ 'padding': [0, 1, 0, 1],
+ 'filterLayout': 'ohwi',
+ 'inputLayout': 'nhwc'
+ }
+ }
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5,
+ 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5,
+ 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1,
+ 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5,
+ 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1,
+ 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 1, 1, 0.5, 0.5
+ ],
+ 'descriptor': {shape: [1, 6, 6, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.strides',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'}, {'options': {'strides': [3, 2]}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.03515625,
+ 0.6484375,
+ 0.446044921875,
+ 1.015625,
+ 0.4091796875,
+ 0.415771484375,
+ 0.0469970703125,
+ 0.00666046142578125,
+ 0.65185546875,
+ 0.08453369140625,
+ 1.2529296875,
+ 0.07757568359375,
+ 0.64794921875,
+ 0.0184173583984375,
+ 0.04901123046875,
+ 0.274169921875,
+ 0.62158203125,
+ 0.72705078125,
+ 0.57080078125,
+ 0.470458984375,
+ 0.332763671875,
+ 0.2421875,
+ 0.5791015625,
+ 0.2425537109375,
+ 1.0615234375,
+ 0.59326171875,
+ 0.6025390625,
+ 0.32373046875,
+ 0.0458984375,
+ 0.70751953125,
+ 0.045989990234375,
+ 1.177734375,
+ 0.1124267578125,
+ 0.93896484375,
+ 0.126953125,
+ 0.337646484375,
+ 0.405517578125,
+ 0.338134765625,
+ 0.58984375,
+ 0.8271484375,
+ 0.68212890625,
+ 0.08245849609375,
+ 0.05999755859375,
+ 0.8564453125,
+ 0.5791015625,
+ 1.1357421875,
+ 0.39892578125,
+ 0.405029296875,
+ 0.08026123046875,
+ 0.01137542724609375,
+ 0.869140625,
+ 0.1097412109375,
+ 1.44921875,
+ 0.07562255859375,
+ 0.63134765625,
+ 0.031463623046875,
+ 0.0836181640625,
+ 0.372314453125,
+ 0.80712890625,
+ 0.87451171875,
+ 0.55615234375,
+ 0.45849609375,
+ 0.054931640625,
+ 0.003459930419921875,
+ 0.71533203125,
+ 0.043914794921875,
+ 0.86865234375,
+ 0.040283203125,
+ 0.210205078125,
+ 0.04205322265625,
+ 0.02203369140625,
+ 0.54150390625,
+ 0.279541015625,
+ 0.587890625,
+ 0.256591796875,
+ 0.09014892578125,
+ 0.0159149169921875,
+ 0.02374267578125,
+ 0.2100830078125,
+ 0.30126953125,
+ 0.288330078125,
+ 0.276611328125,
+ 0.0946044921875,
+ 0.37841796875,
+ 0.023834228515625,
+ 0.50341796875,
+ 0.0238800048828125,
+ 1.0517578125,
+ 0.058380126953125,
+ 0.3046875,
+ 0.28955078125,
+ 0.15185546875,
+ 0.343505859375,
+ 0.152099609375,
+ 0.76318359375,
+ 0.3720703125,
+ 0.130615234375,
+ 0.10968017578125,
+ 0.16357421875,
+ 0.1658935546875,
+ 0.1639404296875,
+ 0.32470703125,
+ 0.40087890625,
+ 0.1370849609375,
+ 0.09381103515625,
+ 0.0059051513671875,
+ 0.935546875,
+ 0.056976318359375,
+ 0.9208984375,
+ 0.03924560546875,
+ 0.204833984375,
+ 0.07177734375,
+ 0.037628173828125,
+ 0.70556640625,
+ 0.363037109375,
+ 0.6044921875,
+ 0.25,
+ 0.08782958984375,
+ 0.0271759033203125,
+ 0.04052734375,
+ 0.276123046875,
+ 0.39111328125,
+ 0.314453125,
+ 0.26953125,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 2, 9, 7], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.dilations',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.319580078125, 0.97607421875, 0.4130859375, 0.479736328125,
+ 0.767578125, 0.908203125, 0.62060546875, 0.658203125, 0.6552734375
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [0.68359375, 0.96435546875, 0.8271484375, 0.5771484375],
+ 'descriptor': {shape: [1, 1, 2, 2], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'dilations': [2, 2]}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.218505859375, 0.66748046875, 0.59033203125, 0.94140625,
+ 0.3984375, 0.327880859375, 0.52490234375, 1.0830078125,
+ 0.740234375, 0.8759765625, 0.6884765625, 1.2568359375,
+ 1.572265625, 1.1982421875, 0.8701171875, 0.396728515625,
+ 0.634765625, 1.0283203125, 0.443115234375, 0.52392578125,
+ 0.51318359375, 0.54443359375, 0.900390625, 0.3798828125,
+ 0.378173828125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.outputPadding',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'strides': [3, 2], 'outputPadding': [1, 1]}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.03515625,
+ 0.6484375,
+ 0.446044921875,
+ 1.015625,
+ 0.4091796875,
+ 0.415771484375,
+ 0,
+ 0.0469970703125,
+ 0.00666046142578125,
+ 0.65185546875,
+ 0.08453369140625,
+ 1.2529296875,
+ 0.07757568359375,
+ 0.64794921875,
+ 0,
+ 0.0184173583984375,
+ 0.04901123046875,
+ 0.274169921875,
+ 0.62158203125,
+ 0.72705078125,
+ 0.57080078125,
+ 0.470458984375,
+ 0,
+ 0.332763671875,
+ 0.2421875,
+ 0.5791015625,
+ 0.2425537109375,
+ 1.0615234375,
+ 0.59326171875,
+ 0.6025390625,
+ 0,
+ 0.32373046875,
+ 0.0458984375,
+ 0.70751953125,
+ 0.045989990234375,
+ 1.177734375,
+ 0.1124267578125,
+ 0.93896484375,
+ 0,
+ 0.126953125,
+ 0.337646484375,
+ 0.405517578125,
+ 0.338134765625,
+ 0.58984375,
+ 0.8271484375,
+ 0.68212890625,
+ 0,
+ 0.08245849609375,
+ 0.05999755859375,
+ 0.8564453125,
+ 0.5791015625,
+ 1.1357421875,
+ 0.39892578125,
+ 0.405029296875,
+ 0,
+ 0.08026123046875,
+ 0.01137542724609375,
+ 0.869140625,
+ 0.1097412109375,
+ 1.44921875,
+ 0.07562255859375,
+ 0.63134765625,
+ 0,
+ 0.031463623046875,
+ 0.0836181640625,
+ 0.372314453125,
+ 0.80712890625,
+ 0.87451171875,
+ 0.55615234375,
+ 0.45849609375,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.054931640625,
+ 0.003459930419921875,
+ 0.71533203125,
+ 0.043914794921875,
+ 0.86865234375,
+ 0.040283203125,
+ 0.210205078125,
+ 0,
+ 0.04205322265625,
+ 0.02203369140625,
+ 0.54150390625,
+ 0.279541015625,
+ 0.587890625,
+ 0.256591796875,
+ 0.09014892578125,
+ 0,
+ 0.0159149169921875,
+ 0.02374267578125,
+ 0.2100830078125,
+ 0.30126953125,
+ 0.288330078125,
+ 0.276611328125,
+ 0.0946044921875,
+ 0,
+ 0.37841796875,
+ 0.023834228515625,
+ 0.50341796875,
+ 0.0238800048828125,
+ 1.0517578125,
+ 0.058380126953125,
+ 0.3046875,
+ 0,
+ 0.28955078125,
+ 0.15185546875,
+ 0.343505859375,
+ 0.152099609375,
+ 0.76318359375,
+ 0.3720703125,
+ 0.130615234375,
+ 0,
+ 0.10968017578125,
+ 0.16357421875,
+ 0.1658935546875,
+ 0.1639404296875,
+ 0.32470703125,
+ 0.40087890625,
+ 0.1370849609375,
+ 0,
+ 0.09381103515625,
+ 0.0059051513671875,
+ 0.935546875,
+ 0.056976318359375,
+ 0.9208984375,
+ 0.03924560546875,
+ 0.204833984375,
+ 0,
+ 0.07177734375,
+ 0.037628173828125,
+ 0.70556640625,
+ 0.363037109375,
+ 0.6044921875,
+ 0.25,
+ 0.08782958984375,
+ 0,
+ 0.0271759033203125,
+ 0.04052734375,
+ 0.276123046875,
+ 0.39111328125,
+ 0.314453125,
+ 0.26953125,
+ 0.0921630859375,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ 'descriptor': {shape: [1, 2, 10, 8], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.outputSizes',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'strides': [3, 2], 'outputSizes': [10, 8]}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.03515625,
+ 0.6484375,
+ 0.446044921875,
+ 1.015625,
+ 0.4091796875,
+ 0.415771484375,
+ 0,
+ 0.0469970703125,
+ 0.00666046142578125,
+ 0.65185546875,
+ 0.08453369140625,
+ 1.2529296875,
+ 0.07757568359375,
+ 0.64794921875,
+ 0,
+ 0.0184173583984375,
+ 0.04901123046875,
+ 0.274169921875,
+ 0.62158203125,
+ 0.72705078125,
+ 0.57080078125,
+ 0.470458984375,
+ 0,
+ 0.332763671875,
+ 0.2421875,
+ 0.5791015625,
+ 0.2425537109375,
+ 1.0615234375,
+ 0.59326171875,
+ 0.6025390625,
+ 0,
+ 0.32373046875,
+ 0.0458984375,
+ 0.70751953125,
+ 0.045989990234375,
+ 1.177734375,
+ 0.1124267578125,
+ 0.93896484375,
+ 0,
+ 0.126953125,
+ 0.337646484375,
+ 0.405517578125,
+ 0.338134765625,
+ 0.58984375,
+ 0.8271484375,
+ 0.68212890625,
+ 0,
+ 0.08245849609375,
+ 0.05999755859375,
+ 0.8564453125,
+ 0.5791015625,
+ 1.1357421875,
+ 0.39892578125,
+ 0.405029296875,
+ 0,
+ 0.08026123046875,
+ 0.01137542724609375,
+ 0.869140625,
+ 0.1097412109375,
+ 1.44921875,
+ 0.07562255859375,
+ 0.63134765625,
+ 0,
+ 0.031463623046875,
+ 0.0836181640625,
+ 0.372314453125,
+ 0.80712890625,
+ 0.87451171875,
+ 0.55615234375,
+ 0.45849609375,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.054931640625,
+ 0.003459930419921875,
+ 0.71533203125,
+ 0.043914794921875,
+ 0.86865234375,
+ 0.040283203125,
+ 0.210205078125,
+ 0,
+ 0.04205322265625,
+ 0.02203369140625,
+ 0.54150390625,
+ 0.279541015625,
+ 0.587890625,
+ 0.256591796875,
+ 0.09014892578125,
+ 0,
+ 0.0159149169921875,
+ 0.02374267578125,
+ 0.2100830078125,
+ 0.30126953125,
+ 0.288330078125,
+ 0.276611328125,
+ 0.0946044921875,
+ 0,
+ 0.37841796875,
+ 0.023834228515625,
+ 0.50341796875,
+ 0.0238800048828125,
+ 1.0517578125,
+ 0.058380126953125,
+ 0.3046875,
+ 0,
+ 0.28955078125,
+ 0.15185546875,
+ 0.343505859375,
+ 0.152099609375,
+ 0.76318359375,
+ 0.3720703125,
+ 0.130615234375,
+ 0,
+ 0.10968017578125,
+ 0.16357421875,
+ 0.1658935546875,
+ 0.1639404296875,
+ 0.32470703125,
+ 0.40087890625,
+ 0.1370849609375,
+ 0,
+ 0.09381103515625,
+ 0.0059051513671875,
+ 0.935546875,
+ 0.056976318359375,
+ 0.9208984375,
+ 0.03924560546875,
+ 0.204833984375,
+ 0,
+ 0.07177734375,
+ 0.037628173828125,
+ 0.70556640625,
+ 0.363037109375,
+ 0.6044921875,
+ 0.25,
+ 0.08782958984375,
+ 0,
+ 0.0271759033203125,
+ 0.04052734375,
+ 0.276123046875,
+ 0.39111328125,
+ 0.314453125,
+ 0.26953125,
+ 0.0921630859375,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ 'descriptor': {shape: [1, 2, 10, 8], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nchw',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'inputLayout': 'nchw'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.64794921875,
+ 1.0439453125,
+ 0.8623046875,
+ 0.415771484375,
+ 0.379638671875,
+ 1.1787109375,
+ 1.9912109375,
+ 1.623046875,
+ 1.25,
+ 0.424560546875,
+ 1.5087890625,
+ 3.287109375,
+ 2.56640625,
+ 1.814453125,
+ 0.2071533203125,
+ 1.25,
+ 1.666015625,
+ 2.09765625,
+ 1.3134765625,
+ 0.031463623046875,
+ 0.386962890625,
+ 1.0849609375,
+ 1.2216796875,
+ 0.45849609375,
+ 0.054931640625,
+ 0.70068359375,
+ 0.70166015625,
+ 0.269287109375,
+ 0.210205078125,
+ 0.420654296875,
+ 0.95849609375,
+ 1.8525390625,
+ 0.53759765625,
+ 0.394775390625,
+ 0.3994140625,
+ 1.578125,
+ 2.12109375,
+ 1.1416015625,
+ 0.43017578125,
+ 0.181396484375,
+ 1.00390625,
+ 1.341796875,
+ 0.83447265625,
+ 0.2249755859375,
+ 0.0271759033203125,
+ 0.302734375,
+ 0.58544921875,
+ 0.4033203125,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'inputLayout': 'nhwc'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.054931640625,
+ 0.64794921875,
+ 0.70068359375,
+ 1.0439453125,
+ 0.70166015625,
+ 0.8623046875,
+ 0.269287109375,
+ 0.415771484375,
+ 0.210205078125,
+ 0.379638671875,
+ 0.420654296875,
+ 1.1787109375,
+ 0.95849609375,
+ 1.9912109375,
+ 1.8525390625,
+ 1.623046875,
+ 0.53759765625,
+ 1.25,
+ 0.394775390625,
+ 0.424560546875,
+ 0.3994140625,
+ 1.5087890625,
+ 1.578125,
+ 3.287109375,
+ 2.12109375,
+ 2.56640625,
+ 1.1416015625,
+ 1.814453125,
+ 0.43017578125,
+ 0.2071533203125,
+ 0.181396484375,
+ 1.25,
+ 1.00390625,
+ 1.666015625,
+ 1.341796875,
+ 2.09765625,
+ 0.83447265625,
+ 1.3134765625,
+ 0.2249755859375,
+ 0.031463623046875,
+ 0.0271759033203125,
+ 0.386962890625,
+ 0.302734375,
+ 1.0849609375,
+ 0.58544921875,
+ 1.2216796875,
+ 0.4033203125,
+ 0.45849609375,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.filterLayout=iohw',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'filterLayout': 'iohw'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.64794921875,
+ 1.0439453125,
+ 0.8623046875,
+ 0.415771484375,
+ 0.379638671875,
+ 1.1787109375,
+ 1.9912109375,
+ 1.623046875,
+ 1.25,
+ 0.424560546875,
+ 1.5087890625,
+ 3.287109375,
+ 2.56640625,
+ 1.814453125,
+ 0.2071533203125,
+ 1.25,
+ 1.666015625,
+ 2.09765625,
+ 1.3134765625,
+ 0.031463623046875,
+ 0.386962890625,
+ 1.0849609375,
+ 1.2216796875,
+ 0.45849609375,
+ 0.054931640625,
+ 0.70068359375,
+ 0.70166015625,
+ 0.269287109375,
+ 0.210205078125,
+ 0.420654296875,
+ 0.95849609375,
+ 1.8525390625,
+ 0.53759765625,
+ 0.394775390625,
+ 0.3994140625,
+ 1.578125,
+ 2.12109375,
+ 1.1416015625,
+ 0.43017578125,
+ 0.181396484375,
+ 1.00390625,
+ 1.341796875,
+ 0.83447265625,
+ 0.2249755859375,
+ 0.0271759033203125,
+ 0.302734375,
+ 0.58544921875,
+ 0.4033203125,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.filterLayout=hwoi',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.97998046875, 0.626953125, 0.06170654296875,
+ 0.63671875, 0.322021484375, 0.83837890625, 0.75, 0.11883544921875,
+ 0.39306640625, 0.9921875, 0.1380615234375, 0.32861328125,
+ 0.283935546875, 0.8740234375, 0.423583984375, 0.720703125,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [3, 3, 2, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'filterLayout': 'hwoi'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.64794921875,
+ 1.0439453125,
+ 0.8623046875,
+ 0.415771484375,
+ 0.379638671875,
+ 1.1787109375,
+ 1.9912109375,
+ 1.623046875,
+ 1.25,
+ 0.424560546875,
+ 1.5087890625,
+ 3.287109375,
+ 2.56640625,
+ 1.814453125,
+ 0.2071533203125,
+ 1.25,
+ 1.666015625,
+ 2.09765625,
+ 1.3134765625,
+ 0.031463623046875,
+ 0.386962890625,
+ 1.0849609375,
+ 1.2216796875,
+ 0.45849609375,
+ 0.054931640625,
+ 0.70068359375,
+ 0.70166015625,
+ 0.269287109375,
+ 0.210205078125,
+ 0.420654296875,
+ 0.95849609375,
+ 1.8525390625,
+ 0.53759765625,
+ 0.394775390625,
+ 0.3994140625,
+ 1.578125,
+ 2.12109375,
+ 1.1416015625,
+ 0.43017578125,
+ 0.181396484375,
+ 1.00390625,
+ 1.341796875,
+ 0.83447265625,
+ 0.2249755859375,
+ 0.0271759033203125,
+ 0.302734375,
+ 0.58544921875,
+ 0.4033203125,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.filterLayout=ohwi',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'filterLayout': 'ohwi'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.64794921875,
+ 1.0439453125,
+ 0.8623046875,
+ 0.415771484375,
+ 0.379638671875,
+ 1.1787109375,
+ 1.9912109375,
+ 1.623046875,
+ 1.25,
+ 0.424560546875,
+ 1.5087890625,
+ 3.287109375,
+ 2.56640625,
+ 1.814453125,
+ 0.2071533203125,
+ 1.25,
+ 1.666015625,
+ 2.09765625,
+ 1.3134765625,
+ 0.031463623046875,
+ 0.386962890625,
+ 1.0849609375,
+ 1.2216796875,
+ 0.45849609375,
+ 0.054931640625,
+ 0.70068359375,
+ 0.70166015625,
+ 0.269287109375,
+ 0.210205078125,
+ 0.420654296875,
+ 0.95849609375,
+ 1.8525390625,
+ 0.53759765625,
+ 0.394775390625,
+ 0.3994140625,
+ 1.578125,
+ 2.12109375,
+ 1.1416015625,
+ 0.43017578125,
+ 0.181396484375,
+ 1.00390625,
+ 1.341796875,
+ 0.83447265625,
+ 0.2249755859375,
+ 0.0271759033203125,
+ 0.302734375,
+ 0.58544921875,
+ 0.4033203125,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 2, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc options.filterLayout=iohw',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'inputLayout': 'nhwc', 'filterLayout': 'iohw'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.054931640625,
+ 0.64794921875,
+ 0.70068359375,
+ 1.0439453125,
+ 0.70166015625,
+ 0.8623046875,
+ 0.269287109375,
+ 0.415771484375,
+ 0.210205078125,
+ 0.379638671875,
+ 0.420654296875,
+ 1.1787109375,
+ 0.95849609375,
+ 1.9912109375,
+ 1.8525390625,
+ 1.623046875,
+ 0.53759765625,
+ 1.25,
+ 0.394775390625,
+ 0.424560546875,
+ 0.3994140625,
+ 1.5087890625,
+ 1.578125,
+ 3.287109375,
+ 2.12109375,
+ 2.56640625,
+ 1.1416015625,
+ 1.814453125,
+ 0.43017578125,
+ 0.2071533203125,
+ 0.181396484375,
+ 1.25,
+ 1.00390625,
+ 1.666015625,
+ 1.341796875,
+ 2.09765625,
+ 0.83447265625,
+ 1.3134765625,
+ 0.2249755859375,
+ 0.031463623046875,
+ 0.0271759033203125,
+ 0.386962890625,
+ 0.302734375,
+ 1.0849609375,
+ 0.58544921875,
+ 1.2216796875,
+ 0.4033203125,
+ 0.45849609375,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc options.filterLayout=hwoi',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.97998046875, 0.626953125, 0.06170654296875,
+ 0.63671875, 0.322021484375, 0.83837890625, 0.75, 0.11883544921875,
+ 0.39306640625, 0.9921875, 0.1380615234375, 0.32861328125,
+ 0.283935546875, 0.8740234375, 0.423583984375, 0.720703125,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [3, 3, 2, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'inputLayout': 'nhwc', 'filterLayout': 'hwoi'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.054931640625,
+ 0.64794921875,
+ 0.70068359375,
+ 1.0439453125,
+ 0.70166015625,
+ 0.8623046875,
+ 0.269287109375,
+ 0.415771484375,
+ 0.210205078125,
+ 0.379638671875,
+ 0.420654296875,
+ 1.1787109375,
+ 0.95849609375,
+ 1.9912109375,
+ 1.8525390625,
+ 1.623046875,
+ 0.53759765625,
+ 1.25,
+ 0.394775390625,
+ 0.424560546875,
+ 0.3994140625,
+ 1.5087890625,
+ 1.578125,
+ 3.287109375,
+ 2.12109375,
+ 2.56640625,
+ 1.1416015625,
+ 1.814453125,
+ 0.43017578125,
+ 0.2071533203125,
+ 0.181396484375,
+ 1.25,
+ 1.00390625,
+ 1.666015625,
+ 1.341796875,
+ 2.09765625,
+ 0.83447265625,
+ 1.3134765625,
+ 0.2249755859375,
+ 0.031463623046875,
+ 0.0271759033203125,
+ 0.386962890625,
+ 0.302734375,
+ 1.0849609375,
+ 0.58544921875,
+ 1.2216796875,
+ 0.4033203125,
+ 0.45849609375,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors options.inputLayout=nhwc options.filterLayout=ohwi',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.056060791015625, 0.71142578125, 0.65283203125, 0.38623046875,
+ 0.386962890625, 0.9462890625, 0.095703125, 0.92333984375,
+ 0.63623046875
+ ],
+ 'descriptor': {shape: [1, 3, 3, 1], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.861328125, 0.626953125, 0.63671875, 0.83837890625,
+ 0.11883544921875, 0.9921875, 0.32861328125, 0.8740234375,
+ 0.720703125, 0.97998046875, 0.06170654296875, 0.322021484375, 0.75,
+ 0.39306640625, 0.1380615234375, 0.283935546875, 0.423583984375,
+ 0.1448974609375
+ ],
+ 'descriptor': {shape: [2, 3, 3, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'inputLayout': 'nhwc', 'filterLayout': 'ohwi'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.04827880859375,
+ 0.054931640625,
+ 0.64794921875,
+ 0.70068359375,
+ 1.0439453125,
+ 0.70166015625,
+ 0.8623046875,
+ 0.269287109375,
+ 0.415771484375,
+ 0.210205078125,
+ 0.379638671875,
+ 0.420654296875,
+ 1.1787109375,
+ 0.95849609375,
+ 1.9912109375,
+ 1.8525390625,
+ 1.623046875,
+ 0.53759765625,
+ 1.25,
+ 0.394775390625,
+ 0.424560546875,
+ 0.3994140625,
+ 1.5087890625,
+ 1.578125,
+ 3.287109375,
+ 2.12109375,
+ 2.56640625,
+ 1.1416015625,
+ 1.814453125,
+ 0.43017578125,
+ 0.2071533203125,
+ 0.181396484375,
+ 1.25,
+ 1.00390625,
+ 1.666015625,
+ 1.341796875,
+ 2.09765625,
+ 0.83447265625,
+ 1.3134765625,
+ 0.2249755859375,
+ 0.031463623046875,
+ 0.0271759033203125,
+ 0.386962890625,
+ 0.302734375,
+ 1.0849609375,
+ 0.58544921875,
+ 1.2216796875,
+ 0.4033203125,
+ 0.45849609375,
+ 0.0921630859375
+ ],
+ 'descriptor': {shape: [1, 5, 5, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'convTranspose2d float16 4D input and filter tensors options.bias',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ 0.1109619140625, 0.8681640625, 0.734375, 0.4306640625,
+ 0.59814453125, 0.12322998046875, 0.1611328125, 0.08837890625,
+ 0.291015625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.6162109375, 0.26220703125, 0.794921875, 0.873046875, 0.8310546875,
+ 0.85498046875, 0.55517578125, 0.84033203125, 0.85302734375
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'convTranspose2dBias': {
+ 'data': [0.45166015625],
+ 'descriptor': {shape: [1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'bias': 'convTranspose2dBias'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ 0.52001953125, 1.015625, 1.2197265625, 1.333984375,
+ 1.03515625, 0.81396484375, 1.783203125, 2.484375,
+ 2.3125, 1.177734375, 0.98876953125, 2.00390625,
+ 2.986328125, 2.5703125, 1.4150390625, 0.83154296875,
+ 1.3564453125, 1.85546875, 1.3828125, 0.8056640625,
+ 0.541015625, 0.63623046875, 0.82470703125, 0.771484375,
+ 0.69970703125
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'convTranspose2d float16 4D input and filter tensors, both negative input tensor and options.bias',
+ 'graph': {
+ 'inputs': {
+ 'convTranspose2dInput': {
+ 'data': [
+ -0.10888671875, -0.298095703125, -0.390869140625, -0.5625,
+ -0.732421875, -0.84228515625, -0.305908203125, -0.9765625,
+ -0.01416015625
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'}
+ },
+ 'convTranspose2dFilter': {
+ 'data': [
+ 0.6162109375, 0.26220703125, 0.794921875, 0.873046875, 0.8310546875,
+ 0.85498046875, 0.55517578125, 0.84033203125, 0.85302734375
+ ],
+ 'descriptor': {shape: [1, 1, 3, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'convTranspose2dBias': {
+ 'data': [-0.845703125],
+ 'descriptor': {shape: [1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'convTranspose2d',
+ 'arguments': [
+ {'input': 'convTranspose2dInput'},
+ {'filter': 'convTranspose2dFilter'},
+ {'options': {'bias': 'convTranspose2dBias'}}
+ ],
+ 'outputs': 'convTranspose2dOutput'
+ }],
+ 'expectedOutputs': {
+ 'convTranspose2dOutput': {
+ 'data': [
+ -0.91259765625, -1.0576171875, -1.2509765625, -1.185546875,
+ -1.15625, -1.287109375, -1.794921875, -2.685546875,
+ -2.228515625, -1.849609375, -1.5859375, -2.890625,
+ -3.73828125, -3.53515625, -1.91015625, -1.4248046875,
+ -2.83203125, -3.494140625, -3.025390625, -1.576171875,
+ -1.015625, -1.64453125, -1.935546875, -1.6904296875,
+ -0.85791015625
+ ],
+ 'descriptor': {shape: [1, 1, 5, 5], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/log.https.any.js b/tests/wpt/tests/webnn/conformance_tests/log.https.any.js
index 011beef53ac..8ed807b3401 100644
--- a/tests/wpt/tests/webnn/conformance_tests/log.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/log.https.any.js
@@ -14,11 +14,8 @@
// MLOperand log(MLOperand input);
-const getLogPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 1 / 1024, float16: 1 / 1024};
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {metricType: 'ATOL', value: toleranceValueDict[expectedDataType]};
+const getLogPrecisionTolerance = () => {
+ return {metricType: 'ULP', value: 8};
};
const logTests = [
diff --git a/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js b/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js
index f385aab1f15..8f81ff565d2 100644
--- a/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/pooling.https.any.js
@@ -34,46 +34,6 @@
// MLOperand maxPool2d(
// MLOperand input, optional MLPool2dOptions options = {});
-
-const getPoolingOperatorsPrecisionTolerance = (graphResources) => {
- const args = graphResources.operators[0].arguments;
- const inputShape =
- graphResources.inputs[args[0][Object.keys(args[0])[0]]].descriptor.shape;
- const options =
- args.length === 2 ? {...args[1][Object.keys(args[1])[0]]} : {};
- let height;
- let width;
-
- if (options.windowDimensions) {
- height = options.windowDimensions[0];
- width = options.windowDimensions[1];
- } else {
- // If not present, the window dimensions are assumed to be the height and
- // width dimensions of the input shape
- if (options.layout && options.layout === 'nhwc') {
- height = inputShape[1];
- width = inputShape[2];
- } else {
- // nhwc layout of input
- height = inputShape[2];
- width = inputShape[3];
- }
- }
-
- const tolerance = height * width + 2;
- const toleranceDict = {
- averagePool2d: {float32: tolerance, float16: tolerance},
- l2Pool2d: {float32: tolerance, float16: tolerance},
- maxPool2d: {float32: 0, float16: 0},
- };
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {
- metricType: 'ULP',
- value: toleranceDict[graphResources.operators[0].name][expectedDataType]
- };
-};
-
const poolingOperatorsTests = [
// averagePool2d tests
{
@@ -2345,8 +2305,7 @@ const poolingOperatorsTests = [
if (navigator.ml) {
poolingOperatorsTests.forEach((test) => {
- webnn_conformance_test(
- buildAndExecuteGraph, getPoolingOperatorsPrecisionTolerance, test);
+ webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
});
} else {
test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
diff --git a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
index 3b59c3bb49d..aa816cce7fb 100644
--- a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
@@ -535,12 +535,12 @@ const subgraphTests = [
{'input': 'transposeOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
- 'outputs': 'quantizedtransposeOutput'
+ 'outputs': 'quantizedTransposeOutput'
},
{
'name': 'dequantizeLinear',
'arguments': [
- {'input': 'quantizedtransposeOutput'},
+ {'input': 'quantizedTransposeOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
'outputs': 'output'
@@ -619,12 +619,12 @@ const subgraphTests = [
{'input': 'tanhOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
- 'outputs': 'quantizedtanhOutput'
+ 'outputs': 'quantizedTanhOutput'
},
{
'name': 'dequantizeLinear',
'arguments': [
- {'input': 'quantizedtanhOutput'},
+ {'input': 'quantizedTanhOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
'outputs': 'output'
@@ -702,12 +702,12 @@ const subgraphTests = [
{'input': 'sigmoidOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
- 'outputs': 'quantizedsigmoidOutput'
+ 'outputs': 'quantizedSigmoidOutput'
},
{
'name': 'dequantizeLinear',
'arguments': [
- {'input': 'quantizedsigmoidOutput'},
+ {'input': 'quantizedSigmoidOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
'outputs': 'output'
@@ -788,12 +788,12 @@ const subgraphTests = [
{'input': 'leakyReluOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
- 'outputs': 'quantizedleakyReluOutput'
+ 'outputs': 'quantizedLeakyReluOutput'
},
{
'name': 'dequantizeLinear',
'arguments': [
- {'input': 'quantizedleakyReluOutput'},
+ {'input': 'quantizedLeakyReluOutput'},
{'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
],
'outputs': 'output'
@@ -924,6 +924,337 @@ const subgraphTests = [
}
}
},
+ {
+ 'name': 'quantized elu',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 1.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ -0.1988269537687301, -0.0041167140007019, -0.0634240251779556,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'elu',
+ 'arguments': [{'input': 'dequantizedInput'}],
+ 'outputs': 'eluOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'eluOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedEluOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedEluOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.49803924560546875, 0.0470588281750679, 0.3333333432674408,
+ -0.18039216101169586, -0.003921568859368563, -0.062745101749897,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized averagePool2d',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ -2.549168109893799, -4.794857501983643,
+ 8.413617134094238, 6.108623504638672
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.343092918395996],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.343092918395996],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'averagePool2d',
+ 'arguments': [{'input': 'dequantizedInput'}, {'options': {'layout': 'nhwc'}}],
+ 'outputs': 'averagePool2dOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'averagePool2dOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedAveragePool2dOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedAveragePool2dOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 3.774022102355957,
+ ],
+ 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized maxPool2d',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ -2.549168109893799, -4.794857501983643,
+ 8.413617134094238, 6.108623504638672
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.343092918395996],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.343092918395996],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'maxPool2d',
+ 'arguments': [{'input': 'dequantizedInput'}, {'options': {'layout': 'nhwc'}}],
+ 'outputs': 'maxPool2dOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'maxPool2dOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedMaxPool2dOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedMaxPool2dOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 8.577322959899902,
+ ],
+ 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized reshape',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 1.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ -0.1988269537687301, -0.0041167140007019, -0.0634240251779556,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [16],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [16],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'reshape',
+ 'arguments': [{'input': 'dequantizedInput'}, {'newShape': [3, 2]}],
+ 'outputs': 'reshapeOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'reshapeOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedReshapeOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedReshapeOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.43529415130615234, 0.0470588281750679,
+ 0.3333333432674408, -0.20000001788139343,
+ -0.003921568859368563, -0.062745101749897,
+ ],
+ 'descriptor': {shape: [3, 2], dataType: 'float32'}
+ }
+ }
+ }
+ },
];
if (navigator.ml) {
diff --git a/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js b/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js
index 4c3a330f850..004c03bdf13 100644
--- a/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/sign.https.any.js
@@ -122,7 +122,8 @@ const signTests = [
'graph': {
'inputs': {
'signInput': {
- 'data': [-1, 0, 1, 2],
+ // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647]
+ 'data': [-2147483648, 0, 2147483646, 2147483647],
'descriptor': {shape: [2, 2], dataType: 'int32'}
}
},
@@ -166,7 +167,8 @@ const signTests = [
'graph': {
'inputs': {
'signInput': {
- 'data': [-1, 0, 1, 2, -2, -1, 0, 1],
+ // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127]
+ 'data': [-128, 0, 1, 2, -2, -1, 0, 127],
'descriptor': {shape: [1, 2, 2, 2], dataType: 'int8'}
}
},
diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js
index 50d7911a918..9d5cfc70c10 100644
--- a/tests/wpt/tests/webnn/resources/utils.js
+++ b/tests/wpt/tests/webnn/resources/utils.js
@@ -59,6 +59,13 @@ const getPrecisionTolerance = (graphResources, intermediateOperands) => {
op, graphResources, intermediateOperands)
.value;
break;
+ case 'averagePool2d':
+ case 'maxPool2d':
+ case 'l2Pool2d':
+ toleranceValue += getPoolingOperatorsPrecisionTolerance(
+ op, graphResources, intermediateOperands)
+ .value;
+ break;
default:
const operatorTolerance =
operatorToleranceDict[op.name]?.[expectedDataType];
@@ -1006,6 +1013,53 @@ const getConv2dPrecisionTolerance =
return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
};
+const getPoolingOperatorsPrecisionTolerance =
+ (op, graphResources, intermediateOperands) => {
+ const args = op.arguments;
+ const operatorName = op.name;
+ const {inputs} = graphResources;
+ let inputShape;
+ const inputIndex = args[0][Object.keys(args[0])[0]];
+ if (inputs[inputIndex]) {
+ inputShape = inputs[inputIndex].descriptor.shape;
+ } else {
+ inputShape = intermediateOperands[inputIndex].shape;
+ }
+ const options =
+ args.length === 2 ? {...args[1][Object.keys(args[1])[0]]} : {};
+ let height;
+ let width;
+
+ if (options.windowDimensions) {
+ height = options.windowDimensions[0];
+ width = options.windowDimensions[1];
+ } else {
+ // If not present, the window dimensions are assumed to be the height
+ // and width dimensions of the input shape
+ if (options.layout && options.layout === 'nhwc') {
+ height = inputShape[1];
+ width = inputShape[2];
+ } else {
+ // nhwc layout of input
+ height = inputShape[2];
+ width = inputShape[3];
+ }
+ }
+
+ const tolerance = height * width + 2;
+ const toleranceDict = {
+ averagePool2d: {float32: tolerance, float16: tolerance},
+ l2Pool2d: {float32: tolerance, float16: tolerance},
+ maxPool2d: {float32: 0, float16: 0},
+ };
+ const expectedDataType =
+ getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
+ return {
+ metricType: 'ULP',
+ value: toleranceDict[operatorName][expectedDataType]
+ };
+};
+
const getInstanceNormPrecisionTolerance = (graphResources) => {
// according to
// https://github.com/web-platform-tests/wpt/pull/43891#discussion_r1457026316
diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html
index 9f07713d443..c93f8b3e541 100644
--- a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html
+++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-clone.https.html
@@ -37,7 +37,7 @@ promise_test(async t => {
const original = result.value;
let clone = structuredClone(original);
assert_equals(original.timestamp, clone.timestamp);
- assert_equals(original.getMetadata().absCaptureTime, clone.getMetadata().absCaptureTime);
+ assert_equals(original.getMetadata().captureTime, clone.getMetadata().captureTime);
assert_array_equals(Array.from(original.data), Array.from(clone.data));
await writer2.write(clone);
resolve();
diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html
index 435e1c06783..df4577c5614 100644
--- a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html
+++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html
@@ -39,7 +39,7 @@ promise_test(async t => {
assert_true(original.getMetadata().hasOwnProperty('receiveTime'));
assert_true(original.getMetadata().receiveTime > 0);
assert_equals(original.getMetadata().rtpTimestamp, newFrame.getMetadata().rtpTimestamp);
- assert_equals(original.getMetadata().absCaptureTime, newFrame.getMetadata().absCaptureTime);
+ assert_equals(original.getMetadata().captureTime, newFrame.getMetadata().captureTime);
assert_equals(original.getMetadata().receiveTime, newFrame.getMetadata().receiveTime);
assert_array_equals(Array.from(original.data), Array.from(newFrame.data));
await writer2.write(newFrame);
@@ -83,7 +83,7 @@ promise_test(async t => {
assert_not_equals(original.getMetadata().rtpTimestamp, newFrame.getMetadata().rtpTimestamp);
assert_equals(newMetadata.rtpTimestamp, newFrame.getMetadata().rtpTimestamp);
assert_equals(original.getMetadata().receiveTime, newFrame.getMetadata().receiveTime);
- assert_equals(original.getMetadata().absCaptureTime, newFrame.getMetadata().absCaptureTime);
+ assert_equals(original.getMetadata().captureTime, newFrame.getMetadata().captureTime);
assert_array_equals(Array.from(original.data), Array.from(newFrame.data));
await writer2.write(newFrame);
resolve();
diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js
index 0bf820acde4..f3873e1de4b 100644
--- a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js
+++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCPeerConnection-insertable-streams.js
@@ -30,7 +30,7 @@ function areMetadataEqual(metadata1, metadata2, type) {
metadata1.payloadType == metadata2.payloadType &&
areArraysEqual(
metadata1.contributingSources, metadata2.contributingSources) &&
- metadata1.absCaptureTime == metadata2.absCaptureTime &&
+ metadata1.captureTime == metadata2.captureTime &&
metadata1.frameId === metadata2.frameId &&
areArraysEqual(metadata1.dependencies, metadata2.dependencies) &&
metadata1.spatialIndex === metadata2.spatialIndex &&