From fa42968a6129a7f1eea7df961852827ad6f32f24 Mon Sep 17 00:00:00 2001 From: Servo WPT Sync <32481905+servo-wpt-sync@users.noreply.github.com> Date: Sun, 24 Aug 2025 03:41:18 +0200 Subject: [PATCH] Sync WPT with upstream (24-08-2025) (#38893) Automated downstream sync of changes from upstream as of 24-08-2025 [no-wpt-sync] Signed-off-by: WPT Sync Bot --- .../meta/FileAPI/blob/Blob-slice.any.js.ini | 38 + .../FileAPI/url/url-with-fetch.any.js.ini | 3 - .../wpt/meta/IndexedDB/idlharness.any.js.ini | 66 + ...transaction-deactivation-timing.any.js.ini | 6 + tests/wpt/meta/MANIFEST.json | 1758 ++++++++++++----- .../xslt/document-function-blocked.html.ini | 4 + .../xsltprocessor-include-blocked.html.ini | 4 + .../layer-cssom-order-reverse.html.ini | 3 + .../layer-font-face-override.html.ini | 6 + .../chrome-bug-439886903-crash.html.ini | 2 + ...nloadable-font-scoped-to-document.html.ini | 2 + .../css/css-mixins/cssom.tentative.html.ini | 12 + .../invalidation.tentative.html.ini | 9 + .../css/css-mixins/media-queries.html.ini | 3 + .../parsing/rotate-parsing-computed.html.ini | 18 + .../parsing/rotate-parsing-valid.html.ini | 18 + .../css/css-values/attr-all-types.html.ini | 80 +- ...ackdrop-filter-inline-positioning.html.ini | 2 + ...svg-empty-element-with-filter-001.html.ini | 2 + .../selectors/parsing/parse-heading.html.ini | 30 + .../wpt/meta/dom/abort/AbortSignal.any.js.ini | 2 +- tests/wpt/meta/dom/abort/event.any.js.ini | 2 +- .../wpt/meta/fetch/api/idlharness.any.js.ini | 30 + .../css-font-face.sub.tentative.html.ini | 3 + .../load-pageshow-events-window-open.html.ini | 3 - .../traverse_the_history_5.html.ini | 3 - .../text/canvas.2d.disconnected.html.ini | 2 + ...he-anchor-attribute-003.tentative.html.ini | 9 - .../meta/html/dom/idlharness.https.html.ini | 18 + .../document-with-fragment-empty.html.ini | 3 +- .../iframe_sandbox_popups_escaping-2.html.ini | 2 +- .../iframe_sandbox_popups_escaping-3.html.ini | 1 + ...rame_sandbox_popups_nonescaping-1.html.ini | 1 - ...rame_sandbox_popups_nonescaping-3.html.ini | 2 +- .../disabled-003.html.ini | 2 + .../parent-image-mask.tentative.html.ini | 4 + .../parent-mask.tentative.html.ini | 4 + .../execution-timing/077.html.ini | 3 + .../script-src-event-handler.html.ini | 3 - ...=> script-src-nomodule.tentative.html.ini} | 2 +- .../script-src-unsupported-language.html.ini | 3 - ...t-src-unsupported-type.tentative.html.ini} | 2 +- .../notifications/idlharness.https.any.js.ini | 12 + .../meta/preload/preload-error.sub.html.ini | 5 +- .../initiator-type/svg.html.ini | 3 + .../tentative/document-initiated.html.ini | 9 - .../initiator-url/document-initiated.html.ini | 42 + .../tentative/stylesheet-initiated.html.ini | 2 +- .../idlharness.https.any.js.ini | 15 + .../intercepted-referrer.https.html.ini | 3 + ...h-violation-be-blocked-by-csp-001.html.ini | 3 + .../wpt/meta/urlpattern/urlpattern.any.js.ini | 18 + .../urlpattern/urlpattern.https.any.js.ini | 18 + .../ctor-channelmerger.html.ini | 3 + .../no-dezippering.html.ini | 9 + .../waveshaper-limits.html.ini | 3 + .../waveshaper.html.ini | 3 + .../webxr/render_state_update.https.html.ini | 2 - tests/wpt/tests/.github/workflows/docker.yml | 4 +- .../tests/.well-known/device-bound-sessions | 8 + .../wpt/tests/FileAPI/blob/Blob-slice.any.js | 15 + ...containertiming-child-img-with-ignore.html | 56 + ...with-intermediate-nesting-transparent.html | 55 + .../nested-containertiming-child-img.html | 2 +- ...nertiming-nesting-change-from-invalid.html | 59 + ...ainertiming-nesting-change-to-invalid.html | 51 + ...ed-shadowed-containertiming-child-img.html | 58 + ...transparent-containertiming-child-img.html | 59 + ...ng-child-img-with-intermediate-ignore.html | 54 + ...transparent-containertiming-child-img.html | 57 + ...to-shadowed-containertiming-child-img.html | 60 + ...oad-from-header-report-only-nonce.sub.html | 20 + ...der-report-only-nonce.sub.html.sub.headers | 4 + .../link-preload-report-only-nonce.sub.html | 21 + ...oad-report-only-nonce.sub.html.sub.headers | 3 + .../content-security-policy/support/pass.js | 1 + .../xslt/document-function-blocked.html | 17 + .../xslt/support/document.xsl | 5 + .../xslt/support/empty.xml | 2 + .../xslt/support/xml-with-stylesheet.xml | 3 + .../support/xml-with-stylesheet.xml.headers | 1 + .../xslt/xsltprocessor-include-blocked.html | 33 + .../CSS2/generated-content/WEB_FEATURES.yml | 92 + ...-parent-and-blended-with-3D-transform.html | 2 +- .../anchor-scroll-to-sticky-003.html | 2 +- .../anchor-scroll-to-sticky-003-ref.html | 40 + .../anchor-scroll-to-sticky-004-ref.html | 3 +- .../animation-duration-infinite-ref.html | 11 + .../animation-duration-infinite.html | 29 + .../table-cell-background-local-003.html | 2 +- .../text-in-nested-multicol-ref.html | 6 + .../text-in-nested-multicol.html | 15 + .../chrome-bug-439886903-crash.html | 16 + .../contain-layout-ink-overflow-019.html | 1 - .../contain-layout-overflow-001.html | 1 - .../tests/css/css-content/WEB_FEATURES.yml | 5 + .../grid-template-columns-invalid.html | 20 + .../parsing/grid-template-rows-invalid.html | 20 + ...rows-repeat-intrinsic-valid.tentative.html | 2 - .../highlight-first-letter-float-crash.html | 18 + .../clip-not-absolute-positioned-003.html | 7 +- .../clip-no-clipping-no-text-ref.html | 10 + .../tests/css/css-mixins/cssom.tentative.html | 71 + .../css/css-mixins/invalid-at-top-level.html | 29 + .../css-mixins/invalidation.tentative.html | 86 + .../tests/css/css-mixins/media-queries.html | 44 + .../column-wrap-reset-interpolation.html | 40 + .../animation/columns-interpolation.html | 136 ++ .../animation/discrete-no-interpolation.html | 6 + .../columns-shorthand-reset-wrap.html | 47 + .../multicol-on-broken-image-alt-text.html | 26 + .../parsing/columns-computed.html | 46 + .../css-multicol/parsing/columns-invalid.html | 14 +- .../css-multicol/parsing/columns-valid.html | 14 +- .../scrollable-overflow-input-001.html | 7 +- .../scrollable-overflow-input-002.html | 7 +- .../css-overflow/scrollbar-gutter-002.html | 1 - .../scrollbar-gutter-vertical-lr-002.html | 1 - .../scrollbar-gutter-vertical-rl-002.html | 1 - .../position-sticky-in-fixed-container.html | 1 - ...de-linear-gradient-horizontal-rtl-ref.html | 33 + .../shape-outside-linear-gradient-005.html | 1 + .../shape-outside-linear-gradient-006.html | 1 + .../shape-outside-linear-gradient-007.html | 1 + .../shape-outside-linear-gradient-009.html | 1 + .../shape-outside-linear-gradient-010.html | 1 + ...utside-linear-gradient-horizontal-rtl.html | 50 + .../circle/shape-outside-circle-052.html | 1 + .../circle/shape-outside-circle-053.html | 1 + .../ellipse/shape-outside-ellipse-050.html | 1 + .../ellipse/shape-outside-ellipse-051.html | 1 + .../reference/text-emphasis-color-001-ref.xht | 2 +- .../text-emphasis-style-002-ref.html | 2 +- .../reference/text-emphasis-style-007.html | 2 +- .../text-emphasis-style-008-ref.html | 2 +- .../text-emphasis-style-010-ref.html | 2 +- .../text-emphasis-style-012-ref.html | 2 +- .../text-emphasis-style-021-ref.html | 2 +- .../text-emphasis-style-filled-001-ref.xht | 2 +- .../text-emphasis-style-open-001-ref.xht | 2 +- .../text-emphasis-style-shape-001-ref.xht | 2 +- .../text-emphasis-style-string-001-ref.xht | 2 +- .../text-emphasis-color-001.xht | 2 +- .../text-emphasis-line-height-001-ref.html | 6 +- .../text-emphasis-line-height-001a.html | 4 + .../text-emphasis-line-height-001b.html | 4 + .../text-emphasis-line-height-001z.html | 2 + .../text-emphasis-line-height-002-ref.html | 6 +- .../text-emphasis-line-height-002a.html | 4 + .../text-emphasis-line-height-002b.html | 4 + .../text-emphasis-punctuation-1-ref.html | 2 +- .../text-emphasis-punctuation-1.html | 2 +- .../text-emphasis-punctuation-2-ref.html | 1 + .../text-emphasis-punctuation-2.html | 1 + .../text-emphasis-style-002.html | 3 + .../text-emphasis-style-007.html | 2 +- .../text-emphasis-style-008.html | 2 +- .../text-emphasis-style-010.html | 2 +- .../text-emphasis-style-012.html | 2 +- .../text-emphasis-style-016.html | 3 + .../text-emphasis-style-021.html | 2 +- .../text-emphasis-style-filled-001.xht | 2 +- .../text-emphasis-style-open-001.xht | 2 +- .../text-emphasis-style-shape-001.xht | 2 +- .../text-emphasis-style-string-001.xht | 2 +- ...trailing-space-and-text-alignment-002.html | 1 - ...trailing-space-and-text-alignment-004.html | 1 - ...ling-space-and-text-alignment-rtl-002.html | 1 - ...ling-space-and-text-alignment-rtl-004.html | 1 - .../parsing/rotate-parsing-computed.html | 10 + .../parsing/rotate-parsing-valid.html | 10 + .../wpt/tests/css/css-values/WEB_FEATURES.yml | 3 + .../tests/css/css-values/attr-all-types.html | 6 + .../document-active-view-transition.html | 46 + .../table-cell-valign-001.html | 1 + .../table-cell-valign-002.html | 1 + .../table-cell-valign-003.html | 1 + .../table-cell-valign-004.html | 1 + .../text-combine-upright-sideways-001.html | 1 + .../vertical-alignment-slr-029-ref.xht | 34 + .../vertical-alignment-slr-029.xht | 6 +- .../vertical-alignment-slr-031-ref.xht | 37 + .../vertical-alignment-slr-031.xht | 4 +- .../vertical-alignment-slr-033-ref.xht | 33 + .../vertical-alignment-slr-033.xht | 4 +- .../vertical-alignment-slr-035-ref.xht | 34 + .../vertical-alignment-slr-035.xht | 6 +- .../backdrop-filter-inline-positioning.html | 36 + ...ackdrop-filter-inline-positioning-ref.html | 33 + .../svg-empty-element-with-filter-001.html | 29 +- .../selectors/has-focus-display-change.html | 44 + tests/wpt/tests/css/selectors/heading.html | 9 - .../css/selectors/parsing/parse-heading.html | 34 + .../allowed-refresh-initiators.https.html | 2 +- .../credentials-matching.https.html | 2 +- .../debug-header.https.html | 8 +- .../include-site.https.html | 2 +- .../device-bound-session-credentials/login.py | 14 +- .../multiple-credentials.https.html | 2 +- .../multiple-registrations.https.html | 2 +- ...refresh-does-not-send-challenge.https.html | 2 +- .../refresh-replaces-config.https.html | 4 +- .../refresh-with-continue-false.https.html | 2 +- .../registration-sends-challenge.https.html | 2 +- .../resolving-urls.https.html | 2 +- ...ession-cookie-has-no-attributes.https.html | 2 +- .../set-authorization.https.html | 2 +- .../set-early-challenge.https.html | 6 +- .../set-scope-origin.https.html | 2 +- .../set-scope-specification.https.html | 2 +- .../setup_sharded_server_state.py | 10 +- .../subdomain-registration.https.html | 68 + .../fedcm-continue-on-disallowed.https.html | 2 +- ...l => script-js-unlabeled-gzipped.sub.html} | 0 tests/wpt/tests/fetch/range/general.any.js | 5 +- .../the-anchor-attribute-003.tentative.html | 71 - ...drop-text-elements-input-event-manual.html | 277 +++ ...ertReplacementText-input-event-manual.html | 209 ++ .../fieldset-overflow.html | 1 - .../firefox-bug-1928736-1-crash.html | 11 + .../firefox-bug-1928736-2-crash.html | 15 + .../parent-image-mask.tentative.html | 43 + .../parent-mask.tentative.html | 43 + ...s-mode-no-height-is-still-bounded-ref.html | 2 +- ...-no-height-is-still-bounded.tentative.html | 2 +- .../json-module/invalid-content-type.any.js | 109 + .../event-dispatch-shadow.html | 3 +- .../script-src-event-handler.sub.html | 25 - ...=> script-src-nomodule.tentative.sub.html} | 0 .../script-src-unsupported-language.sub.html | 25 - ...t-src-unsupported-type.tentative.sub.html} | 2 +- .../script-src-event-handler-framed.sub.html | 12 - ...t-src-unsupported-language-framed.sub.html | 12 - ...cript-src-unsupported-type-framed.sub.html | 2 +- .../page-load/script-src-event-handler.html | 21 - ...tml => script-src-nomodule.tentative.html} | 0 .../script-src-unsupported-language.html | 21 - ...cript-src-unsupported-type.tentative.html} | 0 ...c-unsupported-type-nonspeculative.sub.html | 2 +- .../speculative-parsing/tools/generate.py | 48 +- .../document-write/mutation-observer.html | 38 + ...mutation-observer-iframe-script-async.html | 16 + ...mutation-observer-iframe-script-defer.html | 16 + ...utation-observer-iframe-script-module.html | 16 + .../mutation-observer-iframe-script.html | 18 + .../mutation-observer-iframe-script.js | 1 + ..._before_prepare_the_script_element-01.html | 39 + ...before_prepare_the_script_element-02.xhtml | 42 + .../scripting/event-loops/resources/async.js | 1 + .../scripting/event-loops/resources/defer.js | 1 + tests/wpt/tests/interfaces/IndexedDB.idl | 23 +- tests/wpt/tests/interfaces/cookiestore.idl | 8 +- .../wpt/tests/interfaces/crash-reporting.idl | 8 +- tests/wpt/tests/interfaces/css-typed-om.idl | 4 +- tests/wpt/tests/interfaces/element-timing.idl | 2 +- tests/wpt/tests/interfaces/fedcm.idl | 7 +- tests/wpt/tests/interfaces/fetch.idl | 13 + tests/wpt/tests/interfaces/fs.idl | 2 +- tests/wpt/tests/interfaces/html.idl | 663 ++++--- .../interfaces/largest-contentful-paint.idl | 1 + tests/wpt/tests/interfaces/mediaqueries-5.idl | 8 + tests/wpt/tests/interfaces/notifications.idl | 3 + .../privacy-preserving-attribution.idl | 2 +- tests/wpt/tests/interfaces/push-api.idl | 10 +- tests/wpt/tests/interfaces/shared-storage.idl | 2 +- tests/wpt/tests/interfaces/streams.idl | 2 +- tests/wpt/tests/interfaces/webidl.idl | 13 + tests/wpt/tests/interfaces/webnn.idl | 6 + .../wpt/tests/interfaces/webrtc-identity.idl | 2 +- tests/wpt/tests/interfaces/webrtc-stats.idl | 2 +- .../mrow/semantics-005-ref.html | 15 +- .../mrow/semantics-005.html | 15 +- .../scripts/cramped-001.html | 2 +- .../parsing/math-depth-computed.html | 19 + .../parsing/math-depth-invalid.html | 26 + .../css-styling/parsing/math-depth-valid.html | 21 + .../parsing/math-shift-computed.html | 19 + .../parsing/math-shift-invalid.html | 19 + .../css-styling/parsing/math-shift-valid.html | 18 + .../parsing/math-style-computed.html | 19 + .../parsing/math-style-invalid.html | 19 + .../css-styling/parsing/math-style-valid.html | 18 + ...navigate-multiple-navigation-navigate.html | 38 + ...OrientationSensor-iframe-access.https.html | 1 + ...oundary_events_attributes_during_drag.html | 166 ++ .../initiator-type/resources/dummy.svg | 6 + .../resource-timing/initiator-type/svg.html | 4 + .../resources/test-initiator.js | 61 +- .../tentative/document-initiated.html | 113 -- .../initiator-url/document-initiated.html | 95 + .../tests/resources/webidl2/lib/VERSION.md | 2 +- .../tests/resources/webidl2/lib/webidl2.js | 588 ++++-- .../intercepted-referrer.https.html | 51 + .../resources/intercepted-referrer-sw.js | 35 + ...s.window.js => idlharness.https.window.js} | 0 ...e-allow-storage-access.sub.https.window.js | 2 +- ...sandboxed-iframe-allow-storage-access.html | 2 + .../bad-buffers-and-views.any.js | 17 +- .../external-resource-inline-sheet-helper.svg | 7 + .../external-resource-inline-sheet-ref.html | 17 + .../external-resource-inline-sheet.html | 9 + tests/wpt/tests/svg/painting/marker-009.svg | 1 + .../use-element-attr-selector-transition.html | 25 + .../styling/use-element-attr-selector.html | 24 + ...use-element-class-selector-transition.html | 25 + .../styling/use-element-class-selector.html | 24 + .../use-element-id-selector-transition.html | 27 + .../svg/styling/use-element-id-selector.html | 26 + .../svg/styling/use-element-selector-ref.html | 5 + .../use-element-transitions-dom-mutation.html | 29 + .../types/scripted/SVGAnimatedInteger.html | 13 +- .../svg/types/scripted/SVGAnimatedNumber.html | 3 +- tests/wpt/tests/tools/ci/tc/tasks/test.yml | 39 +- .../wpt/tests/tools/ci/tc/tests/test_valid.py | 48 +- .../webdriver/bidi/modules/emulation.py | 16 +- .../webdriver/bidi/modules/network.py | 13 + .../wptrunner/wptrunner/browsers/chrome.py | 9 + .../wptrunner/wptrunner/browsers/firefox.py | 12 +- .../wptrunner/executors/executorchrome.py | 71 +- .../wptrunner/executors/executormarionette.py | 12 +- .../wptrunner/wptrunner/wptcommandline.py | 6 + ...match-violation-be-blocked-by-csp-001.html | 8 +- ...policy-creation-be-blocked-by-csp-002.html | 8 +- .../resources/urlpatterntestdata.json | 42 + .../toggle-animated-iframe-visibility.html | 1 - .../tests/webaudio/resources/audit-util.js | 8 - .../audiobuffersource-playbackrate-zero.html | 138 +- .../sub-sample-buffer-stitching.html | 146 +- .../ctor-channelmerger.html | 103 +- .../no-dezippering.html | 136 +- .../waveshaper-limits.html | 102 +- .../waveshaper.html | 117 +- tests/wpt/tests/webcodecs/README.md | 10 + .../four-colors-full-range-hlg-420-10bpc.avif | Bin 0 -> 376 bytes .../four-colors-full-range-hlg-420-12bpc.avif | Bin 0 -> 386 bytes .../four-colors-full-range-hlg-422-10bpc.avif | Bin 0 -> 376 bytes .../four-colors-full-range-hlg-422-12bpc.avif | Bin 0 -> 393 bytes .../four-colors-full-range-hlg-444-10bpc.avif | Bin 0 -> 381 bytes .../four-colors-full-range-hlg-444-12bpc.avif | Bin 0 -> 389 bytes .../tests/webcodecs/image-decoder-utils.js | 13 + .../webcodecs/image-decoder.https.any.js | 67 +- .../tests/webdriver/tests/bidi/__init__.py | 46 +- .../emulation/set_locale_override/conftest.py | 11 +- .../emulation/set_locale_override/contexts.py | 46 + .../set_scripting_enabled/__init__.py | 0 .../set_scripting_enabled/conftest.py | 26 + .../set_scripting_enabled/contexts.py | 91 + .../set_scripting_enabled/enabled.py | 25 + .../set_scripting_enabled/invalid.py | 125 ++ .../set_scripting_enabled/user_contexts.py | 145 ++ .../bidi/network/disown_data/__init__.py | 0 .../bidi/network/disown_data/collector.py | 76 + .../tests/bidi/network/disown_data/invalid.py | 91 + .../tests/bidi/network/disown_data/request.py | 29 + .../tests/bidi/network/get_data/invalid.py | 14 + .../classic/perform_actions/pointer_mouse.py | 6 +- ...criptTransform-encoded-transform-worker.js | 5 +- .../RTCEncodedVideoFrame-constructor.html | 67 + tests/wpt/tests/webvtt/META.yml | 2 + .../enable_controls_reposition-ref.html | 52 - .../enable_controls_reposition.html | 43 - .../media_height400_with_controls-ref.html | 33 - .../media_height400_with_controls.html | 23 - .../media_with_controls-ref.html | 33 - .../processing-model/media_with_controls.html | 23 - 365 files changed, 7904 insertions(+), 2377 deletions(-) create mode 100644 tests/wpt/meta/FileAPI/blob/Blob-slice.any.js.ini create mode 100644 tests/wpt/meta/content-security-policy/xslt/document-function-blocked.html.ini create mode 100644 tests/wpt/meta/content-security-policy/xslt/xsltprocessor-include-blocked.html.ini create mode 100644 tests/wpt/meta/css/css-cascade/layer-cssom-order-reverse.html.ini create mode 100644 tests/wpt/meta/css/css-conditional/container-queries/crashtests/chrome-bug-439886903-crash.html.ini create mode 100644 tests/wpt/meta/css/css-fonts/downloadable-font-scoped-to-document.html.ini create mode 100644 tests/wpt/meta/css/css-mixins/cssom.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-mixins/invalidation.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-mixins/media-queries.html.ini create mode 100644 tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-computed.html.ini create mode 100644 tests/wpt/meta/css/filter-effects/backdrop-filter-inline-positioning.html.ini create mode 100644 tests/wpt/meta/css/filter-effects/svg-empty-element-with-filter-001.html.ini create mode 100644 tests/wpt/meta/css/selectors/parsing/parse-heading.html.ini delete mode 100644 tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini create mode 100644 tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini delete mode 100644 tests/wpt/meta/html/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html.ini create mode 100644 tests/wpt/meta/html/semantics/forms/the-fieldset-element/disabled-003.html.ini create mode 100644 tests/wpt/meta/html/semantics/permission-element/parent-image-mask.tentative.html.ini create mode 100644 tests/wpt/meta/html/semantics/permission-element/parent-mask.tentative.html.ini create mode 100644 tests/wpt/meta/html/semantics/scripting-1/the-script-element/execution-timing/077.html.ini delete mode 100644 tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html.ini rename tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/{script-src-nomodule.html.ini => script-src-nomodule.tentative.html.ini} (66%) delete mode 100644 tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html.ini rename tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/{script-src-unsupported-type.html.ini => script-src-unsupported-type.tentative.html.ini} (64%) delete mode 100644 tests/wpt/meta/resource-timing/tentative/document-initiated.html.ini create mode 100644 tests/wpt/meta/resource-timing/tentative/initiator-url/document-initiated.html.ini create mode 100644 tests/wpt/meta/service-workers/service-worker/intercepted-referrer.https.html.ini delete mode 100644 tests/wpt/meta/webxr/render_state_update.https.html.ini create mode 100644 tests/wpt/tests/.well-known/device-bound-sessions create mode 100644 tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-ignore.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-intermediate-nesting-transparent.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-from-invalid.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-to-invalid.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-shadowed-containertiming-child-img.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-shadowed-to-transparent-containertiming-child-img.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img-with-intermediate-ignore.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img.html create mode 100644 tests/wpt/tests/container-timing/tentative/nested-transparent-to-shadowed-containertiming-child-img.html create mode 100644 tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html create mode 100644 tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html.sub.headers create mode 100644 tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html create mode 100644 tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html.sub.headers create mode 100644 tests/wpt/tests/content-security-policy/support/pass.js create mode 100644 tests/wpt/tests/content-security-policy/xslt/document-function-blocked.html create mode 100644 tests/wpt/tests/content-security-policy/xslt/support/document.xsl create mode 100644 tests/wpt/tests/content-security-policy/xslt/support/empty.xml create mode 100644 tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml create mode 100644 tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml.headers create mode 100644 tests/wpt/tests/content-security-policy/xslt/xsltprocessor-include-blocked.html create mode 100644 tests/wpt/tests/css/CSS2/generated-content/WEB_FEATURES.yml create mode 100644 tests/wpt/tests/css/css-anchor-position/reference/anchor-scroll-to-sticky-003-ref.html create mode 100644 tests/wpt/tests/css/css-animations/animation-duration-infinite-ref.html create mode 100644 tests/wpt/tests/css/css-animations/animation-duration-infinite.html create mode 100644 tests/wpt/tests/css/css-break/table/repeated-section/text-in-nested-multicol-ref.html create mode 100644 tests/wpt/tests/css/css-break/table/repeated-section/text-in-nested-multicol.html create mode 100644 tests/wpt/tests/css/css-conditional/container-queries/crashtests/chrome-bug-439886903-crash.html create mode 100644 tests/wpt/tests/css/css-highlight-api/crashtests/highlight-first-letter-float-crash.html create mode 100644 tests/wpt/tests/css/css-masking/clip/reference/clip-no-clipping-no-text-ref.html create mode 100644 tests/wpt/tests/css/css-mixins/cssom.tentative.html create mode 100644 tests/wpt/tests/css/css-mixins/invalid-at-top-level.html create mode 100644 tests/wpt/tests/css/css-mixins/invalidation.tentative.html create mode 100644 tests/wpt/tests/css/css-mixins/media-queries.html create mode 100644 tests/wpt/tests/css/css-multicol/animation/column-wrap-reset-interpolation.html create mode 100644 tests/wpt/tests/css/css-multicol/animation/columns-interpolation.html create mode 100644 tests/wpt/tests/css/css-multicol/columns-shorthand-reset-wrap.html create mode 100644 tests/wpt/tests/css/css-multicol/multicol-on-broken-image-alt-text.html create mode 100644 tests/wpt/tests/css/css-multicol/parsing/columns-computed.html create mode 100644 tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/reference/shape-outside-linear-gradient-horizontal-rtl-ref.html create mode 100644 tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-horizontal-rtl.html create mode 100644 tests/wpt/tests/css/css-view-transitions/document-active-view-transition.html create mode 100644 tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-029-ref.xht create mode 100644 tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031-ref.xht create mode 100644 tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-033-ref.xht create mode 100644 tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-035-ref.xht create mode 100644 tests/wpt/tests/css/filter-effects/backdrop-filter-inline-positioning.html create mode 100644 tests/wpt/tests/css/filter-effects/reference/backdrop-filter-inline-positioning-ref.html create mode 100644 tests/wpt/tests/css/selectors/has-focus-display-change.html create mode 100644 tests/wpt/tests/css/selectors/parsing/parse-heading.html create mode 100644 tests/wpt/tests/device-bound-session-credentials/subdomain-registration.https.html rename tests/wpt/tests/fetch/orb/tentative/{script-js-unlabeled-gziped.sub.html => script-js-unlabeled-gzipped.sub.html} (100%) delete mode 100644 tests/wpt/tests/html/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html create mode 100644 tests/wpt/tests/html/editing/dnd/events/dragdrop-text-elements-input-event-manual.html create mode 100644 tests/wpt/tests/html/editing/editing-0/contenteditable/spellcheck-insertReplacementText-input-event-manual.html create mode 100644 tests/wpt/tests/html/rendering/the-details-element/firefox-bug-1928736-1-crash.html create mode 100644 tests/wpt/tests/html/rendering/the-details-element/firefox-bug-1928736-2-crash.html create mode 100644 tests/wpt/tests/html/semantics/permission-element/parent-image-mask.tentative.html create mode 100644 tests/wpt/tests/html/semantics/permission-element/parent-mask.tentative.html delete mode 100644 tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-event-handler.sub.html rename tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/{script-src-nomodule.sub.html => script-src-nomodule.tentative.sub.html} (100%) delete mode 100644 tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-language.sub.html rename tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/{script-src-unsupported-type.sub.html => script-src-unsupported-type.tentative.sub.html} (97%) delete mode 100644 tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-event-handler-framed.sub.html delete mode 100644 tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-language-framed.sub.html delete mode 100644 tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html rename tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/{script-src-nomodule.html => script-src-nomodule.tentative.html} (100%) delete mode 100644 tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html rename tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/{script-src-unsupported-type.html => script-src-unsupported-type.tentative.html} (100%) create mode 100644 tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/mutation-observer.html create mode 100644 tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-async.html create mode 100644 tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-defer.html create mode 100644 tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-module.html create mode 100644 tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.html create mode 100644 tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.js create mode 100644 tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-01.html create mode 100644 tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-02.xhtml create mode 100644 tests/wpt/tests/html/webappapis/scripting/event-loops/resources/async.js create mode 100644 tests/wpt/tests/html/webappapis/scripting/event-loops/resources/defer.js create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-computed.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-invalid.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-valid.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-computed.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-invalid.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-valid.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-computed.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-invalid.html create mode 100644 tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-valid.html create mode 100644 tests/wpt/tests/navigation-api/navigate-event/navigate-multiple-navigation-navigate.html create mode 100644 tests/wpt/tests/pointerevents/pointerevent_boundary_events_attributes_during_drag.html create mode 100644 tests/wpt/tests/resource-timing/initiator-type/resources/dummy.svg delete mode 100644 tests/wpt/tests/resource-timing/tentative/document-initiated.html create mode 100644 tests/wpt/tests/resource-timing/tentative/initiator-url/document-initiated.html create mode 100644 tests/wpt/tests/service-workers/service-worker/intercepted-referrer.https.html create mode 100644 tests/wpt/tests/service-workers/service-worker/resources/intercepted-referrer-sw.js rename tests/wpt/tests/speech-api/{idlharness.window.js => idlharness.https.window.js} (100%) create mode 100644 tests/wpt/tests/svg/as-image/external-resource-inline-sheet-helper.svg create mode 100644 tests/wpt/tests/svg/as-image/external-resource-inline-sheet-ref.html create mode 100644 tests/wpt/tests/svg/as-image/external-resource-inline-sheet.html create mode 100644 tests/wpt/tests/svg/styling/use-element-attr-selector-transition.html create mode 100644 tests/wpt/tests/svg/styling/use-element-attr-selector.html create mode 100644 tests/wpt/tests/svg/styling/use-element-class-selector-transition.html create mode 100644 tests/wpt/tests/svg/styling/use-element-class-selector.html create mode 100644 tests/wpt/tests/svg/styling/use-element-id-selector-transition.html create mode 100644 tests/wpt/tests/svg/styling/use-element-id-selector.html create mode 100644 tests/wpt/tests/svg/styling/use-element-selector-ref.html create mode 100644 tests/wpt/tests/svg/styling/use-element-transitions-dom-mutation.html create mode 100644 tests/wpt/tests/webcodecs/four-colors-full-range-hlg-420-10bpc.avif create mode 100644 tests/wpt/tests/webcodecs/four-colors-full-range-hlg-420-12bpc.avif create mode 100644 tests/wpt/tests/webcodecs/four-colors-full-range-hlg-422-10bpc.avif create mode 100644 tests/wpt/tests/webcodecs/four-colors-full-range-hlg-422-12bpc.avif create mode 100644 tests/wpt/tests/webcodecs/four-colors-full-range-hlg-444-10bpc.avif create mode 100644 tests/wpt/tests/webcodecs/four-colors-full-range-hlg-444-12bpc.avif create mode 100644 tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/__init__.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/conftest.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/contexts.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/enabled.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/invalid.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/user_contexts.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/disown_data/__init__.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/disown_data/collector.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/disown_data/invalid.py create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/disown_data/request.py create mode 100644 tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-constructor.html delete mode 100644 tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition-ref.html delete mode 100644 tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition.html delete mode 100644 tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls-ref.html delete mode 100644 tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls.html delete mode 100644 tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls-ref.html delete mode 100644 tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls.html diff --git a/tests/wpt/meta/FileAPI/blob/Blob-slice.any.js.ini b/tests/wpt/meta/FileAPI/blob/Blob-slice.any.js.ini new file mode 100644 index 00000000000..75233515aaf --- /dev/null +++ b/tests/wpt/meta/FileAPI/blob/Blob-slice.any.js.ini @@ -0,0 +1,38 @@ +[Blob-slice.any.html] + [Slicing test: slice (1,1).] + expected: FAIL + + [Slicing test: slice (1,3).] + expected: FAIL + + [Slicing test: slice (1,5).] + expected: FAIL + + [Slicing test: slice (1,7).] + expected: FAIL + + [Slicing test: slice (1,8).] + expected: FAIL + + [Slicing test: slice (1,9).] + expected: FAIL + + +[Blob-slice.any.worker.html] + [Slicing test: slice (1,1).] + expected: FAIL + + [Slicing test: slice (1,3).] + expected: FAIL + + [Slicing test: slice (1,5).] + expected: FAIL + + [Slicing test: slice (1,7).] + expected: FAIL + + [Slicing test: slice (1,8).] + expected: FAIL + + [Slicing test: slice (1,9).] + expected: FAIL diff --git a/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini index b275cb58343..292dc852b9f 100644 --- a/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini +++ b/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini @@ -12,6 +12,3 @@ [Revoke blob URL after creating Request, then clone Request, will fetch] expected: FAIL - - [Revoke blob URL after calling fetch, fetch should succeed] - expected: FAIL diff --git a/tests/wpt/meta/IndexedDB/idlharness.any.js.ini b/tests/wpt/meta/IndexedDB/idlharness.any.js.ini index 3dd6edbf07b..6ea65643ea2 100644 --- a/tests/wpt/meta/IndexedDB/idlharness.any.js.ini +++ b/tests/wpt/meta/IndexedDB/idlharness.any.js.ini @@ -134,6 +134,39 @@ [IDBFactory interface: [object IDBFactory\] must inherit property "databases()" with the proper type] expected: FAIL + [IDBObjectStore interface: operation getAllRecords(optional IDBGetAllOptions)] + expected: FAIL + + [IDBIndex interface: operation getAllRecords(optional IDBGetAllOptions)] + expected: FAIL + + [IDBRecord interface: existence and properties of interface object] + expected: FAIL + + [IDBRecord interface object length] + expected: FAIL + + [IDBRecord interface object name] + expected: FAIL + + [IDBRecord interface: existence and properties of interface prototype object] + expected: FAIL + + [IDBRecord interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [IDBRecord interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [IDBRecord interface: attribute key] + expected: FAIL + + [IDBRecord interface: attribute primaryKey] + expected: FAIL + + [IDBRecord interface: attribute value] + expected: FAIL + [idlharness.any.serviceworker.html] expected: ERROR @@ -270,3 +303,36 @@ [IDBFactory interface: [object IDBFactory\] must inherit property "databases()" with the proper type] expected: FAIL + + [IDBObjectStore interface: operation getAllRecords(optional IDBGetAllOptions)] + expected: FAIL + + [IDBIndex interface: operation getAllRecords(optional IDBGetAllOptions)] + expected: FAIL + + [IDBRecord interface: existence and properties of interface object] + expected: FAIL + + [IDBRecord interface object length] + expected: FAIL + + [IDBRecord interface object name] + expected: FAIL + + [IDBRecord interface: existence and properties of interface prototype object] + expected: FAIL + + [IDBRecord interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [IDBRecord interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [IDBRecord interface: attribute key] + expected: FAIL + + [IDBRecord interface: attribute primaryKey] + expected: FAIL + + [IDBRecord interface: attribute value] + expected: FAIL diff --git a/tests/wpt/meta/IndexedDB/transaction-deactivation-timing.any.js.ini b/tests/wpt/meta/IndexedDB/transaction-deactivation-timing.any.js.ini index 3bb3235f4b5..7e35d96fb64 100644 --- a/tests/wpt/meta/IndexedDB/transaction-deactivation-timing.any.js.ini +++ b/tests/wpt/meta/IndexedDB/transaction-deactivation-timing.any.js.ini @@ -16,6 +16,12 @@ [Deactivation of new transactions happens at end of invocation] expected: FAIL + [New transactions are deactivated before next task] + expected: FAIL + + [New transactions from microtask are deactivated before next task] + expected: FAIL + [transaction-deactivation-timing.any.sharedworker.html] expected: ERROR diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index fc97f7777cf..0343219909b 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -1906,6 +1906,13 @@ {} ] ], + "chrome-bug-439886903-crash.html": [ + "a32a38925d1d0f4a9467589791c18974cf219959", + [ + null, + {} + ] + ], "chrome-custom-highlight-crash.html": [ "61e5075ed4e1b485019d96b402bbf17926bd1098", [ @@ -3098,6 +3105,17 @@ } } }, + "css-highlight-api": { + "crashtests": { + "highlight-first-letter-float-crash.html": [ + "ea3742954966931f3d42c075678ad6fdc35bb78a", + [ + null, + {} + ] + ] + } + }, "css-images": { "cross-fade-legacy-2-crash.html": [ "37321f88c1671de236e48341f14366e744c63f34", @@ -8328,6 +8346,20 @@ {} ] ], + "firefox-bug-1928736-1-crash.html": [ + "498a4906398f7816cf66f383948eb9f68b8cf9b2", + [ + null, + {} + ] + ], + "firefox-bug-1928736-2-crash.html": [ + "d26844eb3f7c684bc6067a9ca8458dbc0c2b8cd5", + [ + null, + {} + ] + ], "two-summaries-removal-crash.html": [ "164d3f16aa65deb97826607e2f57c33dcaa0f9b0", [ @@ -24260,6 +24292,13 @@ {} ] ], + "dragdrop-text-elements-input-event-manual.html": [ + "4c65e663666c6e74d86189905340fa8915fd2c52", + [ + null, + {} + ] + ], "dragend-event-manual.html": [ "b4bb621e888d5a632fe0ff35e95036d5634e41db", [ @@ -24918,6 +24957,17 @@ ] ] } + }, + "editing-0": { + "contenteditable": { + "spellcheck-insertReplacementText-input-event-manual.html": [ + "61736269634fc7135a09529f364de9457b6d9c11", + [ + null, + {} + ] + ] + } } }, "links": { @@ -124699,7 +124749,7 @@ ] ], "mix-blend-mode-both-parent-and-blended-with-3D-transform.html": [ - "59fca74f8409f7288ff64f0828cb6c1c417e2a97", + "f634dd7fd99857c6529fdd7c5441beab03c629a9", [ null, [ @@ -124715,7 +124765,7 @@ [ [ 0, - 128 + 180 ], [ 0, @@ -126993,12 +127043,12 @@ ] ], "anchor-scroll-to-sticky-003.html": [ - "ac5e1c3c692e6eaa93789bd8145fb27bbe61d916", + "395d736afb47d34680470103a2660fadccce8851", [ null, [ [ - "/css/css-anchor-position/reference/anchor-scroll-to-sticky-001-ref.html", + "/css/css-anchor-position/reference/anchor-scroll-to-sticky-003-ref.html", "==" ] ], @@ -127930,6 +127980,19 @@ {} ] ], + "animation-duration-infinite.html": [ + "cfe6dc0bcf4f946832b82c4a838844498be2cc22", + [ + null, + [ + [ + "/css/css-animations/animation-duration-infinite-ref.html", + "==" + ] + ], + {} + ] + ], "animation-important-002.html": [ "2a68f8e0cacf06e2e5761ef392b90a4f89fcc843", [ @@ -138171,7 +138234,7 @@ ] ], "table-cell-background-local-003.html": [ - "5641d3d41c0a8770feb120f2898df5262688ca6a", + "e2662bec1fa75049c07cbc07c24449e37c4c56a7", [ null, [ @@ -138180,23 +138243,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "table-cell-background-local.html": [ @@ -150954,6 +151001,19 @@ {} ] ], + "text-in-nested-multicol.html": [ + "e1eb6f9c19ab8398d14f0ed545e40dad05452499", + [ + null, + [ + [ + "/css/css-break/table/repeated-section/text-in-nested-multicol-ref.html", + "==" + ] + ], + {} + ] + ], "variable-fragmentainer-size-001.html": [ "f75a8cf216e9a7b03c4d92022b9a1fc880bc9e51", [ @@ -160740,7 +160800,7 @@ ] ], "contain-layout-ink-overflow-019.html": [ - "5cda6cd5bebb2f3353778eb17285b4dd487ca881", + "d4909aa70f597b31ca0c13a7c63ce3a810d44ccc", [ null, [ @@ -160749,23 +160809,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "contain-layout-ink-overflow-020.html": [ @@ -160782,7 +160826,7 @@ ] ], "contain-layout-overflow-001.html": [ - "05c66fa1e985261dcf8bab284ad05c9b88e293ba", + "5bf984e2bf12263526165048c4aeb0e9236c5bbb", [ null, [ @@ -160791,23 +160835,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "contain-layout-overflow-002.html": [ @@ -214902,12 +214930,12 @@ ] ], "clip-not-absolute-positioned-003.html": [ - "ee3765db7aca5db4d569fdc7b40dcdc633c679a9", + "f6842c50edfbd736a8c26388038b8be0fad4b735", [ null, [ [ - "/css/css-masking/clip/reference/clip-no-clipping-ref.html", + "/css/css-masking/clip/reference/clip-no-clipping-no-text-ref.html", "==" ] ], @@ -225037,6 +225065,19 @@ {} ] ], + "multicol-on-broken-image-alt-text.html": [ + "46e8423b3f2c161a9fabdc9b5d847472a5e2559c", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "multicol-oof-inline-cb-001.html": [ "76c48e8059536707186ae6131fd64f75d3734b2d", [ @@ -233272,7 +233313,7 @@ ] ], "scrollable-overflow-input-001.html": [ - "1b58803079f8b60b68eb1c57a0c522962e0a8019", + "47531c7c8d81e9b84ca690da1ce57cd6e4828fb7", [ null, [ @@ -233285,7 +233326,7 @@ ] ], "scrollable-overflow-input-002.html": [ - "3efebf0b90da7eec05fa4df14b4ac6c78e774773", + "3cb9756dfade994622a38bb2394d3ff493226fcf", [ null, [ @@ -233324,7 +233365,7 @@ ] ], "scrollbar-gutter-002.html": [ - "73c10dc7b3feccdf97ec442c504dad70e6ea0feb", + "129eb2c08590c98505e36f63da173d1c8a4bf98d", [ null, [ @@ -233333,23 +233374,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 20 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "scrollbar-gutter-abspos-001.html": [ @@ -233522,7 +233547,7 @@ ] ], "scrollbar-gutter-vertical-lr-002.html": [ - "598cfdf3664f6ba14df20b73b3383ceb091fe12c", + "9e5dcd299eba99e4ab6f077149a841011805c0a5", [ null, [ @@ -233531,27 +233556,11 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 25 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "scrollbar-gutter-vertical-rl-002.html": [ - "398751845cf3d01dc47254e146d9bb1ada18bf40", + "d68d4e5d3cba0353da274f9c75c558c0a8324092", [ null, [ @@ -233560,23 +233569,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "scrollbar-gutter-with-background-gradient.html": [ @@ -237578,7 +237571,7 @@ ] ], "position-sticky-in-fixed-container.html": [ - "75c2d67259e39513e6fbc7e5daa8d3b227a8ab9c", + "359ec2fd337e76e5ba1540754c87375c4090c1e2", [ null, [ @@ -237587,23 +237580,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "position-sticky-inline.html": [ @@ -246431,7 +246408,7 @@ ] ], "shape-outside-linear-gradient-005.html": [ - "6d0fc21361bd3dd36b7b7f96659f9eed8c4dffab", + "2f6823ac6dba382f2e647764b48df78777dbb26c", [ null, [ @@ -246440,11 +246417,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 7600, + 8700 + ] + ] + ] + ] + } ] ], "shape-outside-linear-gradient-006.html": [ - "68243e0ab8f8848a6da29e78b69acda56f878e76", + "e0a180d6877cdb6c306954402d42b7e792261b46", [ null, [ @@ -246453,11 +246446,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 7600, + 8700 + ] + ] + ] + ] + } ] ], "shape-outside-linear-gradient-007.html": [ - "4ef0b6b5dfeaec318dc7f612d52073a8c3f12e39", + "1eca566a0b459bb4f4008cab2ee702f3b4d5c989", [ null, [ @@ -246466,7 +246475,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 7600, + 8700 + ] + ] + ] + ] + } ] ], "shape-outside-linear-gradient-008.html": [ @@ -246483,7 +246508,7 @@ ] ], "shape-outside-linear-gradient-009.html": [ - "50c80d0ac76e2a98a60cd40a5b82fa017e0f8a7a", + "e3ebf3c29d626f9d58a9589b2d26f1c30e7518a7", [ null, [ @@ -246492,11 +246517,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 7600, + 8700 + ] + ] + ] + ] + } ] ], "shape-outside-linear-gradient-010.html": [ - "1e245cb285c465383253232cf005cd88de070b97", + "ca24c1a01473c50895e028179132a259d2e9a56a", [ null, [ @@ -246505,7 +246546,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 7600, + 8700 + ] + ] + ] + ] + } ] ], "shape-outside-linear-gradient-011.html": [ @@ -246585,6 +246642,19 @@ ], {} ] + ], + "shape-outside-linear-gradient-horizontal-rtl.html": [ + "35e224eceff01b3716f55a15afffcf57efead011", + [ + null, + [ + [ + "/css/css-shapes/shape-outside/shape-image/gradients/reference/shape-outside-linear-gradient-horizontal-rtl-ref.html", + "==" + ] + ], + {} + ] ] }, "shape-image-000.html": [ @@ -247602,7 +247672,7 @@ ] ], "shape-outside-circle-052.html": [ - "d8c462a563d07d6332925cd6684ac6a2f5b64376", + "d9242d7a118902e7c93a3eafc9799706423fdf66", [ null, [ @@ -247611,11 +247681,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 2 + ], + [ + 3, + 3 + ] + ] + ] + ] + } ] ], "shape-outside-circle-053.html": [ - "4ee2f880fa0264ebf59eeb249571591a174d7c05", + "77849f2f6ee4974fec8aed451cd01c1fe5864f02", [ null, [ @@ -247624,7 +247710,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 2 + ], + [ + 1, + 3 + ] + ] + ] + ] + } ] ], "shape-outside-circle-054.html": [ @@ -248290,7 +248392,7 @@ ] ], "shape-outside-ellipse-050.html": [ - "18890072a7f414022c29f247212a45899def0faf", + "d31a7f677ea39a435f9018e1eb4ff3e0e93c7037", [ null, [ @@ -248299,11 +248401,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 2 + ], + [ + 2, + 2 + ] + ] + ] + ] + } ] ], "shape-outside-ellipse-051.html": [ - "764406a0bbcfabb06271e9c1c4eb028692f21d20", + "d379b935aa31f39e55a95c572189462efcd9308e", [ null, [ @@ -248312,7 +248430,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 2 + ], + [ + 1, + 2 + ] + ] + ] + ] + } ] ], "shape-outside-ellipse-052.html": [ @@ -274686,7 +274820,7 @@ ] ], "trailing-space-and-text-alignment-002.html": [ - "27a0fd2b6315f39b87a3959f449597f7c1c54abc", + "30e37908a22b669af58753fbacd3fcaaa2147803", [ null, [ @@ -274695,23 +274829,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 100 - ] - ] - ] - ] - } + {} ] ], "trailing-space-and-text-alignment-003.html": [ @@ -274728,7 +274846,7 @@ ] ], "trailing-space-and-text-alignment-004.html": [ - "756f07133a7be77f096ac091c8d5e431af88a7ca", + "3d7aad05418bce1691ec766a598f6c1d51c00aed", [ null, [ @@ -274737,23 +274855,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 100 - ] - ] - ] - ] - } + {} ] ], "trailing-space-and-text-alignment-005.html": [ @@ -274783,7 +274885,7 @@ ] ], "trailing-space-and-text-alignment-rtl-002.html": [ - "bb3649f3f31837c5575a0a3d6ba731332cb3f578", + "0422506b516abcff0d0bd3b3e422426c67fa1e43", [ null, [ @@ -274792,23 +274894,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 100 - ] - ] - ] - ] - } + {} ] ], "trailing-space-and-text-alignment-rtl-003.html": [ @@ -274825,7 +274911,7 @@ ] ], "trailing-space-and-text-alignment-rtl-004.html": [ - "0421942963d82232071ba5ed421e08ec86d8b6fc", + "7705d6dfb147925308590869b061f174503e34ad", [ null, [ @@ -274834,23 +274920,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 100 - ] - ] - ] - ] - } + {} ] ], "trailing-space-and-text-alignment-rtl-005.html": [ @@ -278831,7 +278901,7 @@ ] ], "text-emphasis-color-001.xht": [ - "344200f2bbe06f520399bb06d6bc5ea71da43e27", + "4513a225896d683094cc1fd8d8dee2ee2f336cbf", [ null, [ @@ -278896,7 +278966,7 @@ ] ], "text-emphasis-line-height-001a.html": [ - "ea9589516dc4888f6746e614811c69cafb724d0b", + "cfcd45cb01981fd1bc9db232b4b0e10ca77bf7ac", [ null, [ @@ -278909,7 +278979,7 @@ ] ], "text-emphasis-line-height-001b.html": [ - "d6468cb6c9cd39189b277d344c02e1a6e32be27c", + "e586b73429ae63b0b47db7c23d5c0244fb5f28ee", [ null, [ @@ -278922,7 +278992,7 @@ ] ], "text-emphasis-line-height-001z.html": [ - "dded6094e35b8b793d648a55be09b44e0bb60b61", + "21530cc8f2b4b3848bbbb38ddcba2fd30c76ef19", [ null, [ @@ -278935,7 +279005,7 @@ ] ], "text-emphasis-line-height-002a.html": [ - "f4a47467a155de18f2124008ddf52ce305d4a851", + "43b190723c6a421c2b0824051d5a0072b377d28f", [ null, [ @@ -278948,7 +279018,7 @@ ] ], "text-emphasis-line-height-002b.html": [ - "28a14cf4792bbe9aae67438980773da481430df2", + "57c7c99b9b15d947a868313d4f89deb5d059e304", [ null, [ @@ -279806,7 +279876,7 @@ ] ], "text-emphasis-punctuation-1.html": [ - "e34e66007f77970d12025da348e029e6e1e538eb", + "8e93220ea76ef5422590ea1bb0464374eefc1d28", [ null, [ @@ -279819,7 +279889,7 @@ ] ], "text-emphasis-punctuation-2.html": [ - "53d261e9c8c11ae33642c893b8f3e098fb4c3e8c", + "890cedca4bbc3f5bdcfbed70a85216369fb0dea2", [ null, [ @@ -279936,7 +280006,7 @@ ] ], "text-emphasis-style-002.html": [ - "8189df238398693c5a7af2fd11737d8f403178c1", + "bae119deb5b5b44d407b808d288db2ffe7d67a2b", [ null, [ @@ -279949,7 +280019,7 @@ ] ], "text-emphasis-style-007.html": [ - "d78a7e20b81c3dc998b321a322318c677c7c282d", + "1cd1123ee49dccdc9c866fb801798011074b412f", [ null, [ @@ -279962,7 +280032,7 @@ ] ], "text-emphasis-style-008.html": [ - "3eda8d7d6e6823a61c793ba23923150a83804377", + "fd298ac8aa92abfe9b8290ff82e4cb00b0642ac2", [ null, [ @@ -279975,7 +280045,7 @@ ] ], "text-emphasis-style-010.html": [ - "3b83a16c3092e83fb3d1006216eec27e84664567", + "52f94858067a82378afa4cd50b0d315c664f41a0", [ null, [ @@ -279988,7 +280058,7 @@ ] ], "text-emphasis-style-012.html": [ - "da7febb0dacdab0a8833b7db6dfbec0210f67988", + "bcd5eb98627f57da9f031dfcccc0e12c568af3ec", [ null, [ @@ -280001,7 +280071,7 @@ ] ], "text-emphasis-style-016.html": [ - "630e6ddf9a559350d1bf43574898787cc83952e7", + "735c394872262134cf658a02012bcc8d86c4c8e3", [ null, [ @@ -280014,7 +280084,7 @@ ] ], "text-emphasis-style-021.html": [ - "285d26075dc3e358430dca928147fa5c852fc0f8", + "8c1e2b54d346e07f94fd85cbbb2a6af35d6adb12", [ null, [ @@ -280027,7 +280097,7 @@ ] ], "text-emphasis-style-filled-001.xht": [ - "63cf4f4c80a600f1772cd3072ee394f9f88d9df8", + "6e786ae276ce0b4510044b8063f1eaf8c7a2feb3", [ null, [ @@ -280053,7 +280123,7 @@ ] ], "text-emphasis-style-open-001.xht": [ - "fb1655845b48816dceec766cd3c5003ebd435f92", + "78019bea93f8e1b4aafc8bb3a96e673964c44c9d", [ null, [ @@ -280573,7 +280643,7 @@ ] ], "text-emphasis-style-shape-001.xht": [ - "ef6220db2963a0ab53251bc2293881ca56f46f36", + "c2ab583b6dc6f087b5783c8fe1b62542b1b29b61", [ null, [ @@ -280586,7 +280656,7 @@ ] ], "text-emphasis-style-string-001.xht": [ - "8cb320d627b6a1626703343fda3417b7fe5b8f8a", + "70ea1a56f7884f95b576e2dff872626ca7e25cfc", [ null, [ @@ -330798,7 +330868,7 @@ ] ], "table-cell-valign-001.html": [ - "f3026810dd58cd04f87df5f3ae2ad474d5c289db", + "b54ad1efbde40b3280db215940e0784c64bdccaf", [ null, [ @@ -330807,11 +330877,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 64 + ], + [ + 0, + 1 + ] + ] + ] + ] + } ] ], "table-cell-valign-002.html": [ - "d9440e4b299c74e4484ab68c8fa4a5cfca404f01", + "344c3078515c8b417d051f557d8c6132b6f68624", [ null, [ @@ -330820,11 +330906,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 64 + ], + [ + 0, + 1 + ] + ] + ] + ] + } ] ], "table-cell-valign-003.html": [ - "aaaea9bd0fe669860d8a874f7d34ee4f51425c1e", + "9274588c7eb4a5552020b17f7c50d2a0a3bb6784", [ null, [ @@ -330833,11 +330935,27 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 64 + ], + [ + 0, + 1 + ] + ] + ] + ] + } ] ], "table-cell-valign-004.html": [ - "9ccf09b6fb47631a2960e5e4b3943e5de6a67ad2", + "7a183c5279fec5a5209d6f5e52492d2171da2641", [ null, [ @@ -330846,7 +330964,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 64 + ], + [ + 0, + 1 + ] + ] + ] + ] + } ] ], "table-column-order-002.xht": [ @@ -331747,7 +331881,7 @@ ] ], "text-combine-upright-sideways-001.html": [ - "8fa22a7df8b1419546102ce214acf4d9774bd932", + "20417d9d5152b2de48ef7f88f932389f119dcf23", [ null, [ @@ -331756,7 +331890,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 50 + ], + [ + 0, + 6 + ] + ] + ] + ] + } ] ], "text-combine-upright-sideways-002.html": [ @@ -332532,12 +332682,12 @@ ] ], "vertical-alignment-slr-029.xht": [ - "f14078f6c62eb1355a9b6ceba654a5420975fb3d", + "d2e523404baa1d5eca4d75a498dadcf1144fef93", [ null, [ [ - "/css/css-writing-modes/vertical-alignment-008-ref.xht", + "/css/css-writing-modes/vertical-alignment-slr-029-ref.xht", "==" ] ], @@ -332545,12 +332695,12 @@ ] ], "vertical-alignment-slr-031.xht": [ - "e578a7177e70c95b1533f65b2ef206a10672a08f", + "360be5f4e1ea46f6eea52fbf416f857146387221", [ null, [ [ - "/css/css-writing-modes/vertical-alignment-006-ref.xht", + "/css/css-writing-modes/vertical-alignment-slr-031-ref.xht", "==" ] ], @@ -332558,12 +332708,12 @@ ] ], "vertical-alignment-slr-033.xht": [ - "a832bb960e05ed4c2d9864a375e63c1a2411fc95", + "94c5db95a840f3d01346eac6acb929ac5aff9f9a", [ null, [ [ - "/css/css-writing-modes/vertical-alignment-004-ref.xht", + "/css/css-writing-modes/vertical-alignment-slr-033-ref.xht", "==" ] ], @@ -332571,12 +332721,12 @@ ] ], "vertical-alignment-slr-035.xht": [ - "e6a7f2378a79f49e608719d186f5c28df2736520", + "ea64c4aed9e2432e703cc358a9a9dfe6e97b65bc", [ null, [ [ - "/css/css-writing-modes/vertical-alignment-002-ref.xht", + "/css/css-writing-modes/vertical-alignment-slr-035-ref.xht", "==" ] ], @@ -334116,6 +334266,19 @@ {} ] ], + "backdrop-filter-inline-positioning.html": [ + "e881e67dbcc8d45a0981e8e9de5f60f72914868f", + [ + null, + [ + [ + "/css/filter-effects/reference/backdrop-filter-inline-positioning-ref.html", + "==" + ] + ], + {} + ] + ], "backdrop-filter-invalid.html": [ "57d69b8b8dcfff1b22f1efc59e3f5e0f744ecc15", [ @@ -336756,12 +336919,12 @@ ] ], "svg-empty-element-with-filter-001.html": [ - "9c441b748b17d21348f66713b1fc86b1ba81765a", + "b1e70ad990e31d3cb427b0be717c09670c29a618", [ null, [ [ - "/css/filter-effects/reference/green-100x100.html", + "/common/blank.html", "==" ] ], @@ -356218,7 +356381,7 @@ ] ], "fieldset-overflow.html": [ - "089b0d9300bea4cccbe3cce540a72d833c1cef5a", + "83813f9020910200ba5cc4b66450c02430dd6c37", [ null, [ @@ -356227,23 +356390,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 1, - 1 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ], "fieldset-painting-order.html": [ @@ -362413,7 +362560,7 @@ ] ], "quirks-mode-no-height-is-still-bounded.tentative.html": [ - "78bd4f2555a5f75739e829b21f98e2fb640a0d2b", + "ae8bf3dbf256768e11dc4d10ac1249833b313800", [ null, [ @@ -365230,7 +365377,7 @@ ] ], "semantics-005.html": [ - "e4fe611c475d0caa28677019868cb54a1c9bb7b6", + "55c99f268aa5a188f7aed2d468aae31764466841", [ null, [ @@ -369959,6 +370106,21 @@ ] ] }, + "as-image": { + "external-resource-inline-sheet.html": [ + "b3017c7bae9a3c62d8853aa37aaab87714802fdd", + [ + null, + [ + [ + "/svg/as-image/external-resource-inline-sheet-ref.html", + "==" + ] + ], + {} + ] + ] + }, "coordinate-systems": { "abspos.html": [ "fb37bbe7f3ae4a61d1c216970c8a263673aed0dc", @@ -371633,7 +371795,7 @@ ] ], "marker-009.svg": [ - "9e6fe21d9177741c8f33a588657dd525807d4a22", + "e4b71011d67f40edf4142b9914d1fb5ece849666", [ null, [ @@ -371642,7 +371804,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 2 + ], + [ + 0, + 50 + ] + ] + ] + ] + } ] ], "marker-orient-001.svg": [ @@ -374677,6 +374855,97 @@ {} ] ], + "use-element-attr-selector-transition.html": [ + "3a617cc315c4cf36a7afb5bf5422124077b14748", + [ + null, + [ + [ + "/svg/styling/use-element-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "use-element-attr-selector.html": [ + "8994d907534eb26d03538a0c5a194a6963dca68c", + [ + null, + [ + [ + "/svg/styling/use-element-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "use-element-class-selector-transition.html": [ + "73c3b1da6c0a44c552acb1b3ada613f0ebd81b6e", + [ + null, + [ + [ + "/svg/styling/use-element-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "use-element-class-selector.html": [ + "d53d462cae8a07dde18d4798b4019edccad0d7c4", + [ + null, + [ + [ + "/svg/styling/use-element-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "use-element-id-selector-transition.html": [ + "83702aff752d107547d54c3f57ee6130e50ca2b1", + [ + null, + [ + [ + "/svg/styling/use-element-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "use-element-id-selector.html": [ + "ce71e3610c7d2c807ad0c547b01215177e23ba97", + [ + null, + [ + [ + "/svg/styling/use-element-selector-ref.html", + "==" + ] + ], + {} + ] + ], + "use-element-transitions-dom-mutation.html": [ + "897c9dfa17f74169c9ab43da6b706b462b230e3e", + [ + null, + [ + [ + "/svg/styling/use-element-selector-ref.html", + "==" + ] + ], + {} + ] + ], "use-element-transitions.html": [ "68653835f44f8a4787983df30a011d532e0c04dc", [ @@ -375524,7 +375793,7 @@ ] ], "toggle-animated-iframe-visibility.html": [ - "df1287d40be632c8de22d9eeae592eabee47a5a3", + "f50ffaad34722afd3e626e6b41ccddf5f02ce0eb", [ null, [ @@ -375533,23 +375802,7 @@ "==" ] ], - { - "fuzzy": [ - [ - null, - [ - [ - 0, - 25 - ], - [ - 0, - 50 - ] - ] - ] - ] - } + {} ] ] }, @@ -376253,19 +376506,6 @@ {} ] ], - "enable_controls_reposition.html": [ - "9e299c8d0d9f1574b3cd5a6e67425867fecbf409", - [ - null, - [ - [ - "/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition-ref.html", - "==" - ] - ], - {} - ] - ], "evil": { "9_cues_overlapping_completely.html": [ "606ded5095e1424892002abbda831ca8e9959110", @@ -376478,32 +376718,6 @@ {} ] ], - "media_height400_with_controls.html": [ - "349a121d9b59fb001849a5ef658ed009901bbca6", - [ - null, - [ - [ - "/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls-ref.html", - "==" - ] - ], - {} - ] - ], - "media_with_controls.html": [ - "dda72d16a6ee582757e12b0c5c5759bba80802fb", - [ - null, - [ - [ - "/webvtt/rendering/cues-with-video/processing-model/media_with_controls-ref.html", - "==" - ] - ], - {} - ] - ], "navigate_cue_position.html": [ "e176ef009913943ea3ea220f24664670ac6a2978", [ @@ -378962,7 +379176,7 @@ [] ], "docker.yml": [ - "12b5adc7ee9d9d5391ff4b21b9a3a2de29a6b02a", + "29e9ba6e084f1af57b6c496553e3f7dc16287e94", [] ], "documentation.yml": [ @@ -379068,6 +379282,10 @@ [] ] }, + "device-bound-sessions": [ + "7944486181bf8de42a513ab95a94151b0e001612", + [] + ], "idp-proxy": { "META.yml": [ "9901aed94e7d018fc877c768f902d2570484518c", @@ -403151,6 +403369,14 @@ ] }, "reporting": { + "link-preload-from-header-report-only-nonce.sub.html.sub.headers": [ + "f9f981b1c91c36ad15ee281f6c2b5e89ddeee143", + [] + ], + "link-preload-report-only-nonce.sub.html.sub.headers": [ + "0a1b3943608f35bc272992d22b0dffad9afade34", + [] + ], "multiple-report-policies.html.sub.headers": [ "485b6832e7f3e0113cc48eb109fce40eed3f28cf", [] @@ -403825,6 +404051,10 @@ "501f7a92088ec4dfd5197c5378e207d9007abe2f", [] ], + "pass.js": [ + "2e3702c685a226411ab3a54567cde0aca20d6dc9", + [] + ], "pass.png": [ "2fa1e0ac0663a65deae6602621521cc2844b93de", [] @@ -403991,6 +404221,26 @@ "a4075557add82baadf088fbbf17a8bfbcca04f35", [] ] + }, + "xslt": { + "support": { + "document.xsl": [ + "99511541f0a6a0ad8f592c87dde3c1ddec76deca", + [] + ], + "empty.xml": [ + "29862022257235ffba49ee0ade0071b9dd4aeb96", + [] + ], + "xml-with-stylesheet.xml": [ + "d6a515466dc758b38f584c9c99818f8e11e733fb", + [] + ], + "xml-with-stylesheet.xml.headers": [ + "72a99ace37ca19408cf42672bc731134e76a9643", + [] + ] + } } }, "contenteditable": { @@ -409832,6 +410082,10 @@ } }, "generated-content": { + "WEB_FEATURES.yml": [ + "ac1cdafecc99728d569ea1241820de4bdd045553", + [] + ], "after-content-display-001-ref.xht": [ "c30736f47a942241c85453006ab66f66d5dc8248", [] @@ -422590,8 +422844,12 @@ "d08d3545d6a31bcdbb67bd6c4f2f62597f5f8add", [] ], + "anchor-scroll-to-sticky-003-ref.html": [ + "4856fa6d3b0c0798f39cd9ba0a047bac46d07870", + [] + ], "anchor-scroll-to-sticky-004-ref.html": [ - "d97b4ffc145357ae1e62032cfa0ae1fe674b4817", + "3b814d32ad0329f8fda227f2c5a21cafc5718973", [] ], "anchor-scroll-update-005-ref.html": [ @@ -422651,6 +422909,10 @@ "ddc7da67ddf5fed83e653d1130a65f5c1e3a6dec", [] ], + "animation-duration-infinite-ref.html": [ + "a72dd6aef19cdb445e6784a44e4620f2dff06910", + [] + ], "animation-important-002-ref.html": [ "52855cb91e6b780fc6375280b0643335802dd4e3", [] @@ -425557,6 +425819,10 @@ "38dfe20d91a02d8878677b8edead5c48ad7178b9", [] ], + "text-in-nested-multicol-ref.html": [ + "80b7d191bd53d7ee88b30837c4e1b9bc58e40f24", + [] + ], "variable-fragmentainer-size-001-ref.html": [ "bea1ace1c376708c9ab58ba706cdfcf7aa140dbd", [] @@ -427680,7 +427946,7 @@ [] ], "WEB_FEATURES.yml": [ - "793c126ceaee0f88a0e3a76f031314050f787c96", + "2fb47c4c6e531d86a837a260473fbe649db612bb", [] ], "attr-case-sensitivity-ref-001.html": [ @@ -444059,6 +444325,10 @@ "fccb18318d2298b96248e316bb161737f6957c93", [] ], + "clip-no-clipping-no-text-ref.html": [ + "5f23acf9660e6a1827c43941a14470a055651788", + [] + ], "clip-no-clipping-ref.html": [ "724f8c51941ce9de2035a059bf6b1f32da2fd500", [] @@ -450850,6 +451120,10 @@ "shape-outside-linear-gradient-004-ref.html": [ "7a021199817c5356650585a60a9daa4911531491", [] + ], + "shape-outside-linear-gradient-horizontal-rtl-ref.html": [ + "a5750089015ebdafee111c4ba7002b101058e6a4", + [] ] } }, @@ -457019,7 +457293,7 @@ [] ], "text-emphasis-color-001-ref.xht": [ - "b38d04110e361bfb3e08e444b92d993e26e8b25c", + "fc6160f3f13fc42cc01b7c0d412f918546791767", [] ], "text-emphasis-position-over-left-001-ref.xht": [ @@ -457059,31 +457333,31 @@ [] ], "text-emphasis-style-002-ref.html": [ - "3a137ab708d324957bdb48a95db985d1b01b2155", + "627ae004b8620cb6fa777a7fa08e9ead10bd1b85", [] ], "text-emphasis-style-007.html": [ - "1ae8e18324245986203d85fef143dd227c154027", + "1ce419d751fa3c7cb9d5256909784fea4ffcc102", [] ], "text-emphasis-style-008-ref.html": [ - "d3891e01ac4e6129ab14397990d224b157a0d2d5", + "8f6c693abeb197ab1b25f94ecdb5f5e774f23d99", [] ], "text-emphasis-style-010-ref.html": [ - "3eef63f5a871ea0900ac497165e3c9cdfb3accf1", + "d4ca0620d17c3539a01ba142a3cc55ed5bc56083", [] ], "text-emphasis-style-012-ref.html": [ - "868fa39906f0b96666ea666d7a4ce2b1fb650a6c", + "49d07e18ab4e77ca2a51f3705bcb323fd3cba260", [] ], "text-emphasis-style-021-ref.html": [ - "d09acdf64b9ec9fed949309d06880680fbe400b9", + "1b50e7be2cb8b633af7c998c3fd6b4e63071c111", [] ], "text-emphasis-style-filled-001-ref.xht": [ - "39be9c25697baf0383565bd7fac00683a4453b3a", + "1fe1e743d4884edba346ad0917f6f36f3a6af065", [] ], "text-emphasis-style-none-001-ref.xht": [ @@ -457091,15 +457365,15 @@ [] ], "text-emphasis-style-open-001-ref.xht": [ - "de908e0cd85a204361f94d466c6619388fa8898f", + "4ea6345ab0e55cfb15d5eb65b9d03a6a6ac78534", [] ], "text-emphasis-style-shape-001-ref.xht": [ - "41e53b93df2c51ec9c4f9422eca127fbf9e55fb0", + "b53c6aaa90ef3927f88cc18e72faa69c17925f04", [] ], "text-emphasis-style-string-001-ref.xht": [ - "e24c86abeb1e3aa8da4d5c69e36d6395b0a6c469", + "57392a0193f5e95c7c9fa50c2fae55d62632f772", [] ], "text-underline-offset-001-notref.html": [ @@ -457218,11 +457492,11 @@ [] ], "text-emphasis-line-height-001-ref.html": [ - "6f02e05bdd986c5e064060d9685f93acb5fe8b81", + "31fa47f31c3bf512115603a65a3cfe6a8da334e4", [] ], "text-emphasis-line-height-002-ref.html": [ - "abff3e9e55347e4a476405727fae34e8cb3f2585", + "101f74a85f1c494bca73a148423a95b94e423e63", [] ], "text-emphasis-line-height-003-ref.html": [ @@ -457266,11 +457540,11 @@ [] ], "text-emphasis-punctuation-1-ref.html": [ - "9cfcb247afef571508dd55eacc024f40ab810a1c", + "89ff477e82da5fb6c544132319d15fcf4f6bade0", [] ], "text-emphasis-punctuation-2-ref.html": [ - "6d824e73d560940249715614a0fa6872e675980b", + "60c3bff0f95a3d5dd8adddbca0b51c56517bd298", [] ], "text-emphasis-punctuation-3-ref.html": [ @@ -460704,7 +460978,7 @@ [] ], "WEB_FEATURES.yml": [ - "349046820745339fb3097de5d98fe8022ac8c50b", + "4fb94215e48a72dcd4187935fc111fa28bdf1202", [] ], "attr-in-slotted-ref.html": [ @@ -465095,6 +465369,22 @@ "0eab9b6df9191a08fec49e20ace29838aa0b8fb2", [] ], + "vertical-alignment-slr-029-ref.xht": [ + "a3ff3ab7855a67961567a774b89cd9412b574fd0", + [] + ], + "vertical-alignment-slr-031-ref.xht": [ + "d46cde2af2dd726c8d4c40f4071e45183ed50e69", + [] + ], + "vertical-alignment-slr-033-ref.xht": [ + "cc75c7f5fba0b95a3054c223414d7069d05b8e9b", + [] + ], + "vertical-alignment-slr-035-ref.xht": [ + "1458c6b2ce27065ae5398c83e89b4b528fc170c0", + [] + ], "vertical-alignment-slr-049-ref.xht": [ "20f6252df504e00d0d2278ccc7463a87c46865bb", [] @@ -466142,6 +466432,10 @@ "bb482e67ffae21bd339b9955c522f168c7830aeb", [] ], + "backdrop-filter-inline-positioning-ref.html": [ + "167d47eed8a4620508815edd5104348fa1f99ed6", + [] + ], "backdrop-filter-plus-will-change-opacity-ref.html": [ "56c6243809bef53423ff18d4b70a8597795cacec", [] @@ -468243,7 +468537,7 @@ [] ], "login.py": [ - "1d811fbaaa154016d62a03ea9324decb331c3e26", + "8c77d31ed474955f06394f76258a51c658c9459b", [] ], "pull_server_state.py": [ @@ -468275,7 +468569,7 @@ [] ], "setup_sharded_server_state.py": [ - "57e935ea57e50a478f3c9ac9684fefb4d121a99b", + "875ae310baead220f7649d1a204b2497ee542ae6", [] ], "start_session.py": [ @@ -490079,7 +490373,7 @@ [] ], "quirks-mode-no-height-is-still-bounded-ref.html": [ - "738dc95f8eba6da8ec11a46c065cccbf94b438bd", + "7ac010c04811328377a490fe49d83baecd5c2e59", [] ], "text-decoration-ref.html": [ @@ -492253,10 +492547,6 @@ "7decc7bc6035e60e6613e55cbb4dafef0b68dab9", [] ], - "script-src-event-handler-framed.sub.html": [ - "7b9e0edeb979e8d04c583d9b3080c388ddab1e17", - [] - ], "script-src-framed.sub.html": [ "baab01075022601ed258866a0b98a6d07129f5fb", [] @@ -492281,12 +492571,8 @@ "08609b1c12a0c79fc0fb8f260777b91fff85eec7", [] ], - "script-src-unsupported-language-framed.sub.html": [ - "62b2c4c017b49ac2dc7e01bc1382a2cc9b10aa39", - [] - ], "script-src-unsupported-type-framed.sub.html": [ - "78e71941b358cc231b3190cdbf4aab4548611a88", + "1f38560ee152a61623667b2be9057296d05453c6", [] ], "svg-image-href-framed.sub.html": [ @@ -492525,7 +492811,7 @@ [] ], "script-src-unsupported-type-nonspeculative.sub.html": [ - "dc8343c382406383b25ce8e41d2bad8ab7085a1f", + "94098b5c77539d7d49d4cb4c3ced4cea3a98ff68", [] ], "svg-image-href-nonspeculative.sub.html": [ @@ -492598,7 +492884,7 @@ }, "tools": { "generate.py": [ - "b3b577d9e1069b1dd2140f2a2499d51fa4947ff1", + "f0db885814b8997cd80ff34121132607d7e71c17", [] ] } @@ -493210,7 +493496,29 @@ "original-id.json": [ "08bd4d0d4e35f880b27140d1500a903420c13ed5", [] - ] + ], + "resources": { + "mutation-observer-iframe-script-async.html": [ + "680290fab2f7adbc93667172b8e6f2555d31e269", + [] + ], + "mutation-observer-iframe-script-defer.html": [ + "e5669ad0c392f7b016d0095474a010585a510220", + [] + ], + "mutation-observer-iframe-script-module.html": [ + "f15bef511aea20dcb8449146c55a26a8f8925834", + [] + ], + "mutation-observer-iframe-script.html": [ + "ebcdc19ec49429cdc9881ab4cdd606fc3220fb89", + [] + ], + "mutation-observer-iframe-script.js": [ + "0267705294ab7bac0243bb1ffde09f7bb3d44cc2", + [] + ] + } }, "document-writeln": { "original-id.json": [ @@ -493370,10 +493678,18 @@ "scripting": { "event-loops": { "resources": { + "async.js": [ + "5b6470d5a447e60acfba9393d42811a93f9adb18", + [] + ], "common.js": [ "e2279f93ddb09d14d7065c89357ab102e0ba0ce0", [] ], + "defer.js": [ + "d8498d274fb6f714c7394868970ee7da63910ac6", + [] + ], "iframe.html": [ "32e486236079ea089c0084bad1118599af06f2cd", [] @@ -494991,7 +495307,7 @@ [] ], "IndexedDB.idl": [ - "d82391da7e65ddd02ced4af0daa9a83c364a46dd", + "7c381fe045398a6513ff9f3e6f97e59e69c1f7d1", [] ], "KHR_parallel_shader_compile.idl": [ @@ -495215,11 +495531,11 @@ [] ], "cookiestore.idl": [ - "ecb277756cc89869423f91e7f7d57b19789b1114", + "cbcf071254684b85a8b9ea11f7e709a681b79388", [] ], "crash-reporting.idl": [ - "d10f3573791ef219bfa5f27c8cfab5c317358a0a", + "60f15bbb44d4f4583194b0d84f916da7e0b26f97", [] ], "credential-management.idl": [ @@ -495355,7 +495671,7 @@ [] ], "css-typed-om.idl": [ - "b0f26ea83c777becd82d86d02964c8627b3a6d83", + "0eab6bc75423a025081e379c158172bfb6583be6", [] ], "css-view-transitions-2.idl": [ @@ -495423,7 +495739,7 @@ [] ], "element-timing.idl": [ - "4f42823704a42d9c40beed4cce8ec9824cfcd65e", + "4b556e8277915c945000e4ce362e647b6dd77632", [] ], "encoding.idl": [ @@ -495447,7 +495763,7 @@ [] ], "fedcm.idl": [ - "efc9f41398bb18659e131ed75075f7997de1a6ea", + "be3bc1b2bd331bcb0c5f0faaac8a57620db68f34", [] ], "fenced-frame.idl": [ @@ -495455,7 +495771,7 @@ [] ], "fetch.idl": [ - "965a82d13f5ffc9eb86cab7607111b476f6bc1cb", + "48149ece73de1cf121546113ef6e4485b4985163", [] ], "fido.idl": [ @@ -495475,7 +495791,7 @@ [] ], "fs.idl": [ - "46a59dd1acd66bf341d44855105ddba051d04308", + "156e9726739297252d1b07636f8ec51ee52ea355", [] ], "fullscreen.idl": [ @@ -495531,7 +495847,7 @@ [] ], "html.idl": [ - "acb1b57ffe866059960c51f0cd9346a377cfb2f2", + "6a6b85335f20f4390553baed9ca1ec8ef7c62b1d", [] ], "idle-detection.idl": [ @@ -495587,7 +495903,7 @@ [] ], "largest-contentful-paint.idl": [ - "d1630cc7daae802bf27107ce0ab07185d0746d7f", + "4eb5c7fa47529e2cd206156d22e1704c6f41df78", [] ], "layout-instability.idl": [ @@ -495671,7 +495987,7 @@ [] ], "mediaqueries-5.idl": [ - "52154c96725bd4c0b022e41f23232c3a798a4d6d", + "c951c356ca3cd3ced9b04fe062f44eeef4307b4c", [] ], "mediasession.idl": [ @@ -495699,7 +496015,7 @@ [] ], "notifications.idl": [ - "4300b1710714e4c3f3df6dce4247d112d7c3ede8", + "eeb26424bce03d5d0b1a89fd9907a72310cf6e80", [] ], "observable.idl": [ @@ -495803,7 +496119,7 @@ [] ], "privacy-preserving-attribution.idl": [ - "666460bbbb58895aea8e836ccd39534bd418f0e0", + "2cf43b1e9bcca27dbe69fbf7672fea63167a858c", [] ], "private-aggregation-api.idl": [ @@ -495823,7 +496139,7 @@ [] ], "push-api.idl": [ - "b16a730b7229d02bb8c06434b521815ae3440d78", + "a1de7a416b61e05d17d59a1b503146a518b5ebfc", [] ], "raw-camera-access.idl": [ @@ -495923,7 +496239,7 @@ [] ], "shared-storage.idl": [ - "e3e221a3aa75dbab227f8bcbd706167358fb10fb", + "d44997faf1996e8d107da163cada9f61a748c495", [] ], "speech-api.idl": [ @@ -495947,7 +496263,7 @@ [] ], "streams.idl": [ - "ab9be033e43ba07af8d7088f22b0e65d6ce9a95b", + "8abc8f5cfda9fed8d7981cb967e5e83756ec686e", [] ], "svg-animations.idl": [ @@ -496139,7 +496455,7 @@ [] ], "webidl.idl": [ - "f3db91096ac1be7558631ed9b7afd7a4dac6706e", + "651c1922115026c38c9699199b71d2a71053738a", [] ], "webmidi.idl": [ @@ -496147,7 +496463,7 @@ [] ], "webnn.idl": [ - "8d0e485bc76e49a616847f305d0b81cc5cce0589", + "3490f40e8322b1d8a5c6d38ae0d314556331cf5a", [] ], "webrtc-encoded-transform.idl": [ @@ -496159,7 +496475,7 @@ [] ], "webrtc-identity.idl": [ - "108c3ad9b111acf08ce6593fbe95808ac3529a6d", + "69597acea62fc8100d166fb6a6b8205feb3d5bda", [] ], "webrtc-priority.idl": [ @@ -496167,7 +496483,7 @@ [] ], "webrtc-stats.idl": [ - "13f74c110d024ba0925ae837bf3c850ecffd72b9", + "b5eff2d0bf54e803f84cf884a925070b0e16fb85", [] ], "webrtc-svc.idl": [ @@ -497253,7 +497569,7 @@ [] ], "semantics-005-ref.html": [ - "cf722603e1debb82566e1c2f7a0cfb27e609f194", + "c71d48b898fb7b282a9af7a2bccf175f32505ff5", [] ] }, @@ -503488,6 +503804,10 @@ ], "initiator-type": { "resources": { + "dummy.svg": [ + "37d6c7440ff1f6802f7b17640ac70546eadf50a1", + [] + ], "initiator-type-test.js": [ "2b1f844376c34f0f30666e0f25c2db5613389ad5", [] @@ -503932,7 +504252,7 @@ [] ], "test-initiator.js": [ - "7c354243260c23213419a4fde00c88607eedfb61", + "c6ad50a9db9306423eb7cb972935a7f809f28029", [] ], "webperftestharness.js": [ @@ -504639,11 +504959,11 @@ [] ], "VERSION.md": [ - "5a3726c6c00fe5a30c01a69dd1d9b722c13d4405", + "2614a8d194be62af0ac639687864ddd2d05fd57b", [] ], "webidl2.js": [ - "7161def899cf24a5edeb26cf234c4de3a7e0071a", + "bae0b2047595d0742f58384f01a6af5f69c3519e", [] ], "webidl2.js.headers": [ @@ -507040,6 +507360,10 @@ "ed20cd4dca6a14e427b907a1d5147c88596bb1f0", [] ], + "intercepted-referrer-sw.js": [ + "f0246c8dbe46a1639853b6b20cf80b105b06a39c", + [] + ], "interface-requirements-worker.sub.js": [ "a3f239b654811317bfcedd09149afab928235c1b", [] @@ -509700,7 +510024,7 @@ [] ], "sandboxed-iframe-allow-storage-access.html": [ - "4df0de7719d94eda471f751ed7dcc687d19db9b3", + "4510b8f83fca991a7a58b6847330ed8838724a48", [] ], "sandboxed-iframe-no-storage-access.html": [ @@ -509986,6 +510310,16 @@ ] } }, + "as-image": { + "external-resource-inline-sheet-helper.svg": [ + "f4b5f8c0c5da63e41ce449173fa3d807780aaead", + [] + ], + "external-resource-inline-sheet-ref.html": [ + "7d3b74ec048b31613407d2b62ab66c28f3e067ba", + [] + ] + }, "coordinate-systems": { "support": { "abspos-ref.html": [ @@ -511175,6 +511509,10 @@ [] ] }, + "use-element-selector-ref.html": [ + "b428098e205f050adc1577d0e76df2d1b1d928db", + [] + ], "use-element-transitions-ref.html": [ "f564b90de8cd962a19a6205338afdfa9a24e461f", [] @@ -511644,7 +511982,7 @@ ], "tasks": { "test.yml": [ - "ebf3098b6af93c9162132b6d5eb9b3cbf2dc049d", + "b67821cce1d89ba8904b7b44c2f99bed43b3694f", [] ] }, @@ -511680,7 +512018,7 @@ [] ], "test_valid.py": [ - "a8390936cad306b3202ccbdd317b3a1d134f6f2f", + "023744268c056c5781fdafb2bf6ae190913d2489", [] ] } @@ -522521,7 +522859,7 @@ [] ], "emulation.py": [ - "1704c05ee201c2dc321edf625b77e2b2b7172b00", + "edd335e97bd79ca4683f72ed1bac1d8ca8cd8cb8", [] ], "input.py": [ @@ -522529,7 +522867,7 @@ [] ], "network.py": [ - "c8fb1ec4e920841ec9a44c01594a0ba4308aabb2", + "0ca03bb9c76b5d28d5646e49a67efc235f8cb912", [] ], "permissions.py": [ @@ -522892,7 +523230,7 @@ [] ], "chrome.py": [ - "7d702878a7e4788d6396c01e93e44f5b50b242c3", + "8e7dfae41eb7a737bbcb4a8006bcbe7255b49ff9", [] ], "chrome_android.py": [ @@ -522920,7 +523258,7 @@ [] ], "firefox.py": [ - "2324e043f30bbd2b1c8cc15462ca12628369ac92", + "d66616005a888881e07fc731dad64045f99018cb", [] ], "firefox_android.py": [ @@ -523004,7 +523342,7 @@ [] ], "executorchrome.py": [ - "ced41b5b1842f57a997d2f17dbaa71ad33eb0b6f", + "d23940e4b61f56bc65997016fd6b8a737c2301dd", [] ], "executoredge.py": [ @@ -523012,7 +523350,7 @@ [] ], "executormarionette.py": [ - "3607960b41e5133ffcec20ef52093756c767e2ab", + "37c64e1745b3de7a85e99a39df8b08072a1c9d89", [] ], "executorselenium.py": [ @@ -523293,7 +523631,7 @@ [] ], "wptcommandline.py": [ - "81e9d509bf473f6abb48cafd6286610431502839", + "0b641e29d087cac95823682a4e700746b7d21100", [] ], "wptlogging.py": [ @@ -524986,7 +525324,7 @@ [] ], "urlpatterntestdata.json": [ - "a613b6a74b5a900e51185f63bfe597e38f8557b6", + "363ec15f2b2787dd1000f48e65dba81fcc3f7ae3", [] ], "urlpatterntests.js": [ @@ -526914,7 +527252,7 @@ [] ], "audit-util.js": [ - "4e574a64b1aeeafde41bb688005288b52af0bc6a", + "422c8f4678c81556e863e83b2dc76b3e468ab35e", [] ], "audit.js": [ @@ -527421,7 +527759,7 @@ [] ], "README.md": [ - "376308b5d1d3ac4f0f4740505b42000cecaa1039", + "1f4fccd41565e2b6f64c026d1ed5fd141bf93205", [] ], "WEB_FEATURES.yml": [ @@ -527464,6 +527802,30 @@ "512a2b855e8c92d9c3e51f7cfa6c2e74b2014928", [] ], + "four-colors-full-range-hlg-420-10bpc.avif": [ + "8209e763f52a0db628dd384dccdd5448a2d60bcb", + [] + ], + "four-colors-full-range-hlg-420-12bpc.avif": [ + "79103149b71bc94ad50c47156322b79b0a847bb5", + [] + ], + "four-colors-full-range-hlg-422-10bpc.avif": [ + "0699fc09ac69e07da298dfee4d6540b2ed44f127", + [] + ], + "four-colors-full-range-hlg-422-12bpc.avif": [ + "93ef46ad29c87af27c3412a1285e074e5224590b", + [] + ], + "four-colors-full-range-hlg-444-10bpc.avif": [ + "3da7037c110cd90a4e0c501b88b2e59e77232201", + [] + ], + "four-colors-full-range-hlg-444-12bpc.avif": [ + "85db04ec2029effb072ffd6433fc9d7dc345ef82", + [] + ], "four-colors-limited-range-420-8bpc.avif": [ "925477b04ca4a847f47bc78293c9f842cdc25cbe", [] @@ -527525,7 +527887,7 @@ [] ], "image-decoder-utils.js": [ - "eccab9b09a4ac32f5d792c82d99c2cc36f1e35ab", + "cf389620e14d48f4489835f218a780cbd5824d38", [] ], "image-decoder.crossOriginIsolated.https.any.js.headers": [ @@ -527657,7 +528019,7 @@ [] ], "__init__.py": [ - "e3d2f83a19ae4ae406cc810fb013dda1fb0d47f4", + "78d4fc55b28b92fd791e6deb166fb16ff3d6f287", [] ], "browser": { @@ -527901,7 +528263,7 @@ [] ], "conftest.py": [ - "16f03b9229ac3940e8a268058afbaf61224920f3", + "f3c03917659f231e6d43135e2068137e409e8815", [] ] }, @@ -527915,6 +528277,16 @@ [] ] }, + "set_scripting_enabled": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], + "conftest.py": [ + "7658953ca49ffc4f2a426291990c623d49284464", + [] + ] + }, "set_timezone_override": { "__init__.py": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -528137,6 +528509,12 @@ [] ] }, + "disown_data": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + }, "fail_request": { "__init__.py": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -529469,7 +529847,7 @@ [] ], "RTCRtpScriptTransform-encoded-transform-worker.js": [ - "89e421ae9aa07b0e16eea497589463f2943aee2c", + "6dd426d461833c7cdab8165efdccd1ad69ca5221", [] ], "RTCRtpScriptTransform-sender-worker-single-frame.js": [ @@ -530121,7 +530499,7 @@ }, "webvtt": { "META.yml": [ - "949f312d7acc3444b3c116a55d1175dd12be33ca", + "99076f815825558d0855d55e5b53bb2454cff3a9", [] ], "README.md": [ @@ -530809,10 +531187,6 @@ "6eca04506e1168680a9787c2b7999fc28bf26c22", [] ], - "enable_controls_reposition-ref.html": [ - "1ff5b84ced6332201467d47332bf56383fb2077c", - [] - ], "evil": { "9_cues_overlapping_completely-ref.html": [ "4c36902662252e23cafed7763943e06890aae7fd", @@ -530911,14 +531285,6 @@ [] ] }, - "media_height400_with_controls-ref.html": [ - "65b23298f004f3fd46e3db86b70553dbe51de4f7", - [] - ], - "media_with_controls-ref.html": [ - "d18b3ce613412d68f96d9b087ba720d66f44f735", - [] - ], "navigate_cue_position-1.html": [ "87f3834e3d788ac998993c996876e761cc0b3b4f", [] @@ -534395,7 +534761,7 @@ ] ], "Blob-slice.any.js": [ - "c48d4703d8673f7f53c752077323e4c6c28b5c58", + "6a7d9c3fab153a53294ed709138725a3a21055fa", [ "FileAPI/blob/Blob-slice.any.html", { @@ -576174,8 +576540,71 @@ {} ] ], + "nested-containertiming-child-img-with-ignore.html": [ + "43c6e7adabbaad8cb55835c2aec881949a30fcd6", + [ + null, + {} + ] + ], + "nested-containertiming-child-img-with-intermediate-nesting-transparent.html": [ + "bff241b33b01effe6a99c5d661025e4b4587fb00", + [ + null, + {} + ] + ], "nested-containertiming-child-img.html": [ - "3f830fe786307c5d8400544911f27eaf9fb39df7", + "de51aa4ffef87d4afc19faaa1d2115e37fb81b04", + [ + null, + {} + ] + ], + "nested-containertiming-nesting-change-from-invalid.html": [ + "318b66396bf8c0932836e5e7f98464de85e244e6", + [ + null, + {} + ] + ], + "nested-containertiming-nesting-change-to-invalid.html": [ + "4735709179dd1739735e24525d1b72917bb5d877", + [ + null, + {} + ] + ], + "nested-shadowed-containertiming-child-img.html": [ + "692f501579cbd14023f4a937969bb8bf855a6e22", + [ + null, + {} + ] + ], + "nested-shadowed-to-transparent-containertiming-child-img.html": [ + "ef2034547ce0dd8ca6022e4aa6c245c798d767bb", + [ + null, + {} + ] + ], + "nested-transparent-containertiming-child-img-with-intermediate-ignore.html": [ + "3a0a64b6455d8f7eb44c02dd93c6fba24cd6b3e8", + [ + null, + {} + ] + ], + "nested-transparent-containertiming-child-img.html": [ + "9523cc88b096a96d6925b3f66a70ecba688973cf", + [ + null, + {} + ] + ], + "nested-transparent-to-shadowed-containertiming-child-img.html": [ + "250f779af7523b8fe01e304f521b15f64d1aeb36", [ null, {} @@ -580647,6 +581076,20 @@ ] }, "reporting": { + "link-preload-from-header-report-only-nonce.sub.html": [ + "b06604dba3ec0a7cda0273c399850343387e11b7", + [ + null, + {} + ] + ], + "link-preload-report-only-nonce.sub.html": [ + "7ed3123d291f2eb3d3595e5e385f9fb55d36a3e7", + [ + null, + {} + ] + ], "multiple-report-policies.html": [ "c28e9ae44a51c85ea614d86c6b18eda8bdffcaa6", [ @@ -583091,6 +583534,22 @@ {} ] ] + }, + "xslt": { + "document-function-blocked.html": [ + "d81c4003f1abceac13f7d964f0ace37b139f67f2", + [ + null, + {} + ] + ], + "xsltprocessor-include-blocked.html": [ + "dbbe07f6e1240caa0ac3ebb202554a94b2e6f3a0", + [ + null, + {} + ] + ] } }, "contenteditable": { @@ -603220,7 +603679,7 @@ ] ], "grid-template-columns-invalid.html": [ - "9f9f173375de85baff69419bf569abedbf3061ad", + "ee9fbb533106558862970b049621acad9797d066", [ null, {} @@ -603297,14 +603756,14 @@ ] ], "grid-template-rows-invalid.html": [ - "192b392d02c66ed30b6a9022b0bf6353ff600600", + "78468f83f32379c055afdc0fc821ce4bc231b892", [ null, {} ] ], "grid-template-rows-repeat-intrinsic-valid.tentative.html": [ - "a3975eb400788758144118220740b59b99786f91", + "32f8df97970b89cc67225fd4f24d4ba1791668b5", [ null, {} @@ -605723,6 +606182,13 @@ {} ] ], + "cssom.tentative.html": [ + "945e25079b5a95a5fc86980f58b63ac032a73e9a", + [ + null, + {} + ] + ], "cycle.tentative.html": [ "46a136693b858353b479de3df5d5f767fc5d211f", [ @@ -605877,6 +606343,20 @@ {} ] ], + "invalid-at-top-level.html": [ + "87296527bd9690e3fddc6268d0d74458c55a0604", + [ + null, + {} + ] + ], + "invalidation.tentative.html": [ + "d70fb29d44798840f956590561aa7c53412e7ae9", + [ + null, + {} + ] + ], "local-attr-substitution.html": [ "de2a20fa470a9268980a403c74df5d9e2c89ef20", [ @@ -605898,6 +606378,13 @@ {} ] ], + "media-queries.html": [ + "239b9ed61c7b7ea0ed83a5151d0f91ebe072a789", + [ + null, + {} + ] + ], "mixins-including-mixins.html": [ "2c9436fd8b6b86c94aa29544ade1f6dc898ba914", [ @@ -605950,8 +606437,22 @@ {} ] ], + "column-wrap-reset-interpolation.html": [ + "8acbef8addefa6a1ca15ab77afc6bba0a4aab026", + [ + null, + {} + ] + ], + "columns-interpolation.html": [ + "869210f8fcdabf5e81539bc0ea05b76c5c159ac5", + [ + null, + {} + ] + ], "discrete-no-interpolation.html": [ - "6572fd503fd7985db9e72c6721a4943fe74d6821", + "bfb97cd3087673bc200e8f6c0bfeb3fce884f742", [ null, {} @@ -605965,6 +606466,13 @@ {} ] ], + "columns-shorthand-reset-wrap.html": [ + "0daa569516a3e90d7088fb1d176f879873ba4522", + [ + null, + {} + ] + ], "filter-with-abspos.html": [ "763bf1fc5a13ba86f440155aa0373357bf7782cb", [ @@ -606477,15 +606985,22 @@ {} ] ], + "columns-computed.html": [ + "e67cdd00ed375b7a338235c11a49f1bc1fba8b95", + [ + null, + {} + ] + ], "columns-invalid.html": [ - "dc9b27bf3759f01086d79af65b6075236223d5d8", + "f6bb39829003bafcc75b4b99b8f6bcf372936259", [ null, {} ] ], "columns-valid.html": [ - "7b643e2d9a309221f6e987847ee558df53151903", + "4dd8895dbeed9d54f29d1f8edb88e98de0fe48d0", [ null, {} @@ -619154,7 +619669,7 @@ ] ], "rotate-parsing-computed.html": [ - "ae1cade666c7f218caaa29a37251aa7f0911da25", + "b52d9987153db34132df5e5b29a97bf0ad214933", [ null, {} @@ -619168,7 +619683,7 @@ ] ], "rotate-parsing-valid.html": [ - "82544b094fc954add9061283eec5f424b01293bd", + "0485ade2110d9ed5f49528085cd0b37250100eef", [ null, {} @@ -623642,7 +624157,7 @@ ] ], "attr-all-types.html": [ - "5ea11a68f8e26eaf13b0dd7b6b7fec841aca2c2b", + "e2a20bab55ba30070675cdaa6c3a179b77c1ccd8", [ null, {} @@ -625383,6 +625898,13 @@ {} ] ], + "document-active-view-transition.html": [ + "7c04a2596fabc114a3e3bd27e1001a26ee4afe13", + [ + null, + {} + ] + ], "duplicate-tag-rejects-capture.html": [ "951294babc2731eb1f86c32bc90c0beab95d70e4", [ @@ -631019,6 +631541,15 @@ {} ] ], + "has-focus-display-change.html": [ + "2084a2701540bd17ea461f3ce21e82039c422973", + [ + null, + { + "testdriver": true + } + ] + ], "has-matches-to-uninserted-elements.html": [ "4d6c8cf2e35f4421b1232b2720184a61a26cb9f9", [ @@ -631048,7 +631579,7 @@ ] ], "heading.html": [ - "70afef0c4a6bc1c0dbdd4c2e3c443e805b94a6a2", + "d0eefa30320e20b9ed07d3b0d4c633b84898c3e4", [ null, {} @@ -632107,6 +632638,13 @@ {} ] ], + "parse-heading.html": [ + "1429dfb8a30f67c791e01e0fc3b2facfcb40e337", + [ + null, + {} + ] + ], "parse-id.html": [ "2441c4217eb4b9ef1c8bde1aa5a96269b09b6304", [ @@ -633618,7 +634156,7 @@ }, "device-bound-session-credentials": { "allowed-refresh-initiators.https.html": [ - "bef2d55c906d0d7fe5818ba3d8fbbde1f5146ad1", + "2a73c1743b4469dd7c6a730caa4063b4c1253aad", [ null, {} @@ -633639,14 +634177,14 @@ ] ], "credentials-matching.https.html": [ - "cdbfa6704597c16445f0300be153b63745b29abf", + "289395497f9bdd6c3e487f673c95403419c4491c", [ null, {} ] ], "debug-header.https.html": [ - "b3e09e7fe095f7ced76c341441490d530aa79dac", + "99d4416b0c81f9d152e340130ba8c0f58df3f555", [ null, {} @@ -633660,21 +634198,21 @@ ] ], "include-site.https.html": [ - "3441acfc625f9e7859388d269629f9c88835fb14", + "6f5d1217bc26d887340254f644573df6452ee342", [ null, {} ] ], "multiple-credentials.https.html": [ - "54fc182b7276d44096f37d8435833fa4032cc96e", + "e3493081a451d48a6fc75cc78b32c0aa2d1c821a", [ null, {} ] ], "multiple-registrations.https.html": [ - "fb0ce500aa4cd764ec3f9d3a7aeeaf059a926fe0", + "ccc1c49b35ae50ae743d2caff484963ea47a3766", [ null, {} @@ -633688,70 +634226,77 @@ ] ], "refresh-does-not-send-challenge.https.html": [ - "a53245c590b905978df79e8b16e4172d4d3978f2", + "886b67358fee0a25c29a8f2f2846f71d65be3d92", [ null, {} ] ], "refresh-replaces-config.https.html": [ - "74264888075c44c52e65855fc69ad652706a4fb9", + "342269836b02dfe36a2214f73e10e299c892b34f", [ null, {} ] ], "refresh-with-continue-false.https.html": [ - "1953af5c0d29ad10a5b81e5732bb31c2d222f874", + "bb4cbd08d339384fe8f58e0bf4c8fa3ee8caa788", [ null, {} ] ], "registration-sends-challenge.https.html": [ - "ab8d033afac166730edafe4f124928b5cf048e16", + "525a45598be819009e879a11eb40208c13aa2880", [ null, {} ] ], "resolving-urls.https.html": [ - "bb10cf52ee17fff4c67f03e1d5546c377fc01b2f", + "e6f635b78d5fa4ac25eff8e7c8514ca16e6fafd6", [ null, {} ] ], "session-cookie-has-no-attributes.https.html": [ - "5bf07abcac1c880dac4ecd772fc94449f2599905", + "5f9ec211e0576bcc1932b3c64e458dfa6892379c", [ null, {} ] ], "set-authorization.https.html": [ - "7e2d8a0819bdc613d984cf05a0de86c49c265016", + "30277edaa30d891583bd228bfe164dc71c83861e", [ null, {} ] ], "set-early-challenge.https.html": [ - "22166c86ffe5c40762276cf5ec1091dbee876c8f", + "f39618907ed257afc64861497ac7d9164a36f41c", [ null, {} ] ], "set-scope-origin.https.html": [ - "f56778a9e5786e51f1c77a4c8447d71dc8c61676", + "f3e68506fb29caa2a1f9478a4d68dd790acc5a3e", [ null, {} ] ], "set-scope-specification.https.html": [ - "5a36831f6dd73398e1373a7e2971ea133e20b5a7", + "b1d2452b53e17dfa1c8da360dfa2ab9bc21dada0", + [ + null, + {} + ] + ], + "subdomain-registration.https.html": [ + "4836ab9688cc0e1800fb1ca27975624c625103d9", [ null, {} @@ -660376,7 +660921,7 @@ ], "fedcm-authz": { "fedcm-continue-on-disallowed.https.html": [ - "fcda3a3dd591c694d341f5a04fa42ce667ea1ad6", + "5c7bf38751013328e4317354077d51a0d776d6c1", [ null, { @@ -676101,7 +676646,7 @@ } ] ], - "script-js-unlabeled-gziped.sub.html": [ + "script-js-unlabeled-gzipped.sub.html": [ "fe8544079883e6087a1cbd46152e8bc6d29c57fd", [ null, @@ -677720,7 +678265,7 @@ ] ], "general.any.js": [ - "64b225a60bdce48cb9f8300d4b5bb454faf37350", + "273e5ec79d1ab4950d9fde72c16dee50601540f7", [ "fetch/range/general.any.html", { @@ -733349,13 +733894,6 @@ {} ] ], - "the-anchor-attribute-003.tentative.html": [ - "e8c12c784f53d086e42c16eb8ed5f9572354c25a", - [ - null, - {} - ] - ], "the-anchor-attribute-004.tentative.html": [ "388e7177662159488b4070c3493aab93fc2ac36f", [ @@ -748611,6 +749149,20 @@ } ] ], + "parent-image-mask.tentative.html": [ + "77fb824f028853af4f53fc2312e019d4dcd95e3a", + [ + null, + {} + ] + ], + "parent-mask.tentative.html": [ + "0dab66b724c5abb2c291f56f9b4736f4ae88df80", + [ + null, + {} + ] + ], "permission-icon": { "icon-color-defaults-to-text-color.html": [ "a5f98cfe8aaf9e3243c5b63716e1eaedf898acc5", @@ -750693,7 +751245,7 @@ ] ], "invalid-content-type.any.js": [ - "d0bb6aa9fb17fe49d85bef83486edf4148ac970d", + "3c13906d36db764ad8afcd23ce6e36e8d35b1bd6", [ "html/semantics/scripting-1/the-script-element/json-module/invalid-content-type.any.html", { @@ -753721,7 +754273,7 @@ ] ], "event-dispatch-shadow.html": [ - "7b15123412cee07a302bb969aebeb2779f363935", + "6578d940bdad7c11692b17da1e4f37e31a2e1cac", [ null, {} @@ -756181,13 +756733,6 @@ {} ] ], - "script-src-event-handler.sub.html": [ - "346660511ee77f105a54a1126266d0db4787008a", - [ - null, - {} - ] - ], "script-src-integrity.tentative.sub.html": [ "6f66636d7673387854f5c2053bad92bd0207aae8", [ @@ -756202,7 +756747,7 @@ {} ] ], - "script-src-nomodule.sub.html": [ + "script-src-nomodule.tentative.sub.html": [ "3f61dba8d41926994c8ad8e7937ba855dbe1eddd", [ null, @@ -756223,15 +756768,8 @@ {} ] ], - "script-src-unsupported-language.sub.html": [ - "e418c0e1edd8fea62752fe38c4db608153d2ad29", - [ - null, - {} - ] - ], - "script-src-unsupported-type.sub.html": [ - "665e7abb02d30c3b911e49228b7c214051c341fb", + "script-src-unsupported-type.tentative.sub.html": [ + "1eaa56494dbe866a75b5f36b4d1046e3a4ac2447", [ null, {} @@ -756617,13 +757155,6 @@ {} ] ], - "script-src-event-handler.html": [ - "6bb89bd463c7b3565352242f96d6b98c4b7bac47", - [ - null, - {} - ] - ], "script-src-integrity.tentative.html": [ "42719e994a4774d8e2c1ed28b70714ecef6df1b4", [ @@ -756638,7 +757169,7 @@ {} ] ], - "script-src-nomodule.html": [ + "script-src-nomodule.tentative.html": [ "20ca80222eb0c6b100c57b6dacfbba0bd62f8c97", [ null, @@ -756659,14 +757190,7 @@ {} ] ], - "script-src-unsupported-language.html": [ - "60f50eb34d6e6beaf2496f0ed090d18f79ea1931", - [ - null, - {} - ] - ], - "script-src-unsupported-type.html": [ + "script-src-unsupported-type.tentative.html": [ "c7c5b483a4eba8b08e0e8ee634cd04409ddf2c10", [ null, @@ -757768,6 +758292,13 @@ {} ] ], + "mutation-observer.html": [ + "2f8701385a5f8e2f6f0ef57e7648fd4d9486c8f2", + [ + null, + {} + ] + ], "script_001.html": [ "43c7adb4d4dcc151ba0da94c935cc6ff55dba02f", [ @@ -758523,6 +759054,20 @@ {} ] ], + "microtask_before_prepare_the_script_element-01.html": [ + "a84a662a53a92214deb4006a94af2a9662f1ac7a", + [ + null, + {} + ] + ], + "microtask_before_prepare_the_script_element-02.xhtml": [ + "4dcc0ad242113756a48b78a16f064d8ba78a3c2e", + [ + null, + {} + ] + ], "new-scroll-event-dispatched-at-next-updating-rendering-time.html": [ "a858c205d051ee15d2cd2e47cedb9668ffe32cc4", [ @@ -767174,7 +767719,7 @@ }, "scripts": { "cramped-001.html": [ - "e03b4d968d2c21c87d52b60152aaff18a3fff728", + "678897e8daf24d7f0c8425debe99fcb2ec54a003", [ null, {} @@ -767599,6 +768144,71 @@ ] ] }, + "parsing": { + "math-depth-computed.html": [ + "075bc6f36fd372ec1b5c8e7bb47089c17435a7b4", + [ + null, + {} + ] + ], + "math-depth-invalid.html": [ + "2220ef8f7610600447450ba1e8cf3791b8600482", + [ + null, + {} + ] + ], + "math-depth-valid.html": [ + "b44018736904078d1ab9e8d59632b03e8be13624", + [ + null, + {} + ] + ], + "math-shift-computed.html": [ + "f95214f37088d1dc2f4642a4f723af67addf2797", + [ + null, + {} + ] + ], + "math-shift-invalid.html": [ + "4fbd4b62e9d71eb09d611ae75f7b65050fe0cefb", + [ + null, + {} + ] + ], + "math-shift-valid.html": [ + "a9949930fc134a1a4f6bc39b30fccbc727696899", + [ + null, + {} + ] + ], + "math-style-computed.html": [ + "3bf9ee5823c07cbc1fd4438470d14cdb6dd06b4c", + [ + null, + {} + ] + ], + "math-style-invalid.html": [ + "e5ce54953ae19ce3ab27fc8ef30d59f9e6ad17b3", + [ + null, + {} + ] + ], + "math-style-valid.html": [ + "dd6a409e935c7005a6b7ea64dd8d8be6fad3cd83", + [ + null, + {} + ] + ] + }, "scriptlevel-001.html": [ "e411433c9f000d223eed677d777cbf61841b7d5e", [ @@ -773446,6 +774056,13 @@ {} ] ], + "navigate-multiple-navigation-navigate.html": [ + "47d78c84ea51a7556d9a0addfe56bcbce68a2e58", + [ + null, + {} + ] + ], "navigate-navigation-back-cross-document.html": [ "084051539b8db3f50edb4e3037c9dd8882a6bbe6", [ @@ -776953,14 +777570,15 @@ ] ], "AbsoluteOrientationSensor-iframe-access.https.html": [ - "599bff7b4a3b0cd23af16bdca765abdfe89fc39b", + "5446e73c523b609e1981d44c3b9a6667c26ad2b4", [ null, { "testdriver": true, "testdriver_features": [ "bidi" - ] + ], + "timeout": "long" } ] ], @@ -783012,6 +783630,15 @@ } ] ], + "pointerevent_boundary_events_attributes_during_drag.html": [ + "04a758d1dba7b509c18b9bb27c0f7325337a3de0", + [ + null, + { + "testdriver": true + } + ] + ], "pointerevent_boundary_events_before_pointerrawupdate.https.html": [ "4de52758126e26089954a51804afaf411c38b290", [ @@ -798853,7 +799480,7 @@ ] ], "svg.html": [ - "d92f5935d807ee4956f15186b65fe1fbe40af8ac", + "f33a12ef4810102fc1feece791474b1c992cbfd0", [ null, {} @@ -799363,13 +799990,15 @@ ] ], "tentative": { - "document-initiated.html": [ - "2f7abbffca25e209bc2105f17dfa7cafe905ba9f", - [ - null, - {} + "initiator-url": { + "document-initiated.html": [ + "6b192270697c4c62ef5fd5edd2475429926651bb", + [ + null, + {} + ] ] - ], + }, "script-initiated.html": [ "d6f3d1a32034a7daba50056d1028a8fe7e08df29", [ @@ -806819,6 +807448,13 @@ {} ] ], + "intercepted-referrer.https.html": [ + "72d789451390f4c90c77b8c6d7203fa814542747", + [ + null, + {} + ] + ], "interface-requirements-sw.https.html": [ "eef868c889f04d257055d9f08ce22832b6cc34fd", [ @@ -814887,10 +815523,10 @@ {} ] ], - "idlharness.window.js": [ + "idlharness.https.window.js": [ "77eb6a1be9083214d78d8d4c659952b18be4db8e", [ - "speech-api/idlharness.window.html", + "speech-api/idlharness.https.window.html", { "script_metadata": [ [ @@ -816278,7 +816914,7 @@ ] ], "requestStorageAccess-sandboxed-iframe-allow-storage-access.sub.https.window.js": [ - "c163245ce36b9bab244730253948ec4d7902d5fb", + "faff38daf9b122116c169108cf889eb48a59a560", [ "storage-access-api/requestStorageAccess-sandboxed-iframe-allow-storage-access.sub.https.window.html", { @@ -819237,7 +819873,7 @@ ], "readable-byte-streams": { "bad-buffers-and-views.any.js": [ - "afcc61e6800a28e0c8acaccf79d3cfadc4237b60", + "eae8dde03f6b8da8d2c8f975d8b7473401e5fef0", [ "streams/readable-byte-streams/bad-buffers-and-views.any.html", { @@ -832304,7 +832940,7 @@ ] ], "SVGAnimatedInteger.html": [ - "e8e8b30a7a5d38022145d4d704fcda84044d6653", + "1ed590b52eef8335ccce54fdb3b12c9de4956ca4", [ null, {} @@ -832339,7 +832975,7 @@ ] ], "SVGAnimatedNumber.html": [ - "c72cabca1a84b8cf071b91097e23a4039468999b", + "3852665c50e2feb950d89d26f58e51bccb13edc6", [ null, {} @@ -833934,7 +834570,7 @@ ] ], "should-sink-type-mismatch-violation-be-blocked-by-csp-001.html": [ - "a920f5240d722480eafb03c45effd9ff0e5a758f", + "bb9bbd39b637ea82ee9840af649a5abe0674569e", [ null, { @@ -833970,7 +834606,7 @@ ] ], "should-trusted-type-policy-creation-be-blocked-by-csp-002.html": [ - "abf24276372da37c7b88e03d65328612b8732a54", + "d299b6648efae51de74e54c64558e158475f0ea7", [ null, { @@ -852665,7 +853301,7 @@ ] ], "audiobuffersource-playbackrate-zero.html": [ - "5624054e3289a18d48fab3b4942f3bb16b9d1c03", + "c8bcbb61dd00ca95b898d98e02efa49ddbe215d9", [ null, {} @@ -852728,7 +853364,7 @@ ] ], "sub-sample-buffer-stitching.html": [ - "3700bfa8ce806a57a4df6c050a9d299d9274edea", + "7b6fbf19775533e0c10daf1e787769e679e2fd28", [ null, {} @@ -853668,7 +854304,7 @@ ] ], "ctor-channelmerger.html": [ - "0d6b45c56df0f43a0eac3f364cadca2e4669c6ed", + "5040a96ec5db9a50ddb9bbbfb1c2a4f9e58f57f2", [ null, {} @@ -853948,7 +854584,7 @@ ] ], "no-dezippering.html": [ - "6326d00dfb78efefd8a179e87dc53b531584895d", + "f6bb8299b2a3388b15497a51d00389d818bd803d", [ null, {} @@ -854308,7 +854944,7 @@ ] ], "waveshaper-limits.html": [ - "13e88be567b3470ec28a7c0cd7785d1ebcd6c988", + "9ac196a27aa709de2b0331b6a2fe7e0c0ae4df9d", [ null, {} @@ -854322,7 +854958,7 @@ ] ], "waveshaper.html": [ - "5e6ed24e9ea30f20d8a0342f958a9f52a1785a0a", + "d0725f4b7a761dd35659c7df0fa6c492b09610a8", [ null, {} @@ -858542,7 +859178,7 @@ ] ], "image-decoder.https.any.js": [ - "9ca28e49c4a2b5254c2f3c18664809bad9384b05", + "9469f51914f01307f32b7ab20065f2fd2ffdc8a3", [ "webcodecs/image-decoder.https.any.html", { @@ -897424,6 +898060,13 @@ } ] ], + "RTCEncodedVideoFrame-constructor.html": [ + "a19e4b7c9424c1ff8b5ccd7b3b1c89c366276bfc", + [ + null, + {} + ] + ], "RTCEncodedVideoFrame-metadata.https.html": [ "77e1ed118f21c5a47aaff1c1548e73e06dcf9666", [ @@ -943567,7 +944210,7 @@ }, "set_locale_override": { "contexts.py": [ - "3a3fa527c4f208b93c0756be1ec2bb798eb7b5e4", + "9f7e01deda35f8eb5e7ce183abad023bfb9e3acf", [ null, {} @@ -943625,6 +944268,36 @@ ] ] }, + "set_scripting_enabled": { + "contexts.py": [ + "e9479a1d5213165d071ce1fa4d84011757e4fdbb", + [ + null, + {} + ] + ], + "enabled.py": [ + "782f292faf93175c863efb9d80b591162349509e", + [ + null, + {} + ] + ], + "invalid.py": [ + "a435092cf6e984ad1c348f503aca8d7d44538785", + [ + null, + {} + ] + ], + "user_contexts.py": [ + "ae4b4af04d443b8e92f7c26c7ab4fed104b869a5", + [ + null, + {} + ] + ] + }, "set_timezone_override": { "contexts.py": [ "c8eba9be67170336b1c4a1b204b3c4e096d0329e", @@ -944426,6 +945099,29 @@ ] ] }, + "disown_data": { + "collector.py": [ + "8e77058077c94f3864560477edac387699a0678c", + [ + null, + {} + ] + ], + "invalid.py": [ + "d3cfb3ec85c2d0a65e5b24771b85469ddd3edcdf", + [ + null, + {} + ] + ], + "request.py": [ + "7a3fde4870563878d432a596d2d03c307316f8e3", + [ + null, + {} + ] + ] + }, "fail_request": { "invalid.py": [ "ead87c1a376ec403c24ca8cd6b4b04bf2a1de0fa", @@ -944467,7 +945163,7 @@ ] ], "invalid.py": [ - "2ee725bef97787d1ec67681ffeab18330128eed1", + "963488865f95997449b856877cc10e0f36222c31", [ null, {} @@ -946603,7 +947299,7 @@ ] ], "pointer_mouse.py": [ - "0a35cf945500f6e8c10ee4e78c21e820b36b2065", + "2b069b7c3633f4bf4da7fc1b19f5d46cd996dedd", [ null, {} diff --git a/tests/wpt/meta/content-security-policy/xslt/document-function-blocked.html.ini b/tests/wpt/meta/content-security-policy/xslt/document-function-blocked.html.ini new file mode 100644 index 00000000000..d5b8574ba09 --- /dev/null +++ b/tests/wpt/meta/content-security-policy/xslt/document-function-blocked.html.ini @@ -0,0 +1,4 @@ +[document-function-blocked.html] + expected: TIMEOUT + [XSL document() function is blocked by CSP] + expected: TIMEOUT diff --git a/tests/wpt/meta/content-security-policy/xslt/xsltprocessor-include-blocked.html.ini b/tests/wpt/meta/content-security-policy/xslt/xsltprocessor-include-blocked.html.ini new file mode 100644 index 00000000000..3980667fa8a --- /dev/null +++ b/tests/wpt/meta/content-security-policy/xslt/xsltprocessor-include-blocked.html.ini @@ -0,0 +1,4 @@ +[xsltprocessor-include-blocked.html] + expected: TIMEOUT + [xsltprocessor-include-blocked] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-cascade/layer-cssom-order-reverse.html.ini b/tests/wpt/meta/css/css-cascade/layer-cssom-order-reverse.html.ini new file mode 100644 index 00000000000..6694f4405f2 --- /dev/null +++ b/tests/wpt/meta/css/css-cascade/layer-cssom-order-reverse.html.ini @@ -0,0 +1,3 @@ +[layer-cssom-order-reverse.html] + [Delete layer invalidates @font-face] + expected: FAIL diff --git a/tests/wpt/meta/css/css-cascade/layer-font-face-override.html.ini b/tests/wpt/meta/css/css-cascade/layer-font-face-override.html.ini index 16cf7474802..6cdbdb3b9d2 100644 --- a/tests/wpt/meta/css/css-cascade/layer-font-face-override.html.ini +++ b/tests/wpt/meta/css/css-cascade/layer-font-face-override.html.ini @@ -5,3 +5,9 @@ [@font-face override between layers] expected: [FAIL, PASS] + + [@font-face override update with appended sheet 1] + expected: FAIL + + [@font-face override update with appended sheet 2] + expected: FAIL diff --git a/tests/wpt/meta/css/css-conditional/container-queries/crashtests/chrome-bug-439886903-crash.html.ini b/tests/wpt/meta/css/css-conditional/container-queries/crashtests/chrome-bug-439886903-crash.html.ini new file mode 100644 index 00000000000..5fe35d23034 --- /dev/null +++ b/tests/wpt/meta/css/css-conditional/container-queries/crashtests/chrome-bug-439886903-crash.html.ini @@ -0,0 +1,2 @@ +[chrome-bug-439886903-crash.html] + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-fonts/downloadable-font-scoped-to-document.html.ini b/tests/wpt/meta/css/css-fonts/downloadable-font-scoped-to-document.html.ini new file mode 100644 index 00000000000..7cc313b657d --- /dev/null +++ b/tests/wpt/meta/css/css-fonts/downloadable-font-scoped-to-document.html.ini @@ -0,0 +1,2 @@ +[downloadable-font-scoped-to-document.html] + expected: FAIL diff --git a/tests/wpt/meta/css/css-mixins/cssom.tentative.html.ini b/tests/wpt/meta/css/css-mixins/cssom.tentative.html.ini new file mode 100644 index 00000000000..8099fe8f7b9 --- /dev/null +++ b/tests/wpt/meta/css/css-mixins/cssom.tentative.html.ini @@ -0,0 +1,12 @@ +[cssom.tentative.html] + [serialization of @mixin] + expected: FAIL + + [serialization of rule with @apply] + expected: FAIL + + [serialization of @mixin with @contents] + expected: FAIL + + [serialization of rule with @apply and contents argument] + expected: FAIL diff --git a/tests/wpt/meta/css/css-mixins/invalidation.tentative.html.ini b/tests/wpt/meta/css/css-mixins/invalidation.tentative.html.ini new file mode 100644 index 00000000000..cdbda2c5c8a --- /dev/null +++ b/tests/wpt/meta/css/css-mixins/invalidation.tentative.html.ini @@ -0,0 +1,9 @@ +[invalidation.tentative.html] + [invalidation of @mixin from same stylesheet] + expected: FAIL + + [invalidation of @mixin from different stylesheet] + expected: FAIL + + [invalidation on adding @apply rule] + expected: FAIL diff --git a/tests/wpt/meta/css/css-mixins/media-queries.html.ini b/tests/wpt/meta/css/css-mixins/media-queries.html.ini new file mode 100644 index 00000000000..ff2960fb7fe --- /dev/null +++ b/tests/wpt/meta/css/css-mixins/media-queries.html.ini @@ -0,0 +1,3 @@ +[media-queries.html] + [CSS Mixins: Media Queries and invalidation] + expected: FAIL diff --git a/tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-computed.html.ini b/tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-computed.html.ini new file mode 100644 index 00000000000..1dfea07fa96 --- /dev/null +++ b/tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-computed.html.ini @@ -0,0 +1,18 @@ +[rotate-parsing-computed.html] + [Property rotate value '-0.5 0 0 400grad'] + expected: FAIL + + [Property rotate value '-1 0 0 400grad'] + expected: FAIL + + [Property rotate value '0 -0.5 0 400grad'] + expected: FAIL + + [Property rotate value '0 -1 0 400grad'] + expected: FAIL + + [Property rotate value '0 0 -0.5 400grad'] + expected: FAIL + + [Property rotate value '0 0 -1 400grad'] + expected: FAIL diff --git a/tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-valid.html.ini b/tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-valid.html.ini index dc904c73c6f..3a8b2c9ee48 100644 --- a/tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-valid.html.ini +++ b/tests/wpt/meta/css/css-transforms/parsing/rotate-parsing-valid.html.ini @@ -1,3 +1,21 @@ [rotate-parsing-valid.html] [e.style['rotate'\] = "z 400grad" should set the property value] expected: FAIL + + [e.style['rotate'\] = "-0.5 0 0 400grad" should set the property value] + expected: FAIL + + [e.style['rotate'\] = "-1 0 0 400grad" should set the property value] + expected: FAIL + + [e.style['rotate'\] = "0 -0.5 0 400grad" should set the property value] + expected: FAIL + + [e.style['rotate'\] = "0 -1 0 400grad" should set the property value] + expected: FAIL + + [e.style['rotate'\] = "0 0 -0.5 400grad" should set the property value] + expected: FAIL + + [e.style['rotate'\] = "0 0 -1 400grad" should set the property value] + expected: FAIL diff --git a/tests/wpt/meta/css/css-values/attr-all-types.html.ini b/tests/wpt/meta/css/css-values/attr-all-types.html.ini index 0b39fc70aac..4ff0064ac41 100644 --- a/tests/wpt/meta/css/css-values/attr-all-types.html.ini +++ b/tests/wpt/meta/css/css-values/attr-all-types.html.ini @@ -35,9 +35,6 @@ [CSS Values and Units Test: attr 12] expected: FAIL - [CSS Values and Units Test: attr 16] - expected: FAIL - [CSS Values and Units Test: attr 17] expected: FAIL @@ -62,9 +59,6 @@ [CSS Values and Units Test: attr 23] expected: FAIL - [CSS Values and Units Test: attr 14] - expected: FAIL - [CSS Values and Units Test: attr 28] expected: FAIL @@ -74,18 +68,9 @@ [CSS Values and Units Test: attr 40] expected: FAIL - [CSS Values and Units Test: attr 41] - expected: FAIL - - [CSS Values and Units Test: attr 42] - expected: FAIL - [CSS Values and Units Test: attr 43] expected: FAIL - [CSS Values and Units Test: attr 44] - expected: FAIL - [CSS Values and Units Test: attr 45] expected: FAIL @@ -122,9 +107,6 @@ [CSS Values and Units Test: attr 59] expected: FAIL - [CSS Values and Units Test: attr 60] - expected: FAIL - [CSS Values and Units Test: attr 61] expected: FAIL @@ -158,9 +140,6 @@ [CSS Values and Units Test: attr 29] expected: FAIL - [CSS Values and Units Test: attr 32] - expected: FAIL - [CSS Values and Units Test: attr 71] expected: FAIL @@ -185,15 +164,6 @@ [CSS Values and Units Test: attr 78] expected: FAIL - [CSS Values and Units Test: attr 15] - expected: FAIL - - [CSS Values and Units Test: attr 30] - expected: FAIL - - [CSS Values and Units Test: attr 31] - expected: FAIL - [CSS Values and Units Test: attr 33] expected: FAIL @@ -212,15 +182,6 @@ [CSS Values and Units Test: attr 82] expected: FAIL - [CSS Values and Units Test: attr 92] - expected: FAIL - - [CSS Values and Units Test: attr 93] - expected: FAIL - - [CSS Values and Units Test: attr 94] - expected: FAIL - [CSS Values and Units Test: attr 8] expected: FAIL @@ -239,5 +200,44 @@ [CSS Values and Units Test: attr 83] expected: FAIL - [CSS Values and Units Test: attr 95] + [CSS Values and Units Test: attr 35] + expected: FAIL + + [CSS Values and Units Test: attr 36] + expected: FAIL + + [CSS Values and Units Test: attr 38] + expected: FAIL + + [CSS Values and Units Test: attr 54] + expected: FAIL + + [CSS Values and Units Test: attr 84] + expected: FAIL + + [CSS Values and Units Test: attr 85] + expected: FAIL + + [CSS Values and Units Test: attr 86] + expected: FAIL + + [CSS Values and Units Test: attr 87] + expected: FAIL + + [CSS Values and Units Test: attr 88] + expected: FAIL + + [CSS Values and Units Test: attr 89] + expected: FAIL + + [CSS Values and Units Test: attr 98] + expected: FAIL + + [CSS Values and Units Test: attr 99] + expected: FAIL + + [CSS Values and Units Test: attr 100] + expected: FAIL + + [CSS Values and Units Test: attr 101] expected: FAIL diff --git a/tests/wpt/meta/css/filter-effects/backdrop-filter-inline-positioning.html.ini b/tests/wpt/meta/css/filter-effects/backdrop-filter-inline-positioning.html.ini new file mode 100644 index 00000000000..4a6013cc664 --- /dev/null +++ b/tests/wpt/meta/css/filter-effects/backdrop-filter-inline-positioning.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-inline-positioning.html] + expected: FAIL diff --git a/tests/wpt/meta/css/filter-effects/svg-empty-element-with-filter-001.html.ini b/tests/wpt/meta/css/filter-effects/svg-empty-element-with-filter-001.html.ini new file mode 100644 index 00000000000..db712884588 --- /dev/null +++ b/tests/wpt/meta/css/filter-effects/svg-empty-element-with-filter-001.html.ini @@ -0,0 +1,2 @@ +[svg-empty-element-with-filter-001.html] + expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-heading.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-heading.html.ini new file mode 100644 index 00000000000..1efaf2bdede --- /dev/null +++ b/tests/wpt/meta/css/selectors/parsing/parse-heading.html.ini @@ -0,0 +1,30 @@ +[parse-heading.html] + [":heading" should be a valid selector] + expected: FAIL + + [":heading(2)" should be a valid selector] + expected: FAIL + + [":heading(99999)" should be a valid selector] + expected: FAIL + + [":heading(0)" should be a valid selector] + expected: FAIL + + [":heading(0, 1, 2)" should be a valid selector] + expected: FAIL + + [":heading(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)" should be a valid selector] + expected: FAIL + + [":heading(-1)" should be a valid selector] + expected: FAIL + + ["h1:heading" should be a valid selector] + expected: FAIL + + ["h1:heading(1)" should be a valid selector] + expected: FAIL + + ["h1:heading(2)" should be a valid selector] + expected: FAIL diff --git a/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini b/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini index 474bf21084b..30f378796fe 100644 --- a/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini +++ b/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini @@ -30,7 +30,7 @@ expected: ERROR [AbortSignal.https.any.shadowrealm-in-audioworklet.html] - expected: TIMEOUT + expected: ERROR [AbortSignal.any.shadowrealm-in-dedicatedworker.html] expected: ERROR diff --git a/tests/wpt/meta/dom/abort/event.any.js.ini b/tests/wpt/meta/dom/abort/event.any.js.ini index d1ed136b2b8..f15826145bd 100644 --- a/tests/wpt/meta/dom/abort/event.any.js.ini +++ b/tests/wpt/meta/dom/abort/event.any.js.ini @@ -24,7 +24,7 @@ expected: ERROR [event.https.any.shadowrealm-in-audioworklet.html] - expected: TIMEOUT + expected: ERROR [event.https.any.shadowrealm-in-serviceworker.html] expected: ERROR diff --git a/tests/wpt/meta/fetch/api/idlharness.any.js.ini b/tests/wpt/meta/fetch/api/idlharness.any.js.ini index 58df7ba3188..9a7a7b2795d 100644 --- a/tests/wpt/meta/fetch/api/idlharness.any.js.ini +++ b/tests/wpt/meta/fetch/api/idlharness.any.js.ini @@ -64,6 +64,36 @@ [Request interface: new Request('about:blank') must inherit property "duplex" with the proper type] expected: FAIL + [FetchLaterResult interface: existence and properties of interface object] + expected: FAIL + + [FetchLaterResult interface object length] + expected: FAIL + + [FetchLaterResult interface object name] + expected: FAIL + + [FetchLaterResult interface: existence and properties of interface prototype object] + expected: FAIL + + [FetchLaterResult interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [FetchLaterResult interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [FetchLaterResult interface: attribute activated] + expected: FAIL + + [Window interface: operation fetchLater(RequestInfo, optional DeferredRequestInit)] + expected: FAIL + + [Window interface: window must inherit property "fetchLater(RequestInfo, optional DeferredRequestInit)" with the proper type] + expected: FAIL + + [Window interface: calling fetchLater(RequestInfo, optional DeferredRequestInit) on window with too few arguments must throw TypeError] + expected: FAIL + [idlharness.any.serviceworker.html] expected: ERROR diff --git a/tests/wpt/meta/fetch/metadata/generated/css-font-face.sub.tentative.html.ini b/tests/wpt/meta/fetch/metadata/generated/css-font-face.sub.tentative.html.ini index 0ca3d822ceb..d55596a6a0d 100644 --- a/tests/wpt/meta/fetch/metadata/generated/css-font-face.sub.tentative.html.ini +++ b/tests/wpt/meta/fetch/metadata/generated/css-font-face.sub.tentative.html.ini @@ -49,3 +49,6 @@ [sec-fetch-storage-access - Not sent to non-trustworthy same-site destination] expected: FAIL + + [sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination] + expected: FAIL diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini index 5aef7ce66ce..324db3d9b35 100644 --- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini +++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html.ini @@ -10,6 +10,3 @@ [load event does not fire on window.open('about:blank?foo')] expected: FAIL - - [load event does not fire on window.open('about:blank')] - expected: FAIL diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini deleted file mode 100644 index 7a5fcb79165..00000000000 --- a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[traverse_the_history_5.html] - [Multiple history traversals, last would be aborted] - expected: FAIL diff --git a/tests/wpt/meta/html/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/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html.ini b/tests/wpt/meta/html/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html.ini deleted file mode 100644 index 8e67fee45b7..00000000000 --- a/tests/wpt/meta/html/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[the-anchor-attribute-003.tentative.html] - [::before uses originating element's implicit anchor] - expected: FAIL - - [::after uses originating element's implicit anchor] - expected: FAIL - - [::backdrop uses originating element's implicit anchor] - 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 a9173ff4def..cce32646d7d 100644 --- a/tests/wpt/meta/html/dom/idlharness.https.html.ini +++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini @@ -7107,3 +7107,21 @@ [HTMLTemplateElement interface: document.createElement("template") must inherit property "shadowRootCustomElementRegistry" with the proper type] expected: FAIL + + [HTMLSelectedContentElement interface: existence and properties of interface object] + expected: FAIL + + [HTMLSelectedContentElement interface object length] + expected: FAIL + + [HTMLSelectedContentElement interface object name] + expected: FAIL + + [HTMLSelectedContentElement interface: existence and properties of interface prototype object] + expected: FAIL + + [HTMLSelectedContentElement interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [HTMLSelectedContentElement interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-empty.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-empty.html.ini index 9e6f4115b8c..0cfee719c4e 100644 --- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-empty.html.ini +++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-empty.html.ini @@ -1,6 +1,7 @@ [document-with-fragment-empty.html] + expected: TIMEOUT [Autofocus elements in iframed documents with empty fragments should work.] expected: FAIL [Autofocus elements in top-level browsing context's documents with empty fragments should work.] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini index 7df8f9458e9..68203d2a082 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini @@ -1,4 +1,4 @@ [iframe_sandbox_popups_escaping-2.html] expected: CRASH [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_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini index 6a420504feb..1c4e58a8ba1 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: CRASH [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index 8822f4daba6..bbc1f35d8d9 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_nonescaping-1.html] - expected: CRASH [Check that popups from a sandboxed iframe do not escape the sandbox] expected: FAIL 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..d89a1691435 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,4 @@ [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/the-fieldset-element/disabled-003.html.ini b/tests/wpt/meta/html/semantics/forms/the-fieldset-element/disabled-003.html.ini new file mode 100644 index 00000000000..5983b46a9ab --- /dev/null +++ b/tests/wpt/meta/html/semantics/forms/the-fieldset-element/disabled-003.html.ini @@ -0,0 +1,2 @@ +[disabled-003.html] + expected: CRASH diff --git a/tests/wpt/meta/html/semantics/permission-element/parent-image-mask.tentative.html.ini b/tests/wpt/meta/html/semantics/permission-element/parent-image-mask.tentative.html.ini new file mode 100644 index 00000000000..a2ae0f7d4e8 --- /dev/null +++ b/tests/wpt/meta/html/semantics/permission-element/parent-image-mask.tentative.html.ini @@ -0,0 +1,4 @@ +[parent-image-mask.tentative.html] + expected: TIMEOUT + [Permission element is invalid if it has a parent with mask-image.] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/permission-element/parent-mask.tentative.html.ini b/tests/wpt/meta/html/semantics/permission-element/parent-mask.tentative.html.ini new file mode 100644 index 00000000000..11afd5d53bd --- /dev/null +++ b/tests/wpt/meta/html/semantics/permission-element/parent-mask.tentative.html.ini @@ -0,0 +1,4 @@ +[parent-mask.tentative.html] + expected: TIMEOUT + [Permission element is invalid if it has a parent with a mask.] + expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/execution-timing/077.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/execution-timing/077.html.ini new file mode 100644 index 00000000000..86e95d0ff4c --- /dev/null +++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/execution-timing/077.html.ini @@ -0,0 +1,3 @@ +[077.html] + [ adding several types of scripts through the DOM and removing some of them confuses scheduler ] + expected: FAIL diff --git a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html.ini b/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html.ini deleted file mode 100644 index 3ac9a71addd..00000000000 --- a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[script-src-event-handler.html] - [Speculative parsing, page load: script-src-event-handler] - expected: FAIL diff --git a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.html.ini b/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.tentative.html.ini similarity index 66% rename from tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.html.ini rename to tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.tentative.html.ini index 78f5e63c885..f100a3b8b87 100644 --- a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.html.ini +++ b/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.tentative.html.ini @@ -1,3 +1,3 @@ -[script-src-nomodule.html] +[script-src-nomodule.tentative.html] [Speculative parsing, page load: script-src-nomodule] expected: FAIL diff --git a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html.ini b/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html.ini deleted file mode 100644 index 0726a34141c..00000000000 --- a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[script-src-unsupported-language.html] - [Speculative parsing, page load: script-src-unsupported-language] - expected: FAIL diff --git a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.html.ini b/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.tentative.html.ini similarity index 64% rename from tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.html.ini rename to tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.tentative.html.ini index 0fbcb350c09..adedaa27c01 100644 --- a/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.html.ini +++ b/tests/wpt/meta/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.tentative.html.ini @@ -1,3 +1,3 @@ -[script-src-unsupported-type.html] +[script-src-unsupported-type.tentative.html] [Speculative parsing, page load: script-src-unsupported-type] expected: FAIL diff --git a/tests/wpt/meta/notifications/idlharness.https.any.js.ini b/tests/wpt/meta/notifications/idlharness.https.any.js.ini index 56add32751d..9925c446f73 100644 --- a/tests/wpt/meta/notifications/idlharness.https.any.js.ini +++ b/tests/wpt/meta/notifications/idlharness.https.any.js.ini @@ -8,6 +8,12 @@ [ServiceWorkerRegistration interface: operation getNotifications(optional GetNotificationOptions)] expected: FAIL + [Notification interface: attribute navigate] + expected: FAIL + + [Notification interface: notification must inherit property "navigate" with the proper type] + expected: FAIL + [idlharness.https.any.html] [ServiceWorkerRegistration interface: operation showNotification(DOMString, optional NotificationOptions)] @@ -16,6 +22,12 @@ [ServiceWorkerRegistration interface: operation getNotifications(optional GetNotificationOptions)] expected: FAIL + [Notification interface: attribute navigate] + expected: FAIL + + [Notification interface: notification must inherit property "navigate" with the proper type] + expected: FAIL + [idlharness.https.any.serviceworker.html] expected: ERROR diff --git a/tests/wpt/meta/preload/preload-error.sub.html.ini b/tests/wpt/meta/preload/preload-error.sub.html.ini index ed3db641537..e86b9eb8da6 100644 --- a/tests/wpt/meta/preload/preload-error.sub.html.ini +++ b/tests/wpt/meta/preload/preload-error.sub.html.ini @@ -56,9 +56,6 @@ [MIME-blocked-nosniff (script): main] expected: FAIL - [CORS (xhr): main] - expected: FAIL - [success (xhr): main] expected: FAIL @@ -74,5 +71,5 @@ [404 (script): main] expected: FAIL - [CORS (script): main] + [Decode-error (style): main] expected: FAIL diff --git a/tests/wpt/meta/resource-timing/initiator-type/svg.html.ini b/tests/wpt/meta/resource-timing/initiator-type/svg.html.ini index 85fe5c76c05..b9f5b1f1f2f 100644 --- a/tests/wpt/meta/resource-timing/initiator-type/svg.html.ini +++ b/tests/wpt/meta/resource-timing/initiator-type/svg.html.ini @@ -1,3 +1,6 @@ [svg.html] [The initiator type for in an must be 'image'] expected: FAIL + + [The initiator type for in an must be 'other'] + expected: FAIL diff --git a/tests/wpt/meta/resource-timing/tentative/document-initiated.html.ini b/tests/wpt/meta/resource-timing/tentative/document-initiated.html.ini deleted file mode 100644 index 6d29e8193e7..00000000000 --- a/tests/wpt/meta/resource-timing/tentative/document-initiated.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[document-initiated.html] - [Ensure initiator Attribute matches with Document ResourceID] - expected: TIMEOUT - - [initiatorUrl by main html file] - expected: FAIL - - [initiatorUrl for resource by document.write()] - expected: FAIL diff --git a/tests/wpt/meta/resource-timing/tentative/initiator-url/document-initiated.html.ini b/tests/wpt/meta/resource-timing/tentative/initiator-url/document-initiated.html.ini new file mode 100644 index 00000000000..8077cc2e810 --- /dev/null +++ b/tests/wpt/meta/resource-timing/tentative/initiator-url/document-initiated.html.ini @@ -0,0 +1,42 @@ +[document-initiated.html] + [The initiator Url for empty.js?blocking initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for display_paragraph.js initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for empty.js?async initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for empty.js?deferred initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for empty.js?module initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for empty_style.css?link initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for blue.png?inline-style initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for Ahem.ttf?initiator-html initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for blue.png?using-Img-tag initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for empty_style.css?inline-script initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for blue.png?inline-script initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for blue.png?inline-script-doc-write initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for empty_style.css?inline-script-doc-write initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL + + [The initiator Url for empty.js?doc-write initiatorUrl from document-initiated must be 'http://web-platform.test:8000/resource-timing/tentative/initiator-url/document-initiated.html'] + expected: FAIL diff --git a/tests/wpt/meta/resource-timing/tentative/stylesheet-initiated.html.ini b/tests/wpt/meta/resource-timing/tentative/stylesheet-initiated.html.ini index b4af8bc760b..495ce98da6a 100644 --- a/tests/wpt/meta/resource-timing/tentative/stylesheet-initiated.html.ini +++ b/tests/wpt/meta/resource-timing/tentative/stylesheet-initiated.html.ini @@ -1,4 +1,4 @@ [stylesheet-initiated.html] - expected: TIMEOUT + expected: ERROR [Ensure initiator Attribute matches with Stylesheet ResourceID] expected: TIMEOUT diff --git a/tests/wpt/meta/service-workers/idlharness.https.any.js.ini b/tests/wpt/meta/service-workers/idlharness.https.any.js.ini index f85e3c42ea4..aba70ff3a35 100644 --- a/tests/wpt/meta/service-workers/idlharness.https.any.js.ini +++ b/tests/wpt/meta/service-workers/idlharness.https.any.js.ini @@ -108,6 +108,21 @@ [Window interface: attribute caches] expected: FAIL + [ServiceWorkerContainer interface: operation register((TrustedScriptURL or USVString), optional RegistrationOptions)] + expected: TIMEOUT + + [NavigationPreloadManager interface: operation enable()] + expected: TIMEOUT + + [NavigationPreloadManager interface: operation disable()] + expected: TIMEOUT + + [NavigationPreloadManager interface: operation setHeaderValue(ByteString)] + expected: TIMEOUT + + [NavigationPreloadManager interface: operation getState()] + expected: TIMEOUT + [idlharness.https.any.serviceworker.html] expected: ERROR diff --git a/tests/wpt/meta/service-workers/service-worker/intercepted-referrer.https.html.ini b/tests/wpt/meta/service-workers/service-worker/intercepted-referrer.https.html.ini new file mode 100644 index 00000000000..541e54f14a9 --- /dev/null +++ b/tests/wpt/meta/service-workers/service-worker/intercepted-referrer.https.html.ini @@ -0,0 +1,3 @@ +[intercepted-referrer.https.html] + [document.referrer for a navigation intercepted by a Service Worker is unchanged and matches the parent URL] + expected: FAIL diff --git a/tests/wpt/meta/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html.ini b/tests/wpt/meta/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html.ini index d3218647e91..b3600e39381 100644 --- a/tests/wpt/meta/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html.ini +++ b/tests/wpt/meta/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html.ini @@ -29,3 +29,6 @@ [directive "require-trusted-types-for 'invalid'%20'script'" (required-ascii-whitespace)] expected: NOTRUN + + [directive "require-trusted-types-for 'invalid'%0D%20'script'" (required-ascii-whitespace)] + expected: NOTRUN diff --git a/tests/wpt/meta/urlpattern/urlpattern.any.js.ini b/tests/wpt/meta/urlpattern/urlpattern.any.js.ini index 065a80d7f08..5126eaa4288 100644 --- a/tests/wpt/meta/urlpattern/urlpattern.any.js.ini +++ b/tests/wpt/meta/urlpattern/urlpattern.any.js.ini @@ -41,6 +41,15 @@ [Pattern: [{"hostname":"bad\\\\:hostname"}\] Inputs: undefined] expected: FAIL + [Pattern: [{"protocol":"http","hostname":"example.com/ignoredpath"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com\\\\?ignoredsearch"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com#ignoredhash"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + [urlpattern.any.sharedworker.html] expected: ERROR @@ -88,6 +97,15 @@ [Pattern: [{"hostname":"bad\\\\:hostname"}\] Inputs: undefined] expected: FAIL + [Pattern: [{"protocol":"http","hostname":"example.com/ignoredpath"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com\\\\?ignoredsearch"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com#ignoredhash"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + [urlpattern.any.serviceworker.html] expected: ERROR diff --git a/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini b/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini index b94748d6714..48555769270 100644 --- a/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini +++ b/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini @@ -44,6 +44,15 @@ [Pattern: [{"hostname":"bad\\\\:hostname"}\] Inputs: undefined] expected: FAIL + [Pattern: [{"protocol":"http","hostname":"example.com/ignoredpath"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com\\\\?ignoredsearch"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com#ignoredhash"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + [urlpattern.https.any.worker.html] [Pattern: [{"protocol":"http","port":"80 "}\] Inputs: [{"protocol":"http","port":"80"}\]] @@ -88,6 +97,15 @@ [Pattern: [{"hostname":"bad\\\\:hostname"}\] Inputs: undefined] expected: FAIL + [Pattern: [{"protocol":"http","hostname":"example.com/ignoredpath"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com\\\\?ignoredsearch"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + + [Pattern: [{"protocol":"http","hostname":"example.com#ignoredhash"}\] Inputs: ["http://example.com/"\]] + expected: FAIL + [urlpattern.https.any.serviceworker.html] expected: ERROR diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html.ini index 38cd20fa0fd..1dca5d4ae18 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html.ini @@ -10,3 +10,6 @@ [# AUDIT TASK RUNNER FINISHED: 1 out of 5 tasks were failed.] expected: FAIL + + [AudioNodeOptions behavior for ChannelMergerNode] + expected: FAIL diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html.ini index bddfce82aff..2766c345ffe 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html.ini @@ -7,3 +7,12 @@ [Executing "test3"] expected: FAIL + + [Compare value setter and setValueAtTime] + expected: FAIL + + [Automation effects] + expected: FAIL + + [Dezippering of GainNode removed] + expected: FAIL diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html.ini index f3b0613af11..cdf6e8bc6cb 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html.ini @@ -1,3 +1,6 @@ [waveshaper-limits.html] [Executing "test"] expected: FAIL + + [WaveShaperNode maps input values outside [-1,1\] according to curve and clamps output correctly] + expected: FAIL diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html.ini index e1cca82524c..eb65c6cd40c 100644 --- a/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html.ini +++ b/tests/wpt/meta/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html.ini @@ -1,3 +1,6 @@ [waveshaper.html] [Executing "test"] expected: FAIL + + [WaveShaperNode applies non-linear distortion correctly] + 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 deleted file mode 100644 index 0e57356683e..00000000000 --- a/tests/wpt/meta/webxr/render_state_update.https.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[render_state_update.https.html] - expected: ERROR diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml index 12b5adc7ee9..29e9ba6e084 100644 --- a/tests/wpt/tests/.github/workflows/docker.yml +++ b/tests/wpt/tests/.github/workflows/docker.yml @@ -26,14 +26,14 @@ jobs: uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 # Based on https://docs.github.com/en/actions/publishing-packages/publishing-docker-images. - name: Log in to the Container registry - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 + uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | diff --git a/tests/wpt/tests/.well-known/device-bound-sessions b/tests/wpt/tests/.well-known/device-bound-sessions new file mode 100644 index 00000000000..7944486181b --- /dev/null +++ b/tests/wpt/tests/.well-known/device-bound-sessions @@ -0,0 +1,8 @@ +import json + +def main(request, response): + response_body = { + "registering_origins": ['https://www.' + request.headers.get('host').decode("utf-8")], + } + return (200, [('Content-Type', 'application/json'), ('Set-Cookie', 'well_known_fetched=true; Path=/device-bound-session-credentials')], + json.dumps(response_body)) diff --git a/tests/wpt/tests/FileAPI/blob/Blob-slice.any.js b/tests/wpt/tests/FileAPI/blob/Blob-slice.any.js index c48d4703d86..6a7d9c3fab1 100644 --- a/tests/wpt/tests/FileAPI/blob/Blob-slice.any.js +++ b/tests/wpt/tests/FileAPI/blob/Blob-slice.any.js @@ -73,6 +73,21 @@ test(function() { {start: 7, end: 4, contents: ""}] ], + // Test double start/end values + [ + ["abcd"], + [{start: 0.5, contents: "abcd"}, + {start: 1.5, contents: "cd"}, + {start: 2.5, contents: "cd"}, + {start: 3.5, contents: ""}, + {start: 0, end: 0.5, contents: ""}, + {start: 0, end: 1.5, contents: "ab"}, + {start: 0, end: 2.5, contents: "ab"}, + {start: 0, end: 3.5, contents: "abcd"}, + {start: 1.5, end: 2.5, contents: ""}, + {start: 1.5, end: 3.5, contents: "cd"}] + ], + // Test 3 strings [ ["foo", "bar", "baz"], diff --git a/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-ignore.html b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-ignore.html new file mode 100644 index 00000000000..43c6e7adabb --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-ignore.html @@ -0,0 +1,56 @@ + + +Container Timing: two nested containertiming nodes, with a child img inside of the inner, and a containertiming-ignore between the roots + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-intermediate-nesting-transparent.html b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-intermediate-nesting-transparent.html new file mode 100644 index 00000000000..bff241b33b0 --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img-with-intermediate-nesting-transparent.html @@ -0,0 +1,55 @@ + + +Container Timing: two nested containertiming nodes, with a child img inside of the inner, and an intermediate nesting policy that is not used + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html index 3f830fe7863..de51aa4ffef 100644 --- a/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html +++ b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html @@ -45,7 +45,7 @@ body { div2.appendChild(img); beforeRender = performance.now(); }; - }, 'A parent containertiming root does not get paints from children containertiming roots.'); + }, 'A parent containertiming root with default nesting policy does not get paints from children containertiming roots.'); diff --git a/tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-from-invalid.html b/tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-from-invalid.html new file mode 100644 index 00000000000..318b66396bf --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-from-invalid.html @@ -0,0 +1,59 @@ + + +Container Timing: two nested containertiming nodes, parent gets invalid, then transparent nesting policy, with a child img inside of the inner + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-to-invalid.html b/tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-to-invalid.html new file mode 100644 index 00000000000..4735709179d --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-containertiming-nesting-change-to-invalid.html @@ -0,0 +1,51 @@ + + +Container Timing: two nested containertiming nodes, parent switching from transparent to invalid nesting policy, with a child img inside of the inner + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-shadowed-containertiming-child-img.html b/tests/wpt/tests/container-timing/tentative/nested-shadowed-containertiming-child-img.html new file mode 100644 index 00000000000..692f501579c --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-shadowed-containertiming-child-img.html @@ -0,0 +1,58 @@ + + +Container Timing: two nested containertiming nodes, parent with shadowed mode, with a child img inside of the inner + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-shadowed-to-transparent-containertiming-child-img.html b/tests/wpt/tests/container-timing/tentative/nested-shadowed-to-transparent-containertiming-child-img.html new file mode 100644 index 00000000000..ef2034547ce --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-shadowed-to-transparent-containertiming-child-img.html @@ -0,0 +1,59 @@ + + +Container Timing: two nested containertiming nodes, parent with shadowed mode changed to transparent mode, with a child img inside of the inner + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img-with-intermediate-ignore.html b/tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img-with-intermediate-ignore.html new file mode 100644 index 00000000000..3a0a64b6455 --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img-with-intermediate-ignore.html @@ -0,0 +1,54 @@ + + +Container Timing: two nested containertiming nodes, parent with transparent mode, with a child img inside of the inner, and an intermediate ignore node + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img.html b/tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img.html new file mode 100644 index 00000000000..9523cc88b09 --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-transparent-containertiming-child-img.html @@ -0,0 +1,57 @@ + + +Container Timing: two nested containertiming nodes, parent with transparent mode, with a child img inside of the inner + + + + + + + + + diff --git a/tests/wpt/tests/container-timing/tentative/nested-transparent-to-shadowed-containertiming-child-img.html b/tests/wpt/tests/container-timing/tentative/nested-transparent-to-shadowed-containertiming-child-img.html new file mode 100644 index 00000000000..250f779af75 --- /dev/null +++ b/tests/wpt/tests/container-timing/tentative/nested-transparent-to-shadowed-containertiming-child-img.html @@ -0,0 +1,60 @@ + + +Container Timing: two nested containertiming nodes, parent with transparent mode, changed to shadowed mode, with a child img inside of the inner + + + + + + + + + diff --git a/tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html b/tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html new file mode 100644 index 00000000000..b06604dba3e --- /dev/null +++ b/tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html @@ -0,0 +1,20 @@ + + + +A Report-Only policy with a nonce does not send a report for an allowed link preload + + + + + + + diff --git a/tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html.sub.headers b/tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html.sub.headers new file mode 100644 index 00000000000..f9f981b1c91 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/reporting/link-preload-from-header-report-only-nonce.sub.html.sub.headers @@ -0,0 +1,4 @@ +Set-Cookie: link-preload-report-only-nonce={{$id:uuid()}}; Path=/content-security-policy/reporting +Content-Security-Policy: script-src 'self' 'unsafe-inline' +Content-Security-Policy-Report-Only: script-src 'nonce-abc'; report-uri /reporting/resources/report.py?op=put&reportID={{$id}} +Link: ;rel=preload;as=script;nonce=abc diff --git a/tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html b/tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html new file mode 100644 index 00000000000..7ed3123d291 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html @@ -0,0 +1,21 @@ + + + +A Report-Only policy with a nonce does not send a report for an allowed link preload + + + + + + + + diff --git a/tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html.sub.headers b/tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html.sub.headers new file mode 100644 index 00000000000..0a1b3943608 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/reporting/link-preload-report-only-nonce.sub.html.sub.headers @@ -0,0 +1,3 @@ +Set-Cookie: link-preload-report-only-nonce={{$id:uuid()}}; Path=/content-security-policy/reporting +Content-Security-Policy: script-src 'self' 'unsafe-inline' +Content-Security-Policy-Report-Only: script-src 'nonce-abc'; report-uri /reporting/resources/report.py?op=put&reportID={{$id}} diff --git a/tests/wpt/tests/content-security-policy/support/pass.js b/tests/wpt/tests/content-security-policy/support/pass.js new file mode 100644 index 00000000000..2e3702c685a --- /dev/null +++ b/tests/wpt/tests/content-security-policy/support/pass.js @@ -0,0 +1 @@ +// intentionally left blank. diff --git a/tests/wpt/tests/content-security-policy/xslt/document-function-blocked.html b/tests/wpt/tests/content-security-policy/xslt/document-function-blocked.html new file mode 100644 index 00000000000..d81c4003f1a --- /dev/null +++ b/tests/wpt/tests/content-security-policy/xslt/document-function-blocked.html @@ -0,0 +1,17 @@ + + + + + + + diff --git a/tests/wpt/tests/content-security-policy/xslt/support/document.xsl b/tests/wpt/tests/content-security-policy/xslt/support/document.xsl new file mode 100644 index 00000000000..99511541f0a --- /dev/null +++ b/tests/wpt/tests/content-security-policy/xslt/support/document.xsl @@ -0,0 +1,5 @@ + + + + + diff --git a/tests/wpt/tests/content-security-policy/xslt/support/empty.xml b/tests/wpt/tests/content-security-policy/xslt/support/empty.xml new file mode 100644 index 00000000000..29862022257 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/xslt/support/empty.xml @@ -0,0 +1,2 @@ + + diff --git a/tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml b/tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml new file mode 100644 index 00000000000..d6a515466dc --- /dev/null +++ b/tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml @@ -0,0 +1,3 @@ + + + diff --git a/tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml.headers b/tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml.headers new file mode 100644 index 00000000000..72a99ace37c --- /dev/null +++ b/tests/wpt/tests/content-security-policy/xslt/support/xml-with-stylesheet.xml.headers @@ -0,0 +1 @@ +Content-Security-Policy: connect-src 'none'; diff --git a/tests/wpt/tests/content-security-policy/xslt/xsltprocessor-include-blocked.html b/tests/wpt/tests/content-security-policy/xslt/xsltprocessor-include-blocked.html new file mode 100644 index 00000000000..dbbe07f6e12 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/xslt/xsltprocessor-include-blocked.html @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/tests/wpt/tests/css/CSS2/generated-content/WEB_FEATURES.yml b/tests/wpt/tests/css/CSS2/generated-content/WEB_FEATURES.yml new file mode 100644 index 00000000000..ac1cdafecc9 --- /dev/null +++ b/tests/wpt/tests/css/CSS2/generated-content/WEB_FEATURES.yml @@ -0,0 +1,92 @@ +features: +- name: attr-contents + files: + - content-037.xht + - content-038.xht + - content-039.xht + - content-040.xht + - content-041.xht + - content-042.xht + - content-043.xht + - content-046.xht + - content-047.xht + - content-048.xht + - content-049.xht + - content-050.xht + - content-051.xht + - content-052.xht + - content-053.xht + - content-054.xht + - content-056.xht + - content-057.xht + - content-063.xht + - content-065.xht + - content-066.xht + - content-067.xht + - content-068.xht + - content-070.xht + - content-072.xht + - content-073.xht + - content-075.xht + - content-076.xht + - content-077.xht + - content-078.xht + - content-080.xht + - content-081.xht + - content-082.xht + - content-083.xht + - content-085.xht + - content-086.xht + - content-089.xht + - content-090.xht + - content-091.xht + - content-096.xht + - content-097.xht + - content-099.xht + - content-100.xht + - content-103.xht + - content-105.xht + - content-107.xht + - content-108.xht + - content-109.xht + - content-110.xht + - content-111.xht + - content-112.xht + - content-113.xht + - content-114.xht + - content-115.xht + - content-116.xht + - content-117.xht + - content-118.xht + - content-119.xht + - content-121.xht + - content-122.xht + - content-123.xht + - content-126.xht + - content-127.xht + - content-129.xht + - content-130.xht + - content-131.xht + - content-132.xht + - content-135.xht + - content-136.xht + - content-138.xht + - content-140.xht + - content-141.xht + - content-142.xht + - content-143.xht + - content-144.xht + - content-145.xht + - content-146.xht + - content-147.xht + - content-149.xht + - content-150.xht + - content-151.xht + - content-152.xht + - content-153.xht + - content-155.xht + - content-attr-001.xht + - content-attr-002.xht + - content-attr-case-001.html + - content-attr-case-002.xht + - other-attribute-001.xht diff --git a/tests/wpt/tests/css/compositing/mix-blend-mode/mix-blend-mode-both-parent-and-blended-with-3D-transform.html b/tests/wpt/tests/css/compositing/mix-blend-mode/mix-blend-mode-both-parent-and-blended-with-3D-transform.html index 59fca74f840..f634dd7fd99 100644 --- a/tests/wpt/tests/css/compositing/mix-blend-mode/mix-blend-mode-both-parent-and-blended-with-3D-transform.html +++ b/tests/wpt/tests/css/compositing/mix-blend-mode/mix-blend-mode-both-parent-and-blended-with-3D-transform.html @@ -8,7 +8,7 @@ - + + +
+
+
+
+
+
+ + diff --git a/tests/wpt/tests/css/css-anchor-position/reference/anchor-scroll-to-sticky-004-ref.html b/tests/wpt/tests/css/css-anchor-position/reference/anchor-scroll-to-sticky-004-ref.html index d97b4ffc145..3b814d32ad0 100644 --- a/tests/wpt/tests/css/css-anchor-position/reference/anchor-scroll-to-sticky-004-ref.html +++ b/tests/wpt/tests/css/css-anchor-position/reference/anchor-scroll-to-sticky-004-ref.html @@ -16,6 +16,7 @@ div { #anchor { height: 20px; background: orange; + position: relative; } #anchored { @@ -27,12 +28,12 @@ div { +
-
diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-invalid.html b/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-invalid.html index 192b392d02c..78468f83f32 100644 --- a/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-invalid.html +++ b/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-invalid.html @@ -30,6 +30,26 @@ test_invalid_value("grid-template-rows", '-10px repeat(auto-fit, auto)'); test_invalid_value("grid-template-rows", '-10px repeat(auto-fill, min-content)'); test_invalid_value("grid-template-rows", '-20% repeat(auto-fit, max-content)'); test_invalid_value("grid-template-rows", 'repeat(auto-fill, fit-content)'); +test_invalid_value("grid-template-rows", 'auto repeat(auto-fill, auto) auto'); +test_invalid_value("grid-template-rows", 'min-content repeat(auto-fill, auto) min-content'); +test_invalid_value("grid-template-rows", 'max-content repeat(auto-fill, auto) max-content'); +test_invalid_value("grid-template-rows", 'fit-content(200px) repeat(auto-fill, auto) fit-content(200px)'); +test_invalid_value("grid-template-rows", 'auto repeat(auto-fill, auto) repeat(5, auto)'); +test_invalid_value("grid-template-rows", 'auto repeat(auto-fill, min-content) auto'); +test_invalid_value("grid-template-rows", 'min-content repeat(auto-fill, min-content) min-content'); +test_invalid_value("grid-template-rows", 'max-content repeat(auto-fill, min-content) max-content'); +test_invalid_value("grid-template-rows", 'fit-content(200px) repeat(auto-fill, min-content) fit-content(200px)'); +test_invalid_value("grid-template-rows", 'min-content repeat(auto-fill, min-content) repeat(5, min-content)'); +test_invalid_value("grid-template-rows", 'auto repeat(auto-fill, max-content) auto'); +test_invalid_value("grid-template-rows", 'min-content repeat(auto-fill, max-content) min-content'); +test_invalid_value("grid-template-rows", 'max-content repeat(auto-fill, max-content) max-content'); +test_invalid_value("grid-template-rows", 'fit-content(200px) repeat(auto-fill, max-content) fit-content(200px)'); +test_invalid_value("grid-template-rows", 'max-content repeat(auto-fill, max-content) repeat(5, max-content)'); +test_invalid_value("grid-template-rows", 'auto repeat(auto-fill, fit-content(200px)) auto'); +test_invalid_value("grid-template-rows", 'min-content repeat(auto-fill, fit-content(200px)) min-content'); +test_invalid_value("grid-template-rows", 'max-content repeat(auto-fill, fit-content(200px)) max-content'); +test_invalid_value("grid-template-rows", 'fit-content(200px) repeat(auto-fill, fit-content(200px)) fit-content(200px)'); +test_invalid_value("grid-template-rows", 'fit-content(200px) repeat(auto-fill, fit-content(200px)) repeat(5, fit-content(200px))'); diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-repeat-intrinsic-valid.tentative.html b/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-repeat-intrinsic-valid.tentative.html index a3975eb4007..32f8df97970 100644 --- a/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-repeat-intrinsic-valid.tentative.html +++ b/tests/wpt/tests/css/css-grid/parsing/grid-template-rows-repeat-intrinsic-valid.tentative.html @@ -28,12 +28,10 @@ test_valid_value("grid-template-rows", 'repeat(auto-fit, max-content 100px max-c test_valid_value("grid-template-rows", 'repeat(auto-fill, minmax(30px, 5fr) [two] max-content)'); test_valid_value("grid-template-rows", 'repeat(auto-fit, [three] max-content [four])'); - test_valid_value("grid-template-rows", 'repeat(auto-fill, fit-content(200px))'); test_valid_value("grid-template-rows", 'repeat(auto-fit, fit-content(200px) 100px fit-content(200px))'); test_valid_value("grid-template-rows", 'repeat(auto-fill, minmax(30px, 5fr) [two] fit-content(200px))'); test_valid_value("grid-template-rows", 'repeat(auto-fit, [three] fit-content(200px) [four])'); - diff --git a/tests/wpt/tests/css/css-highlight-api/crashtests/highlight-first-letter-float-crash.html b/tests/wpt/tests/css/css-highlight-api/crashtests/highlight-first-letter-float-crash.html new file mode 100644 index 00000000000..ea374295496 --- /dev/null +++ b/tests/wpt/tests/css/css-highlight-api/crashtests/highlight-first-letter-float-crash.html @@ -0,0 +1,18 @@ + + + +
abc
+ diff --git a/tests/wpt/tests/css/css-masking/clip/clip-not-absolute-positioned-003.html b/tests/wpt/tests/css/css-masking/clip/clip-not-absolute-positioned-003.html index ee3765db7ac..f6842c50edf 100644 --- a/tests/wpt/tests/css/css-masking/clip/clip-not-absolute-positioned-003.html +++ b/tests/wpt/tests/css/css-masking/clip/clip-not-absolute-positioned-003.html @@ -5,15 +5,14 @@ - + -

The test passes if there is a green square with a blue border.

- \ No newline at end of file + diff --git a/tests/wpt/tests/css/css-masking/clip/reference/clip-no-clipping-no-text-ref.html b/tests/wpt/tests/css/css-masking/clip/reference/clip-no-clipping-no-text-ref.html new file mode 100644 index 00000000000..5f23acf9660 --- /dev/null +++ b/tests/wpt/tests/css/css-masking/clip/reference/clip-no-clipping-no-text-ref.html @@ -0,0 +1,10 @@ + + + + CSS Reftest Reference + + + +
+ + diff --git a/tests/wpt/tests/css/css-mixins/cssom.tentative.html b/tests/wpt/tests/css/css-mixins/cssom.tentative.html new file mode 100644 index 00000000000..945e25079b5 --- /dev/null +++ b/tests/wpt/tests/css/css-mixins/cssom.tentative.html @@ -0,0 +1,71 @@ + + + + CSS Mixins: CSSOM support + + + + + + +
+ + + diff --git a/tests/wpt/tests/css/css-mixins/invalid-at-top-level.html b/tests/wpt/tests/css/css-mixins/invalid-at-top-level.html new file mode 100644 index 00000000000..87296527bd9 --- /dev/null +++ b/tests/wpt/tests/css/css-mixins/invalid-at-top-level.html @@ -0,0 +1,29 @@ + + + + CSS Mixins: @apply is invalid at top level + + + + + + +
This text should be green.
+ + + diff --git a/tests/wpt/tests/css/css-mixins/invalidation.tentative.html b/tests/wpt/tests/css/css-mixins/invalidation.tentative.html new file mode 100644 index 00000000000..d70fb29d447 --- /dev/null +++ b/tests/wpt/tests/css/css-mixins/invalidation.tentative.html @@ -0,0 +1,86 @@ + + + + CSS Mixins: Invalidation after CSSOM changes + + + + + + + + +
Some text.
+
Some text.
+
Some text.
+ + + diff --git a/tests/wpt/tests/css/css-mixins/media-queries.html b/tests/wpt/tests/css/css-mixins/media-queries.html new file mode 100644 index 00000000000..239b9ed61c7 --- /dev/null +++ b/tests/wpt/tests/css/css-mixins/media-queries.html @@ -0,0 +1,44 @@ + + + CSS Mixins: Media Queries and invalidation + + + + + + + + + diff --git a/tests/wpt/tests/css/css-multicol/animation/column-wrap-reset-interpolation.html b/tests/wpt/tests/css/css-multicol/animation/column-wrap-reset-interpolation.html new file mode 100644 index 00000000000..8acbef8adde --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/animation/column-wrap-reset-interpolation.html @@ -0,0 +1,40 @@ + +Test that 'column-wrap' is part of the 'columns' shorthand for animations + + + + + + +
+
+
+ diff --git a/tests/wpt/tests/css/css-multicol/animation/columns-interpolation.html b/tests/wpt/tests/css/css-multicol/animation/columns-interpolation.html new file mode 100644 index 00000000000..869210f8fcd --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/animation/columns-interpolation.html @@ -0,0 +1,136 @@ + +columns shorthand interpolation + + + + + + + + + diff --git a/tests/wpt/tests/css/css-multicol/animation/discrete-no-interpolation.html b/tests/wpt/tests/css/css-multicol/animation/discrete-no-interpolation.html index 6572fd503fd..bfb97cd3087 100644 --- a/tests/wpt/tests/css/css-multicol/animation/discrete-no-interpolation.html +++ b/tests/wpt/tests/css/css-multicol/animation/discrete-no-interpolation.html @@ -24,4 +24,10 @@ test_no_interpolation({ from: 'initial', to: 'all' }); + +test_no_interpolation({ + property: 'column-wrap', + from: 'wrap', + to: 'nowrap' +}); diff --git a/tests/wpt/tests/css/css-multicol/columns-shorthand-reset-wrap.html b/tests/wpt/tests/css/css-multicol/columns-shorthand-reset-wrap.html new file mode 100644 index 00000000000..0daa569516a --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/columns-shorthand-reset-wrap.html @@ -0,0 +1,47 @@ + +Test that 'column-wrap' is reset by the 'columns' shorthand + + + + + + +
+
+
+ diff --git a/tests/wpt/tests/css/css-multicol/multicol-on-broken-image-alt-text.html b/tests/wpt/tests/css/css-multicol/multicol-on-broken-image-alt-text.html new file mode 100644 index 00000000000..46e8423b3f2 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/multicol-on-broken-image-alt-text.html @@ -0,0 +1,26 @@ + + + + + + +

Test passes if there is a filled green square and no red.

+
+
+ XXXXX XXXXX XXXXX XXXXX XXXXX +
diff --git a/tests/wpt/tests/css/css-multicol/parsing/columns-computed.html b/tests/wpt/tests/css/css-multicol/parsing/columns-computed.html new file mode 100644 index 00000000000..e67cdd00ed3 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/parsing/columns-computed.html @@ -0,0 +1,46 @@ + +CSS Multi-column Layout: getComputedStyle().columns + + + + + + +
+ + diff --git a/tests/wpt/tests/css/css-multicol/parsing/columns-invalid.html b/tests/wpt/tests/css/css-multicol/parsing/columns-invalid.html index dc9b27bf375..f6bb3982900 100644 --- a/tests/wpt/tests/css/css-multicol/parsing/columns-invalid.html +++ b/tests/wpt/tests/css/css-multicol/parsing/columns-invalid.html @@ -4,7 +4,8 @@ CSS Multi-column Layout: parsing columns with invalid values - + + @@ -27,6 +28,17 @@ test_invalid_value("columns", "auto auto auto"); test_invalid_value("columns", "10em auto auto"); test_invalid_value("columns", "initial initial"); test_invalid_value("columns", "inherit inherit"); + +// With "/ <'column-height'>" +test_invalid_value("columns", "/ 100px"); +test_invalid_value("columns", "/ auto"); +test_invalid_value("columns", "/"); +test_invalid_value("columns", "auto /"); +test_invalid_value("columns", "100px /"); +test_invalid_value("columns", "2 /"); +test_invalid_value("columns", "2 100px /"); +test_invalid_value("columns", "100px 2 /"); + diff --git a/tests/wpt/tests/css/css-multicol/parsing/columns-valid.html b/tests/wpt/tests/css/css-multicol/parsing/columns-valid.html index 7b643e2d9a3..4dd8895dbee 100644 --- a/tests/wpt/tests/css/css-multicol/parsing/columns-valid.html +++ b/tests/wpt/tests/css/css-multicol/parsing/columns-valid.html @@ -4,7 +4,8 @@ CSS Multi-column Layout: parsing columns with valid values - + + @@ -27,6 +28,17 @@ test_valid_value("columns", "0 1", "0px 1"); test_valid_value("columns", "1 0", "0px 1"); test_valid_value("columns", "0px 1"); +// With "/ <'column-height'>" +test_valid_value("columns", "10px 2 / 100px"); +test_valid_value("columns", "2 10px / 100px", "10px 2 / 100px"); +test_valid_value("columns", "10px / 100px"); +test_valid_value("columns", "auto / 100px"); +test_valid_value("columns", "10px 2 / auto", "10px 2"); +test_valid_value("columns", "2 10px / auto", "10px 2"); +test_valid_value("columns", "10px / auto", "10px"); +test_valid_value("columns", "2 / auto", "2"); +test_valid_value("columns", "auto / auto", "auto"); + // CSS-wide keywords. test_valid_value("columns", "initial"); test_valid_value("columns", "inherit"); diff --git a/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-001.html b/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-001.html index 1b58803079f..47531c7c8d8 100644 --- a/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-001.html +++ b/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-001.html @@ -1,4 +1,5 @@ + CSS Overflow Test: Test the text in an input is not clipped and reachable @@ -23,6 +24,8 @@ input { width (160px) to reproduce this bug. --> - diff --git a/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-002.html b/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-002.html index 3efebf0b90d..3cb9756dfad 100644 --- a/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-002.html +++ b/tests/wpt/tests/css/css-overflow/scrollable-overflow-input-002.html @@ -1,4 +1,5 @@ + CSS Overflow Test: Test the text in an input is not clipped and reachable @@ -24,6 +25,8 @@ input { width (160px) to reproduce this bug. --> - diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html index 73c10dc7b3f..129eb2c0859 100644 --- a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html +++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html @@ -1,7 +1,6 @@ - CSS Overflow: test scrollbar-gutter with horizontal left to right content diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html index 598cfdf3664..9e5dcd299eb 100644 --- a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html +++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html @@ -1,7 +1,6 @@ - CSS Overflow: test scrollbar-gutter with vertical left to right content diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html index 398751845cf..d68d4e5d3cb 100644 --- a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html +++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html @@ -1,7 +1,6 @@ - CSS Overflow: test scrollbar-gutter with vertical right to left content diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html index 75c2d67259e..359ec2fd337 100644 --- a/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html +++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html @@ -1,7 +1,6 @@ - diff --git a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/reference/shape-outside-linear-gradient-horizontal-rtl-ref.html b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/reference/shape-outside-linear-gradient-horizontal-rtl-ref.html new file mode 100644 index 00000000000..a5750089015 --- /dev/null +++ b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/reference/shape-outside-linear-gradient-horizontal-rtl-ref.html @@ -0,0 +1,33 @@ + + + + CSS Reference File + + + + +

+ The test passes if you see a green square. There should be no red. +

+
+
+
+
+ + diff --git a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-005.html b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-005.html index 6d0fc21361b..2f6823ac6db 100644 --- a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-005.html +++ b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-005.html @@ -7,6 +7,7 @@ + diff --git a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-006.html b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-006.html index 68243e0ab8f..e0a180d6877 100644 --- a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-006.html +++ b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-006.html @@ -7,6 +7,7 @@ + diff --git a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-007.html b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-007.html index 4ef0b6b5dfe..1eca566a0b4 100644 --- a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-007.html +++ b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-007.html @@ -7,6 +7,7 @@ + diff --git a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-009.html b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-009.html index 50c80d0ac76..e3ebf3c29d6 100644 --- a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-009.html +++ b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-009.html @@ -7,6 +7,7 @@ + diff --git a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-010.html b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-010.html index 1e245cb285c..ca24c1a0147 100644 --- a/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-010.html +++ b/tests/wpt/tests/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-010.html @@ -9,6 +9,7 @@ + + + +

+ The test passes if you see a green square. There should be no red. +

+
+
+ x x x x +
+
+
+ x x x x +
+ + diff --git a/tests/wpt/tests/css/css-shapes/shape-outside/supported-shapes/circle/shape-outside-circle-052.html b/tests/wpt/tests/css/css-shapes/shape-outside/supported-shapes/circle/shape-outside-circle-052.html index d8c462a563d..d9242d7a118 100644 --- a/tests/wpt/tests/css/css-shapes/shape-outside/supported-shapes/circle/shape-outside-circle-052.html +++ b/tests/wpt/tests/css/css-shapes/shape-outside/supported-shapes/circle/shape-outside-circle-052.html @@ -9,6 +9,7 @@ + diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html index d3891e01ac4..8f6c693abeb 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-008-ref.html @@ -9,7 +9,7 @@

Test passes if "◉" is above every single character of "Text sample"

-
+
Text sample.
diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html index 3eef63f5a87..d4ca0620d17 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-010-ref.html @@ -7,7 +7,7 @@ diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html index 868fa39906f..49d07e18ab4 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-012-ref.html @@ -6,7 +6,7 @@ diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html index d09acdf64b9..1b50e7be2cb 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-021-ref.html @@ -7,7 +7,7 @@ diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht index 39be9c25697..1fe1e743d48 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-filled-001-ref.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht index de908e0cd85..4ea6345ab0e 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-open-001-ref.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht index 41e53b93df2..b53c6aaa90e 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-shape-001-ref.xht @@ -9,7 +9,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht index e24c86abeb1..57392a0193f 100644 --- a/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht +++ b/tests/wpt/tests/css/css-text-decor/reference/text-emphasis-style-string-001-ref.xht @@ -8,7 +8,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } ]]> diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-color-001.xht b/tests/wpt/tests/css/css-text-decor/text-emphasis-color-001.xht index 344200f2bbe..4513a225896 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-color-001.xht +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-color-001.xht @@ -20,7 +20,7 @@ .parent { border: solid 1px gray; - font: 1.5em monospace; + font: 1.5em/2 monospace; width: 10em; } .ref1 rt diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001-ref.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001-ref.html index 6f02e05bdd9..31fa47f31c3 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001-ref.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001-ref.html @@ -5,6 +5,10 @@ CSS Reference: text-emphasis line height, top - + +

Pass if the emphasis marks are below the black line:

diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001a.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001a.html index ea9589516dc..cfcd45cb019 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001a.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001a.html @@ -8,5 +8,9 @@ + +

Pass if the emphasis marks are below the black line:

試験テスト
diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001b.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001b.html index d6468cb6c9c..e586b73429a 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001b.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001b.html @@ -8,5 +8,9 @@ + +

Pass if the emphasis marks are below the black line:

試験テスト
diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001z.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001z.html index dded6094e35..21530cc8f2b 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001z.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-001z.html @@ -6,9 +6,11 @@ + + +

Pass if the emphasis marks are over the black line:

diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002a.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002a.html index f4a47467a15..43b190723c6 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002a.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002a.html @@ -8,5 +8,9 @@ + +

Pass if the emphasis marks are over the black line:

試験テスト
diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002b.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002b.html index 28a14cf4792..57c7c99b9b1 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002b.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-line-height-002b.html @@ -8,5 +8,9 @@ + +

Pass if the emphasis marks are over the black line:

試験テスト
diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html index 9cfcb247afe..89ff477e82d 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1-ref.html @@ -4,7 +4,7 @@ diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1.html index e34e66007f7..8e93220ea76 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-1.html @@ -7,7 +7,7 @@

The punctuation should not have emphasis marks:

diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html index 6d824e73d56..60c3bff0f95 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2-ref.html @@ -4,6 +4,7 @@ diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2.html index 53d261e9c8c..890cedca4bb 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-punctuation-2.html @@ -7,6 +7,7 @@ diff --git a/tests/wpt/tests/css/css-text-decor/text-emphasis-style-002.html b/tests/wpt/tests/css/css-text-decor/text-emphasis-style-002.html index 8189df23839..bae119deb5b 100644 --- a/tests/wpt/tests/css/css-text-decor/text-emphasis-style-002.html +++ b/tests/wpt/tests/css/css-text-decor/text-emphasis-style-002.html @@ -8,6 +8,9 @@ + +
+ + diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-001.html b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-001.html index f3026810dd5..b54ad1efbde 100644 --- a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-001.html +++ b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-001.html @@ -4,6 +4,7 @@ + diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-002.html b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-002.html index d9440e4b299..344c3078515 100644 --- a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-002.html +++ b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-002.html @@ -4,6 +4,7 @@ + diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-003.html b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-003.html index aaaea9bd0fe..9274588c7eb 100644 --- a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-003.html +++ b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-003.html @@ -4,6 +4,7 @@ + diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-004.html b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-004.html index 9ccf09b6fb4..7a183c5279f 100644 --- a/tests/wpt/tests/css/css-writing-modes/table-cell-valign-004.html +++ b/tests/wpt/tests/css/css-writing-modes/table-cell-valign-004.html @@ -4,6 +4,7 @@ + diff --git a/tests/wpt/tests/css/css-writing-modes/text-combine-upright-sideways-001.html b/tests/wpt/tests/css/css-writing-modes/text-combine-upright-sideways-001.html index 8fa22a7df8b..20417d9d515 100644 --- a/tests/wpt/tests/css/css-writing-modes/text-combine-upright-sideways-001.html +++ b/tests/wpt/tests/css/css-writing-modes/text-combine-upright-sideways-001.html @@ -4,6 +4,7 @@ + + + + + + +

Test passes if the left edge of an blue square is vertically aligned with the right edge of a orange square.

+ +
+ Image download support must be enabled
Image download support must be enabled +
+ + + diff --git a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-029.xht b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-029.xht index f14078f6c62..d2e523404ba 100644 --- a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-029.xht +++ b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-029.xht @@ -7,7 +7,7 @@ - + @@ -33,7 +31,7 @@ -

Test passes if the left edge of an blue square is aligned with the right edge of a orange square.

+

Test passes if the left edge of an blue square is vertically aligned with the right edge of a orange square.

AO
diff --git a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031-ref.xht b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031-ref.xht new file mode 100644 index 00000000000..d46cde2af2d --- /dev/null +++ b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031-ref.xht @@ -0,0 +1,37 @@ + + + + CSS Reftest Reference + + + + + + + + + +

Test passes if the right edge of an irregular orange polygon is straight and unbroken.

+ +
+ Image download support must be enabled
Image download support must be enabled +
+ + + diff --git a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031.xht b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031.xht index e578a7177e7..360be5f4e1e 100644 --- a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031.xht +++ b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-031.xht @@ -7,7 +7,7 @@ - + + + + + + +

Test passes if the left edge of an irregular orange polygon is straight and unbroken.

+ +
+ Image download support must be enabled
Image download support must be enabled +
+ + + diff --git a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-033.xht b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-033.xht index a832bb960e0..94c5db95a84 100644 --- a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-033.xht +++ b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-033.xht @@ -7,7 +7,7 @@ - + + + + + + +

Test passes if the right edge of an blue square is vertically aligned with the left edge of a orange square.

+ +
+ Image download support must be enabled
Image download support must be enabled +
+ + + diff --git a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-035.xht b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-035.xht index e6a7f2378a7..ea64c4aed9e 100644 --- a/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-035.xht +++ b/tests/wpt/tests/css/css-writing-modes/vertical-alignment-slr-035.xht @@ -7,7 +7,7 @@ - + @@ -32,7 +30,7 @@ -

Test passes if the right edge of an blue square is aligned with the left edge of a orange square.

+

Test passes if the right edge of an blue square is vertically aligned with the left edge of a orange square.

AO
diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-inline-positioning.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-inline-positioning.html new file mode 100644 index 00000000000..e881e67dbcc --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-inline-positioning.html @@ -0,0 +1,36 @@ + + +backdrop-filter positioning for inline elements + + + + + + +
+

Expected: Orange background with inline elements showing inverted blue areas where backdrop-filter is applied.

+
+
+ 1 +
+
+ 2 +
+
+ AB3 +
+
4
+ diff --git a/tests/wpt/tests/css/filter-effects/reference/backdrop-filter-inline-positioning-ref.html b/tests/wpt/tests/css/filter-effects/reference/backdrop-filter-inline-positioning-ref.html new file mode 100644 index 00000000000..167d47eed8a --- /dev/null +++ b/tests/wpt/tests/css/filter-effects/reference/backdrop-filter-inline-positioning-ref.html @@ -0,0 +1,33 @@ + + +backdrop-filter positioning for inline elements - Reference + + + +
+

Expected: Orange background with inline elements showing inverted blue areas where backdrop-filter is applied.

+
+
+ 1 +
+
+ 2 +
+
+ AB3 +
+
4
+ diff --git a/tests/wpt/tests/css/filter-effects/svg-empty-element-with-filter-001.html b/tests/wpt/tests/css/filter-effects/svg-empty-element-with-filter-001.html index 9c441b748b1..b1e70ad990e 100644 --- a/tests/wpt/tests/css/filter-effects/svg-empty-element-with-filter-001.html +++ b/tests/wpt/tests/css/filter-effects/svg-empty-element-with-filter-001.html @@ -1,15 +1,34 @@ -CSS Filter Effects: ref filters on a empty svg shape +CSS Filter Effects: ref filters on empty SVG shapes - - + + + + - + - + + + + + + + + + + + + + + + diff --git a/tests/wpt/tests/css/selectors/has-focus-display-change.html b/tests/wpt/tests/css/selectors/has-focus-display-change.html new file mode 100644 index 00000000000..2084a270154 --- /dev/null +++ b/tests/wpt/tests/css/selectors/has-focus-display-change.html @@ -0,0 +1,44 @@ + + +:has(:focus) doesn't cause focusability to be lost + + + + + + + + + + +
+ + +
+ diff --git a/tests/wpt/tests/css/selectors/heading.html b/tests/wpt/tests/css/selectors/heading.html index 70afef0c4a6..d0eefa30320 100644 --- a/tests/wpt/tests/css/selectors/heading.html +++ b/tests/wpt/tests/css/selectors/heading.html @@ -33,17 +33,8 @@ const tests = [ {args: ['8'], match: []}, {args: ['9'], match: []}, {args: ['0'], match: []}, - {args: ['-1'], match: []}, {args: ['0', '1', '2'], match: [1, 2]}, {args: ['6', '7'], match: [6]}, - {args: ['n'], match: [1, 2, 3, 4, 5, 6]}, - {args: ['2n'], match: [2, 4, 6]}, - {args: ['2n+1'], match: [1, 3, 5]}, - {args: ['2n+2'], match: [2, 4, 6]}, - {args: ['-n+3'], match: [1, 2, 3]}, - {args: ['2n', '3n'], match: [2, 3, 4, 6]}, - {args: ['even'], match: [2, 4, 6]}, - {args: ['odd'], match: [1, 3, 5]}, ]; for (const el of els) { const testName = el.outerHTML + (el.parentNode === document.body ? '' : ' in ' + el.parentNode.localName); diff --git a/tests/wpt/tests/css/selectors/parsing/parse-heading.html b/tests/wpt/tests/css/selectors/parsing/parse-heading.html new file mode 100644 index 00000000000..1429dfb8a30 --- /dev/null +++ b/tests/wpt/tests/css/selectors/parsing/parse-heading.html @@ -0,0 +1,34 @@ + + +CSS Selectors: The heading pseudo-classes + + + + + diff --git a/tests/wpt/tests/device-bound-session-credentials/allowed-refresh-initiators.https.html b/tests/wpt/tests/device-bound-session-credentials/allowed-refresh-initiators.https.html index bef2d55c906..2a73c1743b4 100644 --- a/tests/wpt/tests/device-bound-session-credentials/allowed-refresh-initiators.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/allowed-refresh-initiators.https.html @@ -42,7 +42,7 @@ const expectedCookieAndAttributes = `${expectedCookieAndValue};${expectedCookieAttributes}`; addCookieAndSessionCleanup(t); - configureServer({ allowedRefreshInitiators: [get_host_info().NOTSAMESITE_HOST], + await configureServer({ allowedRefreshInitiators: [get_host_info().NOTSAMESITE_HOST], cookieDetails: [ {attributes: expectedCookieAttributes} ], }); diff --git a/tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html b/tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html index cdbfa670459..289395497f9 100644 --- a/tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html @@ -18,7 +18,7 @@ addCookieAndSessionCleanup(t); // Configure server to set the session credentials and the associated Set-Cookie header. - configureServer({ cookieDetails: [{ attributes: expectedAttributes }] }); + await configureServer({ cookieDetails: [{ attributes: expectedAttributes }] }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); diff --git a/tests/wpt/tests/device-bound-session-credentials/debug-header.https.html b/tests/wpt/tests/device-bound-session-credentials/debug-header.https.html index b3e09e7fe09..99d4416b0c8 100644 --- a/tests/wpt/tests/device-bound-session-credentials/debug-header.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/debug-header.https.html @@ -20,7 +20,7 @@ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true); // Configure server to fail to refresh - configureServer({ refreshEndpointUnavailable: true }); + await configureServer({ refreshEndpointUnavailable: true }); // Expire the cookie. The server will attempt a refresh, but fail. expireCookie(expectedCookieAndAttributes); @@ -47,7 +47,7 @@ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true); // Configure server to fail to refresh - configureServer({ refreshEndpointUnavailable: true }); + await configureServer({ refreshEndpointUnavailable: true }); // Expire the cookie. The server will attempt a refresh, but fail. expireCookie(expectedCookieAndAttributes); @@ -85,7 +85,7 @@ addCookieAndSessionCleanup(t); // Configure server to configure cookies for next two created sessions. - configureServer({ + await configureServer({ cookieDetailsForNextRegisteredSessions: [[{ nameAndValue: expectedCookieAndValue1 }], [{ nameAndValue: expectedCookieAndValue2 }]] }); @@ -96,7 +96,7 @@ await waitForCookie(expectedCookieAndValue2, /*expectCookie=*/true); // Configure server to fail to refresh - configureServer({ refreshEndpointUnavailable: true }); + await configureServer({ refreshEndpointUnavailable: true }); // Expire the cookie. The server will attempt a refresh, but fail. expireCookie(expectedCookieAndAttributes1); diff --git a/tests/wpt/tests/device-bound-session-credentials/include-site.https.html b/tests/wpt/tests/device-bound-session-credentials/include-site.https.html index 3441acfc625..6f5d1217bc2 100644 --- a/tests/wpt/tests/device-bound-session-credentials/include-site.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/include-site.https.html @@ -13,7 +13,7 @@ const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${location.hostname};Path=/device-bound-session-credentials`; addCookieAndSessionCleanup(t); - configureServer({ includeSite }); + await configureServer({ includeSite }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); diff --git a/tests/wpt/tests/device-bound-session-credentials/login.py b/tests/wpt/tests/device-bound-session-credentials/login.py index 1d811fbaaa1..8c77d31ed47 100644 --- a/tests/wpt/tests/device-bound-session-credentials/login.py +++ b/tests/wpt/tests/device-bound-session-credentials/login.py @@ -28,8 +28,18 @@ def main(request, response): for i in range(num_sessions): registrations.append(('Sec-Session-Registration', f'(RS256);challenge="login_challenge_value";path="{registration_url}"{authorization_header}')) + headers = [] + if request.headers.get(b"origin") is not None: + # Some tests (e.g. subdomain-registration.https.html) login + # across origins. Allow cookies so that we can get the + # session_manager for the request. + headers = [ + ("Access-Control-Allow-Origin", request.headers.get(b"origin")), + ("Access-Control-Allow-Credentials", "true"), + ] + if use_single_header: combined_registrations = [("Sec-Session-Registration", ", ".join([registration[1] for registration in registrations]))] - return (200, combined_registrations, "") + return (200, headers + combined_registrations, "") else: - return (200, registrations, "") + return (200, headers + registrations, "") diff --git a/tests/wpt/tests/device-bound-session-credentials/multiple-credentials.https.html b/tests/wpt/tests/device-bound-session-credentials/multiple-credentials.https.html index 54fc182b727..e3493081a45 100644 --- a/tests/wpt/tests/device-bound-session-credentials/multiple-credentials.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/multiple-credentials.https.html @@ -18,7 +18,7 @@ addCookieAndSessionCleanup(t); // Configure server to set two cookies in the session instruction credentials. - configureServer({ cookieDetails: [ + await configureServer({ cookieDetails: [ { nameAndValue: expectedCookieAndValue2, attributes: expectedAttributes2 }, { nameAndValue: expectedCookieAndValue1, attributes: expectedAttributes1 }, ]}); diff --git a/tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html b/tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html index fb0ce500aa4..ccc1c49b35a 100644 --- a/tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html @@ -16,7 +16,7 @@ addCookieAndSessionCleanup(t); // Configure server to configure cookies for next two created sessions. - configureServer({ + await configureServer({ cookieDetailsForNextRegisteredSessions: [[{ nameAndValue: expectedCookieAndValue1 }], [{ nameAndValue: expectedCookieAndValue2 }]] }); diff --git a/tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html b/tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html index a53245c590b..886b67358fe 100644 --- a/tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html @@ -14,7 +14,7 @@ addCookieAndSessionCleanup(t); // Configure server to avoid sending back a challenge during refresh. - configureServer({ refreshSendsChallenge: false }); + await configureServer({ refreshSendsChallenge: false }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); diff --git a/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html b/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html index 74264888075..342269836b0 100644 --- a/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html @@ -31,7 +31,7 @@ assert_equals(alternateAuthResponse.status, 401); // Configure server to change the cookie in the session config on next refresh. - configureServer({ cookieDetails: [{ nameAndValue: expectedCookieAndValue2 }] }); + await configureServer({ cookieDetails: [{ nameAndValue: expectedCookieAndValue2 }] }); // Expire the first cookie and send a request, which triggers the refresh with the new session config. expireCookie(expectedCookieAndAttributes1); @@ -76,7 +76,7 @@ assert_equals(authResponse.status, 200); // Configure server to change the session identifier in the session config on next refresh. - configureServer({ responseSessionIdOverride: 12345 }); + await configureServer({ responseSessionIdOverride: 12345 }); // Expire the first cookie and send a request, which triggers the refresh with the new session config. expireCookie(expectedCookieAndAttributes); diff --git a/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html b/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html index 1953af5c0d2..bb4cbd08d33 100644 --- a/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html @@ -14,7 +14,7 @@ addCookieAndSessionCleanup(t); // Configure server to end the session upon refresh. - configureServer({ shouldRefreshEndSession: true }); + await configureServer({ shouldRefreshEndSession: true }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); diff --git a/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html b/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html index ab8d033afac..525a45598be 100644 --- a/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html @@ -14,7 +14,7 @@ addCookieAndSessionCleanup(t); // Configure server to send back a challenge during registration. - configureServer({ registrationSendsChallenge: true }); + await configureServer({ registrationSendsChallenge: true }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); diff --git a/tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html b/tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html index bb10cf52ee1..e6f635b78d5 100644 --- a/tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html @@ -14,7 +14,7 @@ addCookieAndSessionCleanup(t); // Configure server to use the absolute URL for refresh instead of a relative URL. - configureServer({ refreshUrl }); + await configureServer({ refreshUrl }); // Configure registration to use absolute URL instead of relative. // Prompt starting a session, and wait until registration completes. diff --git a/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html b/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html index 5bf07abcac1..5f9ec211e05 100644 --- a/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html @@ -13,7 +13,7 @@ addCookieAndSessionCleanup(t); // Configure server to set up a session with a cookie that has no attributes. - configureServer({ cookieDetails: [{ attributes: "" }] }); + await configureServer({ cookieDetails: [{ attributes: "" }] }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); diff --git a/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html b/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html index 7e2d8a0819b..30277edaa30 100644 --- a/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html @@ -13,7 +13,7 @@ addCookieAndSessionCleanup(t); // Configure server send back an authorization header for registration. - configureServer({ authorizationValue: "authcode" }); + await configureServer({ authorizationValue: "authcode" }); // Prompt starting a session, and wait until registration completes. // The server will confirm that the authorization is sent in registration. diff --git a/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html b/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html index 22166c86ffe..f39618907ed 100644 --- a/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html @@ -15,7 +15,7 @@ addCookieAndSessionCleanup(t); // Configure server for sending back a challenge early on refresh. - configureServer({ earlyChallengeForNextRegisteredSession: earlyChallengeString }); + await configureServer({ earlyChallengeForNextRegisteredSession: earlyChallengeString }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); @@ -47,7 +47,7 @@ // Configure server for sending back a challenge early. Also configure the session's cookie // for test clarity (not strictly needed). - configureServer({ + await configureServer({ earlyChallengeForNextRegisteredSession: earlyChallenge1, cookieDetailsForNextRegisteredSessions: [[{ nameAndValue: expectedCookieAndValue1 }]] }); @@ -59,7 +59,7 @@ // Configure server for sending back a challenge early, and configure the second session's // cookie. - configureServer({ + await configureServer({ earlyChallengeForNextRegisteredSession: earlyChallenge2, cookieDetailsForNextRegisteredSessions: [[{ nameAndValue: expectedCookieAndValue2 }]] }); diff --git a/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html b/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html index f56778a9e57..f3e68506fb2 100644 --- a/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html @@ -13,7 +13,7 @@ const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${location.hostname};Path=/device-bound-session-credentials`; addCookieAndSessionCleanup(t); - configureServer({ scopeOrigin }); + await configureServer({ scopeOrigin }); // Prompt starting a session, and wait until registration completes. const loginResponse = await fetch('login.py'); diff --git a/tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html b/tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html index 5a36831f6dd..b1d2452b53e 100644 --- a/tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html +++ b/tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html @@ -14,7 +14,7 @@ addCookieAndSessionCleanup(t); // Configure server to set scope specification. - configureServer({ scopeSpecificationItems: [{ + await configureServer({ scopeSpecificationItems: [{ "type": "include", "domain": location.hostname, "path": "/device-bound-session-credentials/excludeInScopeSpecification/excluded_verify_authenticated.py" diff --git a/tests/wpt/tests/device-bound-session-credentials/setup_sharded_server_state.py b/tests/wpt/tests/device-bound-session-credentials/setup_sharded_server_state.py index 57e935ea57e..875ae310bae 100644 --- a/tests/wpt/tests/device-bound-session-credentials/setup_sharded_server_state.py +++ b/tests/wpt/tests/device-bound-session-credentials/setup_sharded_server_state.py @@ -9,13 +9,19 @@ def main(request, response): if test_id is None: test_id = session_manager.initialize_test() - headers = [("Set-Cookie", f"test_id={test_id}")] + # subdomain-registration.https.html does registration on a + # subdomain. Without the Domain attribute, the test_id cookie won't + # be available on the subdomain. + cookie_attributes = f"Domain={request.url_parts.hostname}" + # Cross-site tests (e.g. allowed-refresh-initiators.https.html) require a # SameSite=None cookie, which must also be Secure. But # not-secure-connection.html cannot have a Secure cookie, so we need to make # the attributes conditional on the test. cross_site = request_body.get("crossSite") if cross_site is not None and cross_site: - headers = [("Set-Cookie", f"test_id={test_id};SameSite=None;Secure")] + cookie_attributes += ";SameSite=None;Secure" + + headers = [("Set-Cookie", f"test_id={test_id};{cookie_attributes}")] return (200, headers, "") diff --git a/tests/wpt/tests/device-bound-session-credentials/subdomain-registration.https.html b/tests/wpt/tests/device-bound-session-credentials/subdomain-registration.https.html new file mode 100644 index 00000000000..4836ab9688c --- /dev/null +++ b/tests/wpt/tests/device-bound-session-credentials/subdomain-registration.https.html @@ -0,0 +1,68 @@ + + + + + + + diff --git a/tests/wpt/tests/fedcm/fedcm-authz/fedcm-continue-on-disallowed.https.html b/tests/wpt/tests/fedcm/fedcm-authz/fedcm-continue-on-disallowed.https.html index fcda3a3dd59..5c7bf387510 100644 --- a/tests/wpt/tests/fedcm/fedcm-authz/fedcm-continue-on-disallowed.https.html +++ b/tests/wpt/tests/fedcm/fedcm-authz/fedcm-continue-on-disallowed.https.html @@ -24,7 +24,7 @@ fedcm_test(async t => { options = request_options_with_mediation_required('manifest_with_continue_on.json'); options.mediation = 'silent'; await select_manifest(t, options); - const cred_promise = fedcm_get_and_select_first_account(t, options); + const cred_promise = navigator.credentials.get(options); return promise_rejects_dom(t, 'NetworkError', cred_promise); }, "continue_on with mediation:silent should fail"); diff --git a/tests/wpt/tests/fetch/orb/tentative/script-js-unlabeled-gziped.sub.html b/tests/wpt/tests/fetch/orb/tentative/script-js-unlabeled-gzipped.sub.html similarity index 100% rename from tests/wpt/tests/fetch/orb/tentative/script-js-unlabeled-gziped.sub.html rename to tests/wpt/tests/fetch/orb/tentative/script-js-unlabeled-gzipped.sub.html diff --git a/tests/wpt/tests/fetch/range/general.any.js b/tests/wpt/tests/fetch/range/general.any.js index 64b225a60bd..273e5ec79d1 100644 --- a/tests/wpt/tests/fetch/range/general.any.js +++ b/tests/wpt/tests/fetch/range/general.any.js @@ -88,10 +88,7 @@ promise_test(async () => { }); const response = await fetch(stashTakeURL); - - assert_regexp_match(await response.json(), - /.*\bidentity\b.*/, - `Expect identity accept-encoding if range header is ${JSON.stringify(rangeHeader)}`); + assert_equals(await response.json(), 'identity', `Expect identity accept-encoding if range header is ${JSON.stringify(rangeHeader)}`); } }, `Fetch with range header will be sent with Accept-Encoding: identity`); diff --git a/tests/wpt/tests/html/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html b/tests/wpt/tests/html/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html deleted file mode 100644 index e8c12c784f5..00000000000 --- a/tests/wpt/tests/html/dom/elements/global-attributes/the-anchor-attribute-003.tentative.html +++ /dev/null @@ -1,71 +0,0 @@ - -Tests that ::before, ::after and ::backdrop pseudo elements use originating element's implicit anchor - - - - - - - -
-
-
- - diff --git a/tests/wpt/tests/html/editing/dnd/events/dragdrop-text-elements-input-event-manual.html b/tests/wpt/tests/html/editing/dnd/events/dragdrop-text-elements-input-event-manual.html new file mode 100644 index 00000000000..4c65e663666 --- /dev/null +++ b/tests/wpt/tests/html/editing/dnd/events/dragdrop-text-elements-input-event-manual.html @@ -0,0 +1,277 @@ + + + + HTML5 Drag and Drop: insertFromDrop Input Event Test + + + + + + + + +

insertFromDrop Input Event Test

+

+ Test insertFromDrop input events and their dataTransfer objects + during drag and drop operations. +

+ +
+ +
+

Div to ContentEditable Div

+
Drag this div text
+
+ Drop here (contenteditable) +
+
+ + +
+

Div to Textarea

+
Drag this div text
+ +
+ + +
+

Div to Input

+
Drag this div text
+ +
+ + +
+

Textarea to ContentEditable Div

+ +
+ Drop here (contenteditable) +
+
+ + +
+

Textarea to Textarea

+ + +
+ + +
+

Textarea to Input

+ + +
+ + +
+

Input to Input

+ + +
+ + +
+

Input to Textarea

+ + +
+
+

insertFromDrop Results:

+
+ Perform drag and drop operations above to see PASS/FAIL results... +
+ + diff --git a/tests/wpt/tests/html/editing/editing-0/contenteditable/spellcheck-insertReplacementText-input-event-manual.html b/tests/wpt/tests/html/editing/editing-0/contenteditable/spellcheck-insertReplacementText-input-event-manual.html new file mode 100644 index 00000000000..61736269634 --- /dev/null +++ b/tests/wpt/tests/html/editing/editing-0/contenteditable/spellcheck-insertReplacementText-input-event-manual.html @@ -0,0 +1,209 @@ + + + + + HTML5 Text Replacement: insertReplacementText Input Event Test + + + + + + + + + +

insertReplacementText Input Event Test

+

+ Test insertReplacementText input events and their dataTransfer + objects during text replacement operations. +

+ +
+

Test Instructions:

+
    +
  1. + Spell Check: Type a misspelled word, + right-click and select a correction +
  2. +
+
+ +
+ +
+

Spell Check - ContentEditable Div

+
+ Type "teh" or "recieve" and right-click for corrections +
+
+ +
+

Spell Check - Textarea

+ +
+ +
+

Spell Check - Input

+ +
+
+ +
+

How to test:

+
    +
  • + Spell Check: Type misspelled words like "teh" + or "recieve", right-click and select correction +
  • +
+
+ +

insertReplacementText Results:

+
+ Perform text replacement operations above to see PASS/FAIL + results... +
+ + diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html index 089b0d9300b..83813f90209 100644 --- a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html +++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html @@ -1,6 +1,5 @@ fieldset overflow - + + +
diff --git a/tests/wpt/tests/html/rendering/the-details-element/firefox-bug-1928736-2-crash.html b/tests/wpt/tests/html/rendering/the-details-element/firefox-bug-1928736-2-crash.html new file mode 100644 index 00000000000..d26844eb3f7 --- /dev/null +++ b/tests/wpt/tests/html/rendering/the-details-element/firefox-bug-1928736-2-crash.html @@ -0,0 +1,15 @@ + + + +
+ WrapperFirstLine
+ WrapperSecondLine
+ +
+ This is the summary + These are the details +
+
+
diff --git a/tests/wpt/tests/html/semantics/permission-element/parent-image-mask.tentative.html b/tests/wpt/tests/html/semantics/permission-element/parent-image-mask.tentative.html new file mode 100644 index 00000000000..77fb824f028 --- /dev/null +++ b/tests/wpt/tests/html/semantics/permission-element/parent-image-mask.tentative.html @@ -0,0 +1,43 @@ + + + + + Permission Element: invalid if parent has mask-image + + + + + + + + diff --git a/tests/wpt/tests/html/semantics/permission-element/parent-mask.tentative.html b/tests/wpt/tests/html/semantics/permission-element/parent-mask.tentative.html new file mode 100644 index 00000000000..0dab66b724c --- /dev/null +++ b/tests/wpt/tests/html/semantics/permission-element/parent-mask.tentative.html @@ -0,0 +1,43 @@ + + + + + Permission Element: invalid if parent has mask + + + + + + + + diff --git a/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded-ref.html b/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded-ref.html index 738dc95f8eb..7ac010c0481 100644 --- a/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded-ref.html +++ b/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded-ref.html @@ -3,7 +3,7 @@ diff --git a/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded.tentative.html b/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded.tentative.html index 78bd4f2555a..ae8bf3dbf25 100644 --- a/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded.tentative.html +++ b/tests/wpt/tests/html/semantics/permission-element/quirks-mode-no-height-is-still-bounded.tentative.html @@ -5,7 +5,7 @@ diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/invalid-content-type.any.js b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/invalid-content-type.any.js index d0bb6aa9fb1..3c13906d36d 100644 --- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/invalid-content-type.any.js +++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/invalid-content-type.any.js @@ -13,7 +13,116 @@ const content_types = [ "text/html;+json", "text/html+json+xml", "text/json/json", + + // Control Characters and Whitespace - Invalid Type + "applic\x00ation/vnd.api+json", // NULL in type + "applic\x09ation/vnd.api+json", // TAB in type + "applic\x0Aation/vnd.api+json", // Line Feed in type + "applic\x0Dation/vnd.api+json", // Carriage Return in type + "applic ation/vnd.api+json", // SPACE in type + "applic\x7Fation/vnd.api+json", // DEL in type + "\x01application/vnd.api+json", // SOH at start of type + "application\x1F/vnd.api+json", // Unit Separator at end of type + + // Control Characters and Whitespace - Invalid Subtype + "application/vnd\x00.api+json", // NULL in subtype + "application/vnd\x09.api+json", // TAB in subtype + "application/vnd\x0A.api+json", // Line Feed in subtype + "application/vnd\x0D.api+json", // Carriage Return in subtype + "application/vnd .api+json", // SPACE in subtype + "application/vnd\x7F.api+json", // DEL in subtype + "application/\x01vnd.api+json", // SOH at start of subtype + "application/vnd.api\x1F+json", // Unit Separator before +json + + // Separator Characters - Invalid Type + "applic\"ation/vnd.api+json", // Double quote in type + "applic(ation/vnd.api+json", // Left parenthesis in type + "applic)ation/vnd.api+json", // Right parenthesis in type + "applic,ation/vnd.api+json", // Comma in type + "applic:ation/vnd.api+json", // Colon in type + "applic;ation/vnd.api+json", // Semicolon in type + "application/vnd.api+json", // Right angle bracket in type + "applic=ation/vnd.api+json", // Equals in type + "applic?ation/vnd.api+json", // Question mark in type + "applic@ation/vnd.api+json", // At sign in type + "applic[ation/vnd.api+json", // Left square bracket in type + "applic]ation/vnd.api+json", // Right square bracket in type + "applic{ation/vnd.api+json", // Left curly brace in type + "applic}ation/vnd.api+json", // Right curly brace in type + + // Separator Characters - Invalid Subtype + "application/vnd\"api\"+json", // Double quote in subtype + "application/vnd(api+json", // Left parenthesis in subtype + "application/vnd)api+json", // Right parenthesis in subtype + "application/vnd,api+json", // Comma in subtype + "application/vnd:api+json", // Colon in subtype + "application/vnd;api+json", // Semicolon in subtype + "application/vndapi+json", // Right angle brackets in subtype + "application/vnd=api+json", // Equals in subtype + "application/vnd?api+json", // Question mark in subtype + "application/vnd@api+json", // At sign in subtype + "application/vnd[api+json", // Left square brackets in subtype + "application/vnd]api+json", // Right square brackets in subtype + "application/vnd{api+json", // Left curly brace in subtype + "application/vnd}api+json", // Right curly brace in subtype + + // Non-ASCII Characters - Invalid Type + "aplicación/vnd.api+json", // Latin small letter o with acute + "申请/vnd.api+json", // Chinese characters + "app™lication/vnd.api+json", // Trade mark sign + "appli€cation/vnd.api+json", // Euro sign + "🚀application/vnd.api+json", // Rocket emoji + "applicatioñ/vnd.api+json", // Latin small letter n with tilde + + // Non-ASCII Characters - Invalid Subtype + "application/vñd.api+json", // Latin small letter n with tilde + "application/vnd.apí+json", // Latin small letter i with acute + "application/vnd.api™+json", // Trade mark sign + "application/vnd.api€+json", // Euro sign + "application/vnd.中文+json", // Chinese characters + "application/vnd.api🚀+json", // Rocket emoji + "application/café.api+json", // Latin small letter e with acute + + // Mixed Invalid Characters (Both Type and Subtype) + "applic ation/vnd api+json", // Spaces in both + "applic\"ation/vnd\"api+json", // Quotes in both + "applic(ation/vnd(api+json", // Left parentheses in both + "applic)ation/vnd)api+json", // Right parentheses in both + "applic,ation/vnd,api+json", // Commas in both + "applic=ation/vnd=api+json", // Equals in both + "申请/中文.api+json", // Chinese in both + "app™/vnd€.api+json", // Unicode symbols in both + "applic\x00ation/vnd\x00api+json", // NULL in both + "applic;ation/vnd;api+json", // Semicolons in both + "applic{ation/vnd{api+json", // Left curly brace in both + "applic}ation/vnd}api+json", // Right curly brace in both + "applic[ation/vnd[api+json", // Left square bracket in both + "applic]ation/vnd]api+json", // Right square bracket in both + "application/vnd>api+json", // Right angle bracket in both + + // Edge Cases - Type + "\"application/vnd.api+json", // Quote at start of type + "application\"/vnd.api+json", // Quote at end of type + "application /vnd.api+json", // Trailing space in type + "/vnd.api+json", // Empty type + "app\x00lication/vnd.api+json", // NULL in middle of type + + // Edge Cases - Subtype + "application/\"vnd.api+json", // Quote at start of subtype + "application/vnd.api\"+json", // Quote before +json + "application/ vnd.api+json", // Leading space in subtype + "application/vnd.api +json", // Space before +json + "application/vnd.api+json\"", // Quote at end + + // Edge Cases - Multiple Invalid Positions + "\"application\"/\"vnd.api\"+json", // Quotes in multiple positions + "app(lic)ation/vnd(api)+json", // Parentheses in multiple positions + "application\x00/\x00vnd.api+json", // NULL in both parts ]; + for (const content_type of content_types) { promise_test(async test => { await promise_rejects_js(test, TypeError, diff --git a/tests/wpt/tests/html/semantics/the-button-element/command-and-commandfor/event-dispatch-shadow.html b/tests/wpt/tests/html/semantics/the-button-element/command-and-commandfor/event-dispatch-shadow.html index 7b15123412c..6578d940bda 100644 --- a/tests/wpt/tests/html/semantics/the-button-element/command-and-commandfor/event-dispatch-shadow.html +++ b/tests/wpt/tests/html/semantics/the-button-element/command-and-commandfor/event-dispatch-shadow.html @@ -5,7 +5,7 @@ - + + \ No newline at end of file diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-event-handler.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-event-handler.sub.html deleted file mode 100644 index 346660511ee..00000000000 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-event-handler.sub.html +++ /dev/null @@ -1,25 +0,0 @@ - - - -Speculative parsing, document.write(): script-src-event-handler - - - - - diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-nomodule.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-nomodule.tentative.sub.html similarity index 100% rename from tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-nomodule.sub.html rename to tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-nomodule.tentative.sub.html diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-language.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-language.sub.html deleted file mode 100644 index e418c0e1edd..00000000000 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-language.sub.html +++ /dev/null @@ -1,25 +0,0 @@ - - - -Speculative parsing, document.write(): script-src-unsupported-language - - - - - diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-type.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-type.tentative.sub.html similarity index 97% rename from tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-type.sub.html rename to tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-type.tentative.sub.html index 665e7abb02d..1eaa56494db 100644 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-type.sub.html +++ b/tests/wpt/tests/html/syntax/speculative-parsing/generated/document-write/script-src-unsupported-type.tentative.sub.html @@ -20,6 +20,6 @@ document.write(''); <\/script> <\!-- speculative case in document.write --> - <script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid=${uuid}&amp;encodingcheck=&Gbreve;" type="text/plain"><\/script> + <script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid=${uuid}&amp;encodingcheck=&Gbreve;" type=text/plain><\/script> `); </script> diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-event-handler-framed.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-event-handler-framed.sub.html deleted file mode 100644 index 7b9e0edeb97..00000000000 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-event-handler-framed.sub.html +++ /dev/null @@ -1,12 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT. This file has been generated. Source: - /html/syntax/speculative-parsing/tools/generate.py ---> -<meta charset=utf-8> -<title>Speculative parsing, page load (helper file): script-src-event-handler</title> -<script src="/common/slow.py?delay=1500"></script> -<script> - document.write('<plaintext>'); -</script> -<!-- speculative case --> -<script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid={{GET[uuid]}}&amp;encodingcheck=&Gbreve;" event="" for=""></script> diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-language-framed.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-language-framed.sub.html deleted file mode 100644 index 62b2c4c017b..00000000000 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-language-framed.sub.html +++ /dev/null @@ -1,12 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT. This file has been generated. Source: - /html/syntax/speculative-parsing/tools/generate.py ---> -<meta charset=utf-8> -<title>Speculative parsing, page load (helper file): script-src-unsupported-language</title> -<script src="/common/slow.py?delay=1500"></script> -<script> - document.write('<plaintext>'); -</script> -<!-- speculative case --> -<script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid={{GET[uuid]}}&amp;encodingcheck=&Gbreve;" language="vbscript"></script> diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-type-framed.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-type-framed.sub.html index 78e71941b35..1f38560ee15 100644 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-type-framed.sub.html +++ b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/resources/script-src-unsupported-type-framed.sub.html @@ -9,4 +9,4 @@ document.write('<plaintext>'); </script> <!-- speculative case --> -<script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid={{GET[uuid]}}&amp;encodingcheck=&Gbreve;" type="text/plain"></script> +<script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid={{GET[uuid]}}&amp;encodingcheck=&Gbreve;" type=text/plain></script> diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html deleted file mode 100644 index 6bb89bd463c..00000000000 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-event-handler.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT. This file has been generated. Source: - /html/syntax/speculative-parsing/tools/generate.py ---> -<meta charset=utf-8> -<title>Speculative parsing, page load: script-src-event-handler</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/utils.js></script> -<script src=/html/syntax/speculative-parsing/resources/speculative-parsing-util.js></script> -<body> -<script> - setup({single_test: true}); - const uuid = token(); - const iframe = document.createElement('iframe'); - iframe.src = `resources/script-src-event-handler-framed.sub.html?uuid=${uuid}`; - document.body.appendChild(iframe); - expect_fetched_onload(uuid, false) - .then(compare_with_nonspeculative(uuid, 'script-src-event-handler', false)) - .then(done); -</script> diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.tentative.html similarity index 100% rename from tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.html rename to tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-nomodule.tentative.html diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html deleted file mode 100644 index 60f50eb34d6..00000000000 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-language.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html> -<!-- DO NOT EDIT. This file has been generated. Source: - /html/syntax/speculative-parsing/tools/generate.py ---> -<meta charset=utf-8> -<title>Speculative parsing, page load: script-src-unsupported-language</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/common/utils.js></script> -<script src=/html/syntax/speculative-parsing/resources/speculative-parsing-util.js></script> -<body> -<script> - setup({single_test: true}); - const uuid = token(); - const iframe = document.createElement('iframe'); - iframe.src = `resources/script-src-unsupported-language-framed.sub.html?uuid=${uuid}`; - document.body.appendChild(iframe); - expect_fetched_onload(uuid, false) - .then(compare_with_nonspeculative(uuid, 'script-src-unsupported-language', false)) - .then(done); -</script> diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.tentative.html similarity index 100% rename from tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.html rename to tests/wpt/tests/html/syntax/speculative-parsing/generated/page-load/script-src-unsupported-type.tentative.html diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/generated/resources/script-src-unsupported-type-nonspeculative.sub.html b/tests/wpt/tests/html/syntax/speculative-parsing/generated/resources/script-src-unsupported-type-nonspeculative.sub.html index dc8343c3824..94098b5c775 100644 --- a/tests/wpt/tests/html/syntax/speculative-parsing/generated/resources/script-src-unsupported-type-nonspeculative.sub.html +++ b/tests/wpt/tests/html/syntax/speculative-parsing/generated/resources/script-src-unsupported-type-nonspeculative.sub.html @@ -5,6 +5,6 @@ <meta charset=utf-8> <title>Speculative parsing, non-speculative (helper file): script-src-unsupported-type</title> <!-- non-speculative case --> -<script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid={{GET[uuid]}}&amp;encodingcheck=&Gbreve;" type="text/plain"></script> +<script src="/html/syntax/speculative-parsing/resources/stash.py?action=put&amp;uuid={{GET[uuid]}}&amp;encodingcheck=&Gbreve;" type=text/plain></script> <!-- block the load event for a bit: --> <script src="/common/slow.py?delay=1500"></script> diff --git a/tests/wpt/tests/html/syntax/speculative-parsing/tools/generate.py b/tests/wpt/tests/html/syntax/speculative-parsing/tools/generate.py index b3b577d9e10..f0db885814b 100755 --- a/tests/wpt/tests/html/syntax/speculative-parsing/tools/generate.py +++ b/tests/wpt/tests/html/syntax/speculative-parsing/tools/generate.py @@ -88,6 +88,14 @@ tentative_tests = [ u'true', u'true' ), + ( + u'script-src-unsupported-type', + u'utf-8', + u'<script src="{}" type=text/plain></script>', + None, + u'false', + u'true' + ), ( u'script-src-type-application-ecmascript', u'utf-8', @@ -96,6 +104,14 @@ tentative_tests = [ u'true', u'true' ), + ( + u'script-src-nomodule', + u'utf-8', + u'<script src="{}" nomodule></script>', + None, + u'false', + u'true' + ), ( u'script-src-module', u'utf-8', @@ -510,38 +526,6 @@ tests = [ # template_testcase_markup, # expect_load, # test_nonspeculative - ( - u'script-src-unsupported-type', - u'utf-8', - u'<script src="{}" type="text/plain"></script>', - None, - u'false', - u'true' - ), - ( - u'script-src-unsupported-language', - u'utf-8', - u'<script src="{}" language="vbscript"></script>', - None, - u'false', - u'false' - ), - ( - u'script-src-nomodule', - u'utf-8', - u'<script src="{}" nomodule></script>', - None, - u'false', - u'true' - ), - ( - u'script-src-event-handler', - u'utf-8', - u'<script src="{}" event="" for=""></script>', - None, - u'false', - u'false' - ), ] # Templates diff --git a/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/mutation-observer.html b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/mutation-observer.html new file mode 100644 index 00000000000..2f8701385a5 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/mutation-observer.html @@ -0,0 +1,38 @@ +<!doctype html> +<meta charset=utf-8> +<title>document.write in mutation observer</title> +<link rel=help href="https://html.spec.whatwg.org/#parsing-main-incdata"> +<link rel=help href="https://html.spec.whatwg.org/#perform-a-microtask-checkpoint"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +[ + {name: "classic", src: "resources/mutation-observer-iframe-script.html"}, + {name: "module", src: "resources/mutation-observer-iframe-script-module.html"}, + {name: "async", src: "resources/mutation-observer-iframe-script-async.html"}, + {name: "defer", src: "resources/mutation-observer-iframe-script-defer.html"}, +].forEach(({name, src}) => { + promise_test(async t => { + const iframe = document.createElement("iframe"); + + iframe.onerror = t.unreached_func("Error loading iframe"); + document.addEventListener("scriptRan", t.unreached_func("script should not run")); + document.addEventListener("documentWriteDone", t.step_func(() => { + assert_equals(iframe.contentDocument.body.textContent, "document.write body contents\n"); + })); + + let loadPromise = new Promise(resolve => { + iframe.onload = t.step_func(() => { + assert_equals(iframe.contentDocument.body.textContent, "document.write body contents\n"); + resolve(); + }); + }); + + iframe.src = src; + document.body.appendChild(iframe); + + await loadPromise; + }, `Mutation observer for ${name} script element`); +}); +</script> diff --git a/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-async.html b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-async.html new file mode 100644 index 00000000000..680290fab2f --- /dev/null +++ b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-async.html @@ -0,0 +1,16 @@ +<!doctype html> +<script> +new MutationObserver((mutations, observer) => { + mutations.forEach(({ addedNodes }) => { + addedNodes.forEach(node => { + if (node.nodeType == 1 && node.tagName == "SCRIPT") { + document.write("document.write body contents\n"); + document.close(); + window.parent.document.dispatchEvent(new CustomEvent("documentWriteDone")); + } + }); + }); +}).observe(document.documentElement, { childList: true, subtree: true }); +</script> +Initial body contents +<script src="mutation-observer-iframe-script.js" async></script> diff --git a/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-defer.html b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-defer.html new file mode 100644 index 00000000000..e5669ad0c39 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-defer.html @@ -0,0 +1,16 @@ +<!doctype html> +<script> +new MutationObserver((mutations, observer) => { + mutations.forEach(({ addedNodes }) => { + addedNodes.forEach(node => { + if (node.nodeType == 1 && node.tagName == "SCRIPT") { + document.write("document.write body contents\n"); + document.close(); + window.parent.document.dispatchEvent(new CustomEvent("documentWriteDone")); + } + }); + }); +}).observe(document.documentElement, { childList: true, subtree: true }); +</script> +Initial body contents +<script src="mutation-observer-iframe-script.js" defer></script> diff --git a/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-module.html b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-module.html new file mode 100644 index 00000000000..f15bef511ae --- /dev/null +++ b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script-module.html @@ -0,0 +1,16 @@ +<!doctype html> +<script> +new MutationObserver((mutations, observer) => { + mutations.forEach(({ addedNodes }) => { + addedNodes.forEach(node => { + if (node.nodeType == 1 && node.tagName == "SCRIPT") { + document.write("document.write body contents\n"); + document.close(); + window.parent.document.dispatchEvent(new CustomEvent("documentWriteDone")); + } + }); + }); +}).observe(document.documentElement, { childList: true, subtree: true }); +</script> +Initial body contents +<script type="module">window.parent.document.dispatchEvent(new CustomEvent("scriptRan"));</script> diff --git a/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.html b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.html new file mode 100644 index 00000000000..ebcdc19ec49 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.html @@ -0,0 +1,18 @@ +<!doctype html> +<script> +window.scriptRan = false; + +new MutationObserver((mutations, observer) => { + mutations.forEach(({ addedNodes }) => { + addedNodes.forEach(node => { + if (node.nodeType == 1 && node.tagName == "SCRIPT") { + document.write("document.write body contents\n"); + document.close(); + window.parent.document.dispatchEvent(new CustomEvent("documentWriteDone")); + } + }); + }); +}).observe(document.documentElement, { childList: true, subtree: true }); +</script> +Initial body contents +<script>window.parent.document.dispatchEvent(new CustomEvent("scriptRan"));</script> diff --git a/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.js b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.js new file mode 100644 index 00000000000..0267705294a --- /dev/null +++ b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/document-write/resources/mutation-observer-iframe-script.js @@ -0,0 +1 @@ +window.parent.document.dispatchEvent(new CustomEvent("scriptRan")); diff --git a/tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-01.html b/tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-01.html new file mode 100644 index 00000000000..a84a662a53a --- /dev/null +++ b/tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-01.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<head> +<link rel=help href="https://html.spec.whatwg.org/#parsing-main-incdata"> +<link rel=help href="https://html.spec.whatwg.org/#perform-a-microtask-checkpoint"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> + +let classicScriptRan = false; +let moduleScriptRan = false; +let asyncScriptRan = false; +let deferSCriptRan = false; + +new MutationObserver((mutations, observer) => { + mutations.forEach(({ addedNodes }) => { + addedNodes.forEach(node => { + if (node.nodeType == 1 && node.tagName == "SCRIPT") { + node.setAttribute("type", "text/plain"); + } + }); + }); +}).observe(document.body, { childList: true, subtree: true }); + +let test = async_test("Microtask before prepare-the-script-element steps"); +window.onload = test.step_func_done(function(e) { + assert_false(classicScriptRan, "Classic script should not run"); + assert_false(moduleScriptRan, "Module script should not run"); + assert_false(asyncScriptRan, "Async script should not run"); + assert_false(deferSCriptRan, "Defer script should not run"); +}); + +</script> +<script>classicScriptRan = true;</script> +<script type="module">moduleScriptRan = true;</script> +<script src="resources/async.js" async></script> +<script src="resources/defer.js" defer></script> +</body> diff --git a/tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-02.xhtml b/tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-02.xhtml new file mode 100644 index 00000000000..4dcc0ad2421 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/scripting/event-loops/microtask_before_prepare_the_script_element-02.xhtml @@ -0,0 +1,42 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<link rel="help" href="https://html.spec.whatwg.org/#parsing-xhtml-documents"/> +<link rel="help" href="https://html.spec.whatwg.org/#perform-a-microtask-checkpoint"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> +<![CDATA[ + +let classicScriptRan = false; +let moduleScriptRan = false; +let asyncScriptRan = false; +let deferSCriptRan = false; + +new MutationObserver((mutations, observer) => { + mutations.forEach(({ addedNodes }) => { + addedNodes.forEach(node => { + if (node.nodeType == 1 && node.tagName == "script") { + node.setAttribute("type", "text/plain"); + } + }); + }); +}).observe(document.body, { childList: true, subtree: true }); + +let test = async_test("Microtask before prepare-the-script-element steps"); +window.onload = test.step_func_done(function(e) { + assert_false(classicScriptRan, "Classic script should not run"); + assert_false(moduleScriptRan, "Module script should not run"); + assert_false(asyncScriptRan, "Async script should not run"); + assert_false(deferSCriptRan, "Defer script should not run"); +}); + +]]> +</script> +<script>classicScriptRan = true;</script> +<script type="module">moduleScriptRan = true;</script> +<script src="resources/async.js" async=""></script> +<script src="resources/defer.js" defer=""></script> +</body> +</html> diff --git a/tests/wpt/tests/html/webappapis/scripting/event-loops/resources/async.js b/tests/wpt/tests/html/webappapis/scripting/event-loops/resources/async.js new file mode 100644 index 00000000000..5b6470d5a44 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/scripting/event-loops/resources/async.js @@ -0,0 +1 @@ +asyncScriptRan = true; diff --git a/tests/wpt/tests/html/webappapis/scripting/event-loops/resources/defer.js b/tests/wpt/tests/html/webappapis/scripting/event-loops/resources/defer.js new file mode 100644 index 00000000000..d8498d274fb --- /dev/null +++ b/tests/wpt/tests/html/webappapis/scripting/event-loops/resources/defer.js @@ -0,0 +1 @@ +deferSCriptRan = true; diff --git a/tests/wpt/tests/interfaces/IndexedDB.idl b/tests/wpt/tests/interfaces/IndexedDB.idl index d82391da7e6..7c381fe0453 100644 --- a/tests/wpt/tests/interfaces/IndexedDB.idl +++ b/tests/wpt/tests/interfaces/IndexedDB.idl @@ -108,10 +108,11 @@ interface IDBObjectStore { [NewObject] IDBRequest clear(); [NewObject] IDBRequest get(any query); [NewObject] IDBRequest getKey(any query); - [NewObject] IDBRequest getAll(optional any query, + [NewObject] IDBRequest getAll(optional any queryOrOptions, optional [EnforceRange] unsigned long count); - [NewObject] IDBRequest getAllKeys(optional any query, + [NewObject] IDBRequest getAllKeys(optional any queryOrOptions, optional [EnforceRange] unsigned long count); + [NewObject] IDBRequest getAllRecords(optional IDBGetAllOptions options = {}); [NewObject] IDBRequest count(optional any query); [NewObject] IDBRequest openCursor(optional any query, @@ -132,6 +133,12 @@ dictionary IDBIndexParameters { boolean multiEntry = false; }; +dictionary IDBGetAllOptions { + any query = null; + [EnforceRange] unsigned long count; + IDBCursorDirection direction = "next"; +}; + [Exposed=(Window,Worker)] interface IDBIndex { attribute DOMString name; @@ -142,10 +149,11 @@ interface IDBIndex { [NewObject] IDBRequest get(any query); [NewObject] IDBRequest getKey(any query); - [NewObject] IDBRequest getAll(optional any query, + [NewObject] IDBRequest getAll(optional any queryOrOptions, optional [EnforceRange] unsigned long count); - [NewObject] IDBRequest getAllKeys(optional any query, + [NewObject] IDBRequest getAllKeys(optional any queryOrOptions, optional [EnforceRange] unsigned long count); + [NewObject] IDBRequest getAllRecords(optional IDBGetAllOptions options = {}); [NewObject] IDBRequest count(optional any query); [NewObject] IDBRequest openCursor(optional any query, @@ -173,6 +181,13 @@ interface IDBKeyRange { boolean includes(any key); }; +[Exposed=(Window,Worker)] +interface IDBRecord { + readonly attribute any key; + readonly attribute any primaryKey; + readonly attribute any value; +}; + [Exposed=(Window,Worker)] interface IDBCursor { readonly attribute (IDBObjectStore or IDBIndex) source; diff --git a/tests/wpt/tests/interfaces/cookiestore.idl b/tests/wpt/tests/interfaces/cookiestore.idl index ecb277756cc..cbcf0712546 100644 --- a/tests/wpt/tests/interfaces/cookiestore.idl +++ b/tests/wpt/tests/interfaces/cookiestore.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Cookie Store API (https://cookiestore.spec.whatwg.org/) +// Source: Cookie Store API Standard (https://cookiestore.spec.whatwg.org/) [Exposed=(ServiceWorker,Window), SecureContext] @@ -53,12 +53,6 @@ dictionary CookieStoreDeleteOptions { dictionary CookieListItem { USVString name; USVString value; - USVString? domain; - USVString path; - DOMHighResTimeStamp? expires; - boolean secure; - CookieSameSite sameSite; - boolean partitioned; }; typedef sequence<CookieListItem> CookieList; diff --git a/tests/wpt/tests/interfaces/crash-reporting.idl b/tests/wpt/tests/interfaces/crash-reporting.idl index d10f3573791..60f15bbb44d 100644 --- a/tests/wpt/tests/interfaces/crash-reporting.idl +++ b/tests/wpt/tests/interfaces/crash-reporting.idl @@ -4,8 +4,8 @@ // Source: Crash Reporting (https://wicg.github.io/crash-reporting/) dictionary CrashReportBody : ReportBody { - DOMString? reason; - DOMString? stack; - boolean? is_top_level; - DocumentVisibilityState? page_visibility; + DOMString reason; + DOMString stack; + boolean is_top_level; + DocumentVisibilityState page_visibility; }; diff --git a/tests/wpt/tests/interfaces/css-typed-om.idl b/tests/wpt/tests/interfaces/css-typed-om.idl index b0f26ea83c7..0eab6bc7542 100644 --- a/tests/wpt/tests/interfaces/css-typed-om.idl +++ b/tests/wpt/tests/interfaces/css-typed-om.idl @@ -45,7 +45,7 @@ interface CSSUnparsedValue : CSSStyleValue { iterable<CSSUnparsedSegment>; readonly attribute unsigned long length; getter CSSUnparsedSegment (unsigned long index); - setter CSSUnparsedSegment (unsigned long index, CSSUnparsedSegment val); + setter undefined (unsigned long index, CSSUnparsedSegment val); }; typedef (USVString or CSSVariableReferenceValue) CSSUnparsedSegment; @@ -263,7 +263,7 @@ interface CSSTransformValue : CSSStyleValue { iterable<CSSTransformComponent>; readonly attribute unsigned long length; getter CSSTransformComponent (unsigned long index); - setter CSSTransformComponent (unsigned long index, CSSTransformComponent val); + setter undefined (unsigned long index, CSSTransformComponent val); readonly attribute boolean is2D; DOMMatrix toMatrix(); diff --git a/tests/wpt/tests/interfaces/element-timing.idl b/tests/wpt/tests/interfaces/element-timing.idl index 4f42823704a..4b556e82779 100644 --- a/tests/wpt/tests/interfaces/element-timing.idl +++ b/tests/wpt/tests/interfaces/element-timing.idl @@ -20,5 +20,5 @@ interface PerformanceElementTiming : PerformanceEntry { PerformanceElementTiming includes PaintTimingMixin; partial interface Element { - [CEReactions] attribute DOMString elementTiming; + [CEReactions, Reflect] attribute DOMString elementTiming; }; diff --git a/tests/wpt/tests/interfaces/fedcm.idl b/tests/wpt/tests/interfaces/fedcm.idl index efc9f41398b..be3bc1b2bd3 100644 --- a/tests/wpt/tests/interfaces/fedcm.idl +++ b/tests/wpt/tests/interfaces/fedcm.idl @@ -10,7 +10,7 @@ dictionary IdentityCredentialDisconnectOptions : IdentityProviderConfig { [Exposed=Window, SecureContext] interface IdentityCredential : Credential { static Promise<undefined> disconnect(IdentityCredentialDisconnectOptions options); - readonly attribute USVString? token; + readonly attribute any token; readonly attribute boolean isAutoSelected; readonly attribute USVString configURL; }; @@ -59,7 +59,6 @@ dictionary IdentityProviderConfig { }; dictionary IdentityProviderRequestOptions : IdentityProviderConfig { - USVString nonce; DOMString loginHint; DOMString domainHint; sequence<USVString> fields; @@ -113,7 +112,7 @@ dictionary IdentityProviderAccountList { }; dictionary IdentityAssertionResponse { - USVString token; + any token; USVString continue_on; IdentityCredentialErrorInit error; }; @@ -136,6 +135,6 @@ dictionary IdentityResolveOptions { [Exposed=Window, SecureContext] interface IdentityProvider { static undefined close(); - static Promise<undefined> resolve(DOMString token, optional IdentityResolveOptions options = {}); + static Promise<undefined> resolve(any token, optional IdentityResolveOptions options = {}); static Promise<sequence<IdentityUserInfo>> getUserInfo(IdentityProviderConfig config); }; diff --git a/tests/wpt/tests/interfaces/fetch.idl b/tests/wpt/tests/interfaces/fetch.idl index 965a82d13f5..48149ece73d 100644 --- a/tests/wpt/tests/interfaces/fetch.idl +++ b/tests/wpt/tests/interfaces/fetch.idl @@ -116,3 +116,16 @@ enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredire partial interface mixin WindowOrWorkerGlobalScope { [NewObject] Promise<Response> fetch(RequestInfo input, optional RequestInit init = {}); }; + +dictionary DeferredRequestInit : RequestInit { + DOMHighResTimeStamp activateAfter; +}; + +[Exposed=Window] +interface FetchLaterResult { + readonly attribute boolean activated; +}; + +partial interface Window { + [NewObject] FetchLaterResult fetchLater(RequestInfo input, optional DeferredRequestInit init = {}); +}; diff --git a/tests/wpt/tests/interfaces/fs.idl b/tests/wpt/tests/interfaces/fs.idl index 46a59dd1acd..156e9726739 100644 --- a/tests/wpt/tests/interfaces/fs.idl +++ b/tests/wpt/tests/interfaces/fs.idl @@ -42,7 +42,7 @@ dictionary FileSystemRemoveOptions { [Exposed=(Window,Worker), SecureContext, Serializable] interface FileSystemDirectoryHandle : FileSystemHandle { - async iterable<USVString, FileSystemHandle>; + async_iterable<USVString, FileSystemHandle>; Promise<FileSystemFileHandle> getFileHandle(USVString name, optional FileSystemGetFileOptions options = {}); Promise<FileSystemDirectoryHandle> getDirectoryHandle(USVString name, optional FileSystemGetDirectoryOptions options = {}); diff --git a/tests/wpt/tests/interfaces/html.idl b/tests/wpt/tests/interfaces/html.idl index acb1b57ffe8..6a6b85335f2 100644 --- a/tests/wpt/tests/interfaces/html.idl +++ b/tests/wpt/tests/interfaces/html.idl @@ -110,21 +110,21 @@ interface HTMLElement : Element { [HTMLConstructor] constructor(); // metadata attributes - [CEReactions] attribute DOMString title; - [CEReactions] attribute DOMString lang; + [CEReactions, Reflect] attribute DOMString title; + [CEReactions, Reflect] attribute DOMString lang; [CEReactions] attribute boolean translate; [CEReactions] attribute DOMString dir; // user interaction [CEReactions] attribute (boolean or unrestricted double or DOMString)? hidden; - [CEReactions] attribute boolean inert; + [CEReactions, Reflect] attribute boolean inert; undefined click(); - [CEReactions] attribute DOMString accessKey; + [CEReactions, Reflect] attribute DOMString accessKey; readonly attribute DOMString accessKeyLabel; [CEReactions] attribute boolean draggable; [CEReactions] attribute boolean spellcheck; - [CEReactions] attribute DOMString writingSuggestions; - [CEReactions] attribute DOMString autocapitalize; + [CEReactions, ReflectSetter] attribute DOMString writingSuggestions; + [CEReactions, ReflectSetter] attribute DOMString autocapitalize; [CEReactions] attribute boolean autocorrect; [CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText; @@ -160,8 +160,8 @@ interface mixin HTMLOrSVGElement { [SameObject] readonly attribute DOMStringMap dataset; attribute DOMString nonce; // intentionally no [CEReactions] - [CEReactions] attribute boolean autofocus; - [CEReactions] attribute long tabIndex; + [CEReactions, Reflect] attribute boolean autofocus; + [CEReactions, ReflectSetter] attribute long tabIndex; undefined focus(optional FocusOptions options = {}); undefined blur(); }; @@ -197,29 +197,29 @@ interface HTMLTitleElement : HTMLElement { interface HTMLBaseElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString href; - [CEReactions] attribute DOMString target; + [CEReactions, ReflectSetter] attribute USVString href; + [CEReactions, Reflect] attribute DOMString target; }; [Exposed=Window] interface HTMLLinkElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString href; + [CEReactions, ReflectURL] attribute USVString href; [CEReactions] attribute DOMString? crossOrigin; - [CEReactions] attribute DOMString rel; + [CEReactions, Reflect] attribute DOMString rel; [CEReactions] attribute DOMString as; - [SameObject, PutForwards=value] readonly attribute DOMTokenList relList; - [CEReactions] attribute DOMString media; - [CEReactions] attribute DOMString integrity; - [CEReactions] attribute DOMString hreflang; - [CEReactions] attribute DOMString type; - [SameObject, PutForwards=value] readonly attribute DOMTokenList sizes; - [CEReactions] attribute USVString imageSrcset; - [CEReactions] attribute DOMString imageSizes; + [SameObject, PutForwards=value, Reflect="rel"] readonly attribute DOMTokenList relList; + [CEReactions, Reflect] attribute DOMString media; + [CEReactions, Reflect] attribute DOMString integrity; + [CEReactions, Reflect] attribute DOMString hreflang; + [CEReactions, Reflect] attribute DOMString type; + [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList sizes; + [CEReactions, Reflect] attribute USVString imageSrcset; + [CEReactions, Reflect] attribute DOMString imageSizes; [CEReactions] attribute DOMString referrerPolicy; - [SameObject, PutForwards=value] readonly attribute DOMTokenList blocking; - [CEReactions] attribute boolean disabled; + [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList blocking; + [CEReactions, Reflect] attribute boolean disabled; [CEReactions] attribute DOMString fetchPriority; // also has obsolete members @@ -230,10 +230,10 @@ HTMLLinkElement includes LinkStyle; interface HTMLMetaElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString name; - [CEReactions] attribute DOMString httpEquiv; - [CEReactions] attribute DOMString content; - [CEReactions] attribute DOMString media; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect="http-equiv"] attribute DOMString httpEquiv; + [CEReactions, Reflect] attribute DOMString content; + [CEReactions, Reflect] attribute DOMString media; // also has obsolete members }; @@ -243,8 +243,8 @@ interface HTMLStyleElement : HTMLElement { [HTMLConstructor] constructor(); attribute boolean disabled; - [CEReactions] attribute DOMString media; - [SameObject, PutForwards=value] readonly attribute DOMTokenList blocking; + [CEReactions, Reflect] attribute DOMString media; + [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList blocking; // also has obsolete members }; @@ -291,16 +291,16 @@ interface HTMLPreElement : HTMLElement { interface HTMLQuoteElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString cite; + [CEReactions, ReflectURL] attribute USVString cite; }; [Exposed=Window] interface HTMLOListElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute boolean reversed; - [CEReactions] attribute long start; - [CEReactions] attribute DOMString type; + [CEReactions, Reflect] attribute boolean reversed; + [CEReactions, Reflect, ReflectDefault=1] attribute long start; + [CEReactions, Reflect] attribute DOMString type; // also has obsolete members }; @@ -323,7 +323,7 @@ interface HTMLMenuElement : HTMLElement { interface HTMLLIElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute long value; + [CEReactions, Reflect] attribute long value; // also has obsolete members }; @@ -346,13 +346,13 @@ interface HTMLDivElement : HTMLElement { interface HTMLAnchorElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString target; - [CEReactions] attribute DOMString download; - [CEReactions] attribute USVString ping; - [CEReactions] attribute DOMString rel; - [SameObject, PutForwards=value] readonly attribute DOMTokenList relList; - [CEReactions] attribute DOMString hreflang; - [CEReactions] attribute DOMString type; + [CEReactions, Reflect] attribute DOMString target; + [CEReactions, Reflect] attribute DOMString download; + [CEReactions, Reflect] attribute USVString ping; + [CEReactions, Reflect] attribute DOMString rel; + [SameObject, PutForwards=value, Reflect="rel"] readonly attribute DOMTokenList relList; + [CEReactions, Reflect] attribute DOMString hreflang; + [CEReactions, Reflect] attribute DOMString type; [CEReactions] attribute DOMString text; @@ -366,14 +366,14 @@ HTMLAnchorElement includes HTMLHyperlinkElementUtils; interface HTMLDataElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString value; + [CEReactions, Reflect] attribute DOMString value; }; [Exposed=Window] interface HTMLTimeElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString dateTime; + [CEReactions, Reflect] attribute DOMString dateTime; }; [Exposed=Window] @@ -389,7 +389,7 @@ interface HTMLBRElement : HTMLElement { }; interface mixin HTMLHyperlinkElementUtils { - [CEReactions] stringifier attribute USVString href; + [CEReactions, ReflectSetter] stringifier attribute USVString href; readonly attribute USVString origin; [CEReactions] attribute USVString protocol; [CEReactions] attribute USVString username; @@ -406,8 +406,8 @@ interface mixin HTMLHyperlinkElementUtils { interface HTMLModElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString cite; - [CEReactions] attribute DOMString dateTime; + [CEReactions, ReflectURL] attribute USVString cite; + [CEReactions, Reflect] attribute DOMString dateTime; }; [Exposed=Window] @@ -419,13 +419,13 @@ interface HTMLPictureElement : HTMLElement { interface HTMLSourceElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString src; - [CEReactions] attribute DOMString type; - [CEReactions] attribute USVString srcset; - [CEReactions] attribute DOMString sizes; - [CEReactions] attribute DOMString media; - [CEReactions] attribute unsigned long width; - [CEReactions] attribute unsigned long height; + [CEReactions, ReflectURL] attribute USVString src; + [CEReactions, Reflect] attribute DOMString type; + [CEReactions, Reflect] attribute USVString srcset; + [CEReactions, Reflect] attribute DOMString sizes; + [CEReactions, Reflect] attribute DOMString media; + [CEReactions, Reflect] attribute unsigned long width; + [CEReactions, Reflect] attribute unsigned long height; }; [Exposed=Window, @@ -433,15 +433,15 @@ interface HTMLSourceElement : HTMLElement { interface HTMLImageElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString alt; - [CEReactions] attribute USVString src; - [CEReactions] attribute USVString srcset; - [CEReactions] attribute DOMString sizes; + [CEReactions, Reflect] attribute DOMString alt; + [CEReactions, ReflectURL] attribute USVString src; + [CEReactions, Reflect] attribute USVString srcset; + [CEReactions, Reflect] attribute DOMString sizes; [CEReactions] attribute DOMString? crossOrigin; - [CEReactions] attribute DOMString useMap; - [CEReactions] attribute boolean isMap; - [CEReactions] attribute unsigned long width; - [CEReactions] attribute unsigned long height; + [CEReactions, Reflect] attribute DOMString useMap; + [CEReactions, Reflect] attribute boolean isMap; + [CEReactions, ReflectSetter] attribute unsigned long width; + [CEReactions, ReflectSetter] attribute unsigned long height; readonly attribute unsigned long naturalWidth; readonly attribute unsigned long naturalHeight; readonly attribute boolean complete; @@ -460,14 +460,14 @@ interface HTMLImageElement : HTMLElement { interface HTMLIFrameElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString src; + [CEReactions, ReflectURL] attribute USVString src; [CEReactions] attribute (TrustedHTML or DOMString) srcdoc; - [CEReactions] attribute DOMString name; - [SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox; - [CEReactions] attribute DOMString allow; - [CEReactions] attribute boolean allowFullscreen; - [CEReactions] attribute DOMString width; - [CEReactions] attribute DOMString height; + [CEReactions, Reflect] attribute DOMString name; + [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList sandbox; + [CEReactions, Reflect] attribute DOMString allow; + [CEReactions, Reflect] attribute boolean allowFullscreen; + [CEReactions, Reflect] attribute DOMString width; + [CEReactions, Reflect] attribute DOMString height; [CEReactions] attribute DOMString referrerPolicy; [CEReactions] attribute DOMString loading; readonly attribute Document? contentDocument; @@ -481,10 +481,10 @@ interface HTMLIFrameElement : HTMLElement { interface HTMLEmbedElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString src; - [CEReactions] attribute DOMString type; - [CEReactions] attribute DOMString width; - [CEReactions] attribute DOMString height; + [CEReactions, ReflectURL] attribute USVString src; + [CEReactions, Reflect] attribute DOMString type; + [CEReactions, Reflect] attribute DOMString width; + [CEReactions, Reflect] attribute DOMString height; Document? getSVGDocument(); // also has obsolete members @@ -494,12 +494,12 @@ interface HTMLEmbedElement : HTMLElement { interface HTMLObjectElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute USVString data; - [CEReactions] attribute DOMString type; - [CEReactions] attribute DOMString name; + [CEReactions, ReflectURL] attribute USVString data; + [CEReactions, Reflect] attribute DOMString type; + [CEReactions, Reflect] attribute DOMString name; readonly attribute HTMLFormElement? form; - [CEReactions] attribute DOMString width; - [CEReactions] attribute DOMString height; + [CEReactions, Reflect] attribute DOMString width; + [CEReactions, Reflect] attribute DOMString height; readonly attribute Document? contentDocument; readonly attribute WindowProxy? contentWindow; Document? getSVGDocument(); @@ -518,12 +518,12 @@ interface HTMLObjectElement : HTMLElement { interface HTMLVideoElement : HTMLMediaElement { [HTMLConstructor] constructor(); - [CEReactions] attribute unsigned long width; - [CEReactions] attribute unsigned long height; + [CEReactions, Reflect] attribute unsigned long width; + [CEReactions, Reflect] attribute unsigned long height; readonly attribute unsigned long videoWidth; readonly attribute unsigned long videoHeight; - [CEReactions] attribute USVString poster; - [CEReactions] attribute boolean playsInline; + [CEReactions, ReflectURL] attribute USVString poster; + [CEReactions, Reflect] attribute boolean playsInline; }; [Exposed=Window, @@ -537,10 +537,10 @@ interface HTMLTrackElement : HTMLElement { [HTMLConstructor] constructor(); [CEReactions] attribute DOMString kind; - [CEReactions] attribute USVString src; - [CEReactions] attribute DOMString srclang; - [CEReactions] attribute DOMString label; - [CEReactions] attribute boolean default; + [CEReactions, ReflectURL] attribute USVString src; + [CEReactions, Reflect] attribute DOMString srclang; + [CEReactions, Reflect] attribute DOMString label; + [CEReactions, Reflect] attribute boolean default; const unsigned short NONE = 0; const unsigned short LOADING = 1; @@ -561,7 +561,7 @@ interface HTMLMediaElement : HTMLElement { readonly attribute MediaError? error; // network state - [CEReactions] attribute USVString src; + [CEReactions, ReflectURL] attribute USVString src; attribute MediaProvider? srcObject; readonly attribute USVString currentSrc; [CEReactions] attribute DOMString? crossOrigin; @@ -596,16 +596,16 @@ interface HTMLMediaElement : HTMLElement { readonly attribute TimeRanges played; readonly attribute TimeRanges seekable; readonly attribute boolean ended; - [CEReactions] attribute boolean autoplay; - [CEReactions] attribute boolean loop; + [CEReactions, Reflect] attribute boolean autoplay; + [CEReactions, Reflect] attribute boolean loop; Promise<undefined> play(); undefined pause(); // controls - [CEReactions] attribute boolean controls; + [CEReactions, Reflect] attribute boolean controls; attribute double volume; attribute boolean muted; - [CEReactions] attribute boolean defaultMuted; + [CEReactions, Reflect="muted"] attribute boolean defaultMuted; // tracks [SameObject] readonly attribute AudioTrackList audioTracks; @@ -742,7 +742,7 @@ dictionary TrackEventInit : EventInit { interface HTMLMapElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString name; [SameObject] readonly attribute HTMLCollection areas; }; @@ -750,14 +750,14 @@ interface HTMLMapElement : HTMLElement { interface HTMLAreaElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString alt; - [CEReactions] attribute DOMString coords; - [CEReactions] attribute DOMString shape; - [CEReactions] attribute DOMString target; - [CEReactions] attribute DOMString download; - [CEReactions] attribute USVString ping; - [CEReactions] attribute DOMString rel; - [SameObject, PutForwards=value] readonly attribute DOMTokenList relList; + [CEReactions, Reflect] attribute DOMString alt; + [CEReactions, Reflect] attribute DOMString coords; + [CEReactions, Reflect] attribute DOMString shape; + [CEReactions, Reflect] attribute DOMString target; + [CEReactions, Reflect] attribute DOMString download; + [CEReactions, Reflect] attribute USVString ping; + [CEReactions, Reflect] attribute DOMString rel; + [SameObject, PutForwards=value, Reflect="rel"] readonly attribute DOMTokenList relList; [CEReactions] attribute DOMString referrerPolicy; // also has obsolete members @@ -801,7 +801,7 @@ interface HTMLTableCaptionElement : HTMLElement { interface HTMLTableColElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute unsigned long span; + [CEReactions, Reflect, ReflectDefault=1, ReflectRange=(1, 1000)] attribute unsigned long span; // also has obsolete members }; @@ -834,13 +834,13 @@ interface HTMLTableRowElement : HTMLElement { interface HTMLTableCellElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute unsigned long colSpan; - [CEReactions] attribute unsigned long rowSpan; - [CEReactions] attribute DOMString headers; + [CEReactions, Reflect, ReflectDefault=1, ReflectRange=(1, 1000)] attribute unsigned long colSpan; + [CEReactions, Reflect, ReflectDefault=1, ReflectRange=(0, 65534)] attribute unsigned long rowSpan; + [CEReactions, Reflect] attribute DOMString headers; readonly attribute long cellIndex; [CEReactions] attribute DOMString scope; // only conforming for th elements - [CEReactions] attribute DOMString abbr; // only conforming for th elements + [CEReactions, Reflect] attribute DOMString abbr; // only conforming for th elements // also has obsolete members }; @@ -851,17 +851,17 @@ interface HTMLTableCellElement : HTMLElement { interface HTMLFormElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString acceptCharset; - [CEReactions] attribute USVString action; + [CEReactions, Reflect="accept-charset"] attribute DOMString acceptCharset; + [CEReactions, ReflectSetter] attribute USVString action; [CEReactions] attribute DOMString autocomplete; [CEReactions] attribute DOMString enctype; [CEReactions] attribute DOMString encoding; [CEReactions] attribute DOMString method; - [CEReactions] attribute DOMString name; - [CEReactions] attribute boolean noValidate; - [CEReactions] attribute DOMString target; - [CEReactions] attribute DOMString rel; - [SameObject, PutForwards=value] readonly attribute DOMTokenList relList; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute boolean noValidate; + [CEReactions, Reflect] attribute DOMString target; + [CEReactions, Reflect] attribute DOMString rel; + [SameObject, PutForwards=value, Reflect="rel"] readonly attribute DOMTokenList relList; [SameObject] readonly attribute HTMLFormControlsCollection elements; readonly attribute unsigned long length; @@ -880,7 +880,7 @@ interface HTMLLabelElement : HTMLElement { [HTMLConstructor] constructor(); readonly attribute HTMLFormElement? form; - [CEReactions] attribute DOMString htmlFor; + [CEReactions, Reflect="for"] attribute DOMString htmlFor; readonly attribute HTMLElement? control; }; @@ -888,44 +888,44 @@ interface HTMLLabelElement : HTMLElement { interface HTMLInputElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString accept; - [CEReactions] attribute boolean alpha; - [CEReactions] attribute DOMString alt; - [CEReactions] attribute DOMString autocomplete; - [CEReactions] attribute boolean defaultChecked; + [CEReactions, Reflect] attribute DOMString accept; + [CEReactions, Reflect] attribute boolean alpha; + [CEReactions, Reflect] attribute DOMString alt; + [CEReactions, ReflectSetter] attribute DOMString autocomplete; + [CEReactions, Reflect="checked"] attribute boolean defaultChecked; attribute boolean checked; [CEReactions] attribute DOMString colorSpace; - [CEReactions] attribute DOMString dirName; - [CEReactions] attribute boolean disabled; + [CEReactions, Reflect] attribute DOMString dirName; + [CEReactions, Reflect] attribute boolean disabled; readonly attribute HTMLFormElement? form; attribute FileList? files; - [CEReactions] attribute USVString formAction; + [CEReactions, ReflectSetter] attribute USVString formAction; [CEReactions] attribute DOMString formEnctype; [CEReactions] attribute DOMString formMethod; - [CEReactions] attribute boolean formNoValidate; - [CEReactions] attribute DOMString formTarget; - [CEReactions] attribute unsigned long height; + [CEReactions, Reflect] attribute boolean formNoValidate; + [CEReactions, Reflect] attribute DOMString formTarget; + [CEReactions, ReflectSetter] attribute unsigned long height; attribute boolean indeterminate; readonly attribute HTMLDataListElement? list; - [CEReactions] attribute DOMString max; - [CEReactions] attribute long maxLength; - [CEReactions] attribute DOMString min; - [CEReactions] attribute long minLength; - [CEReactions] attribute boolean multiple; - [CEReactions] attribute DOMString name; - [CEReactions] attribute DOMString pattern; - [CEReactions] attribute DOMString placeholder; - [CEReactions] attribute boolean readOnly; - [CEReactions] attribute boolean required; - [CEReactions] attribute unsigned long size; - [CEReactions] attribute USVString src; - [CEReactions] attribute DOMString step; + [CEReactions, Reflect] attribute DOMString max; + [CEReactions, ReflectNonNegative] attribute long maxLength; + [CEReactions, Reflect] attribute DOMString min; + [CEReactions, ReflectNonNegative] attribute long minLength; + [CEReactions, Reflect] attribute boolean multiple; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString pattern; + [CEReactions, Reflect] attribute DOMString placeholder; + [CEReactions, Reflect] attribute boolean readOnly; + [CEReactions, Reflect] attribute boolean required; + [CEReactions, Reflect] attribute unsigned long size; + [CEReactions, ReflectURL] attribute USVString src; + [CEReactions, Reflect] attribute DOMString step; [CEReactions] attribute DOMString type; - [CEReactions] attribute DOMString defaultValue; + [CEReactions, Reflect="value"] attribute DOMString defaultValue; [CEReactions] attribute [LegacyNullToEmptyString] DOMString value; attribute object? valueAsDate; attribute unrestricted double valueAsNumber; - [CEReactions] attribute unsigned long width; + [CEReactions, ReflectSetter] attribute unsigned long width; undefined stepUp(optional long n = 1); undefined stepDown(optional long n = 1); @@ -951,24 +951,24 @@ interface HTMLInputElement : HTMLElement { // also has obsolete members }; -HTMLInputElement includes ElementPopover; +HTMLInputElement includes PopoverTargetAttributes; [Exposed=Window] interface HTMLButtonElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString command; - [CEReactions] attribute Element? commandForElement; - [CEReactions] attribute boolean disabled; + [CEReactions, ReflectSetter] attribute DOMString command; + [CEReactions, Reflect] attribute Element? commandForElement; + [CEReactions, Reflect] attribute boolean disabled; readonly attribute HTMLFormElement? form; - [CEReactions] attribute USVString formAction; + [CEReactions, ReflectSetter] attribute USVString formAction; [CEReactions] attribute DOMString formEnctype; [CEReactions] attribute DOMString formMethod; - [CEReactions] attribute boolean formNoValidate; - [CEReactions] attribute DOMString formTarget; - [CEReactions] attribute DOMString name; - [CEReactions] attribute DOMString type; - [CEReactions] attribute DOMString value; + [CEReactions, Reflect] attribute boolean formNoValidate; + [CEReactions, Reflect] attribute DOMString formTarget; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, ReflectSetter] attribute DOMString type; + [CEReactions, Reflect] attribute DOMString value; readonly attribute boolean willValidate; readonly attribute ValidityState validity; @@ -979,19 +979,19 @@ interface HTMLButtonElement : HTMLElement { readonly attribute NodeList labels; }; -HTMLButtonElement includes ElementPopover; +HTMLButtonElement includes PopoverTargetAttributes; [Exposed=Window] interface HTMLSelectElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString autocomplete; - [CEReactions] attribute boolean disabled; + [CEReactions, ReflectSetter] attribute DOMString autocomplete; + [CEReactions, Reflect] attribute boolean disabled; readonly attribute HTMLFormElement? form; - [CEReactions] attribute boolean multiple; - [CEReactions] attribute DOMString name; - [CEReactions] attribute boolean required; - [CEReactions] attribute unsigned long size; + [CEReactions, Reflect] attribute boolean multiple; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute boolean required; + [CEReactions, Reflect, ReflectDefault=0] attribute unsigned long size; readonly attribute DOMString type; @@ -1031,8 +1031,8 @@ interface HTMLDataListElement : HTMLElement { interface HTMLOptGroupElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute boolean disabled; - [CEReactions] attribute DOMString label; + [CEReactions, Reflect] attribute boolean disabled; + [CEReactions, Reflect] attribute DOMString label; }; [Exposed=Window, @@ -1040,12 +1040,12 @@ interface HTMLOptGroupElement : HTMLElement { interface HTMLOptionElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute boolean disabled; + [CEReactions, Reflect] attribute boolean disabled; readonly attribute HTMLFormElement? form; - [CEReactions] attribute DOMString label; - [CEReactions] attribute boolean defaultSelected; + [CEReactions, ReflectSetter] attribute DOMString label; + [CEReactions, Reflect="selected"] attribute boolean defaultSelected; attribute boolean selected; - [CEReactions] attribute DOMString value; + [CEReactions, ReflectSetter] attribute DOMString value; [CEReactions] attribute DOMString text; readonly attribute long index; @@ -1055,19 +1055,19 @@ interface HTMLOptionElement : HTMLElement { interface HTMLTextAreaElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString autocomplete; - [CEReactions] attribute unsigned long cols; - [CEReactions] attribute DOMString dirName; - [CEReactions] attribute boolean disabled; + [CEReactions, ReflectSetter] attribute DOMString autocomplete; + [CEReactions, ReflectPositiveWithFallback, ReflectDefault=20] attribute unsigned long cols; + [CEReactions, Reflect] attribute DOMString dirName; + [CEReactions, Reflect] attribute boolean disabled; readonly attribute HTMLFormElement? form; - [CEReactions] attribute long maxLength; - [CEReactions] attribute long minLength; - [CEReactions] attribute DOMString name; - [CEReactions] attribute DOMString placeholder; - [CEReactions] attribute boolean readOnly; - [CEReactions] attribute boolean required; - [CEReactions] attribute unsigned long rows; - [CEReactions] attribute DOMString wrap; + [CEReactions, ReflectNonNegative] attribute long maxLength; + [CEReactions, ReflectNonNegative] attribute long minLength; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString placeholder; + [CEReactions, Reflect] attribute boolean readOnly; + [CEReactions, Reflect] attribute boolean required; + [CEReactions, ReflectPositiveWithFallback, ReflectDefault=2] attribute unsigned long rows; + [CEReactions, Reflect] attribute DOMString wrap; readonly attribute DOMString type; [CEReactions] attribute DOMString defaultValue; @@ -1096,9 +1096,9 @@ interface HTMLTextAreaElement : HTMLElement { interface HTMLOutputElement : HTMLElement { [HTMLConstructor] constructor(); - [SameObject, PutForwards=value] readonly attribute DOMTokenList htmlFor; + [SameObject, PutForwards=value, Reflect="for"] readonly attribute DOMTokenList htmlFor; readonly attribute HTMLFormElement? form; - [CEReactions] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString name; readonly attribute DOMString type; [CEReactions] attribute DOMString defaultValue; @@ -1118,8 +1118,8 @@ interface HTMLOutputElement : HTMLElement { interface HTMLProgressElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute double value; - [CEReactions] attribute double max; + [CEReactions, ReflectSetter] attribute double value; + [CEReactions, ReflectPositive, ReflectDefault=1.0] attribute double max; readonly attribute double position; readonly attribute NodeList labels; }; @@ -1128,12 +1128,12 @@ interface HTMLProgressElement : HTMLElement { interface HTMLMeterElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute double value; - [CEReactions] attribute double min; - [CEReactions] attribute double max; - [CEReactions] attribute double low; - [CEReactions] attribute double high; - [CEReactions] attribute double optimum; + [CEReactions, ReflectSetter] attribute double value; + [CEReactions, ReflectSetter] attribute double min; + [CEReactions, ReflectSetter] attribute double max; + [CEReactions, ReflectSetter] attribute double low; + [CEReactions, ReflectSetter] attribute double high; + [CEReactions, ReflectSetter] attribute double optimum; readonly attribute NodeList labels; }; @@ -1141,9 +1141,9 @@ interface HTMLMeterElement : HTMLElement { interface HTMLFieldSetElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute boolean disabled; + [CEReactions, Reflect] attribute boolean disabled; readonly attribute HTMLFormElement? form; - [CEReactions] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString name; readonly attribute DOMString type; @@ -1166,6 +1166,11 @@ interface HTMLLegendElement : HTMLElement { // also has obsolete members }; +[Exposed=Window] +interface HTMLSelectedContentElement : HTMLElement { + [HTMLConstructor] constructor(); +}; + enum SelectionMode { "select", "start", @@ -1214,17 +1219,17 @@ dictionary FormDataEventInit : EventInit { interface HTMLDetailsElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString name; - [CEReactions] attribute boolean open; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute boolean open; }; [Exposed=Window] interface HTMLDialogElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute boolean open; + [CEReactions, Reflect] attribute boolean open; attribute DOMString returnValue; - [CEReactions] attribute DOMString closedBy; + [CEReactions, ReflectSetter] attribute DOMString closedBy; [CEReactions] undefined show(); [CEReactions] undefined showModal(); [CEReactions] undefined close(optional DOMString returnValue); @@ -1235,15 +1240,15 @@ interface HTMLDialogElement : HTMLElement { interface HTMLScriptElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString type; - [CEReactions] attribute USVString src; - [CEReactions] attribute boolean noModule; + [CEReactions, Reflect] attribute DOMString type; + [CEReactions, ReflectURL] attribute USVString src; + [CEReactions, Reflect] attribute boolean noModule; [CEReactions] attribute boolean async; - [CEReactions] attribute boolean defer; - [SameObject, PutForwards=value] readonly attribute DOMTokenList blocking; + [CEReactions, Reflect] attribute boolean defer; + [SameObject, PutForwards=value, Reflect] readonly attribute DOMTokenList blocking; [CEReactions] attribute DOMString? crossOrigin; [CEReactions] attribute DOMString referrerPolicy; - [CEReactions] attribute DOMString integrity; + [CEReactions, Reflect] attribute DOMString integrity; [CEReactions] attribute DOMString fetchPriority; [CEReactions] attribute DOMString text; @@ -1259,17 +1264,17 @@ interface HTMLTemplateElement : HTMLElement { readonly attribute DocumentFragment content; [CEReactions] attribute DOMString shadowRootMode; - [CEReactions] attribute boolean shadowRootDelegatesFocus; - [CEReactions] attribute boolean shadowRootClonable; - [CEReactions] attribute boolean shadowRootSerializable; - [CEReactions] attribute DOMString shadowRootCustomElementRegistry; + [CEReactions, Reflect] attribute boolean shadowRootDelegatesFocus; + [CEReactions, Reflect] attribute boolean shadowRootClonable; + [CEReactions, Reflect] attribute boolean shadowRootSerializable; + [CEReactions, Reflect] attribute DOMString shadowRootCustomElementRegistry; }; [Exposed=Window] interface HTMLSlotElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString name; sequence<Node> assignedNodes(optional AssignedNodesOptions options = {}); sequence<Element> assignedElements(optional AssignedNodesOptions options = {}); undefined assign((Element or Text)... nodes); @@ -1793,8 +1798,8 @@ dictionary DragEventInit : MouseEventInit { DataTransfer? dataTransfer = null; }; -interface mixin ElementPopover { - [CEReactions] attribute Element? popoverTargetElement; +interface mixin PopoverTargetAttributes { + [CEReactions, Reflect] attribute Element? popoverTargetElement; [CEReactions] attribute DOMString popoverTargetAction; }; @@ -2651,9 +2656,9 @@ interface Worker : EventTarget { }; dictionary WorkerOptions { + DOMString name = ""; WorkerType type = "classic"; RequestCredentials credentials = "same-origin"; // credentials is only used if type is "module" - DOMString name = ""; }; enum WorkerType { "classic", "module" }; @@ -2750,17 +2755,17 @@ dictionary StorageEventInit : EventInit { interface HTMLMarqueeElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString behavior; - [CEReactions] attribute DOMString bgColor; - [CEReactions] attribute DOMString direction; - [CEReactions] attribute DOMString height; - [CEReactions] attribute unsigned long hspace; + [CEReactions, Reflect] attribute DOMString behavior; + [CEReactions, Reflect] attribute DOMString bgColor; + [CEReactions, Reflect] attribute DOMString direction; + [CEReactions, Reflect] attribute DOMString height; + [CEReactions, Reflect] attribute unsigned long hspace; [CEReactions] attribute long loop; - [CEReactions] attribute unsigned long scrollAmount; - [CEReactions] attribute unsigned long scrollDelay; - [CEReactions] attribute boolean trueSpeed; - [CEReactions] attribute unsigned long vspace; - [CEReactions] attribute DOMString width; + [CEReactions, Reflect, ReflectDefault=6] attribute unsigned long scrollAmount; + [CEReactions, Reflect, ReflectDefault=85] attribute unsigned long scrollDelay; + [CEReactions, Reflect] attribute boolean trueSpeed; + [CEReactions, Reflect] attribute unsigned long vspace; + [CEReactions, Reflect] attribute DOMString width; undefined start(); undefined stop(); @@ -2770,8 +2775,8 @@ interface HTMLMarqueeElement : HTMLElement { interface HTMLFrameSetElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString cols; - [CEReactions] attribute DOMString rows; + [CEReactions, Reflect] attribute DOMString cols; + [CEReactions, Reflect] attribute DOMString rows; }; HTMLFrameSetElement includes WindowEventHandlers; @@ -2779,242 +2784,242 @@ HTMLFrameSetElement includes WindowEventHandlers; interface HTMLFrameElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString name; - [CEReactions] attribute DOMString scrolling; - [CEReactions] attribute USVString src; - [CEReactions] attribute DOMString frameBorder; - [CEReactions] attribute USVString longDesc; - [CEReactions] attribute boolean noResize; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString scrolling; + [CEReactions, ReflectURL] attribute USVString src; + [CEReactions, Reflect] attribute DOMString frameBorder; + [CEReactions, ReflectURL] attribute USVString longDesc; + [CEReactions, Reflect] attribute boolean noResize; readonly attribute Document? contentDocument; readonly attribute WindowProxy? contentWindow; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString marginHeight; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString marginWidth; }; partial interface HTMLAnchorElement { - [CEReactions] attribute DOMString coords; - [CEReactions] attribute DOMString charset; - [CEReactions] attribute DOMString name; - [CEReactions] attribute DOMString rev; - [CEReactions] attribute DOMString shape; + [CEReactions, Reflect] attribute DOMString coords; + [CEReactions, Reflect] attribute DOMString charset; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString rev; + [CEReactions, Reflect] attribute DOMString shape; }; partial interface HTMLAreaElement { - [CEReactions] attribute boolean noHref; + [CEReactions, Reflect] attribute boolean noHref; }; partial interface HTMLBodyElement { - [CEReactions] attribute [LegacyNullToEmptyString] DOMString text; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString link; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString vLink; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString aLink; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; - [CEReactions] attribute DOMString background; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString text; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString link; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString vLink; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString aLink; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString bgColor; + [CEReactions, Reflect] attribute DOMString background; }; partial interface HTMLBRElement { - [CEReactions] attribute DOMString clear; + [CEReactions, Reflect] attribute DOMString clear; }; partial interface HTMLTableCaptionElement { - [CEReactions] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString align; }; partial interface HTMLTableColElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString ch; - [CEReactions] attribute DOMString chOff; - [CEReactions] attribute DOMString vAlign; - [CEReactions] attribute DOMString width; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect="char"] attribute DOMString ch; + [CEReactions, Reflect="charoff"] attribute DOMString chOff; + [CEReactions, Reflect] attribute DOMString vAlign; + [CEReactions, Reflect] attribute DOMString width; }; [Exposed=Window] interface HTMLDirectoryElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute boolean compact; + [CEReactions, Reflect] attribute boolean compact; }; partial interface HTMLDivElement { - [CEReactions] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString align; }; partial interface HTMLDListElement { - [CEReactions] attribute boolean compact; + [CEReactions, Reflect] attribute boolean compact; }; partial interface HTMLEmbedElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString name; }; [Exposed=Window] interface HTMLFontElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute [LegacyNullToEmptyString] DOMString color; - [CEReactions] attribute DOMString face; - [CEReactions] attribute DOMString size; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString color; + [CEReactions, Reflect] attribute DOMString face; + [CEReactions, Reflect] attribute DOMString size; }; partial interface HTMLHeadingElement { - [CEReactions] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString align; }; partial interface HTMLHRElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString color; - [CEReactions] attribute boolean noShade; - [CEReactions] attribute DOMString size; - [CEReactions] attribute DOMString width; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString color; + [CEReactions, Reflect] attribute boolean noShade; + [CEReactions, Reflect] attribute DOMString size; + [CEReactions, Reflect] attribute DOMString width; }; partial interface HTMLHtmlElement { - [CEReactions] attribute DOMString version; + [CEReactions, Reflect] attribute DOMString version; }; partial interface HTMLIFrameElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString scrolling; - [CEReactions] attribute DOMString frameBorder; - [CEReactions] attribute USVString longDesc; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString scrolling; + [CEReactions, Reflect] attribute DOMString frameBorder; + [CEReactions, ReflectURL] attribute USVString longDesc; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString marginHeight; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString marginWidth; }; partial interface HTMLImageElement { - [CEReactions] attribute DOMString name; - [CEReactions] attribute USVString lowsrc; - [CEReactions] attribute DOMString align; - [CEReactions] attribute unsigned long hspace; - [CEReactions] attribute unsigned long vspace; - [CEReactions] attribute USVString longDesc; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, ReflectURL] attribute USVString lowsrc; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute unsigned long hspace; + [CEReactions, Reflect] attribute unsigned long vspace; + [CEReactions, ReflectURL] attribute USVString longDesc; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString border; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString border; }; partial interface HTMLInputElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString useMap; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString useMap; }; partial interface HTMLLegendElement { - [CEReactions] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString align; }; partial interface HTMLLIElement { - [CEReactions] attribute DOMString type; + [CEReactions, Reflect] attribute DOMString type; }; partial interface HTMLLinkElement { - [CEReactions] attribute DOMString charset; - [CEReactions] attribute DOMString rev; - [CEReactions] attribute DOMString target; + [CEReactions, Reflect] attribute DOMString charset; + [CEReactions, Reflect] attribute DOMString rev; + [CEReactions, Reflect] attribute DOMString target; }; partial interface HTMLMenuElement { - [CEReactions] attribute boolean compact; + [CEReactions, Reflect] attribute boolean compact; }; partial interface HTMLMetaElement { - [CEReactions] attribute DOMString scheme; + [CEReactions, Reflect] attribute DOMString scheme; }; partial interface HTMLObjectElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString archive; - [CEReactions] attribute DOMString code; - [CEReactions] attribute boolean declare; - [CEReactions] attribute unsigned long hspace; - [CEReactions] attribute DOMString standby; - [CEReactions] attribute unsigned long vspace; - [CEReactions] attribute DOMString codeBase; - [CEReactions] attribute DOMString codeType; - [CEReactions] attribute DOMString useMap; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString archive; + [CEReactions, Reflect] attribute DOMString code; + [CEReactions, Reflect] attribute boolean declare; + [CEReactions, Reflect] attribute unsigned long hspace; + [CEReactions, Reflect] attribute DOMString standby; + [CEReactions, Reflect] attribute unsigned long vspace; + [CEReactions, ReflectURL] attribute DOMString codeBase; + [CEReactions, Reflect] attribute DOMString codeType; + [CEReactions, Reflect] attribute DOMString useMap; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString border; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString border; }; partial interface HTMLOListElement { - [CEReactions] attribute boolean compact; + [CEReactions, Reflect] attribute boolean compact; }; partial interface HTMLParagraphElement { - [CEReactions] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString align; }; [Exposed=Window] interface HTMLParamElement : HTMLElement { [HTMLConstructor] constructor(); - [CEReactions] attribute DOMString name; - [CEReactions] attribute DOMString value; - [CEReactions] attribute DOMString type; - [CEReactions] attribute DOMString valueType; + [CEReactions, Reflect] attribute DOMString name; + [CEReactions, Reflect] attribute DOMString value; + [CEReactions, Reflect] attribute DOMString type; + [CEReactions, Reflect] attribute DOMString valueType; }; partial interface HTMLPreElement { - [CEReactions] attribute long width; + [CEReactions, Reflect] attribute long width; }; partial interface HTMLStyleElement { - [CEReactions] attribute DOMString type; + [CEReactions, Reflect] attribute DOMString type; }; partial interface HTMLScriptElement { - [CEReactions] attribute DOMString charset; - [CEReactions] attribute DOMString event; - [CEReactions] attribute DOMString htmlFor; + [CEReactions, Reflect] attribute DOMString charset; + [CEReactions, Reflect] attribute DOMString event; + [CEReactions, Reflect="for"] attribute DOMString htmlFor; }; partial interface HTMLTableElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString border; - [CEReactions] attribute DOMString frame; - [CEReactions] attribute DOMString rules; - [CEReactions] attribute DOMString summary; - [CEReactions] attribute DOMString width; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString border; + [CEReactions, Reflect] attribute DOMString frame; + [CEReactions, Reflect] attribute DOMString rules; + [CEReactions, Reflect] attribute DOMString summary; + [CEReactions, Reflect] attribute DOMString width; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString cellPadding; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString cellSpacing; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString bgColor; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString cellPadding; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString cellSpacing; }; partial interface HTMLTableSectionElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString ch; - [CEReactions] attribute DOMString chOff; - [CEReactions] attribute DOMString vAlign; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect="char"] attribute DOMString ch; + [CEReactions, Reflect="charoff"] attribute DOMString chOff; + [CEReactions, Reflect] attribute DOMString vAlign; }; partial interface HTMLTableCellElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString axis; - [CEReactions] attribute DOMString height; - [CEReactions] attribute DOMString width; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect] attribute DOMString axis; + [CEReactions, Reflect] attribute DOMString height; + [CEReactions, Reflect] attribute DOMString width; - [CEReactions] attribute DOMString ch; - [CEReactions] attribute DOMString chOff; - [CEReactions] attribute boolean noWrap; - [CEReactions] attribute DOMString vAlign; + [CEReactions, Reflect="char"] attribute DOMString ch; + [CEReactions, Reflect="charoff"] attribute DOMString chOff; + [CEReactions, Reflect] attribute boolean noWrap; + [CEReactions, Reflect] attribute DOMString vAlign; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString bgColor; }; partial interface HTMLTableRowElement { - [CEReactions] attribute DOMString align; - [CEReactions] attribute DOMString ch; - [CEReactions] attribute DOMString chOff; - [CEReactions] attribute DOMString vAlign; + [CEReactions, Reflect] attribute DOMString align; + [CEReactions, Reflect="char"] attribute DOMString ch; + [CEReactions, Reflect="charoff"] attribute DOMString chOff; + [CEReactions, Reflect] attribute DOMString vAlign; - [CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor; + [CEReactions, Reflect] attribute [LegacyNullToEmptyString] DOMString bgColor; }; partial interface HTMLUListElement { - [CEReactions] attribute boolean compact; - [CEReactions] attribute DOMString type; + [CEReactions, Reflect] attribute boolean compact; + [CEReactions, Reflect] attribute DOMString type; }; partial interface Document { diff --git a/tests/wpt/tests/interfaces/largest-contentful-paint.idl b/tests/wpt/tests/interfaces/largest-contentful-paint.idl index d1630cc7daa..4eb5c7fa475 100644 --- a/tests/wpt/tests/interfaces/largest-contentful-paint.idl +++ b/tests/wpt/tests/interfaces/largest-contentful-paint.idl @@ -6,6 +6,7 @@ [Exposed=Window] interface LargestContentfulPaint : PerformanceEntry { readonly attribute DOMHighResTimeStamp loadTime; + readonly attribute DOMHighResTimeStamp renderTime; readonly attribute unsigned long size; readonly attribute DOMString id; readonly attribute DOMString url; diff --git a/tests/wpt/tests/interfaces/mediaqueries-5.idl b/tests/wpt/tests/interfaces/mediaqueries-5.idl index 52154c96725..c951c356ca3 100644 --- a/tests/wpt/tests/interfaces/mediaqueries-5.idl +++ b/tests/wpt/tests/interfaces/mediaqueries-5.idl @@ -3,6 +3,14 @@ // (https://github.com/w3c/webref) // Source: Media Queries Level 5 (https://drafts.csswg.org/mediaqueries-5/) +typedef (MediaList or boolean) CustomMediaQuery; + +[Exposed=Window] +interface CSSCustomMediaRule : CSSRule { + readonly attribute CSSOMString name; + readonly attribute CustomMediaQuery query; +}; + [Exposed=Window, SecureContext] partial interface Navigator { [SameObject] readonly attribute PreferenceManager preferences; diff --git a/tests/wpt/tests/interfaces/notifications.idl b/tests/wpt/tests/interfaces/notifications.idl index 4300b171071..eeb26424bce 100644 --- a/tests/wpt/tests/interfaces/notifications.idl +++ b/tests/wpt/tests/interfaces/notifications.idl @@ -21,6 +21,7 @@ interface Notification : EventTarget { readonly attribute NotificationDirection dir; readonly attribute DOMString lang; readonly attribute DOMString body; + readonly attribute USVString navigate; readonly attribute DOMString tag; readonly attribute USVString image; readonly attribute USVString icon; @@ -40,6 +41,7 @@ dictionary NotificationOptions { NotificationDirection dir = "auto"; DOMString lang = ""; DOMString body = ""; + USVString navigate; DOMString tag = ""; USVString image; USVString icon; @@ -68,6 +70,7 @@ enum NotificationDirection { dictionary NotificationAction { required DOMString action; required DOMString title; + USVString navigate; USVString icon; }; diff --git a/tests/wpt/tests/interfaces/privacy-preserving-attribution.idl b/tests/wpt/tests/interfaces/privacy-preserving-attribution.idl index 666460bbbb5..2cf43b1e9bc 100644 --- a/tests/wpt/tests/interfaces/privacy-preserving-attribution.idl +++ b/tests/wpt/tests/interfaces/privacy-preserving-attribution.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Attribution Level 1 (https://w3c.github.io/ppa/) +// Source: Attribution Level 1 (https://w3c.github.io/attribution/) partial interface Navigator { [SecureContext, SameObject] readonly attribute Attribution attribution; diff --git a/tests/wpt/tests/interfaces/push-api.idl b/tests/wpt/tests/interfaces/push-api.idl index b16a730b722..a1de7a416b6 100644 --- a/tests/wpt/tests/interfaces/push-api.idl +++ b/tests/wpt/tests/interfaces/push-api.idl @@ -73,14 +73,16 @@ partial interface ServiceWorkerGlobalScope { interface PushEvent : ExtendableEvent { constructor(DOMString type, optional PushEventInit eventInitDict = {}); readonly attribute PushMessageData? data; + readonly attribute Notification? notification; +}; + +dictionary PushEventInit : ExtendableEventInit { + PushMessageDataInit? data = null; + Notification? notification = null; }; typedef (BufferSource or USVString) PushMessageDataInit; -dictionary PushEventInit : ExtendableEventInit { - PushMessageDataInit data; -}; - [Exposed=ServiceWorker, SecureContext] interface PushSubscriptionChangeEvent : ExtendableEvent { constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {}); diff --git a/tests/wpt/tests/interfaces/shared-storage.idl b/tests/wpt/tests/interfaces/shared-storage.idl index e3e221a3aa7..d44997faf19 100644 --- a/tests/wpt/tests/interfaces/shared-storage.idl +++ b/tests/wpt/tests/interfaces/shared-storage.idl @@ -105,7 +105,7 @@ interface SharedStorage { Promise<double> remainingBudget(); [Exposed=SharedStorageWorklet] - async iterable<DOMString, DOMString>; + async_iterable<DOMString, DOMString>; }; dictionary SharedStoragePrivateAggregationConfig { diff --git a/tests/wpt/tests/interfaces/streams.idl b/tests/wpt/tests/interfaces/streams.idl index ab9be033e43..8abc8f5cfda 100644 --- a/tests/wpt/tests/interfaces/streams.idl +++ b/tests/wpt/tests/interfaces/streams.idl @@ -17,7 +17,7 @@ interface ReadableStream { Promise<undefined> pipeTo(WritableStream destination, optional StreamPipeOptions options = {}); sequence<ReadableStream> tee(); - async iterable<any>(optional ReadableStreamIteratorOptions options = {}); + async_iterable<any>(optional ReadableStreamIteratorOptions options = {}); }; typedef (ReadableStreamDefaultReader or ReadableStreamBYOBReader) ReadableStreamReader; diff --git a/tests/wpt/tests/interfaces/webidl.idl b/tests/wpt/tests/interfaces/webidl.idl index f3db91096ac..651c1922115 100644 --- a/tests/wpt/tests/interfaces/webidl.idl +++ b/tests/wpt/tests/interfaces/webidl.idl @@ -3,6 +3,19 @@ // (https://github.com/w3c/webref) // Source: Web IDL Standard (https://webidl.spec.whatwg.org/) +[Exposed=*, Serializable] +interface QuotaExceededError : DOMException { + constructor(optional DOMString message = "", optional QuotaExceededErrorOptions options = {}); + + readonly attribute double? quota; + readonly attribute double? requested; +}; + +dictionary QuotaExceededErrorOptions { + double quota; + double requested; +}; + typedef (Int8Array or Int16Array or Int32Array or Uint8Array or Uint16Array or Uint32Array or Uint8ClampedArray or BigInt64Array or BigUint64Array or diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl index 8d0e485bc76..3490f40e832 100644 --- a/tests/wpt/tests/interfaces/webnn.idl +++ b/tests/wpt/tests/interfaces/webnn.idl @@ -369,6 +369,8 @@ partial interface MLGraphBuilder { MLOperand logicalXor(MLOperand a, MLOperand b, optional MLOperatorOptions options = {}); + MLOperand isNaN(MLOperand a, optional MLOperatorOptions options = {}); + MLOperand isInfinite(MLOperand a, optional MLOperatorOptions options = {}); }; dictionary MLLogicalNotSupportLimits { @@ -387,6 +389,8 @@ partial dictionary MLOpSupportLimits { MLBinarySupportLimits logicalAnd; MLBinarySupportLimits logicalOr; MLBinarySupportLimits logicalXor; + MLLogicalNotSupportLimits isNaN; + MLLogicalNotSupportLimits isInfinite; }; partial interface MLGraphBuilder { @@ -400,6 +404,7 @@ partial interface MLGraphBuilder { MLOperand log(MLOperand input, optional MLOperatorOptions options = {}); MLOperand neg(MLOperand input, optional MLOperatorOptions options = {}); MLOperand reciprocal(MLOperand input, optional MLOperatorOptions options = {}); + MLOperand roundEven(MLOperand input, optional MLOperatorOptions options = {}); MLOperand sin(MLOperand input, optional MLOperatorOptions options = {}); MLOperand sign(MLOperand input, optional MLOperatorOptions options = {}); MLOperand sqrt(MLOperand input, optional MLOperatorOptions options = {}); @@ -417,6 +422,7 @@ partial dictionary MLOpSupportLimits { MLSingleInputSupportLimits log; MLSingleInputSupportLimits neg; MLSingleInputSupportLimits reciprocal; + MLSingleInputSupportLimits roundEven; MLSingleInputSupportLimits sin; MLSingleInputSupportLimits sign; MLSingleInputSupportLimits sqrt; diff --git a/tests/wpt/tests/interfaces/webrtc-identity.idl b/tests/wpt/tests/interfaces/webrtc-identity.idl index 108c3ad9b11..69597acea62 100644 --- a/tests/wpt/tests/interfaces/webrtc-identity.idl +++ b/tests/wpt/tests/interfaces/webrtc-identity.idl @@ -19,7 +19,7 @@ dictionary RTCIdentityProvider { }; callback GenerateAssertionCallback = Promise<RTCIdentityAssertionResult> -(DOMString contents, DOMString origin, RTCIdentityProviderOptions options); +(DOMString contents, DOMString origin, optional RTCIdentityProviderOptions options = {}); callback ValidateAssertionCallback = Promise<RTCIdentityValidationResult> (DOMString assertion, DOMString origin); diff --git a/tests/wpt/tests/interfaces/webrtc-stats.idl b/tests/wpt/tests/interfaces/webrtc-stats.idl index 13f74c110d0..b5eff2d0bf5 100644 --- a/tests/wpt/tests/interfaces/webrtc-stats.idl +++ b/tests/wpt/tests/interfaces/webrtc-stats.idl @@ -117,7 +117,6 @@ dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats { dictionary RTCSentRtpStreamStats : RTCRtpStreamStats { unsigned long long packetsSent; unsigned long long bytesSent; - unsigned long long packetsSentWithEct1; }; dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats { @@ -154,6 +153,7 @@ dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats { boolean powerEfficientEncoder; boolean active; DOMString scalabilityMode; + unsigned long long packetsSentWithEct1; }; enum RTCQualityLimitationReason { diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html index cf722603e1d..c71d48b898f 100644 --- a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html +++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html @@ -1,11 +1,22 @@ <!DOCTYPE html> <title>&lt;semantics&gt - mozilla bug 21479 (reference)</title> <meta charset="utf-8"/> +<style> +@font-face { + font-family: operators; + src: url("/fonts/math/operators.woff"); +} +math, math * { + font-family: operators; + font-size: 32px; + color: purple; +} +</style> <p> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mover> - <mspace width="300px" height="10px" mathbackground="black"></mspace> - <mo>&#xaf;</mo> + <mspace width="300px" height="10px" mathbackground="blue"></mspace> + <mo>&#x21AC;<!-- Rightwards Arrow With Loop --></mo> </mover> </math> </p> diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html index e4fe611c475..55c99f268aa 100644 --- a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html +++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html @@ -3,13 +3,24 @@ <meta charset="utf-8"/> <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=21479"> <link rel="help" href="https://w3c.github.io/mathml-core/#semantics-and-presentation"> +<style> +@font-face { + font-family: operators; + src: url("/fonts/math/operators.woff"); +} +math, math * { + font-family: operators; + font-size: 32px; + color: purple; +} +</style> <link rel="match" href="semantics-005-ref.html"> <meta name="assert" content="The embellished operator made of a single mo inside a semantics element is treated the same as the mo alone."> <p> <math xmlns="http://www.w3.org/1998/Math/MathML"> <mover> - <mspace width="300px" height="10px" mathbackground="black"></mspace> - <semantics><mo>&#xaf;</mo></semantics> + <mspace width="300px" height="10px" mathbackground="blue"></mspace> + <semantics><mo>&#x21AC<!-- Rightwards Arrow With Loop --></mo></semantics> </mover> </math> </p> diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/cramped-001.html b/tests/wpt/tests/mathml/presentation-markup/scripts/cramped-001.html index e03b4d968d2..678897e8daf 100644 --- a/tests/wpt/tests/mathml/presentation-markup/scripts/cramped-001.html +++ b/tests/wpt/tests/mathml/presentation-markup/scripts/cramped-001.html @@ -145,7 +145,7 @@ assert_cramped("css-002", true); assert_cramped("css-003", true); assert_cramped("css-004", false); - }, "element with specified CSS math-style"); + }, "element with specified CSS math-shift"); done(); } diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-computed.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-computed.html new file mode 100644 index 00000000000..075bc6f36fd --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-computed.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-depth with computed values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-script-level-property"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<body> +<math id="target"></math> +<script> + test_computed_value("math-depth", "0"); + test_computed_value("math-depth", "1"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-invalid.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-invalid.html new file mode 100644 index 00000000000..2220ef8f761 --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-invalid.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-depth with invalid values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-script-level-property"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> + test_invalid_value("math-depth", "auto"); + test_invalid_value("math-depth", "invalid"); + test_invalid_value("math-depth", "add"); + test_invalid_value("math-depth", "add(0.5)"); + test_invalid_value("math-depth", "add(1px)"); + test_invalid_value("math-depth", "0.5"); + test_invalid_value("math-depth", "1px"); + test_invalid_value("math-depth", "auto-add add(1)"); + test_invalid_value("math-depth", "auto-add 1"); + test_invalid_value("math-depth", "add(1) 1"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-valid.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-valid.html new file mode 100644 index 00000000000..b4401873690 --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-depth-valid.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-depth with valid values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-script-level-property"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> + test_valid_value("math-depth", "auto-add"); + test_valid_value("math-depth", "add(0)"); + test_valid_value("math-depth", "add(1)"); + test_valid_value("math-depth", "0"); + test_valid_value("math-depth", "1"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-computed.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-computed.html new file mode 100644 index 00000000000..f95214f3708 --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-computed.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-shift with computed values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-shift"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<body> +<math id="target"></math> +<script> + test_computed_value("math-shift", "normal"); + test_computed_value("math-shift", "compact"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-invalid.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-invalid.html new file mode 100644 index 00000000000..4fbd4b62e9d --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-invalid.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-shift with invalid values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-shift"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> + test_invalid_value("math-shift", "auto"); + test_invalid_value("math-shift", "invalid"); + test_invalid_value("math-shift", "normal compact"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-valid.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-valid.html new file mode 100644 index 00000000000..a9949930fc1 --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-shift-valid.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-shift with valid values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-shift"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> + test_valid_value("math-shift", "normal"); + test_valid_value("math-shift", "compact"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-computed.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-computed.html new file mode 100644 index 00000000000..3bf9ee5823c --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-computed.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-style with computed values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-style-property"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +</head> +<body> +<math id="target"></math> +<script> + test_computed_value("math-style", "normal"); + test_computed_value("math-style", "compact"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-invalid.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-invalid.html new file mode 100644 index 00000000000..e5ce54953ae --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-invalid.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-style with invalid values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-style-property"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> + test_invalid_value("math-style", "auto"); + test_invalid_value("math-style", "invalid"); + test_invalid_value("math-style", "normal compact"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-valid.html b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-valid.html new file mode 100644 index 00000000000..dd6a409e935 --- /dev/null +++ b/tests/wpt/tests/mathml/relations/css-styling/parsing/math-style-valid.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>MathML Core: parsing math-style with valid values</title> +<link rel="author" title="Eri Pazos" href="mailto:eri@igalia.com"> +<link rel="help" href="https://w3c.github.io/mathml-core/#the-math-style-property"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> + test_valid_value("math-style", "normal"); + test_valid_value("math-style", "compact"); +</script> +</body> +</html> diff --git a/tests/wpt/tests/navigation-api/navigate-event/navigate-multiple-navigation-navigate.html b/tests/wpt/tests/navigation-api/navigate-event/navigate-multiple-navigation-navigate.html new file mode 100644 index 00000000000..47d78c84ea5 --- /dev/null +++ b/tests/wpt/tests/navigation-api/navigate-event/navigate-multiple-navigation-navigate.html @@ -0,0 +1,38 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<form id="form" action=""></form> +<script> +async_test(t => { + const expected = [ + "navigate #1", + "navigateerror #1", + "navigate #3", + "navigateerror #3", + "navigate #2", + "navigatesuccess #2" + ]; + + const result = []; + navigation.onnavigate = t.step_func(e => { + result.push(`${e.type} ${new URL(e.destination.url).hash}`); + }); + + navigation.onnavigateerror = t.step_func(e => { + result.push(`${e.type} ${new URL(navigation.currentEntry.url).hash}`); + + if (navigation.currentEntry.url.endsWith("#1")) { + navigation.navigate("#3"); + } + }); + + navigation.onnavigatesuccess = t.step_func_done(e => { + result.push(`${e.type} ${new URL(navigation.currentEntry.url).hash}`); + assert_array_equals(result, expected); + }); + + navigation.navigate("#1"); + navigation.navigate("#2"); + +}, "navigation.navigate() multiple times gives correct event order"); +</script> diff --git a/tests/wpt/tests/orientation-sensor/AbsoluteOrientationSensor-iframe-access.https.html b/tests/wpt/tests/orientation-sensor/AbsoluteOrientationSensor-iframe-access.https.html index 599bff7b4a3..5446e73c523 100644 --- a/tests/wpt/tests/orientation-sensor/AbsoluteOrientationSensor-iframe-access.https.html +++ b/tests/wpt/tests/orientation-sensor/AbsoluteOrientationSensor-iframe-access.https.html @@ -1,5 +1,6 @@ <!DOCTYPE html> <meta charset="utf-8"> +<meta name="timeout" content="long"> <title>AbsoluteOrientationSensor iframe test</title> <link rel="author" title="Intel" href="http://www.intel.com"> <link rel="help" href="https://www.w3.org/TR/orientation-sensor/"> diff --git a/tests/wpt/tests/pointerevents/pointerevent_boundary_events_attributes_during_drag.html b/tests/wpt/tests/pointerevents/pointerevent_boundary_events_attributes_during_drag.html new file mode 100644 index 00000000000..04a758d1dba --- /dev/null +++ b/tests/wpt/tests/pointerevents/pointerevent_boundary_events_attributes_during_drag.html @@ -0,0 +1,166 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<title>Attributes of boundary events during dragging mouse</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> +<style> +div.target { + margin: 0; + width: 100%; + height: 16px; +} +</style> +<script> +"use strict"; + +addEventListener("load", () => { + promise_test(async () => { + const body = document.body; + for (let i = 0; i < 6; i++) { + const div = document.createElement("div"); + div.setAttribute("class", "target"); + div.setAttribute("id", `div${i}`); + body.appendChild(div); + } + body.firstElementChild.getBoundingClientRect(); + + let record = false; + const mouseEvents = [], pointerEvents = []; + function recordEvent(event) { + if (!record || !event.target.id) { + return; + } + const e = { + type: event.type, + target: `<${event.target.localName} id="${event.target.id}">`, + button: event.button, + buttons: event.buttons, + pointerId: event.pointerId, + pointerType: event.pointerType, + }; + if (event.pointerId != undefined) { + pointerEvents.push(e); + } else { + mouseEvents.push(e); + } + } + for (const type of ["mouseover", "mouseout", "mouseenter", "mouseleave", + "pointerover", "pointerout", "pointerenter", "pointerleave"]) { + body.addEventListener(type, recordEvent, {capture: true}); + } + let pointerId = 0; + body.addEventListener("pointerdown", event => { + record = true; + pointerId = event.pointerId; + }, {once: true, capture: true}); + body.addEventListener("pointerup", event => { + record = false; + }, {once: true, capture: true}); + body.addEventListener("dragstart", event => { + // We want to check the boundary events during a drag so that we want + // a native drag session. + event.preventDefault(); + }, {once: true, capture: true}); + + document.getElementById("div3").addEventListener("pointerenter", event => { + requestAnimationFrame(() => { + // Remove div3 causes moving div4 underneath the cursor + event.target.remove(); + document.getElementById("div4").getBoundingClientRect(); + }); + }, {once: true, capture: true}); + document.getElementById("div4").addEventListener("pointerenter", event => { + requestAnimationFrame(() => { + // Remove div4 causes moving div5 underneath the cursor + event.target.remove(); + document.getElementById("div5").getBoundingClientRect(); + }); + }, {once: true, capture: true}); + + await new test_driver.Actions() + .pointerMove(0, 0, { origin: document.getElementById("div0") }) + .pointerDown() + .pointerMove(0, 0, { origin: document.getElementById("div1") }) + .pointerMove(0, 0, { origin: document.getElementById("div2") }) + .pointerMove(0, 0, { origin: document.getElementById("div3") }) + .pause(500) + .pointerUp() + .send(); + + function stringifyEvent(event) { + return event.pointerId != undefined + ? `{ type: "${event.type}", target: ${event.target}, button: ${event.button}, buttons: ${ + event.buttons + }, pointerId: ${event.pointerId}, pointerType: "${event.pointerType}"}` + : `{ type: "${event.type}", target: ${event.target}, button: ${event.button}, buttons: ${ + event.buttons + }`; + } + function stringifyEvents(events) { + let str = "["; + for (const event of events) { + if (str != "[") { + str += ", "; + } + str += stringifyEvent(event); + } + return str + "]"; + } + + test(() => { + assert_equals( + stringifyEvents(mouseEvents), + stringifyEvents([ + { type: "mouseout", target: '<div id="div0">', buttons: 1, button: 0 }, + { type: "mouseleave", target: '<div id="div0">', buttons: 1, button: 0 }, + { type: "mouseover", target: '<div id="div1">', buttons: 1, button: 0 }, + { type: "mouseenter", target: '<div id="div1">', buttons: 1, button: 0 }, + { type: "mouseout", target: '<div id="div1">', buttons: 1, button: 0 }, + { type: "mouseleave", target: '<div id="div1">', buttons: 1, button: 0 }, + { type: "mouseover", target: '<div id="div2">', buttons: 1, button: 0 }, + { type: "mouseenter", target: '<div id="div2">', buttons: 1, button: 0 }, + { type: "mouseout", target: '<div id="div2">', buttons: 1, button: 0 }, + { type: "mouseleave", target: '<div id="div2">', buttons: 1, button: 0 }, + { type: "mouseover", target: '<div id="div3">', buttons: 1, button: 0 }, + { type: "mouseenter", target: '<div id="div3">', buttons: 1, button: 0 }, + { type: "mouseover", target: '<div id="div4">', buttons: 1, button: 0 }, + { type: "mouseenter", target: '<div id="div4">', buttons: 1, button: 0 }, + { type: "mouseover", target: '<div id="div5">', buttons: 1, button: 0 }, + { type: "mouseenter", target: '<div id="div5">', buttons: 1, button: 0 }, + ]), + "Mouse boundary events should have the state of primary button pressed" + ); + }); + assert_equals( + stringifyEvents(pointerEvents), + stringifyEvents([ + { type: "pointerout", target: '<div id="div0">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerleave", target: '<div id="div0">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerover", target: '<div id="div1">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerenter", target: '<div id="div1">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerout", target: '<div id="div1">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerleave", target: '<div id="div1">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerover", target: '<div id="div2">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerenter", target: '<div id="div2">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerout", target: '<div id="div2">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerleave", target: '<div id="div2">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerover", target: '<div id="div3">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerenter", target: '<div id="div3">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerover", target: '<div id="div4">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerenter", target: '<div id="div4">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerover", target: '<div id="div5">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + { type: "pointerenter", target: '<div id="div5">', buttons: 1, button: -1, pointerId, pointerType: "mouse" }, + ]), + "Pointer boundary events should have the state of primary button pressed" + ); + }); +}, {once: true}); +</script> +</head> +<body></body> +</html> diff --git a/tests/wpt/tests/resource-timing/initiator-type/resources/dummy.svg b/tests/wpt/tests/resource-timing/initiator-type/resources/dummy.svg new file mode 100644 index 00000000000..37d6c7440ff --- /dev/null +++ b/tests/wpt/tests/resource-timing/initiator-type/resources/dummy.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <symbol id="icon" viewBox="0 0 100 100"> + <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" /> + </symbol> +</svg> + diff --git a/tests/wpt/tests/resource-timing/initiator-type/svg.html b/tests/wpt/tests/resource-timing/initiator-type/svg.html index d92f5935d80..f33a12ef481 100644 --- a/tests/wpt/tests/resource-timing/initiator-type/svg.html +++ b/tests/wpt/tests/resource-timing/initiator-type/svg.html @@ -16,8 +16,12 @@ xmlns:xlink="http://www.w3.org/1999/xlink"> <image href="/resource-timing/resources/blue.png" height="200" width="200"/> </svg> +<svg style="display: none;"> + <use href="/resource-timing/resources/dummy.svg"></use> +</svg> <script> initiator_type_test("blue.png", "image", "<image> in an <svg>"); + initiator_type_test("dummy.svg", "other", "<use> in an <svg>"); </script> </body> </html> diff --git a/tests/wpt/tests/resource-timing/resources/test-initiator.js b/tests/wpt/tests/resource-timing/resources/test-initiator.js index 7c354243260..c6ad50a9db9 100644 --- a/tests/wpt/tests/resource-timing/resources/test-initiator.js +++ b/tests/wpt/tests/resource-timing/resources/test-initiator.js @@ -1,40 +1,25 @@ -function testResourceInitiatorUrl(resourceName, expectedUrl) { - return new Promise(( resolve , reject) => { - const observer = new PerformanceObserver(list => { - const entries = list.getEntriesByType('resource'); - for (const entry of entries) { - if (entry.name.endsWith(resourceName)) { - observer.disconnect(); - try { - assert_equals(entry.initiatorUrl, expectedUrl, `Test ${resourceName} initiatorUrl`); - resolve(); - } catch(error) { - reject(error); - } - } - } - reject(resourceName + " not found"); - }); - observer.observe({type: "resource", buffered: true}); - }); +if (observe_entry === undefined) { + throw new Error("You must include resource-timing/resources/observe-entry.js " + + "before including this script."); } -// TODO(guohuideng@microsoft.com): The utility function below is used by some tests designed -// for resource IDs. Either delete them or modify them when the resource-initiator feature -// is complete. -function testResourceInitiator(resourceName, expectedInitiator) { - return new Promise(resolve => { - const observer = new PerformanceObserver(list => { - const entries = list.getEntriesByType('resource'); - for (const entry of entries) { - if (entry.name.endsWith(resourceName)) { - observer.disconnect(); - assert_equals(entry.initiator, expectedInitiator, `Test ${resourceName} initiator`); - resolve(); - return; - } - } - }); - observer.observe({entryTypes: ['resource']}); - }); -} +// Asserts that, for the given name, there is/will-be a +// PerformanceResourceTiming entry that has the given 'initiatorUrl'. The test +// is labeled according to the given descriptor. +const initiator_url_test = (resourceName, expectedUrl, descriptor) => { + promise_test(async () => { + const entry = await observe_entry(resourceName); + assert_equals(entry.initiatorUrl, expectedUrl); + }, `The initiator Url for ${descriptor} must be '${expectedUrl}'`); +}; + +const initiator_url_doc_write_test = (write_to_doc, + resourceName, expectedUrl, descriptor) => { + promise_test(async () => { + document.open(); + document.write(write_to_doc); + document.close(); + const entry = await observe_entry(resourceName); + assert_equals(entry.initiatorUrl, expectedUrl); + }, `The initiator Url for ${descriptor} must be '${expectedUrl}'`); +}; diff --git a/tests/wpt/tests/resource-timing/tentative/document-initiated.html b/tests/wpt/tests/resource-timing/tentative/document-initiated.html deleted file mode 100644 index 2f7abbffca2..00000000000 --- a/tests/wpt/tests/resource-timing/tentative/document-initiated.html +++ /dev/null @@ -1,113 +0,0 @@ -<!DOCTYPE html> -<head> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="../resources/test-initiator.js"></script> - <script src="/common/get-host-info.sub.js"></script> - - <!-- Empty Blocking Script --> - <script src="../resources/empty.js?blocking"></script> - <!-- Empty Preloaded Script --> - <link rel="preload" href="../resources/display_paragraph.js" as="script" /> - <!-- Loading arbitrary Empty Blocking Async Script --> - <script async src="../resources/empty.js?async"></script> - <!-- Loading arbitrary Empty Deferred Script --> - <script defer src="../resources/empty.js?deferred"></script> - <!-- Loading arbitrary Empty Module Script --> - <script type="module" src="../resources/empty.js?module"></script> - <!-- Empty Stylesheet --> - <link rel="stylesheet" href="../resources/empty_style.css?link" /> - <script src="../resources/display_paragraph.js"></script> - <!-- Inline Styles --> - <style> - body { - background-image: url("/images/blue.png?inline-style"); - font-family: remoteFont, sans-serif; - } - @font-face { - font-family: remoteFont; - /* This query parameter ensures that the Ahem.ttf is not retrieved from the cache. */ - src: url("/fonts/Ahem.ttf?initiator-html"); - } - </style> -</head> -<body> - <!-- Loading an arbitrary Image using <img> tag --> - <img - src="/images/blue.png?using-Img-tag" - alt="Sample Image for testing initiator Attribute" - /> - - <iframe src="../resources/green.html"></iframe> - - <script> - display_paragraph(); - - function waitForLoad(obj) { - return new Promise(resolve => { - obj.addEventListener("load", resolve, { once: true }); - }); - } - - // Load arbitrary stylesheet with inline script - const link = document.createElement("link"); - link.rel = "stylesheet"; - link.href = "../resources/empty_style.css?inline-script"; - document.head.appendChild(link); - // Load arbitrary image with inline script - const img = document.createElement("img"); - img.src = "/images/blue.png?inline-script"; - document.body.appendChild(img); - - const host_info = get_host_info(); - const expectedInitiatorUrl = host_info["ORIGIN"] + "/resource-timing/tentative/document-initiated.html"; - - // Testing Initiator of all the resources loaded - promise_test(async (t) => { - await waitForLoad(link); - await waitForLoad(img); - - const resources = [ - "empty.js?blocking", - "display_paragraph.js", - "empty.js?async", - "empty.js?deferred", - "empty.js?module", - "empty_style.css?link", - "blue.png?inline-style", - "Ahem.ttf?initiator-html", - "blue.png?using-Img-tag", - /* "green.html", - TODO(guohuideng@microsoft.com): report initiator for iframe element. - */ - "empty_style.css?inline-script", - "blue.png?inline-script", - ]; - for (const resource of resources) { - await testResourceInitiatorUrl(resource, expectedInitiatorUrl); - } - }, "initiatorUrl by main html file"); - - // Finally, test with the case document.write(). - promise_test(async (t) => { - document.open(); - document.write('<img id="img_written" src="/images/blue.png?inline-script-doc-write">'); - document.close(); - await waitForLoad(document.getElementById("img_written")); - await testResourceInitiatorUrl("blue.png?inline-script-doc-write", expectedInitiatorUrl); - - document.open(); - document.write('<link id="css_written" rel="stylesheet" href="../resources/empty_style.css?inline-script-doc-write">'); - document.close(); - await waitForLoad(document.getElementById("css_written")); - await testResourceInitiatorUrl("empty_style.css?inline-script-doc-write", expectedInitiatorUrl); - - document.open(); - document.write('<script id="script_written" src="../resources/empty.js?doc-write"><\/script>'); - document.close(); - await waitForLoad(document.getElementById("script_written")); - await testResourceInitiatorUrl("empty.js?doc-write", expectedInitiatorUrl); - }, "initiatorUrl for resource by document.write()"); - - </script> -</body> diff --git a/tests/wpt/tests/resource-timing/tentative/initiator-url/document-initiated.html b/tests/wpt/tests/resource-timing/tentative/initiator-url/document-initiated.html new file mode 100644 index 00000000000..6b192270697 --- /dev/null +++ b/tests/wpt/tests/resource-timing/tentative/initiator-url/document-initiated.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resource-timing/resources/observe-entry.js"></script> + <script src="../../resources/test-initiator.js"></script> + <script src="/common/get-host-info.sub.js"></script> + + <!-- Empty Blocking Script --> + <script src="../../resources/empty.js?blocking"></script> + <!-- Empty Preloaded Script --> + <link rel="preload" href="../../resources/display_paragraph.js" as="script" /> + <!-- Loading arbitrary Empty Blocking Async Script --> + <script async src="../../resources/empty.js?async"></script> + <!-- Loading arbitrary Empty Deferred Script --> + <script defer src="../../resources/empty.js?deferred"></script> + <!-- Loading arbitrary Empty Module Script --> + <script type="module" src="../../resources/empty.js?module"></script> + <!-- Empty Stylesheet --> + <link rel="stylesheet" href="../../resources/empty_style.css?link" /> + <script src="../../resources/display_paragraph.js"></script> + <!-- Inline Styles --> + <style> + body { + background-image: url("/images/blue.png?inline-style"); + font-family: remoteFont, sans-serif; + } + @font-face { + font-family: remoteFont; + /* This query parameter ensures that the Ahem.ttf is not retrieved from the cache. */ + src: url("/fonts/Ahem.ttf?initiator-html"); + } + </style> +</head> +<body> + <!-- Loading an arbitrary Image using <img> tag --> + <img + src="/images/blue.png?using-Img-tag" + alt="Sample Image for testing initiator Attribute" + /> + + <iframe src="../../resources/green.html"></iframe> + + <script> + display_paragraph(); + + // Load arbitrary stylesheet with inline script + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = "../../resources/empty_style.css?inline-script"; + document.head.appendChild(link); + // Load arbitrary image with inline script + const img = document.createElement("img"); + img.src = "/images/blue.png?inline-script"; + document.body.appendChild(img); + + const host_info = get_host_info(); + const expectedInitiatorUrl = host_info["ORIGIN"] + + "/resource-timing/tentative/initiator-url/document-initiated.html"; + + const resources = [ + "empty.js?blocking", + "display_paragraph.js", + "empty.js?async", + "empty.js?deferred", + "empty.js?module", + "empty_style.css?link", + "blue.png?inline-style", + "Ahem.ttf?initiator-html", + "blue.png?using-Img-tag", + /* "green.html", + TODO(guohuideng@microsoft.com): report initiator for iframe element. + */ + "empty_style.css?inline-script", + "blue.png?inline-script", + ]; + for (const resource of resources) { + initiator_url_test(resource, expectedInitiatorUrl, resource+" initiatorUrl from document-initiated"); + } + + write_to_doc = '<img id="img_written" src="/images/blue.png?inline-script-doc-write">'; + resource = "blue.png?inline-script-doc-write"; + initiator_url_doc_write_test(write_to_doc, resource, expectedInitiatorUrl, + resource+" initiatorUrl from document-initiated"); + + write_to_doc = '<link id="css_written" rel="stylesheet" href="../../resources/empty_style.css?inline-script-doc-write">'; + resource = "empty_style.css?inline-script-doc-write"; + initiator_url_doc_write_test(write_to_doc, resource, expectedInitiatorUrl, resource+" initiatorUrl from document-initiated"); + + write_to_doc = '<script id="script_written" src="../../resources/empty.js?doc-write"><\/script>'; + resource = "empty.js?doc-write"; + initiator_url_doc_write_test(write_to_doc, resource, expectedInitiatorUrl, resource+" initiatorUrl from document-initiated"); + + </script> +</body> diff --git a/tests/wpt/tests/resources/webidl2/lib/VERSION.md b/tests/wpt/tests/resources/webidl2/lib/VERSION.md index 5a3726c6c00..2614a8d194b 100644 --- a/tests/wpt/tests/resources/webidl2/lib/VERSION.md +++ b/tests/wpt/tests/resources/webidl2/lib/VERSION.md @@ -1 +1 @@ -Currently using webidl2.js@6889aee6fc7d65915ab1267825248157dbc50486. +Currently using webidl2.js@e6d8ab852ec4e76596f6e308eb7f2efc8b613bfd. diff --git a/tests/wpt/tests/resources/webidl2/lib/webidl2.js b/tests/wpt/tests/resources/webidl2/lib/webidl2.js index 7161def899c..bae0b204759 100644 --- a/tests/wpt/tests/resources/webidl2/lib/webidl2.js +++ b/tests/wpt/tests/resources/webidl2/lib/webidl2.js @@ -17,7 +17,7 @@ return /******/ (() => { // webpackBootstrap __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "parse": () => (/* binding */ parse) +/* harmony export */ parse: () => (/* binding */ parse) /* harmony export */ }); /* harmony import */ var _tokeniser_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); /* harmony import */ var _productions_enum_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15); @@ -46,11 +46,22 @@ __webpack_require__.r(__webpack_exports__); +/** @typedef {'callbackInterface'|'dictionary'|'interface'|'mixin'|'namespace'} ExtendableInterfaces */ +/** @typedef {{ extMembers?: import("./productions/container.js").AllowedMember[]}} Extension */ +/** @typedef {Partial<Record<ExtendableInterfaces, Extension>>} Extensions */ + +/** + * Parser options. + * @typedef {Object} ParserOptions + * @property {string} [sourceName] + * @property {boolean} [concrete] + * @property {Function[]} [productions] + * @property {Extensions} [extensions] + */ + /** * @param {Tokeniser} tokeniser - * @param {object} options - * @param {boolean} [options.concrete] - * @param {Function[]} [options.productions] + * @param {ParserOptions} options */ function parseByTokens(tokeniser, options) { const source = tokeniser.source; @@ -67,7 +78,9 @@ function parseByTokens(tokeniser, options) { const callback = consume("callback"); if (!callback) return; if (tokeniser.probe("interface")) { - return _productions_callback_interface_js__WEBPACK_IMPORTED_MODULE_10__.CallbackInterface.parse(tokeniser, callback); + return _productions_callback_interface_js__WEBPACK_IMPORTED_MODULE_10__.CallbackInterface.parse(tokeniser, callback, { + ...options?.extensions?.callbackInterface, + }); } return _productions_callback_js__WEBPACK_IMPORTED_MODULE_5__.CallbackFunction.parse(tokeniser, callback); } @@ -75,20 +88,32 @@ function parseByTokens(tokeniser, options) { function interface_(opts) { const base = consume("interface"); if (!base) return; - const ret = - _productions_mixin_js__WEBPACK_IMPORTED_MODULE_7__.Mixin.parse(tokeniser, base, opts) || - _productions_interface_js__WEBPACK_IMPORTED_MODULE_6__.Interface.parse(tokeniser, base, opts) || - error("Interface has no proper body"); - return ret; + return ( + _productions_mixin_js__WEBPACK_IMPORTED_MODULE_7__.Mixin.parse(tokeniser, base, { + ...opts, + ...options?.extensions?.mixin, + }) || + _productions_interface_js__WEBPACK_IMPORTED_MODULE_6__.Interface.parse(tokeniser, base, { + ...opts, + ...options?.extensions?.interface, + }) || + error("Interface has no proper body") + ); } function partial() { const partial = consume("partial"); if (!partial) return; return ( - _productions_dictionary_js__WEBPACK_IMPORTED_MODULE_8__.Dictionary.parse(tokeniser, { partial }) || + _productions_dictionary_js__WEBPACK_IMPORTED_MODULE_8__.Dictionary.parse(tokeniser, { + partial, + ...options?.extensions?.dictionary, + }) || interface_({ partial }) || - _productions_namespace_js__WEBPACK_IMPORTED_MODULE_9__.Namespace.parse(tokeniser, { partial }) || + _productions_namespace_js__WEBPACK_IMPORTED_MODULE_9__.Namespace.parse(tokeniser, { + partial, + ...options?.extensions?.namespace, + }) || error("Partial doesn't apply to anything") ); } @@ -107,11 +132,11 @@ function parseByTokens(tokeniser, options) { callback() || interface_() || partial() || - _productions_dictionary_js__WEBPACK_IMPORTED_MODULE_8__.Dictionary.parse(tokeniser) || + _productions_dictionary_js__WEBPACK_IMPORTED_MODULE_8__.Dictionary.parse(tokeniser, options?.extensions?.dictionary) || _productions_enum_js__WEBPACK_IMPORTED_MODULE_1__.Enum.parse(tokeniser) || _productions_typedef_js__WEBPACK_IMPORTED_MODULE_4__.Typedef.parse(tokeniser) || _productions_includes_js__WEBPACK_IMPORTED_MODULE_2__.Includes.parse(tokeniser) || - _productions_namespace_js__WEBPACK_IMPORTED_MODULE_9__.Namespace.parse(tokeniser) + _productions_namespace_js__WEBPACK_IMPORTED_MODULE_9__.Namespace.parse(tokeniser, options?.extensions?.namespace) ); } @@ -134,6 +159,7 @@ function parseByTokens(tokeniser, options) { } return defs; } + const res = definitions(); if (tokeniser.position < source.length) error("Unrecognised tokens"); return res; @@ -141,11 +167,7 @@ function parseByTokens(tokeniser, options) { /** * @param {string} str - * @param {object} [options] - * @param {*} [options.sourceName] - * @param {boolean} [options.concrete] - * @param {Function[]} [options.productions] - * @return {import("./productions/base.js").Base[]} + * @param {ParserOptions} [options] */ function parse(str, options = {}) { const tokeniser = new _tokeniser_js__WEBPACK_IMPORTED_MODULE_0__.Tokeniser(str); @@ -163,11 +185,11 @@ function parse(str, options = {}) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Tokeniser": () => (/* binding */ Tokeniser), -/* harmony export */ "WebIDLParseError": () => (/* binding */ WebIDLParseError), -/* harmony export */ "argumentNameKeywords": () => (/* binding */ argumentNameKeywords), -/* harmony export */ "stringTypes": () => (/* binding */ stringTypes), -/* harmony export */ "typeNameKeywords": () => (/* binding */ typeNameKeywords) +/* harmony export */ Tokeniser: () => (/* binding */ Tokeniser), +/* harmony export */ WebIDLParseError: () => (/* binding */ WebIDLParseError), +/* harmony export */ argumentNameKeywords: () => (/* binding */ argumentNameKeywords), +/* harmony export */ stringTypes: () => (/* binding */ stringTypes), +/* harmony export */ typeNameKeywords: () => (/* binding */ typeNameKeywords) /* harmony export */ }); /* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); /* harmony import */ var _productions_helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -191,6 +213,7 @@ const tokenRe = { const typeNameKeywords = [ "ArrayBuffer", + "SharedArrayBuffer", "DataView", "Int8Array", "Int16Array", @@ -201,6 +224,7 @@ const typeNameKeywords = [ "Uint8ClampedArray", "BigInt64Array", "BigUint64Array", + "Float16Array", "Float32Array", "Float64Array", "any", @@ -243,6 +267,8 @@ const nonRegexTerminals = [ "NaN", "ObservableArray", "Promise", + "async_iterable", + "async_sequence", "bigint", "boolean", "byte", @@ -327,10 +353,10 @@ function tokenise(str) { if (result !== -1) { if (reserved.includes(token.value)) { const message = `${(0,_productions_helpers_js__WEBPACK_IMPORTED_MODULE_1__.unescape)( - token.value + token.value, )} is a reserved identifier and must not be used.`; throw new WebIDLParseError( - (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.syntaxError)(tokens, lastIndex, null, message) + (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.syntaxError)(tokens, lastIndex, null, message), ); } else if (nonRegexTerminals.includes(token.value)) { token.type = "inline"; @@ -414,7 +440,7 @@ class Tokeniser { */ error(message) { throw new WebIDLParseError( - (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.syntaxError)(this.source, this.position, this.current, message) + (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.syntaxError)(this.source, this.position, this.current, message), ); } @@ -522,8 +548,8 @@ class WebIDLParseError extends Error { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "syntaxError": () => (/* binding */ syntaxError), -/* harmony export */ "validationError": () => (/* binding */ validationError) +/* harmony export */ syntaxError: () => (/* binding */ syntaxError), +/* harmony export */ validationError: () => (/* binding */ validationError) /* harmony export */ }); /** * @param {string} text @@ -572,7 +598,7 @@ function error( current, message, kind, - { level = "error", autofix, ruleName } = {} + { level = "error", autofix, ruleName } = {}, ) { /** * @param {number} count @@ -606,11 +632,11 @@ function error( source[position].type !== "eof" ? source[position].line : source.length > 1 - ? source[position - 1].line - : 1; + ? source[position - 1].line + : 1; const precedingLastLine = lastLine( - tokensToText(sliceTokens(-maxTokens), { precedes: true }) + tokensToText(sliceTokens(-maxTokens), { precedes: true }), ); const subsequentTokens = sliceTokens(maxTokens); @@ -625,7 +651,7 @@ function error( const grammaticalContext = current && current.name ? `, ${contextType} \`${current.partial ? "partial " : ""}${contextAsText( - current + current, )}\`` : ""; const context = `${kind} error at line ${line}${inSourceName}${grammaticalContext}:\n${sourceContext}`; @@ -659,7 +685,7 @@ function validationError( current, ruleName, message, - options = {} + options = {}, ) { options.ruleName = ruleName; return error( @@ -668,7 +694,7 @@ function validationError( current, message, "Validation", - options + options, ); } @@ -679,21 +705,21 @@ function validationError( __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "argument_list": () => (/* binding */ argument_list), -/* harmony export */ "autoParenter": () => (/* binding */ autoParenter), -/* harmony export */ "autofixAddExposedWindow": () => (/* binding */ autofixAddExposedWindow), -/* harmony export */ "const_data": () => (/* binding */ const_data), -/* harmony export */ "const_value": () => (/* binding */ const_value), -/* harmony export */ "findLastIndex": () => (/* binding */ findLastIndex), -/* harmony export */ "getFirstToken": () => (/* binding */ getFirstToken), -/* harmony export */ "getLastIndentation": () => (/* binding */ getLastIndentation), -/* harmony export */ "getMemberIndentation": () => (/* binding */ getMemberIndentation), -/* harmony export */ "list": () => (/* binding */ list), -/* harmony export */ "primitive_type": () => (/* binding */ primitive_type), -/* harmony export */ "return_type": () => (/* binding */ return_type), -/* harmony export */ "stringifier": () => (/* binding */ stringifier), -/* harmony export */ "type_with_extended_attributes": () => (/* binding */ type_with_extended_attributes), -/* harmony export */ "unescape": () => (/* binding */ unescape) +/* harmony export */ argument_list: () => (/* binding */ argument_list), +/* harmony export */ autoParenter: () => (/* binding */ autoParenter), +/* harmony export */ autofixAddExposedWindow: () => (/* binding */ autofixAddExposedWindow), +/* harmony export */ const_data: () => (/* binding */ const_data), +/* harmony export */ const_value: () => (/* binding */ const_value), +/* harmony export */ findLastIndex: () => (/* binding */ findLastIndex), +/* harmony export */ getFirstToken: () => (/* binding */ getFirstToken), +/* harmony export */ getLastIndentation: () => (/* binding */ getLastIndentation), +/* harmony export */ getMemberIndentation: () => (/* binding */ getMemberIndentation), +/* harmony export */ list: () => (/* binding */ list), +/* harmony export */ primitive_type: () => (/* binding */ primitive_type), +/* harmony export */ return_type: () => (/* binding */ return_type), +/* harmony export */ stringifier: () => (/* binding */ stringifier), +/* harmony export */ type_with_extended_attributes: () => (/* binding */ type_with_extended_attributes), +/* harmony export */ unescape: () => (/* binding */ unescape) /* harmony export */ }); /* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); /* harmony import */ var _argument_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); @@ -816,7 +842,7 @@ function primitive_type(tokeniser) { "boolean", "byte", "octet", - "undefined" + "undefined", ); if (base) { return new _type_js__WEBPACK_IMPORTED_MODULE_0__.Type({ source, tokens: { base } }); @@ -917,7 +943,7 @@ function autofixAddExposedWindow(def) { def.extAttrs.unshift(exposed); } else { autoParenter(def).extAttrs = _extended_attributes_js__WEBPACK_IMPORTED_MODULE_2__.ExtendedAttributes.parse( - new _tokeniser_js__WEBPACK_IMPORTED_MODULE_5__.Tokeniser("[Exposed=Window]") + new _tokeniser_js__WEBPACK_IMPORTED_MODULE_5__.Tokeniser("[Exposed=Window]"), ); const trivia = def.tokens.base.trivia; def.extAttrs.tokens.open.trivia = trivia; @@ -1010,7 +1036,7 @@ function autoParenter(data, parent) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Type": () => (/* binding */ Type) +/* harmony export */ Type: () => (/* binding */ Type) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -1034,14 +1060,15 @@ function generic_type(tokeniser, typeName) { "FrozenArray", "ObservableArray", "Promise", + "async_sequence", "sequence", - "record" + "record", ); if (!base) { return; } const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.autoParenter)( - new Type({ source: tokeniser.source, tokens: { base } }) + new Type({ source: tokeniser.source, tokens: { base } }), ); ret.tokens.open = tokeniser.consume("<") || @@ -1056,6 +1083,7 @@ function generic_type(tokeniser, typeName) { ret.subtype.push(subtype); break; } + case "async_sequence": case "sequence": case "FrozenArray": case "ObservableArray": { @@ -1143,7 +1171,7 @@ function union_type(tokeniser, type) { ret.type = type || null; while (true) { const typ = - (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.type_with_extended_attributes)(tokeniser) || + (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.type_with_extended_attributes)(tokeniser, type) || tokeniser.error("No type after open parenthesis or 'or' in union type"); if (typ.idlType === "any") tokeniser.error("Type `any` cannot be included in a union type"); @@ -1157,7 +1185,7 @@ function union_type(tokeniser, type) { } if (ret.idlType.length < 2) { tokeniser.error( - "At least two types are expected in a union type but found less" + "At least two types are expected in a union type but found less", ); } tokens.close = @@ -1208,6 +1236,26 @@ class Type extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { *validate(defs) { yield* this.extAttrs.validate(defs); + if (this.idlType === "BufferSource") { + // XXX: For now this is a hack. Consider moving parents' extAttrs into types as the spec says: + // https://webidl.spec.whatwg.org/#idl-annotated-types + for (const extAttrs of [this.extAttrs, this.parent?.extAttrs]) { + for (const extAttr of extAttrs) { + if (extAttr.name !== "AllowShared") { + continue; + } + const message = `\`[AllowShared] BufferSource\` is now replaced with AllowSharedBufferSource.`; + yield (0,_error_js__WEBPACK_IMPORTED_MODULE_3__.validationError)( + this.tokens.base, + this, + "migrate-allowshared", + message, + { autofix: replaceAllowShared(this, extAttr, extAttrs) }, + ); + } + } + } + if (this.idlType === "void") { const message = `\`void\` is now replaced by \`undefined\`. Refer to the \ [relevant GitHub issue](https://github.com/whatwg/webidl/issues/60) \ @@ -1225,8 +1273,8 @@ for more information.`; const target = this.union ? this : typedef && typedef.type === "typedef" - ? typedef.idlType - : undefined; + ? typedef.idlType + : undefined; if (target && this.nullable) { // do not allow any dictionary const { reference } = (0,_validators_helpers_js__WEBPACK_IMPORTED_MODULE_4__.idlTypeIncludesDictionary)(target, defs) || {}; @@ -1237,7 +1285,7 @@ for more information.`; targetToken, this, "no-nullable-union-dict", - message + message, ); } } else { @@ -1274,7 +1322,7 @@ for more information.`; this.idlType ), context: this, - } + }, ); return w.ts.wrap([w.ts.trivia(firstToken.trivia), ref]); }; @@ -1287,6 +1335,23 @@ for more information.`; } } +/** + * @param {Type} type + * @param {import("./extended-attributes.js").SimpleExtendedAttribute} extAttr + * @param {ExtendedAttributes} extAttrs + */ +function replaceAllowShared(type, extAttr, extAttrs) { + return () => { + const index = extAttrs.indexOf(extAttr); + extAttrs.splice(index, 1); + if (!extAttrs.length && type.tokens.base.trivia.match(/^\s$/)) { + type.tokens.base.trivia = ""; // (let's not remove comments) + } + + type.tokens.base.value = "AllowSharedBufferSource"; + }; +} + /** * @param {Type} type */ @@ -1303,7 +1368,7 @@ function replaceVoid(type) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Base": () => (/* binding */ Base) +/* harmony export */ Base: () => (/* binding */ Base) /* harmony export */ }); class Base { /** @@ -1344,14 +1409,17 @@ class Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "dictionaryIncludesRequiredField": () => (/* binding */ dictionaryIncludesRequiredField), -/* harmony export */ "idlTypeIncludesDictionary": () => (/* binding */ idlTypeIncludesDictionary) +/* harmony export */ dictionaryIncludesRequiredField: () => (/* binding */ dictionaryIncludesRequiredField), +/* harmony export */ idlTypeIncludesDictionary: () => (/* binding */ idlTypeIncludesDictionary), +/* harmony export */ idlTypeIncludesEnforceRange: () => (/* binding */ idlTypeIncludesEnforceRange) /* harmony export */ }); /** + * @typedef {import("../validator.js").Definitions} Definitions * @typedef {import("../productions/dictionary.js").Dictionary} Dictionary + * @typedef {import("../../lib/productions/type").Type} Type * - * @param {*} idlType - * @param {import("../validator.js").Definitions} defs + * @param {Type} idlType + * @param {Definitions} defs * @param {object} [options] * @param {boolean} [options.useNullableInner] use when the input idlType is nullable and you want to use its inner type * @return {{ reference: *, dictionary: Dictionary }} the type reference that ultimately includes dictionary. @@ -1359,7 +1427,7 @@ __webpack_require__.r(__webpack_exports__); function idlTypeIncludesDictionary( idlType, defs, - { useNullableInner } = {} + { useNullableInner } = {}, ) { if (!idlType.union) { const def = defs.unique.get(idlType.idlType); @@ -1405,8 +1473,8 @@ function idlTypeIncludesDictionary( } /** - * @param {*} dict dictionary type - * @param {import("../validator.js").Definitions} defs + * @param {Dictionary} dict dictionary type + * @param {Definitions} defs * @return {boolean} */ function dictionaryIncludesRequiredField(dict, defs) { @@ -1430,6 +1498,34 @@ function dictionaryIncludesRequiredField(dict, defs) { return result; } +/** + * For now this only checks the most frequent cases: + * 1. direct inclusion of [EnforceRange] + * 2. typedef of that + * + * More complex cases with dictionaries and records are not covered yet. + * + * @param {Type} idlType + * @param {Definitions} defs + */ +function idlTypeIncludesEnforceRange(idlType, defs) { + if (idlType.union) { + // TODO: This should ideally be checked too + return false; + } + + if (idlType.extAttrs.some((e) => e.name === "EnforceRange")) { + return true; + } + + const def = defs.unique.get(idlType.idlType); + if (def?.type !== "typedef") { + return false; + } + + return def.idlType.extAttrs.some((e) => e.name === "EnforceRange"); +} + /***/ }), /* 8 */ @@ -1437,9 +1533,9 @@ function dictionaryIncludesRequiredField(dict, defs) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ExtendedAttributeParameters": () => (/* binding */ ExtendedAttributeParameters), -/* harmony export */ "ExtendedAttributes": () => (/* binding */ ExtendedAttributes), -/* harmony export */ "SimpleExtendedAttribute": () => (/* binding */ SimpleExtendedAttribute) +/* harmony export */ ExtendedAttributeParameters: () => (/* binding */ ExtendedAttributeParameters), +/* harmony export */ ExtendedAttributes: () => (/* binding */ ExtendedAttributes), +/* harmony export */ SimpleExtendedAttribute: () => (/* binding */ SimpleExtendedAttribute) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _array_base_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); @@ -1494,7 +1590,7 @@ function extAttrListItems(tokeniser) { } } tokeniser.error( - `Expected identifiers, strings, decimals, or integers but none found` + `Expected identifiers, strings, decimals, or integers but none found`, ); } @@ -1505,7 +1601,7 @@ class ExtendedAttributeParameters extends _base_js__WEBPACK_IMPORTED_MODULE_0__. static parse(tokeniser) { const tokens = { assign: tokeniser.consume("=") }; const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_3__.autoParenter)( - new ExtendedAttributeParameters({ source: tokeniser.source, tokens }) + new ExtendedAttributeParameters({ source: tokeniser.source, tokens }), ); ret.list = []; if (tokens.assign) { @@ -1603,8 +1699,8 @@ class SimpleExtendedAttribute extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base const value = this.params.rhsIsList ? list : this.params.tokens.secondaryName - ? (0,_helpers_js__WEBPACK_IMPORTED_MODULE_3__.unescape)(tokens.secondaryName.value) - : null; + ? (0,_helpers_js__WEBPACK_IMPORTED_MODULE_3__.unescape)(tokens.secondaryName.value) + : null; return { type, value }; } get arguments() { @@ -1627,7 +1723,7 @@ information.`; this, "no-nointerfaceobject", message, - { level: "warning" } + { level: "warning" }, ); } else if (renamedLegacies.has(name)) { const message = `\`[${name}]\` extended attribute is a legacy feature \ @@ -1652,7 +1748,7 @@ information.`; w.ts.wrap([ w.ts.extendedAttributeReference(this.name), this.params.write(w), - ]) + ]), ), w.token(this.tokens.separator), ]); @@ -1687,12 +1783,12 @@ class ExtendedAttributes extends _array_base_js__WEBPACK_IMPORTED_MODULE_1__.Arr ...(0,_helpers_js__WEBPACK_IMPORTED_MODULE_3__.list)(tokeniser, { parser: SimpleExtendedAttribute.parse, listName: "extended attribute", - }) + }), ); tokens.close = tokeniser.consume("]") || tokeniser.error( - "Expected a closing token for the extended attribute list" + "Expected a closing token for the extended attribute list", ); if (!ret.length) { tokeniser.unconsume(tokens.close.index); @@ -1700,7 +1796,7 @@ class ExtendedAttributes extends _array_base_js__WEBPACK_IMPORTED_MODULE_1__.Arr } if (tokeniser.probe("[")) { tokeniser.error( - "Illegal double extended attribute lists, consider merging them" + "Illegal double extended attribute lists, consider merging them", ); } return ret; @@ -1730,7 +1826,7 @@ class ExtendedAttributes extends _array_base_js__WEBPACK_IMPORTED_MODULE_1__.Arr __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ArrayBase": () => (/* binding */ ArrayBase) +/* harmony export */ ArrayBase: () => (/* binding */ ArrayBase) /* harmony export */ }); class ArrayBase extends Array { constructor({ source, tokens }) { @@ -1750,8 +1846,8 @@ class ArrayBase extends Array { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Eof": () => (/* binding */ Eof), -/* harmony export */ "WrappedToken": () => (/* binding */ WrappedToken) +/* harmony export */ Eof: () => (/* binding */ Eof), +/* harmony export */ WrappedToken: () => (/* binding */ WrappedToken) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -1775,6 +1871,10 @@ class WrappedToken extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { }; } + get type() { + return this.tokens.value.type; + } + get value() { return (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.unescape)(this.tokens.value.value); } @@ -1811,7 +1911,7 @@ class Eof extends WrappedToken { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Argument": () => (/* binding */ Argument) +/* harmony export */ Argument: () => (/* binding */ Argument) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _default_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); @@ -1837,7 +1937,7 @@ class Argument extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { /** @type {Base["tokens"]} */ const tokens = {}; const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_3__.autoParenter)( - new Argument({ source: tokeniser.source, tokens }) + new Argument({ source: tokeniser.source, tokens }), ); ret.extAttrs = _extended_attributes_js__WEBPACK_IMPORTED_MODULE_2__.ExtendedAttributes.parse(tokeniser); tokens.optional = tokeniser.consume("optional"); @@ -1887,7 +1987,7 @@ class Argument extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { this.tokens.name, this, "no-nullable-dict-arg", - message + message, ); } else if (!this.optional) { if ( @@ -1903,7 +2003,7 @@ class Argument extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { message, { autofix: autofixDictionaryArgumentOptionality(this), - } + }, ); } } else if (!this.default) { @@ -1915,7 +2015,7 @@ class Argument extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { message, { autofix: autofixOptionalDictionaryDefaultValue(this), - } + }, ); } } @@ -1977,7 +2077,7 @@ function autofixOptionalDictionaryDefaultValue(arg) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Default": () => (/* binding */ Default) +/* harmony export */ Default: () => (/* binding */ Default) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -2049,7 +2149,7 @@ class Default extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Operation": () => (/* binding */ Operation) +/* harmony export */ Operation: () => (/* binding */ Operation) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -2060,17 +2160,15 @@ __webpack_require__.r(__webpack_exports__); class Operation extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { /** - * @typedef {import("../tokeniser.js").Token} Token - * * @param {import("../tokeniser.js").Tokeniser} tokeniser * @param {object} [options] - * @param {Token} [options.special] - * @param {Token} [options.regular] + * @param {import("../tokeniser.js").Token} [options.special] + * @param {import("../tokeniser.js").Token} [options.regular] */ static parse(tokeniser, { special, regular } = {}) { const tokens = { special }; const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.autoParenter)( - new Operation({ source: tokeniser.source, tokens }) + new Operation({ source: tokeniser.source, tokens }), ); if (special && special.value === "stringifier") { tokens.termination = tokeniser.consume(";"); @@ -2121,6 +2219,15 @@ class Operation extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { yield (0,_error_js__WEBPACK_IMPORTED_MODULE_2__.validationError)(this.tokens.open, this, "incomplete-op", message); } if (this.idlType) { + if (this.idlType.generic === "async_sequence") { + const message = `async_sequence types cannot be returned by an operation.`; + yield (0,_error_js__WEBPACK_IMPORTED_MODULE_2__.validationError)( + this.idlType.tokens.base, + this, + "async-sequence-idl-to-js", + message, + ); + } yield* this.idlType.validate(defs); } for (const argument of this.arguments) { @@ -2149,7 +2256,7 @@ class Operation extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { ...body, w.token(this.tokens.termination), ]), - { data: this, parent } + { data: this, parent }, ); } } @@ -2161,7 +2268,7 @@ class Operation extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Attribute": () => (/* binding */ Attribute) +/* harmony export */ Attribute: () => (/* binding */ Attribute) /* harmony export */ }); /* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); /* harmony import */ var _validators_helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7); @@ -2182,12 +2289,12 @@ class Attribute extends _base_js__WEBPACK_IMPORTED_MODULE_2__.Base { */ static parse( tokeniser, - { special, noInherit = false, readonly = false } = {} + { special, noInherit = false, readonly = false } = {}, ) { const start_position = tokeniser.position; const tokens = { special }; const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_3__.autoParenter)( - new Attribute({ source: tokeniser.source, tokens }) + new Attribute({ source: tokeniser.source, tokens }), ); if (!special && !noInherit) { tokens.special = tokeniser.consume("inherit"); @@ -2237,32 +2344,34 @@ class Attribute extends _base_js__WEBPACK_IMPORTED_MODULE_2__.Base { yield* this.extAttrs.validate(defs); yield* this.idlType.validate(defs); - switch (this.idlType.generic) { - case "sequence": - case "record": { - const message = `Attributes cannot accept ${this.idlType.generic} types.`; - yield (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.validationError)( - this.tokens.name, - this, - "attr-invalid-type", - message - ); - break; + if ( + ["async_sequence", "sequence", "record"].includes(this.idlType.generic) + ) { + const message = `Attributes cannot accept ${this.idlType.generic} types.`; + yield (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.validationError)( + this.tokens.name, + this, + "attr-invalid-type", + message, + ); + } + + { + const { reference } = (0,_validators_helpers_js__WEBPACK_IMPORTED_MODULE_1__.idlTypeIncludesDictionary)(this.idlType, defs) || {}; + if (reference) { + const targetToken = (this.idlType.union ? reference : this.idlType) + .tokens.base; + const message = "Attributes cannot accept dictionary types."; + yield (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.validationError)(targetToken, this, "attr-invalid-type", message); } - default: { - const { reference } = - (0,_validators_helpers_js__WEBPACK_IMPORTED_MODULE_1__.idlTypeIncludesDictionary)(this.idlType, defs) || {}; - if (reference) { - const targetToken = (this.idlType.union ? reference : this.idlType) - .tokens.base; - const message = "Attributes cannot accept dictionary types."; - yield (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.validationError)( - targetToken, - this, - "attr-invalid-type", - message - ); - } + } + + if (this.readonly) { + if ((0,_validators_helpers_js__WEBPACK_IMPORTED_MODULE_1__.idlTypeIncludesEnforceRange)(this.idlType, defs)) { + const targetToken = this.idlType.tokens.base; + const message = + "Readonly attributes cannot accept [EnforceRange] extended attribute."; + yield (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.validationError)(targetToken, this, "attr-invalid-type", message); } } } @@ -2280,7 +2389,7 @@ class Attribute extends _base_js__WEBPACK_IMPORTED_MODULE_2__.Base { w.name_token(this.tokens.name, { data: this, parent }), w.token(this.tokens.termination), ]), - { data: this, parent } + { data: this, parent }, ); } } @@ -2292,8 +2401,8 @@ class Attribute extends _base_js__WEBPACK_IMPORTED_MODULE_2__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Enum": () => (/* binding */ Enum), -/* harmony export */ "EnumValue": () => (/* binding */ EnumValue) +/* harmony export */ Enum: () => (/* binding */ Enum), +/* harmony export */ EnumValue: () => (/* binding */ EnumValue) /* harmony export */ }); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var _token_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10); @@ -2327,7 +2436,7 @@ class EnumValue extends _token_js__WEBPACK_IMPORTED_MODULE_1__.WrappedToken { w.ts.trivia(this.tokens.value.trivia), w.ts.definition( w.ts.wrap(['"', w.ts.name(this.value, { data: this, parent }), '"']), - { data: this, parent } + { data: this, parent }, ), w.token(this.tokens.separator), ]); @@ -2388,7 +2497,7 @@ class Enum extends _base_js__WEBPACK_IMPORTED_MODULE_2__.Base { w.token(this.tokens.close), w.token(this.tokens.termination), ]), - { data: this } + { data: this }, ); } } @@ -2400,7 +2509,7 @@ class Enum extends _base_js__WEBPACK_IMPORTED_MODULE_2__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Includes": () => (/* binding */ Includes) +/* harmony export */ Includes: () => (/* binding */ Includes) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -2451,7 +2560,7 @@ class Includes extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.reference_token(this.tokens.mixin, this), w.token(this.tokens.termination), ]), - { data: this } + { data: this }, ); } } @@ -2463,7 +2572,7 @@ class Includes extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Typedef": () => (/* binding */ Typedef) +/* harmony export */ Typedef: () => (/* binding */ Typedef) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -2516,7 +2625,7 @@ class Typedef extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.name_token(this.tokens.name, { data: this }), w.token(this.tokens.termination), ]), - { data: this } + { data: this }, ); } } @@ -2528,10 +2637,12 @@ class Typedef extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CallbackFunction": () => (/* binding */ CallbackFunction) +/* harmony export */ CallbackFunction: () => (/* binding */ CallbackFunction) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3); + @@ -2542,7 +2653,7 @@ class CallbackFunction extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { static parse(tokeniser, base) { const tokens = { base }; const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.autoParenter)( - new CallbackFunction({ source: tokeniser.source, tokens }) + new CallbackFunction({ source: tokeniser.source, tokens }), ); tokens.name = tokeniser.consumeKind("identifier") || @@ -2573,6 +2684,18 @@ class CallbackFunction extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { *validate(defs) { yield* this.extAttrs.validate(defs); + for (const arg of this.arguments) { + yield* arg.validate(defs); + if (arg.idlType.generic === "async_sequence") { + const message = `async_sequence types cannot be returned as a callback argument.`; + yield (0,_error_js__WEBPACK_IMPORTED_MODULE_2__.validationError)( + arg.tokens.name, + arg, + "async-sequence-idl-to-js", + message, + ); + } + } yield* this.idlType.validate(defs); } @@ -2590,7 +2713,7 @@ class CallbackFunction extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.token(this.tokens.close), w.token(this.tokens.termination), ]), - { data: this } + { data: this }, ); } } @@ -2602,7 +2725,7 @@ class CallbackFunction extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Interface": () => (/* binding */ Interface) +/* harmony export */ Interface: () => (/* binding */ Interface) /* harmony export */ }); /* harmony import */ var _container_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); /* harmony import */ var _attribute_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14); @@ -2643,8 +2766,12 @@ function static_member(tokeniser) { class Interface extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { /** * @param {import("../tokeniser.js").Tokeniser} tokeniser + * @param {import("../tokeniser.js").Token} base + * @param {object} [options] + * @param {import("./container.js").AllowedMember[]} [options.extMembers] + * @param {import("../tokeniser.js").Token|null} [options.partial] */ - static parse(tokeniser, base, { partial = null } = {}) { + static parse(tokeniser, base, { extMembers = [], partial = null } = {}) { const tokens = { partial, base }; return _container_js__WEBPACK_IMPORTED_MODULE_0__.Container.parse( tokeniser, @@ -2652,6 +2779,7 @@ class Interface extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { { inheritable: !partial, allowedMembers: [ + ...extMembers, [_constant_js__WEBPACK_IMPORTED_MODULE_3__.Constant.parse], [_constructor_js__WEBPACK_IMPORTED_MODULE_8__.Constructor.parse], [static_member], @@ -2660,7 +2788,7 @@ class Interface extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { [_attribute_js__WEBPACK_IMPORTED_MODULE_1__.Attribute.parse], [_operation_js__WEBPACK_IMPORTED_MODULE_2__.Operation.parse], ], - } + }, ); } @@ -2686,11 +2814,11 @@ for more information.`; message, { autofix: (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.autofixAddExposedWindow)(this), - } + }, ); } const oldConstructors = this.extAttrs.filter( - (extAttr) => extAttr.name === "Constructor" + (extAttr) => extAttr.name === "Constructor", ); for (const constructor of oldConstructors) { const message = `Constructors should now be represented as a \`constructor()\` operation on the interface \ @@ -2704,14 +2832,14 @@ for more information.`; message, { autofix: autofixConstructor(this, constructor), - } + }, ); } const isGlobal = this.extAttrs.some((extAttr) => extAttr.name === "Global"); if (isGlobal) { const factoryFunctions = this.extAttrs.filter( - (extAttr) => extAttr.name === "LegacyFactoryFunction" + (extAttr) => extAttr.name === "LegacyFactoryFunction", ); for (const named of factoryFunctions) { const message = `Interfaces marked as \`[Global]\` cannot have factory functions.`; @@ -2719,12 +2847,12 @@ for more information.`; named.tokens.name, this, "no-constructible-global", - message + message, ); } const constructors = this.members.filter( - (member) => member.type === "constructor" + (member) => member.type === "constructor", ); for (const named of constructors) { const message = `Interfaces marked as \`[Global]\` cannot have constructors.`; @@ -2732,7 +2860,7 @@ for more information.`; named.tokens.base, this, "no-constructible-global", - message + message, ); } } @@ -2748,13 +2876,13 @@ function autofixConstructor(interfaceDef, constructorExtAttr) { interfaceDef = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.autoParenter)(interfaceDef); return () => { const indentation = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getLastIndentation)( - interfaceDef.extAttrs.tokens.open.trivia + interfaceDef.extAttrs.tokens.open.trivia, ); const memberIndent = interfaceDef.members.length ? (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getLastIndentation)((0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getFirstToken)(interfaceDef.members[0]).trivia) : (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getMemberIndentation)(indentation); const constructorOp = _constructor_js__WEBPACK_IMPORTED_MODULE_8__.Constructor.parse( - new _tokeniser_js__WEBPACK_IMPORTED_MODULE_9__.Tokeniser(`\n${memberIndent}constructor();`) + new _tokeniser_js__WEBPACK_IMPORTED_MODULE_9__.Tokeniser(`\n${memberIndent}constructor();`), ); constructorOp.extAttrs = new _extended_attributes_js__WEBPACK_IMPORTED_MODULE_10__.ExtendedAttributes({ source: interfaceDef.source, @@ -2764,7 +2892,7 @@ function autofixConstructor(interfaceDef, constructorExtAttr) { const existingIndex = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.findLastIndex)( interfaceDef.members, - (m) => m.type === "constructor" + (m) => m.type === "constructor", ); interfaceDef.members.splice(existingIndex + 1, 0, constructorOp); @@ -2793,7 +2921,7 @@ function autofixConstructor(interfaceDef, constructorExtAttr) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Container": () => (/* binding */ Container) +/* harmony export */ Container: () => (/* binding */ Container) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _extended_attributes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8); @@ -2816,6 +2944,19 @@ function inheritance(tokeniser) { return { colon, inheritance }; } +/** + * Parser callback. + * @callback ParserCallback + * @param {import("../tokeniser.js").Tokeniser} tokeniser + * @param {...*} args + */ + +/** + * A parser callback and optional option object. + * @typedef AllowedMember + * @type {[ParserCallback, object?]} + */ + class Container extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { /** * @param {import("../tokeniser.js").Tokeniser} tokeniser @@ -2889,7 +3030,7 @@ class Container extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.token(this.tokens.colon), w.ts.trivia(this.tokens.inheritance.trivia), w.ts.inheritance( - w.reference(this.tokens.inheritance.value, { context: this }) + w.reference(this.tokens.inheritance.value, { context: this }), ), ]); }; @@ -2908,7 +3049,7 @@ class Container extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.token(this.tokens.close), w.token(this.tokens.termination), ]), - { data: this } + { data: this }, ); } } @@ -2920,7 +3061,7 @@ class Container extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Constant": () => (/* binding */ Constant) +/* harmony export */ Constant: () => (/* binding */ Constant) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); @@ -2989,7 +3130,7 @@ class Constant extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.token(this.tokens.value), w.token(this.tokens.termination), ]), - { data: this, parent } + { data: this, parent }, ); } } @@ -3001,21 +3142,23 @@ class Constant extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "IterableLike": () => (/* binding */ IterableLike) +/* harmony export */ IterableLike: () => (/* binding */ IterableLike) /* harmony export */ }); -/* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); -/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); +/* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); -class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { + +class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_1__.Base { /** * @param {import("../tokeniser.js").Tokeniser} tokeniser */ static parse(tokeniser) { const start_position = tokeniser.position; - const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.autoParenter)( - new IterableLike({ source: tokeniser.source, tokens: {} }) + const ret = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.autoParenter)( + new IterableLike({ source: tokeniser.source, tokens: {} }), ); const { tokens } = ret; tokens.readonly = tokeniser.consume("readonly"); @@ -3025,8 +3168,8 @@ class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { tokens.base = tokens.readonly ? tokeniser.consume("maplike", "setlike") : tokens.async - ? tokeniser.consume("iterable") - : tokeniser.consume("iterable", "maplike", "setlike"); + ? tokeniser.consume("iterable") + : tokeniser.consume("iterable", "async_iterable", "maplike", "setlike"); if (!tokens.base) { tokeniser.unconsume(start_position); return; @@ -3034,14 +3177,16 @@ class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { const { type } = ret; const secondTypeRequired = type === "maplike"; - const secondTypeAllowed = secondTypeRequired || type === "iterable"; - const argumentAllowed = ret.async && type === "iterable"; + const secondTypeAllowed = + secondTypeRequired || type === "iterable" || type === "async_iterable"; + const argumentAllowed = + type === "async_iterable" || (ret.async && type === "iterable"); tokens.open = tokeniser.consume("<") || tokeniser.error(`Missing less-than sign \`<\` in ${type} declaration`); const first = - (0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.type_with_extended_attributes)(tokeniser) || + (0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.type_with_extended_attributes)(tokeniser) || tokeniser.error(`Missing a type argument in ${type} declaration`); ret.idlType = [first]; ret.arguments = []; @@ -3049,7 +3194,7 @@ class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { if (secondTypeAllowed) { first.tokens.separator = tokeniser.consume(","); if (first.tokens.separator) { - ret.idlType.push((0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.type_with_extended_attributes)(tokeniser)); + ret.idlType.push((0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.type_with_extended_attributes)(tokeniser)); } else if (secondTypeRequired) { tokeniser.error(`Missing second type argument in ${type} declaration`); } @@ -3062,7 +3207,7 @@ class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { if (tokeniser.probe("(")) { if (argumentAllowed) { tokens.argsOpen = tokeniser.consume("("); - ret.arguments.push(...(0,_helpers_js__WEBPACK_IMPORTED_MODULE_1__.argument_list)(tokeniser)); + ret.arguments.push(...(0,_helpers_js__WEBPACK_IMPORTED_MODULE_2__.argument_list)(tokeniser)); tokens.argsClose = tokeniser.consume(")") || tokeniser.error("Unterminated async iterable argument list"); @@ -3089,6 +3234,18 @@ class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { } *validate(defs) { + if (this.async && this.type === "iterable") { + const message = "`async iterable` is now changed to `async_iterable`."; + yield (0,_error_js__WEBPACK_IMPORTED_MODULE_0__.validationError)( + this.tokens.async, + this, + "obsolete-async-iterable-syntax", + message, + { + autofix: autofixAsyncIterableSyntax(this), + }, + ); + } for (const type of this.idlType) { yield* type.validate(defs); } @@ -3113,11 +3270,26 @@ class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.token(this.tokens.argsClose), w.token(this.tokens.termination), ]), - { data: this, parent: this.parent } + { data: this, parent: this.parent }, ); } } +/** + * @param {IterableLike} iterableLike + */ +function autofixAsyncIterableSyntax(iterableLike) { + return () => { + const async = iterableLike.tokens.async; + iterableLike.tokens.base = { + ...async, + type: "async_iterable", + value: "async_iterable", + }; + delete iterableLike.tokens.async; + }; +} + /***/ }), /* 23 */ @@ -3125,7 +3297,7 @@ class IterableLike extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "checkInterfaceMemberDuplication": () => (/* binding */ checkInterfaceMemberDuplication) +/* harmony export */ checkInterfaceMemberDuplication: () => (/* binding */ checkInterfaceMemberDuplication) /* harmony export */ }); /* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); @@ -3164,7 +3336,7 @@ function* checkInterfaceMemberDuplication(defs, i) { addition.tokens.name, ext, "no-cross-overload", - message + message, ); } } @@ -3185,10 +3357,10 @@ function* checkInterfaceMemberDuplication(defs, i) { const ops = getOperations(i); return { statics: new Set( - ops.filter((op) => op.special === "static").map((op) => op.name) + ops.filter((op) => op.special === "static").map((op) => op.name), ), nonstatics: new Set( - ops.filter((op) => op.special !== "static").map((op) => op.name) + ops.filter((op) => op.special !== "static").map((op) => op.name), ), }; } @@ -3201,7 +3373,7 @@ function* checkInterfaceMemberDuplication(defs, i) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Constructor": () => (/* binding */ Constructor) +/* harmony export */ Constructor: () => (/* binding */ Constructor) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -3255,7 +3427,7 @@ class Constructor extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { w.token(this.tokens.close), w.token(this.tokens.termination), ]), - { data: this, parent } + { data: this, parent }, ); } } @@ -3267,7 +3439,7 @@ class Constructor extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Mixin": () => (/* binding */ Mixin) +/* harmony export */ Mixin: () => (/* binding */ Mixin) /* harmony export */ }); /* harmony import */ var _container_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); /* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21); @@ -3282,14 +3454,13 @@ __webpack_require__.r(__webpack_exports__); class Mixin extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { /** - * @typedef {import("../tokeniser.js").Token} Token - * * @param {import("../tokeniser.js").Tokeniser} tokeniser - * @param {Token} base + * @param {import("../tokeniser.js").Token} base * @param {object} [options] - * @param {Token} [options.partial] + * @param {import("./container.js").AllowedMember[]} [options.extMembers] + * @param {import("../tokeniser.js").Token} [options.partial] */ - static parse(tokeniser, base, { partial } = {}) { + static parse(tokeniser, base, { extMembers = [], partial } = {}) { const tokens = { partial, base }; tokens.mixin = tokeniser.consume("mixin"); if (!tokens.mixin) { @@ -3300,12 +3471,13 @@ class Mixin extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { new Mixin({ source: tokeniser.source, tokens }), { allowedMembers: [ + ...extMembers, [_constant_js__WEBPACK_IMPORTED_MODULE_1__.Constant.parse], [_helpers_js__WEBPACK_IMPORTED_MODULE_4__.stringifier], [_attribute_js__WEBPACK_IMPORTED_MODULE_2__.Attribute.parse, { noInherit: true }], [_operation_js__WEBPACK_IMPORTED_MODULE_3__.Operation.parse, { regular: true }], ], - } + }, ); } @@ -3321,7 +3493,7 @@ class Mixin extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Dictionary": () => (/* binding */ Dictionary) +/* harmony export */ Dictionary: () => (/* binding */ Dictionary) /* harmony export */ }); /* harmony import */ var _container_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); /* harmony import */ var _field_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); @@ -3332,9 +3504,10 @@ class Dictionary extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { /** * @param {import("../tokeniser.js").Tokeniser} tokeniser * @param {object} [options] + * @param {import("./container.js").AllowedMember[]} [options.extMembers] * @param {import("../tokeniser.js").Token} [options.partial] */ - static parse(tokeniser, { partial } = {}) { + static parse(tokeniser, { extMembers = [], partial } = {}) { const tokens = { partial }; tokens.base = tokeniser.consume("dictionary"); if (!tokens.base) { @@ -3345,8 +3518,8 @@ class Dictionary extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { new Dictionary({ source: tokeniser.source, tokens }), { inheritable: !partial, - allowedMembers: [[_field_js__WEBPACK_IMPORTED_MODULE_1__.Field.parse]], - } + allowedMembers: [...extMembers, [_field_js__WEBPACK_IMPORTED_MODULE_1__.Field.parse]], + }, ); } @@ -3362,7 +3535,7 @@ class Dictionary extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Field": () => (/* binding */ Field) +/* harmony export */ Field: () => (/* binding */ Field) /* harmony export */ }); /* harmony import */ var _base_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); /* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); @@ -3424,7 +3597,7 @@ class Field extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { this.default ? this.default.write(w) : "", w.token(this.tokens.termination), ]), - { data: this, parent } + { data: this, parent }, ); } } @@ -3436,7 +3609,7 @@ class Field extends _base_js__WEBPACK_IMPORTED_MODULE_0__.Base { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Namespace": () => (/* binding */ Namespace) +/* harmony export */ Namespace: () => (/* binding */ Namespace) /* harmony export */ }); /* harmony import */ var _container_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); /* harmony import */ var _attribute_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14); @@ -3455,9 +3628,10 @@ class Namespace extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { /** * @param {import("../tokeniser.js").Tokeniser} tokeniser * @param {object} [options] + * @param {import("./container.js").AllowedMember[]} [options.extMembers] * @param {import("../tokeniser.js").Token} [options.partial] */ - static parse(tokeniser, { partial } = {}) { + static parse(tokeniser, { extMembers = [], partial } = {}) { const tokens = { partial }; tokens.base = tokeniser.consume("namespace"); if (!tokens.base) { @@ -3468,11 +3642,12 @@ class Namespace extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { new Namespace({ source: tokeniser.source, tokens }), { allowedMembers: [ + ...extMembers, [_attribute_js__WEBPACK_IMPORTED_MODULE_1__.Attribute.parse, { noInherit: true, readonly: true }], [_constant_js__WEBPACK_IMPORTED_MODULE_5__.Constant.parse], [_operation_js__WEBPACK_IMPORTED_MODULE_2__.Operation.parse, { regular: true }], ], - } + }, ); } @@ -3497,7 +3672,7 @@ for more information.`; message, { autofix: (0,_helpers_js__WEBPACK_IMPORTED_MODULE_4__.autofixAddExposedWindow)(this), - } + }, ); } yield* super.validate(defs); @@ -3511,7 +3686,7 @@ for more information.`; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CallbackInterface": () => (/* binding */ CallbackInterface) +/* harmony export */ CallbackInterface: () => (/* binding */ CallbackInterface) /* harmony export */ }); /* harmony import */ var _container_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); /* harmony import */ var _operation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(13); @@ -3523,8 +3698,11 @@ __webpack_require__.r(__webpack_exports__); class CallbackInterface extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Container { /** * @param {import("../tokeniser.js").Tokeniser} tokeniser + * @param {*} callback + * @param {object} [options] + * @param {import("./container.js").AllowedMember[]} [options.extMembers] */ - static parse(tokeniser, callback, { partial = null } = {}) { + static parse(tokeniser, callback, { extMembers = [] } = {}) { const tokens = { callback }; tokens.base = tokeniser.consume("interface"); if (!tokens.base) { @@ -3534,12 +3712,12 @@ class CallbackInterface extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Conta tokeniser, new CallbackInterface({ source: tokeniser.source, tokens }), { - inheritable: !partial, allowedMembers: [ + ...extMembers, [_constant_js__WEBPACK_IMPORTED_MODULE_2__.Constant.parse], [_operation_js__WEBPACK_IMPORTED_MODULE_1__.Operation.parse, { regular: true }], ], - } + }, ); } @@ -3555,8 +3733,8 @@ class CallbackInterface extends _container_js__WEBPACK_IMPORTED_MODULE_0__.Conta __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Writer": () => (/* binding */ Writer), -/* harmony export */ "write": () => (/* binding */ write) +/* harmony export */ Writer: () => (/* binding */ Writer), +/* harmony export */ write: () => (/* binding */ write) /* harmony export */ }); function noop(arg) { return arg; @@ -3640,7 +3818,7 @@ function write(ast, { templates: ts = templates } = {}) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "validate": () => (/* binding */ validate) +/* harmony export */ validate: () => (/* binding */ validate) /* harmony export */ }); /* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); @@ -3797,14 +3975,14 @@ function validate(ast) { /******/ /************************************************************************/ var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. (() => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "WebIDLParseError": () => (/* reexport safe */ _lib_tokeniser_js__WEBPACK_IMPORTED_MODULE_3__.WebIDLParseError), -/* harmony export */ "parse": () => (/* reexport safe */ _lib_webidl2_js__WEBPACK_IMPORTED_MODULE_0__.parse), -/* harmony export */ "validate": () => (/* reexport safe */ _lib_validator_js__WEBPACK_IMPORTED_MODULE_2__.validate), -/* harmony export */ "write": () => (/* reexport safe */ _lib_writer_js__WEBPACK_IMPORTED_MODULE_1__.write) +/* harmony export */ WebIDLParseError: () => (/* reexport safe */ _lib_tokeniser_js__WEBPACK_IMPORTED_MODULE_3__.WebIDLParseError), +/* harmony export */ parse: () => (/* reexport safe */ _lib_webidl2_js__WEBPACK_IMPORTED_MODULE_0__.parse), +/* harmony export */ validate: () => (/* reexport safe */ _lib_validator_js__WEBPACK_IMPORTED_MODULE_2__.validate), +/* harmony export */ write: () => (/* reexport safe */ _lib_writer_js__WEBPACK_IMPORTED_MODULE_1__.write) /* harmony export */ }); /* harmony import */ var _lib_webidl2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony import */ var _lib_writer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30); diff --git a/tests/wpt/tests/service-workers/service-worker/intercepted-referrer.https.html b/tests/wpt/tests/service-workers/service-worker/intercepted-referrer.https.html new file mode 100644 index 00000000000..72d78945139 --- /dev/null +++ b/tests/wpt/tests/service-workers/service-worker/intercepted-referrer.https.html @@ -0,0 +1,51 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Service Worker intercepted navigation preserves document.referrer</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> + +<body> +<h1>Service Worker intercepted navigation preserves document.referrer</h1> +<script> +promise_test(async t => { + // Scope where the SW will control navigations. + // This lives under the same directory as the SW script below. + const scope = 'resources/referrer-scope/'; + + // Ensure a clean registration, then register the SW. + const reg = await service_worker_unregister_and_register( + t, 'resources/intercepted-referrer-sw.js', scope); + + // Wait for activation (handles fresh or already-active cases). + const worker = reg.installing || reg.waiting || reg.active; + await wait_for_state(t, worker, 'activated'); + + // We’ll get one message back from the intercepted document. + const messagePromise = new Promise(resolve => { + window.addEventListener('message', e => resolve(e.data), { once: true }); + }); + + // Create a navigation under the SW’s scope. The SW will synthesize the page. + const iframe = document.createElement('iframe'); + t.add_cleanup(() => iframe.remove()); + iframe.src = scope + 'navigated.html'; + document.body.append(iframe); + + const data = await messagePromise; + + // Basic sanity from the child payload. + assert_equals(data && data.source, 'sw-intercepted', 'Child payload is from SW response'); + + // document.referrer should be the full URL of this test page (same-origin default policy). + // WPT servers send same-origin requests with full referrer (default "strict-origin-when-cross-origin"). + const expectedReferrer = location.href; + + assert_equals(data.referrer, expectedReferrer, + 'document.referrer inside the SW-synthesized document equals the parent test page URL'); + + // Clean up: unregister the SW. + t.add_cleanup(() => reg.unregister()); +}, 'document.referrer for a navigation intercepted by a Service Worker is unchanged and matches the parent URL'); +</script> +</body> diff --git a/tests/wpt/tests/service-workers/service-worker/resources/intercepted-referrer-sw.js b/tests/wpt/tests/service-workers/service-worker/resources/intercepted-referrer-sw.js new file mode 100644 index 00000000000..f0246c8dbe4 --- /dev/null +++ b/tests/wpt/tests/service-workers/service-worker/resources/intercepted-referrer-sw.js @@ -0,0 +1,35 @@ +self.addEventListener('install', event => { + // Activate immediately to simplify the test. + event.waitUntil(self.skipWaiting()); +}); + +self.addEventListener('activate', event => { + // Make sure the very next navigation is controlled by this SW. + event.waitUntil(self.clients.claim()); +}); + +self.addEventListener('fetch', event => { + // Only handle top-level navigations within our scope. + if (event.request.mode === 'navigate') { + const html = `<!doctype html> + <meta charset="utf-8"> + <title>SW Intercepted Page</title> + <script> + // Post the referrer observed by this new Document. + window.addEventListener('load', () => { + parent.postMessage({ + source: 'sw-intercepted', + referrer: document.referrer, + url: location.href + }, '*'); + }); + </script> + <h1>SW-synthesized page</h1> + <p>This page was served by a Service Worker via respondWith().</p>`; + + event.respondWith(new Response(html, { + headers: { 'Content-Type': 'text/html; charset=utf-8' } + })); + } + // Otherwise, fall through to network. +}); diff --git a/tests/wpt/tests/speech-api/idlharness.window.js b/tests/wpt/tests/speech-api/idlharness.https.window.js similarity index 100% rename from tests/wpt/tests/speech-api/idlharness.window.js rename to tests/wpt/tests/speech-api/idlharness.https.window.js diff --git a/tests/wpt/tests/storage-access-api/requestStorageAccess-sandboxed-iframe-allow-storage-access.sub.https.window.js b/tests/wpt/tests/storage-access-api/requestStorageAccess-sandboxed-iframe-allow-storage-access.sub.https.window.js index c163245ce36..faff38daf9b 100644 --- a/tests/wpt/tests/storage-access-api/requestStorageAccess-sandboxed-iframe-allow-storage-access.sub.https.window.js +++ b/tests/wpt/tests/storage-access-api/requestStorageAccess-sandboxed-iframe-allow-storage-access.sub.https.window.js @@ -7,6 +7,6 @@ const frameSourceUrl = 'https://{{hosts[alt][www]}}:{{ports[https][0]}}/storage-access-api/resources/sandboxed-iframe-allow-storage-access.html'; const sandboxAttribute = - 'allow-scripts allow-same-origin allow-storage-access-by-user-activation'; + 'allow-scripts allow-same-origin allow-storage-access-by-user-activation allow-popups'; RunTestsInIFrame(frameSourceUrl, sandboxAttribute); diff --git a/tests/wpt/tests/storage-access-api/resources/sandboxed-iframe-allow-storage-access.html b/tests/wpt/tests/storage-access-api/resources/sandboxed-iframe-allow-storage-access.html index 4df0de7719d..4510b8f83fc 100644 --- a/tests/wpt/tests/storage-access-api/resources/sandboxed-iframe-allow-storage-access.html +++ b/tests/wpt/tests/storage-access-api/resources/sandboxed-iframe-allow-storage-access.html @@ -29,6 +29,7 @@ t.add_cleanup(async () => { await test_driver.set_permission({name: 'storage-access'}, 'prompt'); }); + await SetFirstPartyCookie(location.origin, "initial-cookie=unpartitioned;Secure;SameSite=None;Path=/"); await test_driver.set_permission({name: 'storage-access'}, 'granted'); await MaybeSetStorageAccess('*', '*', 'blocked'); await document.requestStorageAccess(); @@ -45,6 +46,7 @@ t.add_cleanup(async () => { await test_driver.set_permission({name: 'storage-access'}, 'prompt'); }); + await SetFirstPartyCookie(location.origin, "initial-cookie=unpartitioned;Secure;SameSite=None;Path=/"); await test_driver.set_permission({name: 'storage-access'}, 'granted'); await MaybeSetStorageAccess('*', '*', 'blocked'); diff --git a/tests/wpt/tests/streams/readable-byte-streams/bad-buffers-and-views.any.js b/tests/wpt/tests/streams/readable-byte-streams/bad-buffers-and-views.any.js index afcc61e6800..eae8dde03f6 100644 --- a/tests/wpt/tests/streams/readable-byte-streams/bad-buffers-and-views.any.js +++ b/tests/wpt/tests/streams/readable-byte-streams/bad-buffers-and-views.any.js @@ -123,8 +123,7 @@ promise_test(t => { async_test(t => { const stream = new ReadableStream({ pull: t.step_func_done(c => { - // Detach it by reading into it - reader.read(c.byobRequest.view); + c.byobRequest.view.buffer.transfer(); assert_throws_js(TypeError, () => c.byobRequest.respond(1), 'respond() must throw if the corresponding view has become detached'); @@ -141,9 +140,7 @@ async_test(t => { const stream = new ReadableStream({ pull: t.step_func_done(c => { c.close(); - - // Detach it by reading into it - reader.read(c.byobRequest.view); + c.byobRequest.view.buffer.transfer(); assert_throws_js(TypeError, () => c.byobRequest.respond(0), 'respond() must throw if the corresponding view has become detached'); @@ -159,9 +156,8 @@ async_test(t => { async_test(t => { const stream = new ReadableStream({ pull: t.step_func_done(c => { - // Detach it by reading into it const view = new Uint8Array([1, 2, 3]); - reader.read(view); + view.buffer.transfer(); assert_throws_js(TypeError, () => c.byobRequest.respondWithNewView(view)); }), @@ -364,8 +360,7 @@ async_test(t => { async_test(t => { const stream = new ReadableStream({ pull: t.step_func_done(c => { - // Detach it by reading into it - reader.read(c.byobRequest.view); + c.byobRequest.view.buffer.transfer(); assert_throws_js(TypeError, () => c.enqueue(new Uint8Array([1])), 'enqueue() must throw if the BYOB request\'s buffer has become detached'); @@ -382,9 +377,7 @@ async_test(t => { const stream = new ReadableStream({ pull: t.step_func_done(c => { c.close(); - - // Detach it by reading into it - reader.read(c.byobRequest.view); + c.byobRequest.view.buffer.transfer(); assert_throws_js(TypeError, () => c.enqueue(new Uint8Array([1])), 'enqueue() must throw if the BYOB request\'s buffer has become detached'); diff --git a/tests/wpt/tests/svg/as-image/external-resource-inline-sheet-helper.svg b/tests/wpt/tests/svg/as-image/external-resource-inline-sheet-helper.svg new file mode 100644 index 00000000000..f4b5f8c0c5d --- /dev/null +++ b/tests/wpt/tests/svg/as-image/external-resource-inline-sheet-helper.svg @@ -0,0 +1,7 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"> + <style><![CDATA[ + svg { + background-image: url(/images/blue.png); + } + ]]></style> +</svg> diff --git a/tests/wpt/tests/svg/as-image/external-resource-inline-sheet-ref.html b/tests/wpt/tests/svg/as-image/external-resource-inline-sheet-ref.html new file mode 100644 index 00000000000..7d3b74ec048 --- /dev/null +++ b/tests/wpt/tests/svg/as-image/external-resource-inline-sheet-ref.html @@ -0,0 +1,17 @@ +<!doctype html> +<meta charset="utf-8"> +<link rel=help href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982344"> +<style> +div { + display: inline-block; + width: 100px; + height: 100px; +} +.blue { + background-color: red; + background-image: url(/images/blue.png); +} +</style> + +<div></div> +<div class="blue"></div> diff --git a/tests/wpt/tests/svg/as-image/external-resource-inline-sheet.html b/tests/wpt/tests/svg/as-image/external-resource-inline-sheet.html new file mode 100644 index 00000000000..b3017c7bae9 --- /dev/null +++ b/tests/wpt/tests/svg/as-image/external-resource-inline-sheet.html @@ -0,0 +1,9 @@ +<!doctype html> +<meta charset="utf-8"> +<title>SVG as image loading external resource from an inline sheet</title> +<link rel=help href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982344"> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="author" href="https://mozilla.com" title="Mozilla"> +<link rel="match" href="external-resource-inline-sheet-ref.html"> +<img src="external-resource-inline-sheet-helper.svg?0" width=100 height=100> +<object data="external-resource-inline-sheet-helper.svg?1" type="image/svg+xml" width=100 height=100></object> diff --git a/tests/wpt/tests/svg/painting/marker-009.svg b/tests/wpt/tests/svg/painting/marker-009.svg index 9e6fe21d917..e4b71011d67 100644 --- a/tests/wpt/tests/svg/painting/marker-009.svg +++ b/tests/wpt/tests/svg/painting/marker-009.svg @@ -2,6 +2,7 @@ <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#OrientAttribute"/> <html:link rel="match" href="marker-009-ref.svg"/> <html:meta name="assert" content="Tests correct number of markers are drawn on multiple sub-paths"/> + <html:meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-50"/> <defs> <marker id="m1" markerUnits="userSpaceOnUse" overflow="visible"> <circle cx="0" cy="0" r="25" fill="green"/> diff --git a/tests/wpt/tests/svg/styling/use-element-attr-selector-transition.html b/tests/wpt/tests/svg/styling/use-element-attr-selector-transition.html new file mode 100644 index 00000000000..3a617cc315c --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-attr-selector-transition.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>SVG Test: Attribute change in template starts transition in &lt;use&gt; element tree</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElement"> +<link rel="match" href="use-element-selector-ref.html"> +<style> + #rect { fill: black; transition: fill 1000s steps(2, start); } + [attr] > #rect { fill: lime; } +</style> +<svg> + <use id="use_elm" xlink:href="#tmpl" /> + <defs> + <g id="tmpl"> + <rect id="rect" width="100" height="100"></rect> + </g> + </defs> +</svg> +<script> + requestAnimationFrame(() => { + requestAnimationFrame(() => { + tmpl.setAttribute("attr", "val"); + document.documentElement.classList.remove('reftest-wait'); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/styling/use-element-attr-selector.html b/tests/wpt/tests/svg/styling/use-element-attr-selector.html new file mode 100644 index 00000000000..8994d907534 --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-attr-selector.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>SVG Test: Attribute change in template affects attribute selector matching in &lt;use&gt; element tree</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElement"> +<link rel="match" href="use-element-selector-ref.html"> +<style> + [attr] > #rect { fill: green; } +</style> +<svg> + <use id="use_elm" xlink:href="#tmpl" /> + <defs> + <g id="tmpl"> + <rect id="rect" width="100" height="100"></rect> + </g> + </defs> +</svg> +<script> + requestAnimationFrame(() => { + requestAnimationFrame(() => { + tmpl.setAttribute("attr", "val"); + document.documentElement.classList.remove('reftest-wait'); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/styling/use-element-class-selector-transition.html b/tests/wpt/tests/svg/styling/use-element-class-selector-transition.html new file mode 100644 index 00000000000..73c3b1da6c0 --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-class-selector-transition.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>SVG Test: Class change in template starts transition in &lt;use&gt; element tree</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElement"> +<link rel="match" href="use-element-selector-ref.html"> +<style> + #rect { fill: black; transition: fill 1000s steps(2, start); } + .class > #rect { fill: lime; } +</style> +<svg> + <use id="use_elm" xlink:href="#tmpl" /> + <defs> + <g id="tmpl"> + <rect id="rect" width="100" height="100"></rect> + </g> + </defs> +</svg> +<script> + requestAnimationFrame(() => { + requestAnimationFrame(() => { + tmpl.setAttribute("class", "class"); + document.documentElement.classList.remove('reftest-wait'); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/styling/use-element-class-selector.html b/tests/wpt/tests/svg/styling/use-element-class-selector.html new file mode 100644 index 00000000000..d53d462cae8 --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-class-selector.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>SVG Test: Class change in template affects class selector matching in &lt;use&gt; element tree</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElement"> +<link rel="match" href="use-element-selector-ref.html"> +<style> + .class > #rect { fill: green; } +</style> +<svg> + <use id="use_elm" xlink:href="#tmpl" /> + <defs> + <g id="tmpl"> + <rect id="rect" width="100" height="100"></rect> + </g> + </defs> +</svg> +<script> + requestAnimationFrame(() => { + requestAnimationFrame(() => { + tmpl.setAttribute("class", "class"); + document.documentElement.classList.remove('reftest-wait'); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/styling/use-element-id-selector-transition.html b/tests/wpt/tests/svg/styling/use-element-id-selector-transition.html new file mode 100644 index 00000000000..83702aff752 --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-id-selector-transition.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>SVG Test: Id change in template starts transition in &lt;use&gt; element tree</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElement"> +<link rel="match" href="use-element-selector-ref.html"> +<style> + #rect { fill: black; transition: fill 1000s steps(2, start); } + #id > #rect { fill: lime; } +</style> +<svg> + <use id="use_elm" xlink:href="#tmpl" /> + <defs> + <g id="tmpl"> + <g id="no_id"> + <rect id="rect" width="100" height="100"></rect> + </g> + </g> + </defs> +</svg> +<script> + requestAnimationFrame(() => { + requestAnimationFrame(() => { + no_id.setAttribute("id", "id"); + document.documentElement.classList.remove('reftest-wait'); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/styling/use-element-id-selector.html b/tests/wpt/tests/svg/styling/use-element-id-selector.html new file mode 100644 index 00000000000..ce71e3610c7 --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-id-selector.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>SVG Test: Id change in template affects id selector matching in &lt;use&gt; element tree</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElement"> +<link rel="match" href="use-element-selector-ref.html"> +<style> + #id > #rect { fill: green; } +</style> +<svg> + <use id="use_elm" xlink:href="#tmpl" /> + <defs> + <g id="tmpl"> + <g id="no_id"> + <rect id="rect" width="100" height="100"></rect> + </g> + </g> + </defs> +</svg> +<script> + requestAnimationFrame(() => { + requestAnimationFrame(() => { + no_id.setAttribute("id", "id"); + document.documentElement.classList.remove('reftest-wait'); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/styling/use-element-selector-ref.html b/tests/wpt/tests/svg/styling/use-element-selector-ref.html new file mode 100644 index 00000000000..b428098e205 --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-selector-ref.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<title>SVG Test Reference</title> +<svg> + <rect width="100" height="100" fill="green"></rect> +</svg> diff --git a/tests/wpt/tests/svg/styling/use-element-transitions-dom-mutation.html b/tests/wpt/tests/svg/styling/use-element-transitions-dom-mutation.html new file mode 100644 index 00000000000..897c9dfa17f --- /dev/null +++ b/tests/wpt/tests/svg/styling/use-element-transitions-dom-mutation.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>SVG Test: DOM mutations in template should not stop transition in &lt;use&gt; element tree</title> +<link rel="help" href="https://svgwg.org/svg2-draft/struct.html#UseElement"> +<link rel="match" href="use-element-selector-ref.html"> +<style> + #rect { fill: black; transition: fill 1000s steps(2, start); } + .class > #rect { fill: lime; } +</style> +<svg> + <use id="use_elm" xlink:href="#tmpl" /> + <defs> + <g id="tmpl"> + <rect id="rect" width="100" height="100"></rect> + <text id="txt">FAIL</text> + </g> + </defs> +</svg> +<script> + requestAnimationFrame(() => { + requestAnimationFrame(() => { + tmpl.setAttribute("class", "class"); + requestAnimationFrame(() => { + txt.remove(); + document.documentElement.classList.remove('reftest-wait'); + }); + }); + }); +</script> diff --git a/tests/wpt/tests/svg/types/scripted/SVGAnimatedInteger.html b/tests/wpt/tests/svg/types/scripted/SVGAnimatedInteger.html index e8e8b30a7a5..1ed590b52ee 100644 --- a/tests/wpt/tests/svg/types/scripted/SVGAnimatedInteger.html +++ b/tests/wpt/tests/svg/types/scripted/SVGAnimatedInteger.html @@ -21,7 +21,8 @@ test(function() { // Check assigning various valid and invalid values. feConvolveMatrix.targetX.baseVal = -1; - assert_equals(feConvolveMatrix.targetX.baseVal, -1); // Negative values are allowed from SVG DOM, but should lead to an error when rendering (disable the filter) + // Negative values are allowed from SVG DOM, but should lead to an error when rendering (disable the filter) + assert_equals(feConvolveMatrix.targetX.baseVal, -1); feConvolveMatrix.targetX.baseVal = 300; assert_equals(feConvolveMatrix.targetX.baseVal, 300); // ECMA-262, 9.5, "ToInt32" @@ -41,8 +42,12 @@ test(function() { feConvolveMatrix.setAttribute("order", "5"); assert_equals(feConvolveMatrix.orderX.baseVal, 5); feConvolveMatrix.setAttribute("order", "-1.5"); - assert_equals(feConvolveMatrix.orderX.baseVal, -1); - feConvolveMatrix.orderX.baseVal = -2.7; - assert_equals(feConvolveMatrix.orderX.baseVal, -2); // Negative values are allowed from SVG DOM, but should lead to an error when rendering (disable the filter) + // Invalid values should result in the initial value being returned + // For orderX that is 3 per + // https://www.w3.org/TR/filter-effects-1/#element-attrdef-order + assert_equals(feConvolveMatrix.orderX.baseVal, 3); + feConvolveMatrix.orderX.baseVal = -2; + // Negative values are allowed from SVG DOM, but should lead to an error when rendering (disable the filter) + assert_equals(feConvolveMatrix.orderX.baseVal, -2); }); </script> diff --git a/tests/wpt/tests/svg/types/scripted/SVGAnimatedNumber.html b/tests/wpt/tests/svg/types/scripted/SVGAnimatedNumber.html index c72cabca1a8..3852665c50e 100644 --- a/tests/wpt/tests/svg/types/scripted/SVGAnimatedNumber.html +++ b/tests/wpt/tests/svg/types/scripted/SVGAnimatedNumber.html @@ -20,7 +20,8 @@ test(function() { assert_equals(feSpecularLightingElement.surfaceScale.baseVal, 1); // Check assigning various valid and invalid values. - feSpecularLightingElement.surfaceScale.baseVal = -1; // Negative values are allowed from SVG DOM, but should lead to an error when rendering (disable the filter) + // Negative values are allowed from SVG DOM, but should lead to an error when rendering (disable the filter) + feSpecularLightingElement.surfaceScale.baseVal = -1; assert_equals(feSpecularLightingElement.surfaceScale.baseVal, -1); feSpecularLightingElement.surfaceScale.baseVal = 300; assert_equals(feSpecularLightingElement.surfaceScale.baseVal, 300); diff --git a/tests/wpt/tests/tools/ci/tc/tasks/test.yml b/tests/wpt/tests/tools/ci/tc/tasks/test.yml index ebf3098b6af..b67821cce1d 100644 --- a/tests/wpt/tests/tools/ci/tc/tasks/test.yml +++ b/tests/wpt/tests/tools/ci/tc/tasks/test.yml @@ -247,12 +247,6 @@ tasks: use: - trigger-weekly - trigger-push - - vars: - browser: servo - channel: nightly - use: - - trigger-daily - - trigger-push - vars: browser: firefox_android channel: nightly @@ -278,6 +272,39 @@ tasks: of ${chunks.total}), run in the ${vars.channel} release of ${vars.browser}. + # Servo is handled separately to skip the wdspec suite until + # https://github.com/servo/servo/issues/38586 is resolved. + - $map: + for: + - vars: + suite: testharness + - vars: + suite: reftest + - vars: + suite: crashtest + do: + $map: + for: + - vars: + browser: servo + channel: nightly + use: + - trigger-daily + - trigger-push + do: + - ${vars.browser}-${vars.channel}-${vars.suite}: + use: + - wpt-base + - run-options + - wpt-run + - browser-${vars.browser} + - wpt-${vars.suite} + description: >- + A subset of WPT's "${vars.suite}" tests (chunk number ${chunks.id} + of ${chunks.total}), run in the ${vars.channel} release of + ${vars.browser}. + + # print-reftest are currently only supported by Chrome and Firefox. - $map: for: diff --git a/tests/wpt/tests/tools/ci/tc/tests/test_valid.py b/tests/wpt/tests/tools/ci/tc/tests/test_valid.py index a8390936cad..023744268c0 100644 --- a/tests/wpt/tests/tools/ci/tc/tests/test_valid.py +++ b/tests/wpt/tests/tools/ci/tc/tests/test_valid.py @@ -285,22 +285,6 @@ def test_verify_payload(): 'wpt-wpewebkit_minibrowser-nightly-testharness-14', 'wpt-wpewebkit_minibrowser-nightly-testharness-15', 'wpt-wpewebkit_minibrowser-nightly-testharness-16', - 'wpt-servo-nightly-testharness-1', - 'wpt-servo-nightly-testharness-2', - 'wpt-servo-nightly-testharness-3', - 'wpt-servo-nightly-testharness-4', - 'wpt-servo-nightly-testharness-5', - 'wpt-servo-nightly-testharness-6', - 'wpt-servo-nightly-testharness-7', - 'wpt-servo-nightly-testharness-8', - 'wpt-servo-nightly-testharness-9', - 'wpt-servo-nightly-testharness-10', - 'wpt-servo-nightly-testharness-11', - 'wpt-servo-nightly-testharness-12', - 'wpt-servo-nightly-testharness-13', - 'wpt-servo-nightly-testharness-14', - 'wpt-servo-nightly-testharness-15', - 'wpt-servo-nightly-testharness-16', 'wpt-firefox_android-nightly-testharness-1', 'wpt-firefox_android-nightly-testharness-2', 'wpt-firefox_android-nightly-testharness-3', @@ -391,12 +375,6 @@ def test_verify_payload(): 'wpt-wpewebkit_minibrowser-nightly-reftest-4', 'wpt-wpewebkit_minibrowser-nightly-reftest-5', 'wpt-wpewebkit_minibrowser-nightly-reftest-6', - 'wpt-servo-nightly-reftest-1', - 'wpt-servo-nightly-reftest-2', - 'wpt-servo-nightly-reftest-3', - 'wpt-servo-nightly-reftest-4', - 'wpt-servo-nightly-reftest-5', - 'wpt-servo-nightly-reftest-6', 'wpt-firefox_android-nightly-reftest-1', 'wpt-firefox_android-nightly-reftest-2', 'wpt-firefox_android-nightly-reftest-3', @@ -419,8 +397,6 @@ def test_verify_payload(): 'wpt-webkitgtk_minibrowser-nightly-wdspec-2', 'wpt-wpewebkit_minibrowser-nightly-wdspec-1', 'wpt-wpewebkit_minibrowser-nightly-wdspec-2', - 'wpt-servo-nightly-wdspec-1', - 'wpt-servo-nightly-wdspec-2', 'wpt-firefox_android-nightly-wdspec-1', 'wpt-firefox_android-nightly-wdspec-2', 'wpt-firefox_android-stable-wdspec-1', @@ -430,9 +406,31 @@ def test_verify_payload(): 'wpt-chrome-stable-crashtest-1', 'wpt-webkitgtk_minibrowser-nightly-crashtest-1', 'wpt-wpewebkit_minibrowser-nightly-crashtest-1', - 'wpt-servo-nightly-crashtest-1', 'wpt-firefox_android-nightly-crashtest-1', 'wpt-firefox_android-stable-crashtest-1', + 'wpt-servo-nightly-testharness-1', + 'wpt-servo-nightly-testharness-2', + 'wpt-servo-nightly-testharness-3', + 'wpt-servo-nightly-testharness-4', + 'wpt-servo-nightly-testharness-5', + 'wpt-servo-nightly-testharness-6', + 'wpt-servo-nightly-testharness-7', + 'wpt-servo-nightly-testharness-8', + 'wpt-servo-nightly-testharness-9', + 'wpt-servo-nightly-testharness-10', + 'wpt-servo-nightly-testharness-11', + 'wpt-servo-nightly-testharness-12', + 'wpt-servo-nightly-testharness-13', + 'wpt-servo-nightly-testharness-14', + 'wpt-servo-nightly-testharness-15', + 'wpt-servo-nightly-testharness-16', + 'wpt-servo-nightly-reftest-1', + 'wpt-servo-nightly-reftest-2', + 'wpt-servo-nightly-reftest-3', + 'wpt-servo-nightly-reftest-4', + 'wpt-servo-nightly-reftest-5', + 'wpt-servo-nightly-reftest-6', + 'wpt-servo-nightly-crashtest-1', 'wpt-firefox-stable-print-reftest-1', 'wpt-chromium-nightly-print-reftest-1', 'wpt-chrome-stable-print-reftest-1']) 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 1704c05ee20..edd335e97bd 100644 --- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py +++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/emulation.py @@ -1,4 +1,5 @@ -from typing import Any, Dict, List, Mapping, MutableMapping, Optional, Union +from typing import Any, Dict, List, Literal, Mapping, MutableMapping, Optional, \ + Union from ._module import BidiModule, command from ..undefined import UNDEFINED, Undefined @@ -70,6 +71,19 @@ class Emulation(BidiModule): return params + @command + def set_scripting_enabled( + self, + enabled: Literal[False, None], + contexts: Union[List[str], Undefined] = UNDEFINED, + user_contexts: Union[List[str], Undefined] = UNDEFINED, + ) -> Mapping[str, Any]: + return { + "enabled": enabled, + "contexts": contexts, + "userContexts": user_contexts, + } + @command def set_screen_orientation_override( self, diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py index c8fb1ec4e92..0ca03bb9c76 100644 --- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py +++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/network.py @@ -282,6 +282,19 @@ class Network(BidiModule): params: MutableMapping[str, Any] = {"collector": collector} return params + @command + def disown_data( + self, + request: str, + data_type: str, + collector: str) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = { + "request": request, + "dataType": data_type, + "collector": collector, + } + return params + @command def set_cache_behavior( self, diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py index 7d702878a7e..8e7dfae41eb 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -86,6 +86,15 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite # fail to create a session if they don't recognize this capability. chrome_options["quitGracefully"] = True + if trace_categories := kwargs.get("trace_categories"): + executor_kwargs["enable_tracing"] = True + capabilities["goog:loggingPrefs"] = { + "performance": "INFO", + } + chrome_options["perfLoggingPrefs"] = { + "traceCategories": trace_categories, + } + # Here we set a few Chrome flags that are always passed. # ChromeDriver's "acceptInsecureCerts" capability only controls the current # browsing context, whereas the CLI flag works for workers, too. diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py index 2324e043f30..d66616005a8 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py @@ -164,6 +164,15 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, capabilities["pageLoadStrategy"] = "eager" if test_type in ("reftest", "print-reftest"): executor_kwargs["reftest_internal"] = kwargs["reftest_internal"] + cache_screenshots = True + if run_info_data["os"] == "android": + try: + major_version = int(run_info_data["version"].split(".", 1)[0]) + except ValueError: + pass + else: + cache_screenshots = major_version < 14 + executor_kwargs["cache_screenshots"] = cache_screenshots if test_type == "wdspec": options = {"args": []} if kwargs["binary"]: @@ -231,7 +240,6 @@ def run_info_extras(logger, default_prefs=None, **kwargs): "swgl": bool_pref("gfx.webrender.software"), "privateBrowsing": bool_pref("browser.privatebrowsing.autostart"), "remoteAsyncEvents": bool_pref("remote.events.async.wheel.enabled"), - "remoteCNM": not bool_pref("remote.parent-navigation.enabled"), "incOriginInit": os.environ.get("MOZ_ENABLE_INC_ORIGIN_INIT") == "1", } rv.update(run_info_browser_version(**kwargs)) @@ -256,6 +264,7 @@ def run_info_browser_version(**kwargs): def update_properties(): return ([ "os", + "os_version", "debug", "display", "fission", @@ -265,7 +274,6 @@ def update_properties(): "asan", "tsan", "remoteAsyncEvents", - "remoteCNM", "sessionHistoryInParent", "subsuite"], { "os": ["version"], diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py index ced41b5b184..d23940e4b61 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py @@ -185,6 +185,38 @@ class ChromeDriverDevToolsProtocolPart(ProtocolPart): body=body) +class ChromeDriverTracingProtocolPart(ProtocolPart): + name = "tracing" + + def setup(self): + self.webdriver = self.parent.webdriver + + def get_trace(self): + """Retrieve trace events accumulated by ChromeDriver. + + This also clears ChromeDriver's internal buffer of logged events. + + Returns: + JSON in the trace array format [0]. + + [0]: https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview?tab=t.0#heading=h.f2f0yd51wi15 + """ + # Not a standard WebDriver method. + perf_data = self.webdriver.send_session_command("POST", "se/log", { + "type": "performance", + }) + events = [] + for entry in perf_data: + # Unwrap the inner trace event and discard the unnecessary + # ChromeDriver-added fields. + data_collected_event = json.loads(entry["message"]).get("message", {}) + if data_collected_event.get("method") != "Tracing.dataCollected": + continue + if trace_event := data_collected_event.get("params"): + events.append(trace_event) + return events + + class ChromeDriverProtocol(WebDriverProtocol): implements = [ ChromeDriverBaseProtocolPart, @@ -192,6 +224,7 @@ class ChromeDriverProtocol(WebDriverProtocol): ChromeDriverFedCMProtocolPart, ChromeDriverTestDriverProtocolPart, ChromeDriverTestharnessProtocolPart, + ChromeDriverTracingProtocolPart, ] for base_part in WebDriverProtocol.implements: if base_part.name not in {part.name for part in implements}: @@ -213,6 +246,7 @@ class ChromeDriverBidiProtocol(WebDriverBidiProtocol): ChromeDriverDevToolsProtocolPart, ChromeDriverFedCMProtocolPart, ChromeDriverTestharnessProtocolPart, + ChromeDriverTracingProtocolPart, ] for base_part in WebDriverBidiProtocol.implements: if base_part.name not in {part.name for part in implements}: @@ -258,24 +292,39 @@ def _evaluate_sanitized_result(executor_cls): class ChromeDriverCrashTestExecutor(WebDriverCrashtestExecutor): protocol_cls = ChromeDriverProtocol - def __init__(self, *args, sanitizer_enabled=False, **kwargs): + def __init__(self, *args, sanitizer_enabled=False, enable_tracing=False, **kwargs): super().__init__(*args, **kwargs) self.sanitizer_enabled = sanitizer_enabled + self.enable_tracing = enable_tracing + + def do_test(self, test): + file_result, subtest_results = super().do_test(test) + if self.enable_tracing: + file_result.extra["trace"] = self.protocol.tracing.get_trace() + return file_result, subtest_results @_evaluate_sanitized_result class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor): protocol_cls = ChromeDriverProtocol - def __init__(self, *args, sanitizer_enabled=False, **kwargs): + def __init__(self, *args, sanitizer_enabled=False, enable_tracing=False, **kwargs): super().__init__(*args, **kwargs) self.sanitizer_enabled = sanitizer_enabled + self.enable_tracing = enable_tracing + + def do_test(self, test): + file_result, subtest_results = super().do_test(test) + if self.enable_tracing: + file_result.extra["trace"] = self.protocol.tracing.get_trace() + return file_result, subtest_results @_evaluate_sanitized_result class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor): - def __init__(self, *args, sanitizer_enabled=False, reuse_window=False, **kwargs): + def __init__(self, *args, sanitizer_enabled=False, enable_tracing=False, reuse_window=False, + **kwargs): require_webdriver_bidi = kwargs.get("browser_settings", {}).get( "require_webdriver_bidi", None) if require_webdriver_bidi: @@ -285,6 +334,7 @@ class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor): super().__init__(*args, **kwargs) self.sanitizer_enabled = sanitizer_enabled + self.enable_tracing = enable_tracing self.reuse_window = reuse_window def create_test_window(self, protocol): @@ -312,11 +362,24 @@ class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor): self.protocol.testharness.persistent_test_window = test_window return test_window + def do_test(self, test): + file_result, subtest_results = super().do_test(test) + if self.enable_tracing: + file_result.extra["trace"] = self.protocol.tracing.get_trace() + return file_result, subtest_results + @_evaluate_sanitized_result class ChromeDriverPrintRefTestExecutor(WebDriverPrintRefTestExecutor): protocol_cls = ChromeDriverProtocol - def __init__(self, *args, sanitizer_enabled=False, **kwargs): + def __init__(self, *args, sanitizer_enabled=False, enable_tracing=False, **kwargs): super().__init__(*args, **kwargs) self.sanitizer_enabled = sanitizer_enabled + self.enable_tracing = enable_tracing + + def do_test(self, test): + file_result, subtest_results = super().do_test(test) + if self.enable_tracing: + file_result.extra["trace"] = self.protocol.tracing.get_trace() + return file_result, subtest_results diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py index 3607960b41e..37c64e1745b 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -1059,7 +1059,8 @@ class MarionetteRefTestExecutor(RefTestExecutor): debug_info=None, reftest_internal=False, reftest_screenshot="unexpected", ccov=False, group_metadata=None, capabilities=None, debug=False, - browser_version=None, debug_test=False, **kwargs): + browser_version=None, debug_test=False, + cache_screenshots=True, **kwargs): """Marionette-based executor for reftests""" RefTestExecutor.__init__(self, logger, @@ -1082,6 +1083,7 @@ class MarionetteRefTestExecutor(RefTestExecutor): self.group_metadata = group_metadata self.debug = debug self.debug_test = debug_test + self.cache_screenshots = cache_screenshots self.install_extensions = browser.extensions @@ -1225,7 +1227,9 @@ class InternalRefTestImplementation(RefTestImplementation): return self.executor.logger def setup(self, screenshot="unexpected", chrome_scope=False): - data = {"screenshot": screenshot, "isPrint": self.executor.is_print} + data = {"screenshot": screenshot, + "isPrint": self.executor.is_print, + "cacheScreenshots": self.executor.cache_screenshots} if self.executor.group_metadata is not None: data["urlCount"] = {urljoin(self.executor.server_url(key[0]), key[1]):value for key, value in self.executor.group_metadata.get("url_count", {}).items() @@ -1234,6 +1238,7 @@ class InternalRefTestImplementation(RefTestImplementation): if chrome_scope: self.logger.debug("Using marionette Chrome scope for reftests") self.executor.protocol.marionette.set_context(self.executor.protocol.marionette.CONTEXT_CHROME) + self.logger.debug(f"Starting internal reftests with {data}") self.executor.protocol.marionette._send_message("reftest:setup", data) def reset(self, **kwargs): @@ -1357,7 +1362,7 @@ class MarionettePrintRefTestExecutor(MarionetteRefTestExecutor): screenshot_cache=None, close_after_done=True, debug_info=None, reftest_screenshot="unexpected", ccov=False, group_metadata=None, capabilities=None, debug=False, - reftest_internal=False, **kwargs): + reftest_internal=False, cache_screenshots=True, **kwargs): """Marionette-based executor for reftests""" MarionetteRefTestExecutor.__init__(self, logger, @@ -1373,6 +1378,7 @@ class MarionettePrintRefTestExecutor(MarionetteRefTestExecutor): group_metadata=group_metadata, capabilities=capabilities, debug=debug, + cache_screenshots=cache_screenshots, **kwargs) def setup(self, runner, protocol=None): diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py index 81e9d509bf4..0b641e29d08 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/wptcommandline.py @@ -381,6 +381,12 @@ scheme host and port.""") help=("Reuse a window across `testharness.js` tests where possible, " "which can speed up testing. Also useful for ensuring that the " "renderer process has a stable PID for a debugger to attach to.")) + chrome_group.add_argument( + "--trace-categories", + metavar="CATEGORIES", + nargs="?", + const="blink,blink.bindings", + help="Record traces under the given categories for each test.") sauce_group = parser.add_argument_group("Sauce Labs-specific") sauce_group.add_argument("--sauce-browser", help="Sauce Labs browser name") diff --git a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html index a920f5240d7..bb9bbd39b63 100644 --- a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html +++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html @@ -104,10 +104,10 @@ header(Content-Security-Policy-Report-Only,require-trusted-types-for 'script',Tr // per the spec's ABNF: // https://www.w3.org/TR/trusted-types/#require-trusted-types-for-csp-directive // https://w3c.github.io/webappsec-csp/#grammardef-required-ascii-whitespace - // U+00A LF breaks the header field value into two lines so make sure that - // "the continuation line begins with a space or horizontal tab" in accordance - // with https://www.rfc-editor.org/rfc/rfc2616 - ["%09", "%0A%20", "%0C", "%0D", "%20"].forEach(whitespace => { + // U+00A and U+00D LF break the header field value into two lines so make sure + // that "the continuation line begins with a space or horizontal tab" in + // accordance with https://www.rfc-editor.org/rfc/rfc2616 + ["%09", "%0A%20", "%0C", "%0D%20", "%20"].forEach(whitespace => { let directive = `require-trusted-types-for 'invalid'${whitespace}'script'`; promise_test(async t => { let results = await trySendingPlainStringToTrustedTypeSink( diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html index abf24276372..d299b6648ef 100644 --- a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html +++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html @@ -91,13 +91,13 @@ // ABNF: // https://w3c.github.io/trusted-types/dist/spec/#serialized-tt-configuration // https://w3c.github.io/webappsec-csp/#grammardef-required-ascii-whitespace - // U+00A LF breaks the header field value into two lines so make sure that - // "the continuation line begins with a space or horizontal tab" in accordance - // with https://www.rfc-editor.org/rfc/rfc2616 + // U+00A / U+00D LF breaks the header field value into two lines so make sure + // that "the continuation line begins with a space or horizontal tab" in + // accordance with https://www.rfc-editor.org/rfc/rfc2616 promise_test(async t => { let results = await tryCreatingTrustedTypePoliciesWithCSP( ["_TTP1_", "_TTP2_", "_TTP3_", "_TTP4_", "_TTP5_", "_TTP6_"], - "header(Content-Security-Policy,trusted-types _TTP1_%09_TTP2_%0A%20_TTP3_%0C_TTP4_%0D_TTP5_%20_TTP6_,True)" + "header(Content-Security-Policy,trusted-types _TTP1_%09_TTP2_%0A%20_TTP3_%0C_TTP4_%0D%20_TTP5_%20_TTP6_,True)" ); assert_equals(results.length, 6); results.forEach((result, index) => { diff --git a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json index a613b6a74b5..363ec15f2b2 100644 --- a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json +++ b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json @@ -2991,5 +2991,47 @@ "pattern": [{ "pathname": "/([\\d&&[0-1]])" }], "inputs": [{ "pathname": "/3" }], "expected_match": null + }, + { + "pattern": [{ "protocol": "http", "hostname": "example.com/ignoredpath" }], + "inputs": ["http://example.com/"], + "expected_obj": { + "protocol": "http", + "hostname": "example.com", + "pathname": "*" + }, + "expected_match": { + "protocol": { "input": "http", "groups": {} }, + "hostname": { "input": "example.com", "groups": {} }, + "pathname": { "input": "/", "groups": { "0": "/" } } + } + }, + { + "pattern": [{ "protocol": "http", "hostname": "example.com\\?ignoredsearch" }], + "inputs": ["http://example.com/"], + "expected_obj": { + "protocol": "http", + "hostname": "example.com", + "search": "*" + }, + "expected_match": { + "protocol": { "input": "http", "groups": {} }, + "hostname": { "input": "example.com", "groups": {} }, + "pathname": { "input": "/", "groups": { "0": "/" } } + } + }, + { + "pattern": [{ "protocol": "http", "hostname": "example.com#ignoredhash" }], + "inputs": ["http://example.com/"], + "expected_obj": { + "protocol": "http", + "hostname": "example.com", + "hash": "*" + }, + "expected_match": { + "protocol": { "input": "http", "groups": {} }, + "hostname": { "input": "example.com", "groups": {} }, + "pathname": { "input": "/", "groups": { "0": "/" } } + } } ] diff --git a/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html b/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html index df1287d40be..f50ffaad347 100644 --- a/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html +++ b/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html @@ -1,7 +1,6 @@ <!DOCTYPE html> <html class="reftest-wait"> <meta name="assert" content="This should resume the animation after unhiding the iframe."> -<meta name="fuzzy" content="0-25;0-50"> <title>CSS Test (Animations): Unhiding iframe visibility should restart animation. </title> <link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=616270"> <link rel="match" href="toggle-animated-iframe-visibility-ref.html"> diff --git a/tests/wpt/tests/webaudio/resources/audit-util.js b/tests/wpt/tests/webaudio/resources/audit-util.js index 4e574a64b1a..422c8f4678c 100644 --- a/tests/wpt/tests/webaudio/resources/audit-util.js +++ b/tests/wpt/tests/webaudio/resources/audit-util.js @@ -239,14 +239,6 @@ function assert_array_equals_exact(actual, expected, message) { * @param {!Array<number>} array The array to be checked. * @param {number} constantValue The constant value to compare against. * @param {string} message Description used for assertion failures. - * Asserts that not all values in the given array are equal to the - * specified constant. This is useful for verifying that an output - * signal is not silent or uniform. - * - * @param {!Array<number>} array - The array of numbers to check. - * @param {number} constantValue - The value that not all array elements - * should match. - * @param {string} message - Description used for assertion failure messages. */ function assert_not_constant_value(array, constantValue, message) { const notAllSame = array.some(value => value !== constantValue); diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-playbackrate-zero.html b/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-playbackrate-zero.html index 5624054e328..c8bcbb61dd0 100644 --- a/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-playbackrate-zero.html +++ b/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-playbackrate-zero.html @@ -1,33 +1,27 @@ <!DOCTYPE html> <html> <head> - <title> - audiobuffersource-playbackrate-zero.html - </title> + <title>audiobuffersource-playbackrate-zero.html</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/webaudio/resources/audit-util.js"></script> - <script src="/webaudio/resources/audit.js"></script> </head> <body> - <script id="layout-test-code"> + <script> // Sample rate should be power of 128 to observe the change of AudioParam // at the beginning of rendering quantum. (playbackRate is k-rate) This is // the minimum sample rate in the valid sample rate range. - let sampleRate = 8192; + const sampleRate = 8192; // The render duration in seconds, and the length in samples. - let renderDuration = 1.0; - let renderLength = renderDuration * sampleRate; + const renderDuration = 1.0; + const renderLength = renderDuration * sampleRate; - let context = new OfflineAudioContext(1, renderLength, sampleRate); - let audit = Audit.createTaskRunner(); + const context = new OfflineAudioContext(1, renderLength, sampleRate); - - // Task: Render the actual buffer and compare with the reference. - audit.define('synthesize-verify', (task, should) => { - let ramp = context.createBufferSource(); - let rampBuffer = createLinearRampBuffer(context, renderLength); + promise_test(async t => { + const ramp = new AudioBufferSourceNode(context); + const rampBuffer = createLinearRampBuffer(context, renderLength); ramp.buffer = rampBuffer; ramp.connect(context.destination); @@ -39,78 +33,78 @@ ramp.playbackRate.setValueAtTime(1.0, 0.0); ramp.playbackRate.setValueAtTime(0.0, renderDuration / 2); - context.startRendering() - .then(function(renderedBuffer) { - let data = renderedBuffer.getChannelData(0); - let rampData = rampBuffer.getChannelData(0); - let half = rampData.length / 2; - let passed = true; - let i; + const renderedBuffer = await context.startRendering(); - for (i = 1; i < rampData.length; i++) { - if (i < half) { - // Before the half position, the actual should match with the - // original ramp data. - if (data[i] !== rampData[i]) { - passed = false; - break; - } - } else { - // From the half position, the actual value should not change. - if (data[i] !== rampData[half]) { - passed = false; - break; - } - } - } + const data = renderedBuffer.getChannelData(0); + const rampData = rampBuffer.getChannelData(0); + const half = rampData.length / 2; - should(passed, 'The zero playbackRate') - .message( - 'held the sample value correctly', - 'should hold the sample value. ' + - 'Expected ' + rampData[half] + ' but got ' + data[i] + - ' at the index ' + i); - }) - .then(() => task.done()); - }); + let passed = true; + let i; + + for (i = 1; i < rampData.length; i++) { + if (i < half) { + if (data[i] !== rampData[i]) { + passed = false; + break; + } + } else { + if (data[i] !== rampData[half]) { + passed = false; + break; + } + } + } + + assert_true( + passed, + `The zero playbackRate should hold the sample value. Expected` + + `${rampData[half]} but got ${data[i]} at index ${i}`); + }, 'Synthesize and verify sample-and-hold behavior when playbackRate ' + + 'is set to zero halfway'); + + promise_test(async t => { + const context = new OfflineAudioContext(1, renderLength, sampleRate); + const rampBuffer = new AudioBuffer({ + length: renderLength, + sampleRate: context.sampleRate + }); + + const data = new Float32Array(renderLength); + const startValue = 5; - audit.define('subsample start with playback rate 0', (task, should) => { - let context = new OfflineAudioContext(1, renderLength, sampleRate); - let rampBuffer = new AudioBuffer( - {length: renderLength, sampleRate: context.sampleRate}); - let data = new Float32Array(renderLength); - let startValue = 5; for (let k = 0; k < data.length; ++k) { data[k] = k + startValue; } + rampBuffer.copyToChannel(data, 0); - let src = new AudioBufferSourceNode( - context, {buffer: rampBuffer, playbackRate: 0}); + const src = new AudioBufferSourceNode(context, { + buffer: rampBuffer, + playbackRate: 0 + }); src.connect(context.destination); // Purposely start the source between frame boundaries - let startFrame = 27.3; + const startFrame = 27.3; src.start(startFrame / context.sampleRate); - context.startRendering() - .then(audioBuffer => { - let actualStartFrame = Math.ceil(startFrame); - let audio = audioBuffer.getChannelData(0); + const audioBuffer = await context.startRendering(); + const actualStartFrame = Math.ceil(startFrame); + const audio = audioBuffer.getChannelData(0); - should( - audio.slice(0, actualStartFrame), - `output[0:${actualStartFrame - 1}]`) - .beConstantValueOf(0); - should( - audio.slice(actualStartFrame), `output[${actualStartFrame}:]`) - .beConstantValueOf(startValue); - }) - .then(() => task.done()); - }); - - audit.run(); + assert_constant_value( + audio.slice(0, actualStartFrame), + 0, + 'output before startFrame should be silence: '); + assert_constant_value( + audio.slice(actualStartFrame), + startValue, + `output after startFrame (starting at index ${actualStartFrame}) ` + + `should match start value: `); + }, 'Subsample start with playbackRate 0 should produce sample-and-hold ' + + 'from exact start frame'); </script> </body> </html> diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html b/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html index 3700bfa8ce8..7b6fbf19775 100644 --- a/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html +++ b/tests/wpt/tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html @@ -7,81 +7,77 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/webaudio/resources/audit-util.js"></script> - <script src="/webaudio/resources/audit.js"></script> </head> <body> <script> - let audit = Audit.createTaskRunner(); - audit.define( - { - label: 'buffer-stitching-1', - description: 'Subsample buffer stitching, same rates' - }, - (task, should) => { - const sampleRate = 44100; - const bufferRate = 44100; - const bufferLength = 30; + promise_test(async t => { + // Sub‑sample stitching with identical context/buffer rates. + const sampleRate = 44100; + const bufferRate = 44100; + const bufferLength = 30; - // Experimentally determined thresholds. DO NOT relax these values - // to far from these values to make the tests pass. - const errorThreshold = 9.0957e-5; - const snrThreshold = 85.580; + // Experimentally determined thresholds. DO NOT relax these values + // too far from these values to make the tests pass. + const errorThreshold = 9.0957e-5; + const snrThreshold = 85.580; - // Informative message - should(sampleRate, 'Test 1: context.sampleRate') - .beEqualTo(sampleRate); - testBufferStitching(sampleRate, bufferRate, bufferLength) - .then(resultBuffer => { - const actual = resultBuffer.getChannelData(0); - const expected = resultBuffer.getChannelData(1); - should( - actual, - `Stitched sine-wave buffers at sample rate ${bufferRate}`) - .beCloseToArray( - expected, {absoluteThreshold: errorThreshold}); - const SNR = 10 * Math.log10(computeSNR(actual, expected)); - should(SNR, `SNR (${SNR} dB)`) - .beGreaterThanOrEqualTo(snrThreshold); - }) - .then(() => task.done()); - }); + assert_equals(sampleRate, 44100, 'Test 1: context.sampleRate'); - audit.define( - { - label: 'buffer-stitching-2', - description: 'Subsample buffer stitching, different rates' - }, - (task, should) => { - const sampleRate = 44100; - const bufferRate = 43800; - const bufferLength = 30; + const resultBuffer = + await testBufferStitching(sampleRate, bufferRate, bufferLength); - // Experimentally determined thresholds. DO NOT relax these values - // to far from these values to make the tests pass. - const errorThreshold = 3.8986e-3; - const snrThreshold = 65.737; + const actual = resultBuffer.getChannelData(0); + const expected = resultBuffer.getChannelData(1); - // Informative message - should(sampleRate, 'Test 2: context.sampleRate') - .beEqualTo(sampleRate); - testBufferStitching(sampleRate, bufferRate, bufferLength) - .then(resultBuffer => { - const actual = resultBuffer.getChannelData(0); - const expected = resultBuffer.getChannelData(1); - should( - actual, - `Stitched sine-wave buffers at sample rate ${bufferRate}`) - .beCloseToArray( - expected, {absoluteThreshold: errorThreshold}); - const SNR = 10 * Math.log10(computeSNR(actual, expected)); - should(SNR, `SNR (${SNR} dB)`) - .beGreaterThanOrEqualTo(snrThreshold); - }) - .then(() => task.done()); - }); + assert_array_approximately_equals( + actual, + expected, + errorThreshold, + `Stitched sine‑wave buffers at sample rate ${bufferRate}`); - audit.run(); + const SNR = 10 * Math.log10(computeSNR(actual, expected)); + + assert_greater_than_equal( + SNR, + snrThreshold, + `SNR (${SNR.toFixed(3)} dB) should be ≥ ${snrThreshold} dB`); + }, 'buffer-stitching-1'); + + promise_test(async t => { + // Sub‑sample stitching with differing context/buffer rates. + const sampleRate = 44100; + const bufferRate = 43800; + const bufferLength = 30; + + // Experimentally determined thresholds. DO NOT relax these values + // too far from these values to make the tests pass. + const errorThreshold = 3.8986e-3; + const snrThreshold = 65.737; + + assert_equals(sampleRate, 44100, 'Test 2: context.sampleRate'); + + const resultBuffer = await testBufferStitching( + sampleRate, + bufferRate, + bufferLength); + + const actual = resultBuffer.getChannelData(0); + const expected = resultBuffer.getChannelData(1); + + assert_array_approximately_equals( + actual, + expected, + errorThreshold, + `Stitched sine‑wave buffers at sample rate ${bufferRate}`); + + const SNR = 10 * Math.log10(computeSNR(actual, expected)); + + assert_greater_than_equal( + SNR, + snrThreshold, + `SNR (${SNR.toFixed(3)} dB) should be ≥ ${snrThreshold} dB`); + }, 'buffer-stitching-2'); // Create graph to test stitching of consecutive ABSNs. The context rate // is |sampleRate|, and the buffers have a fixed length of |bufferLength| @@ -89,25 +85,27 @@ // from |sampleRate| because of interpolation of the buffer to the context // rate. function testBufferStitching(sampleRate, bufferRate, bufferLength) { - // The context for testing. Channel 0 contains the output from - // stitching all the buffers together, and channel 1 contains the - // expected output. - const context = new OfflineAudioContext( - {numberOfChannels: 2, length: sampleRate, sampleRate: sampleRate}); + // The OfflineAudioContext used for rendering. + // Channel 0 captures the stitched output. + // Channel 1 records the expected reference signal. + const context = new OfflineAudioContext({ + numberOfChannels: 2, + length: sampleRate, + sampleRate: sampleRate, + }); const merger = new ChannelMergerNode( context, {numberOfInputs: context.destination.channelCount}); - merger.connect(context.destination); - // The reference is a sine wave at 440 Hz. + // Reference signal (channel 1): pure 440 Hz sine wave const ref = new OscillatorNode(context, {frequency: 440, type: 'sine'}); ref.connect(merger, 0, 1); ref.start(); // The test signal is a bunch of short AudioBufferSources containing // bits of a sine wave. - let waveSignal = new Float32Array(context.length); + const waveSignal = new Float32Array(context.length); const omega = 2 * Math.PI / bufferRate * ref.frequency.value; for (let k = 0; k < context.length; ++k) { waveSignal[k] = Math.sin(omega * k); @@ -119,6 +117,8 @@ for (let k = 0; k < context.length; k += bufferLength) { const buffer = new AudioBuffer({length: bufferLength, sampleRate: bufferRate}); + + // Copy the slice into the AudioBuffer’s first (and only) channel. buffer.copyToChannel(waveSignal.slice(k, k + bufferLength), 0); const src = new AudioBufferSourceNode(context, {buffer: buffer}); diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html b/tests/wpt/tests/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html index 0d6b45c56df..5040a96ec5d 100644 --- a/tests/wpt/tests/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html +++ b/tests/wpt/tests/webaudio/the-audio-api/the-channelmergernode-interface/ctor-channelmerger.html @@ -7,106 +7,81 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/webaudio/resources/audit-util.js"></script> - <script src="/webaudio/resources/audit.js"></script> <script src="/webaudio/resources/audionodeoptions.js"></script> </head> <body> - <script id="layout-test-code"> + <script> let context; - let audit = Audit.createTaskRunner(); + test(() => { + context = new OfflineAudioContext(1, 1, 48000); + }, 'Initialize AudioContext for ChannelMergerNode tests'); - audit.define('initialize', (task, should) => { - context = initializeContext(should); - task.done(); - }); + test(() => { + testInvalidConstructor_W3CTH('ChannelMergerNode', context); + }, 'Invalid constructor behavior for ChannelMergerNode'); - audit.define('invalid constructor', (task, should) => { - testInvalidConstructor(should, 'ChannelMergerNode', context); - task.done(); - }); - - audit.define('default constructor', (task, should) => { - let prefix = 'node0'; - let node = - testDefaultConstructor(should, 'ChannelMergerNode', context, { + test(() => { + const prefix = 'node0'; + const node = + testDefaultConstructor_W3CTH('ChannelMergerNode', context, { prefix: prefix, numberOfInputs: 6, numberOfOutputs: 1, channelCount: 1, channelCountMode: 'explicit', - channelInterpretation: 'speakers' + channelInterpretation: 'speakers', }); + }, 'Default constructor behavior for ChannelMergerNode'); - task.done(); - }); - - audit.define('test AudioNodeOptions', (task, should) => { - testAudioNodeOptions(should, context, 'ChannelMergerNode', { + test(() => { + testAudioNodeOptions_W3CTH(context, 'ChannelMergerNode', { channelCount: { value: 1, isFixed: true, - exceptionType: 'InvalidStateError' + exceptionType: 'InvalidStateError', }, channelCountMode: { value: 'explicit', isFixed: true, - exceptionType: 'InvalidStateError' - } + exceptionType: 'InvalidStateError', + }, }); - task.done(); - }); + }, 'AudioNodeOptions behavior for ChannelMergerNode'); - audit.define('constructor options', (task, should) => { + test(() => { let node; let options = { numberOfInputs: 3, numberOfOutputs: 9, - channelInterpretation: 'discrete' + channelInterpretation: 'discrete', }; - should( - () => { - node = new ChannelMergerNode(context, options); - }, - 'node1 = new ChannelMergerNode(context, ' + - JSON.stringify(options) + ')') - .notThrow(); + node = new ChannelMergerNode(context, options); - should(node.numberOfInputs, 'node1.numberOfInputs') - .beEqualTo(options.numberOfInputs); - should(node.numberOfOutputs, 'node1.numberOfOutputs').beEqualTo(1); - should(node.channelInterpretation, 'node1.channelInterpretation') - .beEqualTo(options.channelInterpretation); + assert_equals( + node.numberOfInputs, options.numberOfInputs, + 'node1.numberOfInputs'); + assert_equals(node.numberOfOutputs, 1, 'node1.numberOfOutputs'); + assert_equals( + node.channelInterpretation, options.channelInterpretation, + 'node1.channelInterpretation'); options = {numberOfInputs: 99}; - should( - () => { - node = new ChannelMergerNode(context, options); - }, - 'new ChannelMergerNode(c, ' + JSON.stringify(options) + ')') - .throw(DOMException, 'IndexSizeError'); + assert_throws_dom('IndexSizeError', () => { + node = new ChannelMergerNode(context, options); + }, 'new ChannelMergerNode(c, ' + JSON.stringify(options) + ')'); options = {channelCount: 3}; - should( - () => { - node = new ChannelMergerNode(context, options); - }, - 'new ChannelMergerNode(c, ' + JSON.stringify(options) + ')') - .throw(DOMException, 'InvalidStateError'); + assert_throws_dom('InvalidStateError', () => { + node = new ChannelMergerNode(context, options); + }, 'new ChannelMergerNode(c, ' + JSON.stringify(options) + ')'); options = {channelCountMode: 'max'}; - should( - () => { - node = new ChannelMergerNode(context, options); - }, - 'new ChannelMergerNode(c, ' + JSON.stringify(options) + ')') - .throw(DOMException, 'InvalidStateError'); - - task.done(); - }); - - audit.run(); + assert_throws_dom('InvalidStateError', () => { + node = new ChannelMergerNode(context, options); + }, 'new ChannelMergerNode(c, ' + JSON.stringify(options) + ')'); + }, 'Constructor options validation for ChannelMergerNode'); </script> </body> </html> diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html b/tests/wpt/tests/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html index 6326d00dfb7..f6bb8299b2a 100644 --- a/tests/wpt/tests/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html +++ b/tests/wpt/tests/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html @@ -7,82 +7,68 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/webaudio/resources/audit-util.js"></script> - <script src="/webaudio/resources/audit.js"></script> </head> <body> - <script id="layout-test-code"> - let audit = Audit.createTaskRunner(); + <script> + promise_test( + () => testWithAutomation({prefix: ''}), + 'Compare value setter and setValueAtTime'); - audit.define( - {label: 'test0', description: 'Dezippering of GainNode removed'}, - (task, should) => { - // Only need a few frames to verify that dezippering has been - // removed from the GainNode. Sample rate is pretty arbitrary. - let context = new OfflineAudioContext(1, 1024, 16000); + promise_test( + () => testWithAutomation({ + prefix: 'With modulation: ', + modulator: true + }), + 'Automation effects'); - // Send a unit source to the gain node so we can measure the effect - // of the gain node. - let src = new ConstantSourceNode(context, {offset: 1}); - let g = new GainNode(context, {gain: 1}); - src.connect(g).connect(context.destination); + promise_test(async () => { + // Only need a few frames to verify that dezippering has been + // removed from the GainNode. Sample rate is pretty arbitrary. + const context = new OfflineAudioContext(1, 1024, 16000); - context.suspend(RENDER_QUANTUM_FRAMES / context.sampleRate) - .then(() => { - g.gain.value = .5; - }) - .then(() => context.resume()); + // Send a unit source to the gain node so we can measure the effect + // of the gain node. + const src = new ConstantSourceNode(context, {offset: 1}); + const g = new GainNode(context, {gain: 1}); + src.connect(g).connect(context.destination); - src.start(); + // Schedule the suspend but DON’T await it here + context + .suspend(RENDER_QUANTUM_FRAMES / context.sampleRate) + .then(() => { + g.gain.value = 0.5; + return context.resume(); + }); - context.startRendering() - .then(audio => { - let c = audio.getChannelData(0); + src.start(); - // If dezippering has been removed, the gain output should - // instantly jump at frame 128 to 0.5. - should(c.slice(0, 128), 'output[0:127]').beConstantValueOf(1); - should(c.slice(128), 'output[128:]').beConstantValueOf(0.5); - }) - .then(() => task.done()); - }); + // Now start rendering and wait for it to finish + const audio = await context.startRendering(); + const c = audio.getChannelData(0); - audit.define( - { - label: 'test2', - description: 'Compare value setter and setValueAtTime' - }, - (task, should) => { - testWithAutomation(should, {prefix: ''}).then(() => task.done()); - }); + // If dezippering has been removed, the gain output should + // instantly jump at frame 128 to 0.5. + assert_constant_value(c.slice(0, 128), 1, 'output[0:127]'); + assert_constant_value(c.slice(128), 0.5, 'output[128:]'); + }, 'Dezippering of GainNode removed'); - audit.define( - {label: 'test3', description: 'Automation effects'}, - (task, should) => { - testWithAutomation(should, { - prefix: 'With modulation: ', - modulator: true - }).then(() => task.done()); - }); - - audit.run(); - - function testWithAutomation(should, options) { + async function testWithAutomation(options) { // Sample rate must be a power of two to eliminate round-off in // computing the time at render quantum boundaries. - let context = new OfflineAudioContext(2, 1024, 16384); - let merger = new ChannelMergerNode(context, {numberOfChannels: 2}); + const context = new OfflineAudioContext(2, 1024, 16384); + const merger = new ChannelMergerNode(context, {numberOfChannels: 2}); merger.connect(context.destination); - let src = new OscillatorNode(context); - let gainTest = new GainNode(context); - let gainRef = new GainNode(context); + const src = new OscillatorNode(context); + const gainTest = new GainNode(context); + const gainRef = new GainNode(context); src.connect(gainTest).connect(merger, 0, 0); src.connect(gainRef).connect(merger, 0, 1); if (options.modulator) { - let mod = new OscillatorNode(context, {frequency: 1000}); - let modGain = new GainNode(context); + const mod = new OscillatorNode(context, {frequency: 1000}); + const modGain = new GainNode(context); mod.connect(modGain); modGain.connect(gainTest.gain); modGain.connect(gainRef.gain); @@ -90,32 +76,30 @@ } // Change the gains. Must do the change on a render boundary! - let changeTime = 3 * RENDER_QUANTUM_FRAMES / context.sampleRate; - let newGain = .3; + const changeTime = 3 * RENDER_QUANTUM_FRAMES / context.sampleRate; + const newGain = 0.3; gainRef.gain.setValueAtTime(newGain, changeTime); - context.suspend(changeTime) - .then(() => gainTest.gain.value = newGain) - .then(() => context.resume()); + context + .suspend(changeTime) + .then(() => { + gainTest.gain.value = newGain; + return context.resume(); + }); src.start(); - return context.startRendering().then(audio => { - let actual = audio.getChannelData(0); - let expected = audio.getChannelData(1); + const audio = await context.startRendering(); + const actual = audio.getChannelData(0); + const expected = audio.getChannelData(1); - // The values using the .value setter must be identical to the - // values using setValueAtTime. - let match = should(actual, options.prefix + '.value setter output') - .beEqualToArray(expected); - - should( - match, - options.prefix + - '.value setter output matches setValueAtTime output') - .beTrue(); - }); + // The values using the .value setter must be identical to the + // values using setValueAtTime. + assert_array_equals( + actual, expected, + options.prefix + '.value setter output matches setValueAtTime'); } + </script> </body> </html> diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html b/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html index 13e88be567b..9ac196a27aa 100644 --- a/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html +++ b/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper-limits.html @@ -7,32 +7,29 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../../resources/audit-util.js"></script> - <script src="../../resources/audit.js"></script> </head> <body> - <script id="layout-test-code"> - let audit = Audit.createTaskRunner(); - + <script> let context; let bufferData; let outputData; let reference; - let sampleRate = 48000; + const sampleRate = 48000; // Must be odd so we have an exact middle point. - let testFrames = 23; - let scale = 1 / ((testFrames - 1) / 2 - 1); + const testFrames = 23; + const scale = 1 / ((testFrames - 1) / 2 - 1); // Number of decimal digits to print - let decimals = 6; + const decimals = 6; // Required accuracy - let diffThreshold = Math.pow(10, -decimals); + const diffThreshold = Math.pow(10, -decimals); // Generate reference data - function generateReference() { + const generateReference = () => { // The curve data is 0, 1, 0, and the input data is a ramp from -1+eps // to 1+eps. Then the output is a ramp from 0 to 1 back to 0. - let ref = new Float32Array(testFrames); - let midPoint = (testFrames - 1) / 2; + const ref = new Float32Array(testFrames); + const midPoint = (testFrames - 1) / 2; // First sample is below -1 at -1-scale. ref[0] = 0; // Generate ramp up to the mid-point @@ -48,63 +45,52 @@ // The last sample is out of range at 1+scale ref[testFrames - 1] = 0; return ref; - } + }; - function checkResult(renderedBuffer, should) { + const checkResult = renderedBuffer => { outputData = renderedBuffer.getChannelData(0); reference = generateReference(); - let success = true; - // Verify that every output value matches our expected reference value. for (let k = 0; k < outputData.length; ++k) { - let diff = outputData[k] - reference[k]; - should( + const diff = outputData[k] - reference[k]; + assert_less_than_equal( Math.abs(diff), - 'Max error mapping ' + bufferData[k].toFixed(decimals) + ' to ' + - outputData[k].toFixed(decimals)) - .beLessThanOrEqualTo(diffThreshold); + diffThreshold, + `Max error mapping ${bufferData[k].toFixed(decimals)} to ` + + `${outputData[k].toFixed(decimals)}`); } - } + }; - audit.define( - { - label: 'test', - description: - 'WaveShaperNode including values outside the range of [-1,1]' - }, - function(task, should) { - context = new OfflineAudioContext(1, testFrames, sampleRate); - // Create input values between -1.1 and 1.1 - let buffer = - context.createBuffer(1, testFrames, context.sampleRate); - bufferData = new Float32Array(testFrames); - let start = -1 - scale; - for (let k = 0; k < testFrames; ++k) { - bufferData[k] = k * scale + start; - } - buffer.copyToChannel(bufferData, 0); + promise_test(async t => { + context = new OfflineAudioContext(1, testFrames, sampleRate); + // Create input values between -1.1 and 1.1 + const buffer = new AudioBuffer({ length: testFrames, + numberOfChannels: 1, sampleRate: context.sampleRate }); + bufferData = new Float32Array(testFrames); + const start = -1 - scale; + for (let k = 0; k < testFrames; ++k) { + bufferData[k] = k * scale + start; + } + buffer.copyToChannel(bufferData, 0); - let source = context.createBufferSource(); - source.buffer = buffer; + const source = new AudioBufferSourceNode(context, { buffer }); - // Create simple waveshaper. It should map -1 to 0, 0 to 1, and +1 - // to 0 and interpolate all points in between using a simple linear - // interpolator. - let shaper = context.createWaveShaper(); - let curve = new Float32Array(3); - curve[0] = 0; - curve[1] = 1; - curve[2] = 0; - shaper.curve = curve; - source.connect(shaper); - shaper.connect(context.destination); + // Create simple waveshaper. It should map -1 to 0, 0 to 1, and +1 + // to 0 and interpolate all points in between using a simple linear + // interpolator. + const curve = new Float32Array(3); + curve[0] = 0; + curve[1] = 1; + curve[2] = 0; - source.start(); - context.startRendering() - .then(buffer => checkResult(buffer, should)) - .then(() => task.done()); - }); + const shaper = new WaveShaperNode(context, { curve }); + source.connect(shaper); + shaper.connect(context.destination); - audit.run(); + source.start(); + const renderedBuffer = await context.startRendering(); + checkResult(renderedBuffer); + }, 'WaveShaperNode maps input values outside [-1,1] according to curve' + + ' and clamps output correctly'); </script> </body> </html> diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html b/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html index 5e6ed24e9ea..d0725f4b7a7 100644 --- a/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html +++ b/tests/wpt/tests/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html @@ -6,34 +6,34 @@ </title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> - <script src="../../resources/audit-util.js"></script> - <script src="../../resources/audit.js"></script> </head> <body> - <script id="layout-test-code"> - let audit = Audit.createTaskRunner(); + <script> - let sampleRate = 44100; - let lengthInSeconds = 4; - let numberOfRenderFrames = sampleRate * lengthInSeconds; - let numberOfCurveFrames = 65536; + const sampleRate = 44100; + const lengthInSeconds = 4; + const numberOfRenderFrames = sampleRate * lengthInSeconds; + const numberOfCurveFrames = 65536; + + let context; let inputBuffer; let waveShapingCurve; - let context; - function generateInputBuffer() { // Create mono input buffer. - let buffer = - context.createBuffer(1, numberOfRenderFrames, context.sampleRate); - let data = buffer.getChannelData(0); + const buffer = new AudioBuffer({ + length: numberOfRenderFrames, + numberOfChannels: 1, + sampleRate: context.sampleRate + }); + const data = buffer.getChannelData(0); // Generate an input vector with values from -1 -> +1 over a duration of // lengthInSeconds. This exercises the full nominal input range and will // touch every point of the shaping curve. for (let i = 0; i < numberOfRenderFrames; ++i) { - let x = i / numberOfRenderFrames; // 0 -> 1 - x = 2 * x - 1; // -1 -> +1 + let x = i / numberOfRenderFrames; + x = 2 * x - 1; data[i] = x; } @@ -46,62 +46,72 @@ // To some extent, the actual curve we choose is not important in this // test, since the input vector walks through all possible curve values. function generateWaveShapingCurve() { - let curve = new Float32Array(numberOfCurveFrames); - - let n = numberOfCurveFrames; - let n2 = n / 2; + const curve = new Float32Array(numberOfCurveFrames); + const n = numberOfCurveFrames; + const n2 = n / 2; for (let i = 0; i < n; ++i) { - let x = (i - n2) / n2; - let y = Math.atan(5 * x) / (0.5 * Math.PI); + const x = (i - n2) / n2; + curve[i] = Math.atan(5 * x) / (0.5 * Math.PI); } - return curve; } + // Following spec algorithm from + // https://webaudio.github.io/web-audio-api/#WaveShaperNode-attributes + function checkShapedCurve(buffer) { + const inputData = inputBuffer.getChannelData(0); + const outputData = buffer.getChannelData(0); + const c = waveShapingCurve; + const N = numberOfCurveFrames; + const tolerance = 1e-6; - function checkShapedCurve(buffer, should) { - let inputData = inputBuffer.getChannelData(0); - let outputData = buffer.getChannelData(0); - - let success = true; + let firstMismatchIndex = -1; + let actual = 0; + let expected = 0; // Go through every sample and make sure it has been shaped exactly // according to the shaping curve we gave it. for (let i = 0; i < buffer.length; ++i) { - let input = inputData[i]; + const x = inputData[i]; - // Calculate an index based on input -1 -> +1 with 0 being at the - // center of the curve data. - let index = Math.floor(numberOfCurveFrames * 0.5 * (input + 1)); + const v = ((N - 1) * 0.5) * (x + 1); + const k = Math.floor(v); + const f = v - k; - // Clip index to the input range of the curve. - // This takes care of input outside of nominal range -1 -> +1 - index = index < 0 ? 0 : index; - index = - index > numberOfCurveFrames - 1 ? numberOfCurveFrames - 1 : index; + let y; + if (v < 0) { + y = c[0]; + } else if (v >= N - 1) { + y = c[N - 1]; + } else { + y = (1 - f) * c[k] + f * c[k + 1]; + } - let expectedOutput = waveShapingCurve[index]; - - let output = outputData[i]; - - if (output != expectedOutput) { - success = false; + if (Math.abs(outputData[i] - y) > tolerance) { + firstMismatchIndex = i; + actual = outputData[i]; + expected = y; break; } } - should( - success, 'WaveShaperNode applied non-linear distortion correctly') - .beTrue(); + assert_equals( + firstMismatchIndex, + -1, + firstMismatchIndex === -1 + ? 'WaveShaperNode output should match the spec.' + : `Mismatch at sample ${firstMismatchIndex}: ` + + `actual = ${actual}, expected = ${expected}, ` + + `tolerance = ${tolerance}`); } - audit.define('test', function(task, should) { + promise_test(async t => { // Create offline audio context. context = new OfflineAudioContext(1, numberOfRenderFrames, sampleRate); // source -> waveshaper -> destination - let source = context.createBufferSource(); - let waveshaper = context.createWaveShaper(); + const source = new AudioBufferSourceNode(context); + const waveshaper = new WaveShaperNode(context); source.connect(waveshaper); waveshaper.connect(context.destination); @@ -113,14 +123,11 @@ waveShapingCurve = generateWaveShapingCurve(); waveshaper.curve = waveShapingCurve; - source.start(0); + source.start(); - context.startRendering() - .then(buffer => checkShapedCurve(buffer, should)) - .then(task.done.bind(task)); - }); - - audit.run(); + const renderedBuffer = await context.startRendering(); + checkShapedCurve(renderedBuffer); + }, 'WaveShaperNode applies non-linear distortion correctly'); </script> </body> </html> diff --git a/tests/wpt/tests/webcodecs/README.md b/tests/wpt/tests/webcodecs/README.md index 376308b5d1d..1f4fccd4156 100644 --- a/tests/wpt/tests/webcodecs/README.md +++ b/tests/wpt/tests/webcodecs/README.md @@ -69,6 +69,16 @@ avifenc -r l -d 8 -y 444 -s 0 four-colors.png four-colors-limited-range-444-8bpc avifenc -r f -d 10 -y 444 -s 0 --nclx 9/16/9 four-colors.png four-colors-full-range-bt2020-pq-444-10bpc.avif ``` +### four-colors-full-range-(420|422|444)-hlg-(10|12)bpc.avif +``` +avifenc -r f -d 10 -y 420 -s 0 --nclx 9/18/9 four-colors.png four-colors-full-range-hlg-420-10bpc.avif +avifenc -r f -d 10 -y 422 -s 0 --nclx 9/18/9 four-colors.png four-colors-full-range-hlg-422-10bpc.avif +avifenc -r f -d 10 -y 444 -s 0 --nclx 9/18/9 four-colors.png four-colors-full-range-hlg-444-10bpc.avif +avifenc -r f -d 12 -y 420 -s 0 --nclx 9/18/9 four-colors.png four-colors-full-range-hlg-420-12bpc.avif +avifenc -r f -d 12 -y 422 -s 0 --nclx 9/18/9 four-colors.png four-colors-full-range-hlg-422-12bpc.avif +avifenc -r f -d 12 -y 444 -s 0 --nclx 9/18/9 four-colors.png four-colors-full-range-hlg-444-12bpc.avif +``` + ### four-colors.jpg Used [Sqoosh.app](https://squoosh.app/) with MozJPEG compression and RGB channels. exiftool was then used to add an orientation marker. diff --git a/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-420-10bpc.avif b/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-420-10bpc.avif new file mode 100644 index 0000000000000000000000000000000000000000..8209e763f52a0db628dd384dccdd5448a2d60bcb GIT binary patch literal 376 zcmZQzU{FXasVqn=%S>Yc0uY^>nP!-qnV9D5Xy^nKdYzkEk_eIm0>zA!oFWL5fuSHX zxdg_B(R>A&CAnY@BaoEK%*js%@mv@f7=aK(GB64Q=~N)r$jr<GTMCwu0&-HBfWjbN zVwr)VbAC=f*siS1f}#STxOZkjaz2n2$t*4a=?4Nv2O#kQhy@BVD>8vJ12Y#F7m(sf zEHiX&WbgqA2`A_06y+u7R4{Nd2r+Or0ENUe3vv@dazFrd7z-m)GYgQJo12nYBE-PO zE}{7R@1GM6MiGJ&7?=bc85!=q5vgdtT-e^goE7}%ysU=UjSm$HF=uMIEN`C4D_{RZ zVN*)Ala<ZpTU8S?E`8?XjBbxrtnkU`=da}Gx-8;1Cq$QR=KOgg$5pmxylW8KVFCaa Cu2^&c literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-420-12bpc.avif b/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-420-12bpc.avif new file mode 100644 index 0000000000000000000000000000000000000000..79103149b71bc94ad50c47156322b79b0a847bb5 GIT binary patch literal 386 zcmZQzV30{GsVqn=%S>Yc0uY^>nP!-qnF!*)&P^>z1c?KIVn#|%5roOWP>`8i0%OBy zzJkn>Trh_bNXljA<R^o8E({EeKnNlk82N#8F%WBHX6At{1j|SPIjKxQVGu8|%)rn& zKPMk-S5{_0Q2|igJF_4;A4rR278j&~6atkx0ErJkEKrbHkqM+3n0a`3fD}(+nW1x| zLk>ttI5|J3C@(puf`OAkh=H>KC?uX)kedjS0|KDKSQwd_S%A#y+?2!;AqFn?2*u}r z|D<ymr3p@8aAXm5xc5e+BBQ9V-J(7#oK0xL#nsMN*G*;nBDHm*T6a*X%*TSjx_}lo z53kzEbFYXACKsMAo`3h)b&bY2j<)hwzf;8AeZ_tSNxZ(h+@<#OwRF)R^(qH)tWTtc MUaM-idH3cf0Pj9w-~a#s literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-422-10bpc.avif b/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-422-10bpc.avif new file mode 100644 index 0000000000000000000000000000000000000000..0699fc09ac69e07da298dfee4d6540b2ed44f127 GIT binary patch literal 376 zcmZQzV30{GsVqn=%S>Yc0uY^>nP!-qnF!*)&P^>z1c?KIVn#|%5roOWP>`8i0%OBy zzJkn>Trh_bNXljA<R^o8E({EeKnNlk82N#8CJ<|6X6At{1j|SPIjKxQVGu8|%)rn& zKPMk-S5{_0Q2|igJF_4;A4rR278j&~6atkx0ErJkEKrbH0Wy<;nTv}HNbw|=89FyQ zcz}e2lk;<m@{)5Z7&sY(7&se%LgJYPxrrb-AOJdyg^{V51;{MSO-U>fV&GzrP<;OP z&yfbB7{Lh)OahLK3{ML`b<f!SaAn*C*VQlVc#b;ueR1zTsK32OL*SnD%O7@v9#(Vb z_K025<k?rYX*r+m{fhqGGLQOh$Op;&sejGMb4)Ln@z1XJ>%PxBa*Vex|CDcM&kg|U CuwOC& literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-422-12bpc.avif b/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-422-12bpc.avif new file mode 100644 index 0000000000000000000000000000000000000000..93ef46ad29c87af27c3412a1285e074e5224590b GIT binary patch literal 393 zcmZQzV30{GsVqn=%S>Yc0uY^>nP!-qnF!*)&P^>z1c?KIVn#|%5roOWP>`8i0%OBy zzJkn>Trh_bNXljA<R^o8E({EeKnNlk82N#86%cD=X6At{1j|SPIjKxQVGu8|%)rn& zKPMk-S5{_0Q2|igJF_4;A4rR278j&~6atkx0ErJkEKrbHkqM+3n0a`3fD}(+nW1x| zLk37lI5|J3C@(puf`OAkh=H>KC?uX)kedjS0|KDKSQwd_S%A!@+?2!;AqFn?2*u}r z|D-7x<qA$<aAXm5c*=F;DbLPz+^MH3qdlgGR2STMu$}EyeynD1fkR79%Cao3X9?xA zk_6u#T`;-W+##u`P%LTIaRv7YUvIx(^0<B9o`Ss#{!aMc`1IwHVwo9pzL`zsO*peZ VM@2to0n7D=?<>y+$sV_y004x)Xs!SN literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-444-10bpc.avif b/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-444-10bpc.avif new file mode 100644 index 0000000000000000000000000000000000000000..3da7037c110cd90a4e0c501b88b2e59e77232201 GIT binary patch literal 381 zcmZQzU{FXasVqn=%S>Yc0uY^>nP!-qnV9D5Xy^zOdYzkEk_eIm0>zA!oFWL5fuSHX zxdg_B(R>A&CAnY@BaoEK%*js%@mv@f7=aK(GB64Q=`0}D$jr<GTMCwu0&-HBfWjbN zVwr)VbAC=f*siS1f}#STxOZkjaz2n2$t*5N1t|n7bpR3{fLNd)vmz5nGca>;aRDiw z#4<zYMg<3ukZ^K-PElTRP6Y!egAfB}15ijjvmiGSBnJdQhp{j+HM0PjMY$=7B|;2b zY!-^o|NgmT6el==fl0uTk>P3Kr|ucMAFhm>X#L@>$~wJd*{4hT;-9pfX{&#Ad}7?x zWo_Nhtaq|y&M&m!YX7z2=Q)QcIpv+acI%w$#Jgo#7~XK(uD-OuL2(UZ!YRL>e#%Gn Jl5NFy008xKUEcrz literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-444-12bpc.avif b/tests/wpt/tests/webcodecs/four-colors-full-range-hlg-444-12bpc.avif new file mode 100644 index 0000000000000000000000000000000000000000..85db04ec2029effb072ffd6433fc9d7dc345ef82 GIT binary patch literal 389 zcmZQzV30{GsVqn=%S>Yc0uY^>nP!-qnF!*)&P^>z1c?KIVn#|%5roOWP>`8i0%OBy zzJkn>Trh_bNXljA<R^o8E({EeKnNlk82N#884zn^X6At{1j|SPIjKxQVGu8|%)rn& zKPMk-S5{_0Q2|igJF_4;A4rR278j&~6atkx0ErJkEKrbHkqM+3n0a`3fD}(+nW1x| zLjp)hI5|J3C@(puf`OAkh=H>KC?uX)kedjS0|KDKSQwd_S%A#C+?2!;AqFn?2*u}r z|D-q=WeQGUaAXm5c*=F;DbLPz+^MHp%=7QCt~ql@s(<0WmZRT1gFijz(pyx&WyT^s z;cK0f4#!=~6$@<CbK9~%Cza7fb;56v4~cif&+r{gJgh1<OZ%;yO0II*)-&4_qXjg7 QD<-{Xm!Fi^7WG~L0L}_x8UO$Q literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webcodecs/image-decoder-utils.js b/tests/wpt/tests/webcodecs/image-decoder-utils.js index eccab9b09a4..cf389620e14 100644 --- a/tests/wpt/tests/webcodecs/image-decoder-utils.js +++ b/tests/wpt/tests/webcodecs/image-decoder-utils.js @@ -60,9 +60,22 @@ function testFourColorsDecodeBuffer(buffer, mimeType, options = {}) { if (options.tolerance === undefined) options.tolerance = 0; + if (options.colorSpace !== undefined) { + assert_equals( + result.image.colorSpace.primaries, options.colorSpace.primaries); + assert_equals( + result.image.colorSpace.transfer, options.colorSpace.transfer); + assert_equals(result.image.colorSpace.matrix, options.colorSpace.matrix); + assert_equals( + result.image.colorSpace.fullRange, options.colorSpace.fullRange); + } + let canvas = new OffscreenCanvas( result.image.displayWidth, result.image.displayHeight); let ctx = canvas.getContext('2d'); + if (ctx.globalHDRHeadroom !== undefined) { + ctx.globalHDRHeadroom = Infinity; + } ctx.drawImage(result.image, 0, 0); let top_left = ctx.getImageData(0, 0, 1, 1); diff --git a/tests/wpt/tests/webcodecs/image-decoder.https.any.js b/tests/wpt/tests/webcodecs/image-decoder.https.any.js index 9ca28e49c4a..9469f51914f 100644 --- a/tests/wpt/tests/webcodecs/image-decoder.https.any.js +++ b/tests/wpt/tests/webcodecs/image-decoder.https.any.js @@ -1,8 +1,7 @@ // META: global=window,dedicatedworker // META: script=/webcodecs/image-decoder-utils.js -function testFourColorsDecode(filename, mimeType, options = {}) { - var decoder = null; +async function testFourColorsDecode(filename, mimeType, options = {}) { return ImageDecoder.isTypeSupported(mimeType).then(support => { assert_implements_optional( support, 'Optional codec ' + mimeType + ' not supported.'); @@ -14,8 +13,7 @@ function testFourColorsDecode(filename, mimeType, options = {}) { // Note: Requiring all data to do YUV decoding is a Chromium limitation, other // implementations may support YUV decode with partial ReadableStream data. -function testFourColorsYuvDecode(filename, mimeType, options = {}) { - var decoder = null; +async function testFourColorsYuvDecode(filename, mimeType, options = {}) { return ImageDecoder.isTypeSupported(mimeType).then(support => { assert_implements_optional( support, 'Optional codec ' + mimeType + ' not supported.'); @@ -95,7 +93,6 @@ promise_test(t => { return testFourColorDecodeWithExifOrientation(8, null, /*useYuv=*/ true); }, 'Test 4:2:0 JPEG w/ EXIF orientation left-bottom.'); - promise_test(t => { return testFourColorsDecode('four-colors.png', 'image/png'); }, 'Test PNG image decoding.'); @@ -158,6 +155,66 @@ promise_test(t => { {yuvFormat: 'I420', tolerance: 3}); }, 'Test WEBP image YUV 4:2:0 decoding.'); +const FOUR_COLORS_AVIF_HLG_COLOR_SPACE = new VideoColorSpace({ + primaries: 'bt2020', + transfer: 'hlg', + matrix: 'bt2020-ncl', + fullRange: true, +}); +promise_test(t => { + return testFourColorsYuvDecode( + 'four-colors-full-range-hlg-420-10bpc.avif', 'image/avif', { + yuvFormat: 'I420P10', + colorSpace: FOUR_COLORS_AVIF_HLG_COLOR_SPACE, + tolerance: 3 + }); +}, 'Test AVIF image HDR YUV 10-bit 4:2:0 decoding.'); + +promise_test(t => { + return testFourColorsYuvDecode( + 'four-colors-full-range-hlg-422-10bpc.avif', 'image/avif', { + yuvFormat: 'I422P10', + colorSpace: FOUR_COLORS_AVIF_HLG_COLOR_SPACE, + tolerance: 3 + }); +}, 'Test AVIF image HDR YUV 10-bit 4:2:2 decoding.'); + +promise_test(t => { + return testFourColorsYuvDecode( + 'four-colors-full-range-hlg-444-10bpc.avif', 'image/avif', { + yuvFormat: 'I444P10', + colorSpace: FOUR_COLORS_AVIF_HLG_COLOR_SPACE, + tolerance: 3 + }); +}, 'Test AVIF image HDR YUV 10-bit 4:4:4 decoding.'); + +promise_test(t => { + return testFourColorsYuvDecode( + 'four-colors-full-range-hlg-420-12bpc.avif', 'image/avif', { + yuvFormat: 'I420P12', + colorSpace: FOUR_COLORS_AVIF_HLG_COLOR_SPACE, + tolerance: 3 + }); +}, 'Test AVIF image HDR YUV 12-bit 4:2:0 decoding.'); + +promise_test(t => { + return testFourColorsYuvDecode( + 'four-colors-full-range-hlg-422-12bpc.avif', 'image/avif', { + yuvFormat: 'I422P12', + colorSpace: FOUR_COLORS_AVIF_HLG_COLOR_SPACE, + tolerance: 3 + }); +}, 'Test AVIF image HDR YUV 12-bit 4:2:2 decoding.'); + +promise_test(t => { + return testFourColorsYuvDecode( + 'four-colors-full-range-hlg-444-12bpc.avif', 'image/avif', { + yuvFormat: 'I444P12', + colorSpace: FOUR_COLORS_AVIF_HLG_COLOR_SPACE, + tolerance: 3 + }); +}, 'Test AVIF image HDR YUV 12-bit 4:4:4 decoding.'); + promise_test(t => { return fetch('four-colors.png').then(response => { let decoder = new ImageDecoder({data: response.body, type: 'junk/type'}); diff --git a/tests/wpt/tests/webdriver/tests/bidi/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/__init__.py index e3d2f83a19a..78d4fc55b28 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/__init__.py @@ -1,10 +1,54 @@ -from typing import Any, Callable, Dict, List, Mapping +from typing import Any, Callable, Dict, List, Mapping, Literal from tests.support.sync import AsyncPoll from webdriver.bidi.modules.script import ContextTarget from webdriver.bidi.undefined import UNDEFINED +def get_invalid_cases( + type_: Literal["boolean", "list", "string", "dict", "number"], + nullable: bool = False) -> List[Any]: + """ + Returns invalid use cases for the specific type with the given restrictions. + >>> get_invalid_cases("boolean") + [42, None, [], 'foo', {}] + >>> get_invalid_cases("list") + [42, False, None, 'foo', {}] + >>> get_invalid_cases("string") + [42, False, None, [], {}] + >>> get_invalid_cases("dict") + [42, False, None, [], 'foo'] + >>> get_invalid_cases("number") + [False, None, [], 'foo', {}] + >>> get_invalid_cases("boolean", nullable=True) + [42, [], 'foo', {}] + >>> get_invalid_cases("boolean", nullable=False) + [42, None, [], 'foo', {}] + + >>> get_invalid_cases("invalid_type") + Traceback (most recent call last): + ... + ValueError: Unexpected type: invalid_type + + """ + cases = { + "boolean": False, + "list": [], + "string": 'foo', + "dict": {}, + "number": 42, + } + + if type_ not in cases: + raise ValueError(f"Unexpected type: {type_}") + + result = list(filter(lambda i: i != cases[type_], cases.values())) + if not nullable: + result.append(None) + + return sorted(result, key=lambda x: str(x)) + + # Compares 2 objects recursively. # Actual value can have more keys as part of the forwards-compat design. # Expected value can be a value, a callable delegate, asserting the value, or UNDEFINED. diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/conftest.py index 16f03b9229a..f3c03917659 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/conftest.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/conftest.py @@ -31,15 +31,15 @@ async def default_locale(get_current_locale, top_context): @pytest.fixture def some_locale(default_locale): """ - Returns some locale which is not equal to `default_locale` nor to - `another_locale`. + Returns some locale which is not equal to `default_locale`. """ for locale in LOCALES: if locale != default_locale: return locale raise Exception( - f"Unexpectedly could not find locale different from the default {default_locale}") + f"Unexpectedly could not find locale different from the default {default_locale}" + ) @pytest.fixture @@ -49,8 +49,9 @@ def another_locale(default_locale, some_locale): `some_locale`. """ for locale in LOCALES: - if locale != default_locale and locale != another_locale: + if locale != default_locale and locale != some_locale: return locale raise Exception( - f"Unexpectedly could not find locale different from the default {default_locale}") + f"Unexpectedly could not find locale different from the default {default_locale} and {some_locale}" + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/contexts.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/contexts.py index 3a3fa527c4f..9f7e01deda3 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/contexts.py +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_locale_override/contexts.py @@ -1,4 +1,5 @@ import pytest +from webdriver.bidi.modules.script import ContextTarget pytestmark = pytest.mark.asyncio @@ -90,3 +91,48 @@ async def test_iframe( # Assert locale is emulated in the iframe context. assert await get_current_locale(iframe) == another_locale + + +async def test_locale_override_applies_to_new_sandbox( + bidi_session, new_tab, some_locale +): + await bidi_session.emulation.set_locale_override( + contexts=[new_tab["context"]], locale=some_locale + ) + + result = await bidi_session.script.evaluate( + expression="new Intl.DateTimeFormat().resolvedOptions().locale", + target=ContextTarget(new_tab["context"], sandbox="test"), + await_promise=False, + ) + + # Make sure the override got applied to the newly created sandbox. + assert result["value"] == some_locale + + +async def test_locale_override_applies_to_existing_sandbox( + bidi_session, new_tab, default_locale, another_locale +): + sandbox_name = "test" + + # Create a sandbox. + result = await bidi_session.script.evaluate( + expression="new Intl.DateTimeFormat().resolvedOptions().locale", + target=ContextTarget(new_tab["context"], sandbox=sandbox_name), + await_promise=False, + ) + + assert result["value"] == default_locale + + await bidi_session.emulation.set_locale_override( + contexts=[new_tab["context"]], locale=another_locale + ) + + result = await bidi_session.script.evaluate( + expression="new Intl.DateTimeFormat().resolvedOptions().locale", + target=ContextTarget(new_tab["context"], sandbox=sandbox_name), + await_promise=False, + ) + + # Make sure the override got applied to the existing sandbox. + assert result["value"] == another_locale diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/conftest.py new file mode 100644 index 00000000000..7658953ca49 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/conftest.py @@ -0,0 +1,26 @@ +import pytest_asyncio + +from webdriver.bidi.modules.script import ContextTarget + + +@pytest_asyncio.fixture +async def is_scripting_enabled(bidi_session): + """A fixture that returns a function to check if scripting is enabled in a + given browsing context.""" + + async def is_scripting_enabled(context): + result = await bidi_session.script.evaluate( + # `noscript` elements do not render their children if scripting is + # enabled. + expression="""(()=>{ + const n = document.createElement('noscript'); + n.innerHTML = '<div></div>'; + return n.childElementCount === 0; + })()""", + target=ContextTarget(context["context"]), + await_promise=False, + ) + + return result["value"] + + return is_scripting_enabled diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/contexts.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/contexts.py new file mode 100644 index 00000000000..e9479a1d521 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/contexts.py @@ -0,0 +1,91 @@ +import pytest + +pytestmark = pytest.mark.asyncio + + +async def test_contexts(bidi_session, new_tab, top_context, + is_scripting_enabled): + # Disable scripting + await bidi_session.emulation.set_scripting_enabled( + contexts=[new_tab["context"]], + enabled=False + ) + + # Assert scripting is disabled only in the required context. + assert await is_scripting_enabled(new_tab) is False + assert await is_scripting_enabled(top_context) is True + + # Reset scripting override. + await bidi_session.emulation.set_scripting_enabled( + contexts=[new_tab["context"]], + enabled=None) + + # Assert scripting is enabled. + assert await is_scripting_enabled(new_tab) is True + assert await is_scripting_enabled(top_context) is True + + +async def test_multiple_contexts(bidi_session, new_tab, is_scripting_enabled): + new_context = await bidi_session.browsing_context.create(type_hint="tab") + + # Disable scripting + await bidi_session.emulation.set_scripting_enabled( + contexts=[new_tab["context"], new_context["context"]], + enabled=False + ) + + # Assert scripting is disabled in all the required contexts. + assert await is_scripting_enabled(new_tab) is False + assert await is_scripting_enabled(new_context) is False + + # Reset scripting override. + await bidi_session.emulation.set_scripting_enabled( + contexts=[new_tab["context"], new_context["context"]], + enabled=None) + + # Assert scripting is enabled. + assert await is_scripting_enabled(new_tab) is True + assert await is_scripting_enabled(new_context) is True + + +@pytest.mark.parametrize("domain", ["", "alt"], + ids=["same_origin", "cross_origin"]) +async def test_iframe( + bidi_session, + new_tab, + is_scripting_enabled, + domain, + inline, +): + # Disable scripting + await bidi_session.emulation.set_scripting_enabled( + contexts=[new_tab["context"]], enabled=False + ) + + # Assert scripting is disabled in the required context. + assert await is_scripting_enabled(new_tab) is False + + iframe_url = inline("<div id='in-iframe'>foo</div>", domain=domain) + page_url = inline(f"<iframe src='{iframe_url}'></iframe>") + + # Load the page with iframes. + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=page_url, + wait="complete", + ) + + contexts = await bidi_session.browsing_context.get_tree( + root=new_tab["context"]) + iframe = contexts[0]["children"][0] + + # Assert scripting is disabled in the iframe context. + assert await is_scripting_enabled(iframe) is False + + # Enable scripting back + await bidi_session.emulation.set_scripting_enabled( + contexts=[new_tab["context"]], enabled=None + ) + + # Assert scripting is enabled in the iframe context. + assert await is_scripting_enabled(iframe) is True diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/enabled.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/enabled.py new file mode 100644 index 00000000000..782f292faf9 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/enabled.py @@ -0,0 +1,25 @@ +import pytest + +pytestmark = pytest.mark.asyncio + + +async def test_enabled_set_override_and_reset(bidi_session, top_context, + is_scripting_enabled): + # By default, scripting is enabled. + assert await is_scripting_enabled(top_context) is True + + # Disable scripting. + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + contexts=[top_context["context"]], + ) + + assert await is_scripting_enabled(top_context) is False + + # Reset scripting. + await bidi_session.emulation.set_scripting_enabled( + enabled=None, + contexts=[top_context["context"]], + ) + + assert await is_scripting_enabled(top_context) is True diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/invalid.py new file mode 100644 index 00000000000..a435092cf6e --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/invalid.py @@ -0,0 +1,125 @@ +import pytest + +import webdriver.bidi.error as error +from tests.bidi import get_invalid_cases +from webdriver.bidi.undefined import UNDEFINED + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("value", get_invalid_cases("list")) +async def test_params_contexts_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + contexts=value + ) + + +async def test_params_contexts_empty_list(bidi_session): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + contexts=[]) + + +@pytest.mark.parametrize("value", get_invalid_cases("string")) +async def test_params_contexts_entry_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + contexts=[value]) + + +async def test_params_contexts_entry_invalid_value(bidi_session): + with pytest.raises(error.NoSuchFrameException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + contexts=["_invalid_"], + ) + + +async def test_params_contexts_iframe(bidi_session, new_tab, get_test_page): + url = get_test_page(as_frame=True) + await bidi_session.browsing_context.navigate( + context=new_tab["context"], url=url, wait="complete" + ) + + contexts = await bidi_session.browsing_context.get_tree( + root=new_tab["context"]) + assert len(contexts) == 1 + frames = contexts[0]["children"] + assert len(frames) == 1 + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + contexts=[frames[0]["context"]], + ) + + +@pytest.mark.parametrize("value", get_invalid_cases("list")) +async def test_params_user_contexts_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + user_contexts=value, + ) + + +async def test_params_user_contexts_empty_list(bidi_session): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + user_contexts=[], + ) + + +@pytest.mark.parametrize("value", get_invalid_cases("string")) +async def test_params_user_contexts_entry_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + user_contexts=[value], + ) + + +@pytest.mark.parametrize("value", ["", "somestring"]) +async def test_params_user_contexts_entry_invalid_value(bidi_session, value): + with pytest.raises(error.NoSuchUserContextException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False, + user_contexts=[value], + ) + + +async def test_params_missing_contexts_and_user_contexts(bidi_session): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=False + ) + + +async def test_params_enabled_missing(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=UNDEFINED, + contexts=[top_context["context"]], + ) + + +@pytest.mark.parametrize("value", get_invalid_cases("boolean", nullable=True)) +async def test_params_enabled_invalid_type(bidi_session, top_context, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=value, + contexts=[top_context["context"]], + ) + + +async def test_params_enabled_invalid_value(bidi_session, top_context): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.emulation.set_scripting_enabled( + enabled=True, + contexts=[top_context["context"]], + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/user_contexts.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/user_contexts.py new file mode 100644 index 00000000000..ae4b4af04d4 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_scripting_enabled/user_contexts.py @@ -0,0 +1,145 @@ +import pytest + +pytestmark = pytest.mark.asyncio + + +async def test_user_contexts( + bidi_session, + create_user_context, + new_tab, + is_scripting_enabled, +): + user_context = await create_user_context() + context_in_user_context = await bidi_session.browsing_context.create( + user_context=user_context, type_hint="tab") + + assert await is_scripting_enabled(new_tab) is True + + # Disable scripting + await bidi_session.emulation.set_scripting_enabled( + user_contexts=[user_context], + enabled=False) + + # Assert scripting is disabled in user context. + assert await is_scripting_enabled(context_in_user_context) is False + + # Assert the default user context is not affected. + assert await is_scripting_enabled(new_tab) is True + + # Create a new context in the user context. + another_context_in_user_context = await bidi_session.browsing_context.create( + user_context=user_context, type_hint="tab") + # Assert scripting is disabled in a new browsing context of the user context. + assert await is_scripting_enabled( + another_context_in_user_context) is False + + +async def test_set_to_default_user_context( + bidi_session, + new_tab, + create_user_context, + is_scripting_enabled, +): + user_context = await create_user_context() + context_in_user_context = await bidi_session.browsing_context.create( + user_context=user_context, type_hint="tab" + ) + + await bidi_session.emulation.set_scripting_enabled( + user_contexts=["default"], + enabled=False, + ) + + # Make sure that the scripting changes are only applied to the context + # associated with default user context. + assert await is_scripting_enabled(context_in_user_context) is True + assert await is_scripting_enabled(new_tab) is False + + # Create a new context in the default context. + context_in_default_context = await bidi_session.browsing_context.create( + type_hint="tab" + ) + + assert await is_scripting_enabled(context_in_default_context) is False + + # Reset scripting override. + await bidi_session.emulation.set_scripting_enabled( + user_contexts=["default"], + enabled=None + ) + + +async def test_set_to_multiple_user_contexts( + bidi_session, + create_user_context, + is_scripting_enabled, +): + # Create the first user context. + user_context_1 = await create_user_context() + # Create a browsing context within the first user context. + context_in_user_context_1 = await bidi_session.browsing_context.create( + user_context=user_context_1, type_hint="tab" + ) + # Create the second user context. + user_context_2 = await create_user_context() + # Create a browsing context within the second user context. + context_in_user_context_2 = await bidi_session.browsing_context.create( + user_context=user_context_2, type_hint="tab" + ) + # Disable scripting for both user contexts. + await bidi_session.emulation.set_scripting_enabled( + user_contexts=[user_context_1, user_context_2], + enabled=False + ) + + # Assert scripting is disabled in the browsing context of the first user context. + assert await is_scripting_enabled(context_in_user_context_1) is False + # Assert scripting is disabled in the browsing context of the second user context. + assert await is_scripting_enabled(context_in_user_context_2) is False + + +async def test_set_to_user_context_and_then_to_context( + bidi_session, + create_user_context, + new_tab, + is_scripting_enabled, +): + user_context = await create_user_context() + context_in_user_context_1 = await bidi_session.browsing_context.create( + user_context=user_context, type_hint="tab" + ) + + # Apply scripting override to the user context. + await bidi_session.emulation.set_scripting_enabled( + user_contexts=[user_context], + enabled=False + ) + + # Apply scripting override now only to the context. + await bidi_session.emulation.set_scripting_enabled( + contexts=[context_in_user_context_1["context"]], + enabled=None + ) + assert await is_scripting_enabled(context_in_user_context_1) is True + + await bidi_session.browsing_context.reload( + context=context_in_user_context_1["context"], wait="complete" + ) + + # Make sure that after reload the scripting is still updated. + assert await is_scripting_enabled(context_in_user_context_1) is True + + # Create a new context in the user context. + context_in_user_context_2 = await bidi_session.browsing_context.create( + user_context=user_context, type_hint="tab" + ) + # Make sure that the scripting override for the user context is applied. + assert await is_scripting_enabled(context_in_user_context_2) is False + + await bidi_session.emulation.set_scripting_enabled( + contexts=[context_in_user_context_1["context"]], + enabled=None, + ) + + # Make sure that the scripting override was reset. + assert await is_scripting_enabled(context_in_user_context_1) is True diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/collector.py b/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/collector.py new file mode 100644 index 00000000000..8e77058077c --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/collector.py @@ -0,0 +1,76 @@ +import pytest +import webdriver.bidi.error as error + +from .. import PAGE_EMPTY_TEXT + +pytestmark = pytest.mark.asyncio + + +async def test_disowned_collector( + bidi_session, + url, + setup_collected_response, +): + [request, collector] = await setup_collected_response( + fetch_url=url(PAGE_EMPTY_TEXT) + ) + + # disown using get_data + await bidi_session.network.get_data( + request=request, data_type="response", collector=collector, disown=True + ) + + # Check that you can no longer disown data with + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.disown_data( + request=request, data_type="response", collector=collector + ) + + +async def test_several_collectors( + bidi_session, + url, + add_data_collector, + setup_collected_response, +): + collector = await add_data_collector(collector_type="blob", data_types=["response"]) + [request, other_collector] = await setup_collected_response( + fetch_url=url(PAGE_EMPTY_TEXT) + ) + + # disown with the first collector + await bidi_session.network.disown_data( + request=request, data_type="response", collector=collector + ) + + # Check that you can no longer get or disown data with the first collector, + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.disown_data( + request=request, data_type="response", collector=collector + ) + + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.get_data( + request=request, data_type="response", collector=collector + ) + + # But the data should still be available from the other collector or without + # a collector parameter. + await bidi_session.network.get_data( + request=request, data_type="response", collector=other_collector + ) + await bidi_session.network.get_data(request=request, data_type="response") + + # disown with the other collector + await bidi_session.network.disown_data( + request=request, data_type="response", collector=other_collector + ) + + # Check the data can no longer be retrieved or disowned + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.disown_data( + request=request, data_type="response", collector=other_collector + ) + + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.get_data(request=request, data_type="response") diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/invalid.py new file mode 100644 index 00000000000..d3cfb3ec85c --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/invalid.py @@ -0,0 +1,91 @@ +import pytest +import webdriver.bidi.error as error + +from .. import PAGE_EMPTY_TEXT + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_request_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.disown_data( + request=value, data_type="response", collector="collector_id" + ) + + +async def test_params_request_non_existent(bidi_session): + collector = await bidi_session.network.add_data_collector( + data_types=["response"], max_encoded_data_size=1000 + ) + + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.disown_data( + request="does_not_exist", data_type="response", collector=collector + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_data_type_invalid_type(bidi_session, value): + collector = await bidi_session.network.add_data_collector( + data_types=["response"], max_encoded_data_size=1000 + ) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.disown_data( + request="request_id", data_type=value, collector=collector + ) + + +@pytest.mark.parametrize("value", ["", "invalid"]) +async def test_params_data_type_invalid_value(bidi_session, value): + collector = await bidi_session.network.add_data_collector( + data_types=["response"], max_encoded_data_size=1000 + ) + + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.disown_data( + request="request_id", data_type=value, collector=collector + ) + + +@pytest.mark.parametrize("value", [None, False, 42, {}, []]) +async def test_params_collector_invalid_type(bidi_session, value): + with pytest.raises(error.InvalidArgumentException): + await bidi_session.network.disown_data( + request="request_id", data_type="response", collector=value + ) + + +async def test_params_collector_non_existent(bidi_session): + with pytest.raises(error.NoSuchNetworkCollectorException): + await bidi_session.network.disown_data( + request="request_id", data_type="response", collector="does_not_exist" + ) + + +async def test_params_collector_removed_collector(bidi_session): + collector = await bidi_session.network.add_data_collector( + data_types=["response"], max_encoded_data_size=1000 + ) + + await bidi_session.network.remove_data_collector(collector=collector) + + with pytest.raises(error.NoSuchNetworkCollectorException): + await bidi_session.network.disown_data( + request="request_id", data_type="response", collector=collector + ) + + +async def test_params_collector_not_in_collected_data( + bidi_session, url, add_data_collector, setup_collected_response +): + too_small_collector = await add_data_collector( + data_types=["response"], max_encoded_data_size=1 + ) + [request, _] = await setup_collected_response(fetch_url=url(PAGE_EMPTY_TEXT)) + + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.disown_data( + request=request, data_type="response", collector=too_small_collector + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/request.py b/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/request.py new file mode 100644 index 00000000000..7a3fde48705 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/disown_data/request.py @@ -0,0 +1,29 @@ +import pytest +import webdriver.bidi.error as error + +from .. import PAGE_EMPTY_TEXT + +pytestmark = pytest.mark.asyncio + + +async def test_request( + bidi_session, + url, + setup_collected_response, +): + [request, collector] = await setup_collected_response( + fetch_url=url(PAGE_EMPTY_TEXT) + ) + await bidi_session.network.disown_data( + request=request, data_type="response", collector=collector + ) + + # Check that after calling disown data, you can no longer get or disown the + # data. + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.disown_data( + request=request, data_type="response", collector=collector + ) + + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.get_data(request=request, data_type="response") diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/get_data/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/get_data/invalid.py index 2ee725bef97..963488865f9 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/get_data/invalid.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/get_data/invalid.py @@ -58,6 +58,20 @@ async def test_params_collector_non_existent( ) +async def test_params_collector_not_in_collected_data( + bidi_session, url, add_data_collector, setup_collected_response +): + too_small_collector = await add_data_collector( + data_types=["response"], max_encoded_data_size=1 + ) + [request, _] = await setup_collected_response(fetch_url=url(PAGE_EMPTY_TEXT)) + + with pytest.raises(error.NoSuchNetworkDataException): + await bidi_session.network.get_data( + request=request, data_type="response", collector=too_small_collector + ) + + @pytest.mark.parametrize("value", ["", "true", "false", 42, {}, []]) async def test_params_disown_invalid_type( bidi_session, url, setup_collected_response, value diff --git a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_mouse.py b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_mouse.py index 0a35cf94550..2b069b7c363 100644 --- a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_mouse.py +++ b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_mouse.py @@ -316,7 +316,11 @@ def test_move_to_origin_position_within_frame( events = get_events(session) assert len(events) == 1 - assert events[0] == target_point + + # For now we are allowing any of floor, ceil, or precise values, because + # it's unclear what the actual spec requirements really are + assert events[0][0] == pytest.approx(target_point[0], abs=1.0) + assert events[0][1] == pytest.approx(target_point[1], abs=1.0) @pytest.mark.parametrize("missing", ["x", "y"]) diff --git a/tests/wpt/tests/webrtc-encoded-transform/RTCRtpScriptTransform-encoded-transform-worker.js b/tests/wpt/tests/webrtc-encoded-transform/RTCRtpScriptTransform-encoded-transform-worker.js index 89e421ae9aa..6dd426d4618 100644 --- a/tests/wpt/tests/webrtc-encoded-transform/RTCRtpScriptTransform-encoded-transform-worker.js +++ b/tests/wpt/tests/webrtc-encoded-transform/RTCRtpScriptTransform-encoded-transform-worker.js @@ -18,15 +18,14 @@ function RestoreAndWrite(chunk, transformer) { chunk.value.data = chunk.value.data.slice(0, chunk.value.data.byteLength - 1); let frameData = chunk.value.data; transformer.writer.write(chunk.value); - if (lastByte === modification && !chunk.value.getMetadata().rtpTimestamp && frameData.byteLength == 0) { + if (lastByte === modification && frameData.byteLength == 0) { self.postMessage("got expected"); } else { self.postMessage("unexpected value: lastByte (got " + lastByte + ", expected " + modification + "), frame data length (got " + frameData.byteLength + - ", expected 0), rtpTimestamp (got " + - chunk.value.getMetadata().rtpTimestamp + ", expected null)"); + ", expected 0))"); } } onrtctransform = (event) => { diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-constructor.html b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-constructor.html new file mode 100644 index 00000000000..a19e4b7c942 --- /dev/null +++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-constructor.html @@ -0,0 +1,67 @@ +<!doctype html> +<meta charset=utf-8> +<title>Timestamps in RTCEncodedFrame metadata</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/webrtc/RTCPeerConnection-helper.js"></script> +<script src="RTCEncodedFrame-timestamps-helper.js"></script> +<script> +'use strict'; + +function doWork() { + onrtctransform = async e => { + const reader = e.transformer.readable.getReader(); + const writer = e.transformer.writable.getWriter(); + for (let i = 0; i<10; i++) { + const frameOrDone = await reader.read(); + if (frameOrDone.done) { + self.postMessage("Unexpected end of stream"); + return; + } + const originalFrame = frameOrDone.value; + const originalMetadata= originalFrame.getMetadata(); + const newFrame = new RTCEncodedVideoFrame(originalFrame, {metadata: originalMetadata}); + + await writer.write(newFrame); + } + self.postMessage("OK"); + }; +} + +async function testAudioFrameConstructor(t, enableAbsCaptureTime, enableForSenderFrames) { + const worker = new Worker(`data:text/javascript,(${doWork.toString()})()`); + const workerPromise = new Promise((resolve, reject) => { + worker.onmessage = t.step_func(message => { + if (message.data == "OK") { + resolve(); + } else { + reject(message.data); + } + }); + }); + + await initiateCall( + t, /*streamOptions=*/{audio: false, video: true}, + /*enableAbsCaptureTime=*/enableAbsCaptureTime, worker, /*enableSenderTransform=*/enableForSenderFrames, + /*enableReceiverTransform=*/!enableForSenderFrames); + + return workerPromise; +} + +promise_test(async t => { + return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/false) +}, 'Constructing a new receiver audio frame explicitly using metadata from an existing frame works'); + +promise_test(async t => { + return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/false, /*enableForSenderFrames=*/true) +}, 'Constructing a new sender audio frame explicitly using metadata from an existing frame works'); + +promise_test(async t => { + return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/false) +}, 'Constructing a new receiver audio frame explicitly using metadata from an existing frame works, absCaptureTime extension enabled'); + +promise_test(async t => { + return testAudioFrameConstructor(t, /*enableAbsCaptureTime=*/true, /*enableForSenderFrames=*/true) +}, 'Constructing a new sender audio frame explicitly using metadata from an existing frame works, absCaptureTime extension enabled'); + +</script> diff --git a/tests/wpt/tests/webvtt/META.yml b/tests/wpt/tests/webvtt/META.yml index 949f312d7ac..99076f81582 100644 --- a/tests/wpt/tests/webvtt/META.yml +++ b/tests/wpt/tests/webvtt/META.yml @@ -2,3 +2,5 @@ spec: https://w3c.github.io/webvtt/ suggested_reviewers: - silviapfeiffer - BenjaminSchaaf + - zcorpan + - alastor0325 diff --git a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition-ref.html b/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition-ref.html deleted file mode 100644 index 1ff5b84ced6..00000000000 --- a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition-ref.html +++ /dev/null @@ -1,52 +0,0 @@ -<!DOCTYPE html> -<html class="reftest-wait"> -<title>Reference for WebVTT rendering, cue reposition after enabling controls</title> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -<style> -video { - position: absolute; - width:320px; - height:240px; -} -.cue { - position: absolute; - bottom: 50px; - left: 0; - right: 0; - text-align: center; - color: green; - font-size: 50px; - font-family: Ahem, sans-serif; -} -.cue > span { - background: rgba(0,0,0,0.8); -} - -.media-container { - display: inline-block; - position: relative; - border: solid black 1px; - border-box: content-box; - width: 320px; - height: 240px; -} -</style> -<div class="media-container"> - <span class="cue"><span>Foo</span></span> - <video controls autoplay onplaying="runTest()"> - <source src="/media/sound_5.mp3" type="audio/mp3"> - <source src="/media/sound_5.oga" type="audio/ogg"> - </video> -</div> -<script src="/common/reftest-wait.js"></script> -<script> - async function runTest() { - let media = document.getElementsByTagName("video")[0]; - media.pause(); - media.currentTime = 0; - media.addEventListener("seeked", (event) => { - takeScreenshot(); - }); - } -</script> -</html> diff --git a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition.html b/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition.html deleted file mode 100644 index 9e299c8d0d9..00000000000 --- a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition.html +++ /dev/null @@ -1,43 +0,0 @@ -<!doctype html> -<html class="reftest-wait"> -<title>WebVTT rendering, cue reposition after enabling controls</title> -<link rel="match" href="enable_controls_reposition-ref.html"> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -<style> -video { - width: 320px; - height: 240px; -} -::cue { - font-family: Ahem, sans-serif; - font-size: 50px; - color: green; -} -.media-container { - display: inline-block; - position: relative; - border: solid black 1px; - border-box: content-box; - width: 320px; - height: 240px; -} -</style> -<div class="media-container"> -<video controls autoplay onplaying="runTest()"> - <source src="/media/sound_5.mp3" type="audio/mp3"> - <source src="/media/sound_5.oga" type="audio/ogg"> - <track src="support/foo.vtt"> -</video> -</div> -<script src="/common/reftest-wait.js"></script> -<script> -async function runTest() { - document.getElementsByTagName("track")[0].track.mode = "showing"; - let media = document.getElementsByTagName("video")[0]; - media.pause(); - media.currentTime = 0; - media.addEventListener("seeked", (event) => { - takeScreenshot(); - }); -} -</script> \ No newline at end of file diff --git a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls-ref.html b/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls-ref.html deleted file mode 100644 index 65b23298f00..00000000000 --- a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls-ref.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> -<html class="reftest-wait"> -<title>Reference for WebVTT rendering, the subtitles is not covered by or covering the controls</title> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -<style> -.video { - display: inline-block; - position: absolute; - width: 320px; - height: 400px; - font-size: 20px; -} -.cue { - position: absolute; - bottom: 0; - left: 0; - right: 0; - text-align: center; - padding-bottom: 40px; - font-family: Ahem, sans-serif; - color: green; -} -.cue > span { - background: rgba(0,0,0,0.8); -} -</style> -<script src="/common/reftest-wait.js"></script> -<div class="video"><span class="cue"><span>This is a test subtitle</span></span></div> -<video width="320" height="400" autoplay controls onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> - <source src="/media/white.webm" type="video/webm"> - <source src="/media/white.mp4" type="video/mp4"> - <track> -</video> diff --git a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls.html b/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls.html deleted file mode 100644 index 349a121d9b5..00000000000 --- a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_height400_with_controls.html +++ /dev/null @@ -1,23 +0,0 @@ -<!DOCTYPE html> -<html class="reftest-wait"> -<title>WebVTT rendering, the subtitles is not covered by or covering the controls</title> -<link rel="match" href="media_height400_with_controls-ref.html"> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -<style> -html { overflow:hidden } -body { margin:0 } -::cue { - font-family: Ahem, sans-serif; - color: green -} -</style> -<script src="/common/reftest-wait.js"></script> -<video width="320" height="400" autoplay controls onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> - <source src="/media/white.webm" type="video/webm"> - <source src="/media/white.mp4" type="video/mp4"> - <track src="support/test.vtt"> - <script> - document.getElementsByTagName('track')[0].track.mode = 'showing'; - </script> -</video> -</html> diff --git a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls-ref.html b/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls-ref.html deleted file mode 100644 index d18b3ce6134..00000000000 --- a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls-ref.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> -<html class="reftest-wait"> -<title>Reference for WebVTT rendering, the subtitles are moved up to correct position when controls are visible</title> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -<style> -.video { - display: inline-block; - position: absolute; - width: 320px; - height: 180px; - font-size: 9px; -} -.cue { - position: absolute; - bottom: 0; - left: 0; - right: 0; - text-align: center; - padding-bottom: 9px; - font-family: Ahem, sans-serif; - color: green; -} -.cue > span { - background: rgba(0,0,0,0.8); -} -</style> -<script src="/common/reftest-wait.js"></script> -<div class="video"><span class="cue"><span>This is a test subtitle</span></span></div> -<video width="320" height="180" autoplay controls onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> - <source src="/media/white.webm" type="video/webm"> - <source src="/media/white.mp4" type="video/mp4"> - <track> -</video> diff --git a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls.html b/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls.html deleted file mode 100644 index dda72d16a6e..00000000000 --- a/tests/wpt/tests/webvtt/rendering/cues-with-video/processing-model/media_with_controls.html +++ /dev/null @@ -1,23 +0,0 @@ -<!DOCTYPE html> -<html class="reftest-wait"> -<title>WebVTT rendering, the subtitles are moved up to correct position when controls are visible</title> -<link rel="match" href="media_with_controls-ref.html"> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -<style> -html { overflow:hidden } -body { margin:0 } -::cue { - font-family: Ahem, sans-serif; - color: green -} -</style> -<script src="/common/reftest-wait.js"></script> -<video width="320" height="180" autoplay controls onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> - <source src="/media/white.webm" type="video/webm"> - <source src="/media/white.mp4" type="video/mp4"> - <track src="support/test.vtt"> - <script> - document.getElementsByTagName('track')[0].track.mode = 'showing'; - </script> -</video> -</html>