From c3a58f9c16895aaf137949944f4986ef67b2b68d Mon Sep 17 00:00:00 2001 From: Servo WPT Sync <32481905+servo-wpt-sync@users.noreply.github.com> Date: Thu, 5 Dec 2024 06:23:07 +0100 Subject: [PATCH] Update web-platform-tests to revision b'bf49dde84c5f05613115d6146d109f0ec3900694' (#34483) Signed-off-by: WPT Sync Bot --- .../url/url-in-tags-revoke.window.js.ini | 3 + tests/wpt/meta-legacy-layout/MANIFEST.json | 212501 ++++++++++++--- .../crypto_key_cached_slots.https.any.js.ini | 8 + ...c_importKey_failures_ECDH.https.any.js.ini | 72 + ..._importKey_failures_ECDSA.https.any.js.ini | 72 + ...mportKey_failures_Ed25519.https.any.js.ini | 48 + ..._importKey_failures_Ed448.https.any.js.ini | 48 + ...importKey_failures_X25519.https.any.js.ini | 42 + ...p_importKey_failures_X448.https.any.js.ini | 42 + .../wrapKey_unwrapKey.https.any.js.ini | 122 + .../console/console-is-a-namespace.any.js.ini | 18 + .../console-label-conversion.any.js.ini | 18 + .../console-log-large-array.any.js.ini | 18 + .../console/console-log-symbol.any.js.ini | 18 + ...e-namespace-object-class-string.any.js.ini | 18 + .../console-tests-historical.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - .../console/idlharness.any.js.ini | 4 + .../event-dispatch.tentative.html.ini | 11 + .../animation-range-shorthand.html.ini | 3 + .../animation-range-start-valid.html.ini | 3 + .../css-backgrounds/background-332.html.ini | 3 + .../background-size-001.html.ini | 27 + .../css-cascade/scope-invalidation.html.ini | 9 + .../css/css-cascade/scope-nesting.html.ini | 3 + .../timing-functions-syntax-computed.html.ini | 3 + .../timing-functions-syntax-valid.html.ini | 3 + ...rthand-serialization-font-stretch.html.ini | 3 + .../generic-family-keywords-001.html.ini | 3 + .../gap-decorations-style-computed.html.ini | 27 + .../css-grid/computed-grid-column.html.ini | 3 + ...ry-intrinsic-sizing-cols-001-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-001-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-001-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-001-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-001.html.ini | 2 - ...ry-intrinsic-sizing-cols-002-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-002-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-002-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-002-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-002.html.ini | 2 - ...ry-intrinsic-sizing-cols-003-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-003-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-003-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-003-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-003.html.ini | 2 - ...ry-intrinsic-sizing-cols-004-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-004-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-004-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-004-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-004.html.ini | 2 - ...ry-intrinsic-sizing-rows-001-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-001-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-001-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-001-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-001.html.ini | 2 - ...ry-intrinsic-sizing-rows-002-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-002-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-002-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-002-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-002.html.ini | 2 - ...ry-intrinsic-sizing-rows-003-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-003-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-003-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-003-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-003.html.ini | 2 - ...ry-intrinsic-sizing-rows-004-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-004-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-004-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-004-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-004.html.ini | 2 - ...masonry-intrinsic-sizing-rows-005.html.ini | 2 + .../grid-template-columns-computed.html.ini | 3 + .../cross-fade-computed-value.html.ini | 3 + ...scrollable-overflow-padding-input.html.ini | 15 + ...ct-arrow-pseudo-element.tentative.html.ini | 15 + ...ch-alias-block-size-001.tentative.html.ini | 96 + ...h-alias-inline-size-001.tentative.html.ini | 78 + ...lias-max-block-size-001.tentative.html.ini | 123 + ...ias-max-inline-size-001.tentative.html.ini | 117 + ...lias-min-block-size-001.tentative.html.ini | 114 + ...ias-min-inline-size-001.tentative.html.ini | 114 + .../stretch/stretch-block-size-001.html.ini | 102 + .../stretch/stretch-inline-size-001.html.ini | 78 + .../stretch-max-block-size-001.html.ini | 123 + .../stretch-max-inline-size-001.html.ini | 117 + .../stretch-min-block-size-001.html.ini | 114 + .../stretch-min-inline-size-001.html.ini | 114 + .../css/css-values/attr-all-types.html.ini | 21 +- .../css/css-values/attr-security.html.ini | 13 +- ...lc-sibling-function-in-shadow-dom.html.ini | 3 + .../css-values/calc-sibling-function.html.ini | 3 + .../vh_not_refreshing_on_chrome.html.ini | 1 + .../elementsFromPoint-invalid-cases.html.ini | 3 + ...scrollWidthHeightWhenNotScrollable.xht.ini | 6 + .../prefers-color-scheme.html.ini | 12 - .../has-pseudoclass-only.html.ini | 36 + .../dom/abort/AbortSignal.any.js.ini | 18 + .../dom/abort/event.any.js.ini | 18 + .../dom/abort/timeout-shadowrealm.any.js.ini | 18 + .../dom/idlharness-shadowrealm.window.js.ini | 2 - .../dom/idlharness.any.js.ini | 4 + .../encoding/api-basics.any.js.ini | 18 + .../encoding/api-surrogates-utf8.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - .../encoding/idlharness.any.js.ini | 4 + .../encoding/iso-2022-jp-decoder.any.js.ini | 18 + .../encoding/streams/backpressure.any.js.ini | 18 + .../streams/decode-attributes.any.js.ini | 18 + .../streams/decode-bad-chunks.any.js.ini | 18 + .../streams/decode-non-utf8.any.js.ini | 18 + .../readable-writable-properties.any.js.ini | 18 + .../encoding/textdecoder-arguments.any.js.ini | 18 + .../textdecoder-byte-order-marks.any.js.ini | 18 + .../textdecoder-fatal-streaming.any.js.ini | 18 + .../encoding/textdecoder-fatal.any.js.ini | 18 + .../encoding/textdecoder-ignorebom.any.js.ini | 18 + .../textdecoder-utf16-surrogates.any.js.ini | 18 + .../textencoder-utf16-surrogates.any.js.ini | 18 + .../css-font-face.sub.tentative.html.ini | 3 - .../idlharness-shadowrealm.window.js.ini | 2 - .../hr-time/idlharness.any.js.ini | 10 +- .../load-pageshow-events-window-open.html.ini | 3 - .../dom/idlharness-shadowrealm.window.js.ini | 2 - ...ss.worker.js.ini => idlharness.any.js.ini} | 890 +- .../html/dom/idlharness.https.html.ini | 108 - .../dom/reflection-forms-weekmonth.html.ini | 3 - .../html/dom/reflection-forms.html.ini | 6 - ...ading-lazy-reload-location-reload.html.ini | 3 - .../iframe_sandbox_popups_escaping-1.html.ini | 3 +- ...rame_sandbox_popups_nonescaping-2.html.ini | 3 +- .../newline-normalization.html.ini | 12 - .../submit-file.sub.html.ini | 4 - .../select-parsing.tentative.html.ini | 6 - .../html/webappapis/atob/base64.any.js.ini | 18 + .../self.any.js.ini | 17 + .../nav2-test-timing-persistent.html.ini | 3 + .../idlharness-shadowrealm.window.js.ini | 2 - .../idlharness.any.js.ini | 4 + ...erevent_touch-action-verification.html.ini | 12 + .../idlharness.https.window.js.ini | 204 + .../pointerevents/inheritance.html.ini | 6 + .../parsing/touch-action-computed.html.ini | 18 + .../parsing/touch-action-valid.html.ini | 18 + ...from-pointer-event-init.tentative.html.ini | 6 + .../pointerevent_constructor.html.ini | 3 + ..._fractional_coordinates_untrusted.html.ini | 1297 + .../pointerevent_on_event_handlers.html.ini | 91 + ...t_tiltX_tiltY_to_azimuth_altitude.html.ini | 57 + ...pointerevent_touch-action-illegal.html.ini | 9 + ...erevent_touch-action-verification.html.ini | 111 + ...control-element-is-in-shadow-tree.html.ini | 2 + .../async-iterator.any.js.ini | 18 + .../bad-strategies.any.js.ini | 18 + .../bad-underlying-sources.any.js.ini | 18 + .../readable-streams/cancel.any.js.ini | 18 + .../readable-streams/constructor.any.js.ini | 18 + ...nt-queuing-strategy-integration.any.js.ini | 18 + .../default-reader.any.js.ini | 18 + ...floating-point-total-queue-size.any.js.ini | 18 + .../streams/readable-streams/from.any.js.ini | 60 + .../garbage-collection.any.js.ini | 18 + .../readable-streams/general.any.js.ini | 18 + .../owning-type-message-port.any.js.ini | 18 + .../readable-streams/owning-type.any.js.ini | 18 + .../patched-global.any.js.ini | 18 + .../reentrant-strategies.any.js.ini | 18 + .../streams/readable-streams/tee.any.js.ini | 18 + .../readable-streams/templated.any.js.ini | 18 + .../tentative/fetch.any.js.ini | 139 + .../tentative/script.window.js.ini | 65 + .../signatures/tentative/fetch.any.js.ini | 47 + .../url/idlharness-shadowrealm.window.js.ini | 2 - .../url/idlharness.any.js.ini | 6 + .../url/toascii.window.js.ini | 291 + .../idlharness-shadowrealm.window.js.ini | 2 - .../user-timing/idlharness.any.js.ini | 3 + .../wasm/jsapi/constructor/compile.any.js.ini | 18 + .../instantiate-bad-imports.any.js.ini | 18 + .../jsapi/constructor/instantiate.any.js.ini | 18 + .../jsapi/constructor/multi-value.any.js.ini | 18 + .../jsapi/constructor/toStringTag.any.js.ini | 18 + .../jsapi/constructor/validate.any.js.ini | 18 + .../exception/basic.tentative.any.js.ini | 18 + .../constructor.tentative.any.js.ini | 18 + .../exception/getArg.tentative.any.js.ini | 18 + .../exception/identity.tentative.any.js.ini | 18 + .../jsapi/exception/is.tentative.any.js.ini | 18 + .../exception/toString.tentative.any.js.ini | 18 + .../jsapi/function/call.tentative.any.js.ini | 18 + .../function/constructor.tentative.any.js.ini | 18 + .../jsapi/function/table.tentative.any.js.ini | 18 + .../jsapi/function/type.tentative.any.js.ini | 18 + .../wasm/jsapi/global/constructor.any.js.ini | 18 + .../wasm/jsapi/global/toString.any.js.ini | 18 + .../jsapi/global/type.tentative.any.js.ini | 18 + .../jsapi/global/value-get-set.any.js.ini | 18 + .../wasm/jsapi/global/valueOf.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - .../wasm/jsapi/idlharness.any.js.ini | 4 + .../constructor-bad-imports.any.js.ini | 18 + .../instance/constructor-caching.any.js.ini | 18 + .../jsapi/instance/constructor.any.js.ini | 18 + .../wasm/jsapi/instance/exports.any.js.ini | 18 + .../wasm/jsapi/instance/toString.any.js.ini | 18 + .../wasm/jsapi/interface.any.js.ini | 18 + .../js-string/basic.tentative.any.js.ini | 18 + .../js-string/constants.tentative.any.js.ini | 19 + .../js-string/imports.tentative.any.js.ini | 19 + .../constructor-shared.tentative.any.js.ini | 18 + .../constructor-types.tentative.any.js.ini | 18 + .../wasm/jsapi/memory/constructor.any.js.ini | 18 + .../wasm/jsapi/memory/grow.any.js.ini | 18 + .../jsapi/memory/type.tentative.any.js.ini | 18 + .../wasm/jsapi/module/constructor.any.js.ini | 18 + .../jsapi/module/customSections.any.js.ini | 18 + .../wasm/jsapi/module/exports.any.js.ini | 18 + .../wasm/jsapi/module/imports.any.js.ini | 18 + .../module/moduleSource.tentative.any.js.ini | 19 + .../wasm/jsapi/module/toString.any.js.ini | 18 + .../wasm/jsapi/prototypes.any.js.ini | 18 + .../constructor-types.tentative.any.js.ini | 18 + .../wasm/jsapi/table/constructor.any.js.ini | 18 + .../wasm/jsapi/table/get-set.any.js.ini | 18 + .../wasm/jsapi/table/grow.any.js.ini | 18 + .../wasm/jsapi/table/length.any.js.ini | 18 + .../wasm/jsapi/table/toString.any.js.ini | 18 + .../jsapi/table/type.tentative.any.js.ini | 18 + .../tag/constructor.tentative.any.js.ini | 18 + .../jsapi/tag/toString.tentative.any.js.ini | 18 + .../wasm/jsapi/tag/type.tentative.any.js.ini | 18 + .../DOMException-constants.any.js.ini | 18 + ...ption-constructor-and-prototype.any.js.ini | 18 + ...MException-constructor-behavior.any.js.ini | 18 + .../DOMException-custom-bindings.any.js.ini | 18 + .../global-mutable-prototype.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - .../webidl/idlharness.any.js.ini | 6 + tests/wpt/meta/MANIFEST.json | 16610 +- .../crypto_key_cached_slots.https.any.js.ini | 8 + ...c_importKey_failures_ECDH.https.any.js.ini | 72 + ..._importKey_failures_ECDSA.https.any.js.ini | 72 + ...mportKey_failures_Ed25519.https.any.js.ini | 48 + ..._importKey_failures_Ed448.https.any.js.ini | 48 + ...importKey_failures_X25519.https.any.js.ini | 42 + ...p_importKey_failures_X448.https.any.js.ini | 42 + .../wrapKey_unwrapKey.https.any.js.ini | 122 + .../console/console-is-a-namespace.any.js.ini | 18 + .../console-label-conversion.any.js.ini | 18 + .../console-log-large-array.any.js.ini | 18 + .../console/console-log-symbol.any.js.ini | 18 + ...e-namespace-object-class-string.any.js.ini | 18 + .../console-tests-historical.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - tests/wpt/meta/console/idlharness.any.js.ini | 7 +- .../mix-blend-mode-video-sibling.html.ini | 2 - .../event-dispatch.tentative.html.ini | 13 +- .../animation-range-shorthand.html.ini | 3 + .../animation-range-start-valid.html.ini | 3 + .../css-backgrounds/background-332.html.ini | 3 + .../background-size-001.html.ini | 27 + .../css-cascade/scope-invalidation.html.ini | 9 + .../css/css-cascade/scope-nesting.html.ini | 3 + .../timing-functions-syntax-computed.html.ini | 3 + .../timing-functions-syntax-valid.html.ini | 3 + ...rthand-serialization-font-stretch.html.ini | 3 + .../gap-decorations-style-computed.html.ini | 27 + .../css-grid/computed-grid-column.html.ini | 3 + ...ry-intrinsic-sizing-cols-001-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-001-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-001-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-001-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-001.html.ini | 2 - ...ry-intrinsic-sizing-cols-002-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-002-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-002-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-002-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-002.html.ini | 2 - ...ry-intrinsic-sizing-cols-003-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-003-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-003-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-003-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-003.html.ini | 2 - ...ry-intrinsic-sizing-cols-004-auto.html.ini | 2 + ...onry-intrinsic-sizing-cols-004-fr.html.ini | 2 + ...ry-intrinsic-sizing-cols-004-mix1.html.ini | 2 + ...ry-intrinsic-sizing-cols-004-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-cols-004.html.ini | 2 - ...ry-intrinsic-sizing-rows-001-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-001-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-001-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-001-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-001.html.ini | 2 - ...ry-intrinsic-sizing-rows-002-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-002-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-002-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-002-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-002.html.ini | 2 - ...ry-intrinsic-sizing-rows-003-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-003-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-003-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-003-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-003.html.ini | 2 - ...ry-intrinsic-sizing-rows-004-auto.html.ini | 2 + ...onry-intrinsic-sizing-rows-004-fr.html.ini | 2 + ...ry-intrinsic-sizing-rows-004-mix1.html.ini | 2 + ...ry-intrinsic-sizing-rows-004-mix2.html.ini | 2 + ...masonry-intrinsic-sizing-rows-004.html.ini | 2 - ...nry-intrinsic-sizing-rows-007-ref.html.ini | 2 + ...masonry-intrinsic-sizing-rows-007.html.ini | 2 + .../masonry-subgrid-flex.html.ini | 2 + .../masonry-subgrid-intrinsic-sizing.html.ini | 2 + .../track-sizing/masonry-subgrid.html.ini | 2 + .../cross-fade-computed-value.html.ini | 3 + ...scrollable-overflow-padding-input.html.ini | 6 + ...ct-arrow-pseudo-element.tentative.html.ini | 15 + ...ch-alias-block-size-001.tentative.html.ini | 96 + ...h-alias-inline-size-001.tentative.html.ini | 84 + ...lias-max-block-size-001.tentative.html.ini | 117 + ...ias-max-inline-size-001.tentative.html.ini | 117 + ...lias-min-block-size-001.tentative.html.ini | 114 + ...ias-min-inline-size-001.tentative.html.ini | 114 + .../stretch/stretch-block-size-001.html.ini | 36 + .../stretch/stretch-inline-size-001.html.ini | 24 + .../stretch-max-block-size-001.html.ini | 30 + .../stretch-max-inline-size-001.html.ini | 30 + .../stretch-min-block-size-001.html.ini | 42 + .../stretch-min-inline-size-001.html.ini | 42 + .../css/css-values/attr-all-types.html.ini | 21 +- .../css/css-values/attr-security.html.ini | 13 +- ...lc-sibling-function-in-shadow-dom.html.ini | 3 + .../css-values/calc-sibling-function.html.ini | 3 + .../elementsFromPoint-invalid-cases.html.ini | 3 + ...scrollWidthHeightWhenNotScrollable.xht.ini | 6 + .../has-pseudoclass-only.html.ini | 36 + .../wpt/meta/dom/abort/AbortSignal.any.js.ini | 18 + tests/wpt/meta/dom/abort/event.any.js.ini | 18 + .../dom/abort/timeout-shadowrealm.any.js.ini | 18 + .../dom/idlharness-shadowrealm.window.js.ini | 2 - tests/wpt/meta/dom/idlharness.any.js.ini | 4 + tests/wpt/meta/encoding/api-basics.any.js.ini | 18 + .../encoding/api-surrogates-utf8.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - tests/wpt/meta/encoding/idlharness.any.js.ini | 4 + .../encoding/iso-2022-jp-decoder.any.js.ini | 18 + .../encoding/streams/backpressure.any.js.ini | 18 + .../streams/decode-attributes.any.js.ini | 18 + .../streams/decode-bad-chunks.any.js.ini | 18 + .../streams/decode-non-utf8.any.js.ini | 18 + .../readable-writable-properties.any.js.ini | 18 + .../encoding/textdecoder-arguments.any.js.ini | 18 + .../textdecoder-byte-order-marks.any.js.ini | 18 + .../textdecoder-fatal-streaming.any.js.ini | 18 + .../encoding/textdecoder-fatal.any.js.ini | 18 + .../encoding/textdecoder-ignorebom.any.js.ini | 18 + .../textdecoder-utf16-surrogates.any.js.ini | 18 + .../textencoder-utf16-surrogates.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - tests/wpt/meta/hr-time/idlharness.any.js.ini | 3 + ...c-aboutblank-navigate-immediately.html.ini | 5 +- ...avigation-unload-same-origin.window.js.ini | 3 - .../createImageBitmap-transfer.html.ini | 2 +- .../dom/idlharness-shadowrealm.window.js.ini | 2 - ...ss.worker.js.ini => idlharness.any.js.ini} | 489 +- .../iframe_sandbox_popups_escaping-2.html.ini | 2 +- .../iframe_sandbox_popups_escaping-3.html.ini | 3 +- .../select-parsing.tentative.html.ini | 6 - .../parsing/DOMContentLoaded-defer.html.ini | 3 - .../html/webappapis/atob/base64.any.js.ini | 18 + .../self.any.js.ini | 17 + .../nav2-test-timing-persistent.html.ini | 3 + .../idlharness-shadowrealm.window.js.ini | 2 - .../idlharness.any.js.ini | 4 + ..._fractional_coordinates_untrusted.html.ini | 1297 + ...control-element-is-in-shadow-tree.html.ini | 3 + .../async-iterator.any.js.ini | 18 + .../bad-strategies.any.js.ini | 18 + .../bad-underlying-sources.any.js.ini | 18 + .../readable-streams/cancel.any.js.ini | 18 + .../readable-streams/constructor.any.js.ini | 18 + ...nt-queuing-strategy-integration.any.js.ini | 18 + .../default-reader.any.js.ini | 18 + ...floating-point-total-queue-size.any.js.ini | 18 + .../streams/readable-streams/from.any.js.ini | 60 + .../garbage-collection.any.js.ini | 18 + .../readable-streams/general.any.js.ini | 18 + .../owning-type-message-port.any.js.ini | 18 + .../readable-streams/owning-type.any.js.ini | 18 + .../patched-global.any.js.ini | 18 + .../reentrant-strategies.any.js.ini | 18 + .../streams/readable-streams/tee.any.js.ini | 18 + .../readable-streams/templated.any.js.ini | 18 + .../tentative/fetch.any.js.ini | 139 + .../tentative/script.window.js.ini | 64 + .../signatures/tentative/fetch.any.js.ini | 48 + .../url/idlharness-shadowrealm.window.js.ini | 2 - tests/wpt/meta/url/idlharness.any.js.ini | 6 + tests/wpt/meta/url/toascii.window.js.ini | 291 + .../idlharness-shadowrealm.window.js.ini | 2 - .../meta/user-timing/idlharness.any.js.ini | 3 + .../wasm/jsapi/constructor/compile.any.js.ini | 18 + .../instantiate-bad-imports.any.js.ini | 18 + .../jsapi/constructor/instantiate.any.js.ini | 18 + .../jsapi/constructor/multi-value.any.js.ini | 18 + .../jsapi/constructor/toStringTag.any.js.ini | 18 + .../jsapi/constructor/validate.any.js.ini | 18 + .../exception/basic.tentative.any.js.ini | 18 + .../constructor.tentative.any.js.ini | 18 + .../exception/getArg.tentative.any.js.ini | 18 + .../exception/identity.tentative.any.js.ini | 18 + .../jsapi/exception/is.tentative.any.js.ini | 18 + .../exception/toString.tentative.any.js.ini | 18 + .../jsapi/function/call.tentative.any.js.ini | 18 + .../function/constructor.tentative.any.js.ini | 18 + .../jsapi/function/table.tentative.any.js.ini | 18 + .../jsapi/function/type.tentative.any.js.ini | 18 + .../wasm/jsapi/global/constructor.any.js.ini | 18 + .../wasm/jsapi/global/toString.any.js.ini | 18 + .../jsapi/global/type.tentative.any.js.ini | 18 + .../jsapi/global/value-get-set.any.js.ini | 18 + .../meta/wasm/jsapi/global/valueOf.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - .../wpt/meta/wasm/jsapi/idlharness.any.js.ini | 4 + .../constructor-bad-imports.any.js.ini | 18 + .../instance/constructor-caching.any.js.ini | 18 + .../jsapi/instance/constructor.any.js.ini | 18 + .../wasm/jsapi/instance/exports.any.js.ini | 18 + .../wasm/jsapi/instance/toString.any.js.ini | 18 + .../wpt/meta/wasm/jsapi/interface.any.js.ini | 18 + .../js-string/basic.tentative.any.js.ini | 18 + .../js-string/constants.tentative.any.js.ini | 19 + .../js-string/imports.tentative.any.js.ini | 19 + .../constructor-shared.tentative.any.js.ini | 18 + .../constructor-types.tentative.any.js.ini | 18 + .../wasm/jsapi/memory/constructor.any.js.ini | 18 + .../meta/wasm/jsapi/memory/grow.any.js.ini | 18 + .../jsapi/memory/type.tentative.any.js.ini | 18 + .../wasm/jsapi/module/constructor.any.js.ini | 18 + .../jsapi/module/customSections.any.js.ini | 18 + .../meta/wasm/jsapi/module/exports.any.js.ini | 18 + .../meta/wasm/jsapi/module/imports.any.js.ini | 18 + .../module/moduleSource.tentative.any.js.ini | 18 + .../wasm/jsapi/module/toString.any.js.ini | 18 + .../wpt/meta/wasm/jsapi/prototypes.any.js.ini | 18 + .../constructor-types.tentative.any.js.ini | 18 + .../wasm/jsapi/table/constructor.any.js.ini | 18 + .../meta/wasm/jsapi/table/get-set.any.js.ini | 18 + .../wpt/meta/wasm/jsapi/table/grow.any.js.ini | 18 + .../meta/wasm/jsapi/table/length.any.js.ini | 18 + .../meta/wasm/jsapi/table/toString.any.js.ini | 18 + .../jsapi/table/type.tentative.any.js.ini | 18 + .../tag/constructor.tentative.any.js.ini | 18 + .../jsapi/tag/toString.tentative.any.js.ini | 18 + .../wasm/jsapi/tag/type.tentative.any.js.ini | 18 + .../DOMException-constants.any.js.ini | 18 + ...ption-constructor-and-prototype.any.js.ini | 18 + ...MException-constructor-behavior.any.js.ini | 18 + .../DOMException-custom-bindings.any.js.ini | 18 + .../global-mutable-prototype.any.js.ini | 18 + .../idlharness-shadowrealm.window.js.ini | 2 - tests/wpt/meta/webidl/idlharness.any.js.ini | 6 + .../mozilla/meta-legacy-layout/MANIFEST.json | 311 +- tests/wpt/mozilla/meta/MANIFEST.json | 2 +- .../crypto_key_cached_slots.https.any.js | 44 + ...gorithm_returns_cached_object.https.any.js | 24 - .../ec_importKey_failures_fixtures.js | 22 + .../import_export/importKey_failures.js | 60 + .../okp_importKey_failures_fixtures.js | 24 + .../wrapKey_unwrapKey.https.any.js | 537 +- .../wrapKey_unwrapKey_vectors.js | 114 + .../comp_name_from_content.tentative.html | 25 - .../compat/webkit-box-item-shrink-001.html | 127 + .../compat/webkit-box-item-shrink-002.html | 124 + .../idlharness-shadowrealm.window.js | 3 - .../tests/compression/idlharness.https.any.js | 1 + .../console/idlharness-shadowrealm.window.js | 6 - tests/wpt/tests/console/idlharness.any.js | 1 + ...-snapshotted-csp-during-task-creation.html | 92 + .../navigation/support/utils.js | 6 + ...ript-parent-initiated-check-csp-order.html | 99 + ...javascript-parent-initiated-child-csp.html | 6 - .../reporting/report-clips-sample.https.html | 58 +- ...d-cookies-a-b-a-embed.tentative.https.html | 1 + ...to-same-site-redirect.tentative.https.html | 1 + ...o-cross-site-redirect.tentative.https.html | 2 + ...es-top-level-redirect.tentative.https.html | 6 +- .../anchor-as-multicol-crash.html | 4 + .../anchor-scope-scroll-ref.html | 33 + .../anchor-scope-scroll.html | 48 + .../chrome-380321441-crash.html | 19 + .../last-successful-iframe.html | 68 + ...position-area-scrolling-001.tentative.html | 122 + ...position-area-scrolling-002.tentative.html | 150 + ...position-area-scrolling-003.tentative.html | 141 + .../event-dispatch.tentative.html | 143 + .../parsing/animation-range-shorthand.html | 1 + .../parsing/animation-range-start-valid.html | 1 + .../css/css-backgrounds/background-332.html | 2 +- .../css-backgrounds/background-size-001.html | 18 +- .../css/css-cascade/scope-invalidation.html | 90 + .../tests/css/css-cascade/scope-nesting.html | 25 + .../support/cq-testcommon.js | 2 +- ...t-visibility-hidden-and-innertext-ref.html | 10 + ...ntent-visibility-hidden-and-innertext.html | 20 + .../content-visibility-on-ruby-ref.html | 14 + .../content-visibility-on-ruby.html | 17 + .../timing-functions-syntax-computed.html | 2 + .../timing-functions-syntax-valid.html | 2 + .../tests/css/css-fonts/font-palette-23b.html | 25 + ...-shorthand-serialization-font-stretch.html | 14 + .../gap-decorations-style-computed.html | 30 + .../css/css-grid/computed-grid-column.html | 32 + ...ry-intrinsic-sizing-cols-001-auto-ref.html | 105 + ...asonry-intrinsic-sizing-cols-001-auto.html | 103 + ...onry-intrinsic-sizing-cols-001-fr-ref.html | 105 + .../masonry-intrinsic-sizing-cols-001-fr.html | 103 + ...ry-intrinsic-sizing-cols-001-mix1-ref.html | 107 + ...asonry-intrinsic-sizing-cols-001-mix1.html | 103 + ...ry-intrinsic-sizing-cols-001-mix2-ref.html | 104 + ...asonry-intrinsic-sizing-cols-001-mix2.html | 104 + ...masonry-intrinsic-sizing-cols-001-ref.html | 360 - .../masonry-intrinsic-sizing-cols-001.html | 349 - ...ry-intrinsic-sizing-cols-002-auto-ref.html | 107 + ...asonry-intrinsic-sizing-cols-002-auto.html | 105 + ...onry-intrinsic-sizing-cols-002-fr-ref.html | 106 + .../masonry-intrinsic-sizing-cols-002-fr.html | 105 + ...ry-intrinsic-sizing-cols-002-mix1-ref.html | 107 + ...asonry-intrinsic-sizing-cols-002-mix1.html | 105 + ...ry-intrinsic-sizing-cols-002-mix2-ref.html | 106 + ...asonry-intrinsic-sizing-cols-002-mix2.html | 106 + ...masonry-intrinsic-sizing-cols-002-ref.html | 362 - .../masonry-intrinsic-sizing-cols-002.html | 351 - ...ry-intrinsic-sizing-cols-003-auto-ref.html | 131 + ...asonry-intrinsic-sizing-cols-003-auto.html | 104 + ...onry-intrinsic-sizing-cols-003-fr-ref.html | 129 + .../masonry-intrinsic-sizing-cols-003-fr.html | 105 + ...ry-intrinsic-sizing-cols-003-mix1-ref.html | 131 + ...asonry-intrinsic-sizing-cols-003-mix1.html | 105 + ...ry-intrinsic-sizing-cols-003-mix2-ref.html | 132 + ...asonry-intrinsic-sizing-cols-003-mix2.html | 106 + ...masonry-intrinsic-sizing-cols-003-ref.html | 433 - .../masonry-intrinsic-sizing-cols-003.html | 350 - ...ry-intrinsic-sizing-cols-004-auto-ref.html | 143 + ...asonry-intrinsic-sizing-cols-004-auto.html | 105 + ...onry-intrinsic-sizing-cols-004-fr-ref.html | 135 + .../masonry-intrinsic-sizing-cols-004-fr.html | 105 + ...ry-intrinsic-sizing-cols-004-mix1-ref.html | 141 + ...asonry-intrinsic-sizing-cols-004-mix1.html | 105 + ...ry-intrinsic-sizing-cols-004-mix2-ref.html | 136 + ...asonry-intrinsic-sizing-cols-004-mix2.html | 106 + ...masonry-intrinsic-sizing-cols-004-ref.html | 460 - .../masonry-intrinsic-sizing-cols-004.html | 350 - ...ry-intrinsic-sizing-rows-001-auto-ref.html | 112 + ...asonry-intrinsic-sizing-rows-001-auto.html | 110 + ...onry-intrinsic-sizing-rows-001-fr-ref.html | 111 + .../masonry-intrinsic-sizing-rows-001-fr.html | 110 + ...ry-intrinsic-sizing-rows-001-mix1-ref.html | 112 + ...asonry-intrinsic-sizing-rows-001-mix1.html | 110 + ...ry-intrinsic-sizing-rows-001-mix2-ref.html | 111 + ...asonry-intrinsic-sizing-rows-001-mix2.html | 111 + ...masonry-intrinsic-sizing-rows-001-ref.html | 366 - .../masonry-intrinsic-sizing-rows-001.html | 355 - ...ry-intrinsic-sizing-rows-002-auto-ref.html | 113 + ...asonry-intrinsic-sizing-rows-002-auto.html | 111 + ...onry-intrinsic-sizing-rows-002-fr-ref.html | 112 + .../masonry-intrinsic-sizing-rows-002-fr.html | 111 + ...ry-intrinsic-sizing-rows-002-mix1-ref.html | 113 + ...asonry-intrinsic-sizing-rows-002-mix1.html | 111 + ...ry-intrinsic-sizing-rows-002-mix2-ref.html | 112 + ...asonry-intrinsic-sizing-rows-002-mix2.html | 112 + ...masonry-intrinsic-sizing-rows-002-ref.html | 368 - .../masonry-intrinsic-sizing-rows-002.html | 357 - ...ry-intrinsic-sizing-rows-003-auto-ref.html | 159 + ...asonry-intrinsic-sizing-rows-003-auto.html | 137 + ...onry-intrinsic-sizing-rows-003-fr-ref.html | 154 + .../masonry-intrinsic-sizing-rows-003-fr.html | 137 + ...ry-intrinsic-sizing-rows-003-mix1-ref.html | 158 + ...asonry-intrinsic-sizing-rows-003-mix1.html | 137 + ...ry-intrinsic-sizing-rows-003-mix2-ref.html | 137 + ...asonry-intrinsic-sizing-rows-003-mix2.html | 112 + ...masonry-intrinsic-sizing-rows-003-ref.html | 461 - .../masonry-intrinsic-sizing-rows-003.html | 356 - ...ry-intrinsic-sizing-rows-004-auto-ref.html | 165 + ...asonry-intrinsic-sizing-rows-004-auto.html | 137 + ...onry-intrinsic-sizing-rows-004-fr-ref.html | 142 + .../masonry-intrinsic-sizing-rows-004-fr.html | 111 + ...ry-intrinsic-sizing-rows-004-mix1-ref.html | 156 + ...asonry-intrinsic-sizing-rows-004-mix1.html | 138 + ...ry-intrinsic-sizing-rows-004-mix2-ref.html | 137 + ...asonry-intrinsic-sizing-rows-004-mix2.html | 112 + ...masonry-intrinsic-sizing-rows-004-ref.html | 461 - .../masonry-intrinsic-sizing-rows-004.html | 355 - ...masonry-intrinsic-sizing-rows-005-ref.html | 25 +- .../masonry-intrinsic-sizing-rows-005.html | 2 +- ...masonry-intrinsic-sizing-rows-007-ref.html | 43 + .../masonry-intrinsic-sizing-rows-007.html | 43 + .../masonry-subgrid-flex-ref.html | 81 + .../track-sizing/masonry-subgrid-flex.html | 87 + .../masonry-subgrid-intrinsic-sizing-ref.html | 81 + .../masonry-subgrid-intrinsic-sizing.html | 87 + .../track-sizing/masonry-subgrid-ref.html | 86 + .../subgrid/track-sizing/masonry-subgrid.html | 87 + .../grid-template-columns-computed.html | 1 + .../css-images/cross-fade-computed-value.html | 6 + .../css-images/cross-fade-legacy-2-crash.html | 14 + ...-trim-ignore-nested-text-box-edge-ref.html | 14 - ...-box-trim-ignore-nested-text-box-edge.html | 27 - .../column-pseudo-background-color-ref.html | 3 + .../column-pseudo-background-color.html | 27 + .../parsing/column-pseudo-computed.html | 44 + .../parsing/column-pseudo-invalid.html | 14 + .../parsing/column-pseudo-valid.html | 12 + .../parent-pseudo-in-placeholder-crash.html | 8 + .../scrollable-overflow-padding-input.html | 36 + ...layout-contained-inline-subtree-print.html | 12 + ...ener-relayout-contained-subtree-print.html | 12 + .../css/css-page/fixedpos-011-print-ref.html | 29 + .../css/css-page/fixedpos-011-print.html | 37 + .../dimensions-015-print-ref.html | 21 + .../dimensions-015-print.tentative.html | 32 + .../css/css-page/page-size-015-print-ref.html | 10 + .../page-size-015-print.tentative.html | 19 + .../css/css-page/page-size-016-print-ref.html | 15 + .../page-size-016-print.tentative.html | 24 + .../css/css-page/page-size-017-print-ref.html | 16 + .../page-size-017-print.tentative.html | 19 + .../the-check-pseudo-element.tentative.html | 2 +- ...select-arrow-pseudo-element.tentative.html | 36 +- .../parsing/block-step-align-computed.html | 21 + .../parsing/block-step-align-invalid.html | 29 + .../parsing/block-step-align-valid.html | 20 + .../parsing/block-step-insert-computed.html | 6 +- .../parsing/block-step-insert-invalid.html | 11 +- .../parsing/block-step-insert-valid.html | 12 +- .../parsing/block-step-round-computed.html | 20 + .../parsing/block-step-round-invalid.html | 34 + .../parsing/block-step-round-valid.html | 19 + .../parsing/block-step-size-computed.html | 1 - .../parsing/block-step-size-invalid.html | 7 - .../parsing/block-step-size-valid.html | 7 - ...er-size-rounded-up-to-block-step-size.html | 26 + .../host-in-host-context-selector.html | 20 + .../css-scoping/host-in-host-selector.html | 20 + .../slotted-details-content-ref.html | 3 + .../css-scoping/slotted-details-content.html | 17 + .../slotted-file-selector-button-ref.html | 6 + .../slotted-file-selector-button.html | 18 + .../css/css-scoping/slotted-parsing.html | 2 + .../snap-fling-in-large-area.html | 24 +- .../forget-on-disconnect-in-iframe.html | 51 + ...tretch-alias-block-size-001.tentative.html | 212 + ...retch-alias-inline-size-001.tentative.html | 212 + ...ch-alias-max-block-size-001.tentative.html | 234 + ...h-alias-max-inline-size-001.tentative.html | 234 + ...ch-alias-min-block-size-001.tentative.html | 215 + ...h-alias-min-inline-size-001.tentative.html | 215 + .../stretch/stretch-block-size-001.html | 206 + .../stretch/stretch-inline-size-001.html | 206 + .../stretch/stretch-max-block-size-001.html | 228 + .../stretch/stretch-max-inline-size-001.html | 228 + .../stretch/stretch-min-block-size-001.html | 209 + .../stretch/stretch-min-inline-size-001.html | 209 + .../tests/css/css-values/attr-all-types.html | 1 + .../tests/css/css-values/attr-security.html | 37 +- .../css-values/attr-universal-selector.html | 35 + .../calc-sibling-function-in-shadow-dom.html | 33 + .../css/css-values/calc-sibling-function.html | 8 + .../new-content-flat-transform-ancestor.html | 2 +- .../interrupt-hidden-smooth-scroll.html | 2 +- .../scrollWidthHeight-contain-layout.html | 47 + .../scrollWidthHeightWhenNotScrollable.xht | 14 +- .../has-pseudoclass-only-crash.html | 21 + .../invalidation/has-pseudoclass-only.html | 84 + tests/wpt/tests/docs/README.md | 10 +- .../docs/running-tests/from-local-system.md | 1 + .../running-tests/webkitgtk_minibrowser.md | 80 +- .../running-tests/wpewebkit_minibrowser.md | 70 + tests/wpt/tests/docs/writing-tests/wdspec.md | 100 +- .../dom/idlharness-shadowrealm.window.js | 3 - tests/wpt/tests/dom/idlharness.any.js | 2 +- tests/wpt/tests/editing/data/inserthtml.js | 12 +- .../encoding/idlharness-shadowrealm.window.js | 3 - tests/wpt/tests/encoding/idlharness.any.js | 2 +- .../modal-dialog-interrupt-paint.html | 3 + .../resources/unfenced-top-target.html | 14 + ...unfenced-top-navigation-default.https.html | 37 + ...nerate-bid-browser-signals.https.window.js | 1 + .../tentative/resources/fledge-util.sub.js | 4 +- .../element-request-fullscreen-timing.html | 3 +- .../hr-time/idlharness-shadowrealm.window.js | 3 - tests/wpt/tests/hr-time/idlharness.any.js | 6 +- .../consume-user-activation/window-open.html | 16 +- .../coop-noopener-allow-popups.https.html | 8 +- ...dedicated-worker.https.tentative.window.js | 21 +- .../html/dom/idlharness-shadowrealm.window.js | 3 - ...idlharness.worker.js => idlharness.any.js} | 13 +- .../dynamic-content-change-rendering.html | 2 +- .../select-parsing.tentative.html | 10 +- ...isconnected-firefox-bug-1933919-crash.html | 8 + ...og-popover-closedby-complex.tentative.html | 32 +- .../lang-attribute-update.html | 51 + .../self.any.js | 48 + .../testdriver/actions/touchEvents.js | 22 +- .../wpt/tests/interfaces/compute-pressure.idl | 2 +- tests/wpt/tests/interfaces/fedcm.idl | 4 +- tests/wpt/tests/interfaces/html.idl | 17 +- .../interfaces/long-animation-frames.idl | 2 + tests/wpt/tests/interfaces/webnn.idl | 25 + ...cross-origin-animated-image.tentative.html | 2 +- .../largest-contentful-paint-helpers.js | 18 +- tests/wpt/tests/lint.ignore | 4 + .../tentative/loaf-basic.html | 8 +- .../tentative/loaf-blocking-duration.html | 6 +- .../loaf-event-blocking-duration.html | 2 +- .../tentative/loaf-event-listener.html | 6 +- .../tentative/loaf-first-ui-event.html | 24 +- .../tentative/loaf-pause-duration.html | 2 +- .../tentative/loaf-promise.html | 12 +- .../tentative/loaf-script-block.html | 11 +- .../loaf-script-nested-callback.html | 4 +- .../loaf-script-window-attribution.html | 7 +- .../loaf-source-location-redirect.html | 2 +- .../tentative/loaf-source-location.html | 8 +- .../tentative/loaf-stream.html | 6 +- .../tentative/loaf-user-callback.html | 14 +- .../tentative/performance-bind.html | 8 +- .../tentative/resources/busy.js | 3 +- .../resources/event-generates-loaf.js | 4 +- .../resources/loaf-after-callback.js | 2 +- .../loaf-in-microtask-after-callback.js | 2 +- .../resources/promise-generates-loaf.js | 3 +- .../tentative/resources/raf-generates-loaf.js | 4 +- .../stream-promise-generates-loaf.js | 3 +- .../tentative/resources/utils.js | 44 +- .../media-capabilities/decodingInfo.any.js | 100 +- .../media-capabilities/encodingInfo.any.js | 90 +- ...diaRecorder-canvas-media-source.https.html | 6 +- .../MediaRecorder-events-and-exceptions.html | 6 +- .../MediaRecorder-mimetype.html | 10 +- .../MediaRecorder-pause-resume.html | 6 +- .../MediaRecorder-peerconnection.https.html | 6 +- .../MediaRecorder-stop.html | 6 +- .../cross-origin-traversal-redirect.html | 3 +- .../cross-origin-redirect-on-second-visit.py | 7 +- .../nav2-test-timing-persistent.html | 51 +- .../idlharness-shadowrealm.window.js | 3 - .../performance-timeline/idlharness.any.js | 6 +- .../permissions-policy-payment-extension.html | 3 +- ...vent_fractional_coordinates_untrusted.html | 192 + .../pointerevent_pointercapture_in_frame.html | 83 +- .../wpt/tests/preload/prefetch-document.html | 1 + .../tests/resources/idlharness-shadowrealm.js | 52 - tests/wpt/tests/resources/idlharness.js | 19 +- .../IdlNamespace/test_operation.html | 13 +- .../testharness-shadowrealm-inner.js | 11 + .../testharness-shadowrealm-outer.js | 52 +- .../view-timelines/view-timeline-range.html | 7 + ...textcontrol-element-is-in-shadow-tree.html | 47 + ...control-element-on-pressing-backspace.html | 47 + ...ata-origin-option.tentative.https.sub.html | 35 - ...ustom-data-origin.tentative.https.sub.html | 64 + ...erify-data-origin.tentative.https.sub.html | 70 +- .../shared-storage/resources/simple-module.js | 50 + .../resources/trusted-origins.py | 59 +- .../shared-storage/resources/util.sub.js | 41 +- ...ata-origin-option.tentative.https.sub.html | 35 - ...ustom-data-origin.tentative.https.sub.html | 64 + .../setters.tentative.https.sub.html | 73 + ...r-modifier-method.tentative.https.sub.html | 75 + ...-modifier-method.tentative.https.window.js | 94 + ...ndow-batch-update.tentative.https.sub.html | 74 + ...w-modifier-method.tentative.https.sub.html | 66 + ...klet-batch-update.tentative.https.sub.html | 85 + ...t-modifier-method.tentative.https.sub.html | 75 + .../web-locks.tentative.https.sub.html | 2 + .../no-http-cache-interference.https.html | 25 + .../prefetch/resources/conditional-status.py | 19 + .../prerender/clients-matchall.https.html | 7 +- .../streams/idlharness-shadowrealm.window.js | 3 - tests/wpt/tests/streams/idlharness.any.js | 2 +- .../readable-byte-streams/general.any.js | 94 +- .../patched-global.any.js | 54 + .../readable-byte-streams/templated.any.js | 24 + .../streams/readable-streams/from.any.js | 151 + .../garbage-collection.any.js | 19 + .../streams/readable-streams/templated.any.js | 8 +- .../streams/resources/rs-test-templates.js | 103 +- tests/wpt/tests/streams/resources/rs-utils.js | 10 +- .../streams/transform-streams/cancel.any.js | 90 + .../streams/writable-streams/aborting.any.js | 88 +- .../writable-streams/constructor.any.js | 4 + .../garbage-collection.any.js | 21 + .../identity-digest/tentative/fetch.any.js | 143 + .../identity-digest/tentative/resource.py | 27 + .../tentative/script.window.js | 148 + .../signatures/tentative/fetch.any.js | 116 + .../signatures/tentative/resource.py | 38 + tests/wpt/tests/tools/manifest/manifest.py | 2 +- .../tools/manifest/tests/test_manifest.py | 6 +- tests/wpt/tests/tools/serve/serve.py | 114 +- tests/wpt/tests/tools/wpt/browser.py | 96 +- tests/wpt/tests/tools/wpt/install.py | 1 + tests/wpt/tests/tools/wpt/run.py | 25 +- .../wpt/tests/tools/wpt/tests/test_browser.py | 133 +- .../tests/tools/wpt/tests/test_testfiles.py | 2 +- .../wptrunner/wptrunner/browsers/__init__.py | 1 + .../browsers/wpewebkit_minibrowser.py | 77 + .../wptrunner/wptrunner/executors/base.py | 18 +- .../wptrunner/tests/test_testloader.py | 6 +- .../wptrunner/tests/test_wptrunner.py | 2 +- .../Document-write-appending-line-feed.html | 76 + ...icyFactory-createPolicy-cspTests-none.html | 30 +- ...pePolicyFactory-createPolicy-cspTests.html | 42 +- ...ePolicyFactory-createPolicy-nameTests.html | 23 - ...-handler-content-attributes.tentative.html | 32 +- ...ng-assignment-to-ShadowRoot-innerHTML.html | 79 + ...ssignment-to-ShadowRoot-setHTMLUnsafe.html | 23 +- .../default-policy-callback-arguments.html | 2 +- .../eval-csp-tt-default-policy-mutate.html | 16 + .../eval-csp-tt-default-policy.html | 88 +- .../eval-csp-tt-no-default-policy.html | 28 + ...arguments-and-applying-default-policy.html | 61 + .../eval-function-constructor.html | 67 +- .../trusted-types/eval-no-csp-no-tt.html | 12 + .../modify-attributes-in-callback.html | 58 +- .../url/idlharness-shadowrealm.window.js | 3 - tests/wpt/tests/url/idlharness.any.js | 1 + tests/wpt/tests/url/resources/toascii.json | 173 +- .../idlharness-shadowrealm.window.js | 3 - tests/wpt/tests/user-timing/idlharness.any.js | 6 +- .../jsapi/idlharness-shadowrealm.window.js | 3 - tests/wpt/tests/wasm/jsapi/idlharness.any.js | 1 + .../script-src-blocks-wasm.tentative.sub.html | 2 +- .../animation-types/property-list.js | 14 +- ...ve.html => overallProgress.tentative.html} | 50 +- ...l-timeline-overallProgress.tentative.html} | 65 +- .../Animation/style-change-events.html | 2 +- .../resources/keyframe-tests.js | 12 +- tests/wpt/tests/webcodecs/README.md | 6 + .../audioDecoder-codec-specific.https.any.js | 62 +- tests/wpt/tests/webcodecs/sfx-vorbis.ogg | Bin 0 -> 4443 bytes .../tests/bidi/input/perform_actions/key.py | 28 + .../input/perform_actions/pointer_mouse.py | 30 +- .../bidi/input/perform_actions/pointer_pen.py | 30 +- .../input/perform_actions/pointer_touch.py | 30 +- .../webdriver/tests/bidi/network/__init__.py | 32 +- .../before_request_sent.py | 53 + .../response_completed/response_completed.py | 53 + .../response_started/response_started.py | 53 + .../support/initiator/simple-initiator-bg.png | Bin 0 -> 81 bytes .../initiator/simple-initiator-img.png | Bin 0 -> 81 bytes .../initiator/simple-initiator-script.js | 3 + .../initiator/simple-initiator-style.css | 4 + .../support/initiator/simple-initiator.html | 17 + .../webdriver/tests/bidi/storage/__init__.py | 8 + .../bidi/storage/delete_cookies/filter.py | 34 +- .../bidi/storage/delete_cookies/partition.py | 31 +- .../tests/bidi/storage/get_cookies/filter.py | 30 +- .../bidi/storage/get_cookies/partition.py | 16 +- .../bidi/storage/set_cookie/cookie_expiry.py | 20 +- .../storage/set_cookie/cookie_http_only.py | 6 +- .../bidi/storage/set_cookie/cookie_path.py | 6 +- .../storage/set_cookie/cookie_same_site.py | 6 +- .../bidi/storage/set_cookie/cookie_secure.py | 6 +- .../bidi/storage/set_cookie/page_protocols.py | 6 +- .../tests/classic/perform_actions/conftest.py | 5 +- .../tests/classic/perform_actions/key.py | 14 + .../classic/perform_actions/pointer_mouse.py | 15 + .../classic/perform_actions/pointer_pen.py | 15 + .../classic/perform_actions/pointer_touch.py | 15 + .../support/html/test_actions_pointer.html | 8 +- .../webidl/idlharness-shadowrealm.window.js | 13 - tests/wpt/tests/webidl/idlharness.any.js | 1 + .../scatterElements.https.any.js | 68 + .../shared_arraybuffer_constant.https.any.js | 71 + ..._arraybuffer_constant.https.any.js.headers | 2 + .../conformance_tests/transpose.https.any.js | 23 + tests/wpt/tests/webnn/resources/utils.js | 13 +- .../validation_tests/constant.https.any.js | 98 +- .../constant.https.any.js.headers | 2 + .../unprintableNames.https.any.js | 46 + ...ingParameters-codec-opus-stereo.https.html | 8 +- ...h264-unidirectional-codec-offer.https.html | 232 + .../webrtc/simulcast/screenshare.https.html | 2 +- tests/wpt/tests/webrtc/simulcast/simulcast.js | 2 +- .../webgl/meta-legacy-layout/MANIFEST.json | 9364 +- tests/wpt/webgl/meta/MANIFEST.json | 2 +- .../misc/texture-video-transparent.html.ini | 3 + tests/wpt/webgpu/meta/MANIFEST.json | 2 +- 889 files changed, 225440 insertions(+), 53621 deletions(-) create mode 100644 tests/wpt/meta-legacy-layout/WebCryptoAPI/crypto_key_cached_slots.https.any.js.ini create mode 100644 tests/wpt/meta-legacy-layout/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/console/idlharness-shadowrealm.window.js.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-backgrounds/background-size-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-fonts/font-shorthand-serialization-font-stretch.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-gaps/tentative/parsing/gap-decorations-style-computed.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/computed-grid-column.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-overflow/scrollable-overflow-padding-input.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-alias-block-size-001.tentative.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-alias-inline-size-001.tentative.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-alias-max-inline-size-001.tentative.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-alias-min-inline-size-001.tentative.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-block-size-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-inline-size-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-max-block-size-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-max-inline-size-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-min-block-size-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-sizing/stretch/stretch-min-inline-size-001.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/css-values/calc-sibling-function-in-shadow-dom.html.ini create mode 100644 tests/wpt/meta-legacy-layout/css/cssom-view/scrollWidthHeightWhenNotScrollable.xht.ini create mode 100644 tests/wpt/meta-legacy-layout/css/selectors/invalidation/has-pseudoclass-only.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/dom/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/encoding/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/hr-time/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/html/dom/idlharness-shadowrealm.window.js.ini rename tests/wpt/meta-legacy-layout/html/dom/{idlharness.worker.js.ini => idlharness.any.js.ini} (76%) delete mode 100644 tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/html/semantics/forms/form-submission-0/submit-file.sub.html.ini create mode 100644 tests/wpt/meta-legacy-layout/html/webappapis/the-shadowrealmglobalscope-interface/self.any.js.ini create mode 100644 tests/wpt/meta-legacy-layout/navigation-timing/nav2-test-timing-persistent.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/performance-timeline/idlharness-shadowrealm.window.js.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/compat/pointerevent_touch-action-verification.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/idlharness.https.window.js.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/inheritance.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/parsing/touch-action-computed.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/parsing/touch-action-valid.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/persistentDeviceId/pointer-event-has-persistentdeviceid-from-pointer-event-init.tentative.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/pointerevent_constructor.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/pointerevent_fractional_coordinates_untrusted.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/pointerevent_on_event_handlers.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/pointerevent_tiltX_tiltY_to_azimuth_altitude.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/pointerevent_touch-action-illegal.html.ini create mode 100644 tests/wpt/meta-legacy-layout/pointerevents/pointerevent_touch-action-verification.html.ini create mode 100644 tests/wpt/meta-legacy-layout/selection/fire-selectionchange-event-on-document-if-textcontrol-element-is-in-shadow-tree.html.ini create mode 100644 tests/wpt/meta-legacy-layout/subresource-integrity/identity-digest/tentative/fetch.any.js.ini create mode 100644 tests/wpt/meta-legacy-layout/subresource-integrity/identity-digest/tentative/script.window.js.ini create mode 100644 tests/wpt/meta-legacy-layout/subresource-integrity/signatures/tentative/fetch.any.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/url/idlharness-shadowrealm.window.js.ini create mode 100644 tests/wpt/meta-legacy-layout/url/idlharness.any.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/user-timing/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/wasm/jsapi/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta-legacy-layout/webidl/idlharness-shadowrealm.window.js.ini create mode 100644 tests/wpt/meta-legacy-layout/webidl/idlharness.any.js.ini create mode 100644 tests/wpt/meta/WebCryptoAPI/crypto_key_cached_slots.https.any.js.ini create mode 100644 tests/wpt/meta/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js.ini delete mode 100644 tests/wpt/meta/console/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-video-sibling.html.ini create mode 100644 tests/wpt/meta/css/css-backgrounds/background-332.html.ini create mode 100644 tests/wpt/meta/css/css-backgrounds/background-size-001.html.ini create mode 100644 tests/wpt/meta/css/css-fonts/font-shorthand-serialization-font-stretch.html.ini create mode 100644 tests/wpt/meta/css/css-gaps/tentative/parsing/gap-decorations-style-computed.html.ini create mode 100644 tests/wpt/meta/css/css-grid/computed-grid-column.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2.html.ini delete mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007-ref.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing.html.ini create mode 100644 tests/wpt/meta/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid.html.ini create mode 100644 tests/wpt/meta/css/css-overflow/scrollable-overflow-padding-input.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-alias-block-size-001.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-alias-inline-size-001.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-alias-max-inline-size-001.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-alias-min-inline-size-001.tentative.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-block-size-001.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-inline-size-001.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-max-block-size-001.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-max-inline-size-001.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-min-block-size-001.html.ini create mode 100644 tests/wpt/meta/css/css-sizing/stretch/stretch-min-inline-size-001.html.ini create mode 100644 tests/wpt/meta/css/css-values/calc-sibling-function-in-shadow-dom.html.ini create mode 100644 tests/wpt/meta/css/cssom-view/elementsFromPoint-invalid-cases.html.ini create mode 100644 tests/wpt/meta/css/cssom-view/scrollWidthHeightWhenNotScrollable.xht.ini create mode 100644 tests/wpt/meta/css/selectors/invalidation/has-pseudoclass-only.html.ini delete mode 100644 tests/wpt/meta/dom/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta/encoding/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta/hr-time/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini delete mode 100644 tests/wpt/meta/html/dom/idlharness-shadowrealm.window.js.ini rename tests/wpt/meta/html/dom/{idlharness.worker.js.ini => idlharness.any.js.ini} (79%) delete mode 100644 tests/wpt/meta/html/syntax/parsing/DOMContentLoaded-defer.html.ini create mode 100644 tests/wpt/meta/html/webappapis/the-shadowrealmglobalscope-interface/self.any.js.ini create mode 100644 tests/wpt/meta/navigation-timing/nav2-test-timing-persistent.html.ini delete mode 100644 tests/wpt/meta/performance-timeline/idlharness-shadowrealm.window.js.ini create mode 100644 tests/wpt/meta/pointerevents/pointerevent_fractional_coordinates_untrusted.html.ini create mode 100644 tests/wpt/meta/selection/fire-selectionchange-event-on-document-if-textcontrol-element-is-in-shadow-tree.html.ini create mode 100644 tests/wpt/meta/subresource-integrity/identity-digest/tentative/fetch.any.js.ini create mode 100644 tests/wpt/meta/subresource-integrity/identity-digest/tentative/script.window.js.ini create mode 100644 tests/wpt/meta/subresource-integrity/signatures/tentative/fetch.any.js.ini delete mode 100644 tests/wpt/meta/url/idlharness-shadowrealm.window.js.ini create mode 100644 tests/wpt/meta/url/idlharness.any.js.ini delete mode 100644 tests/wpt/meta/user-timing/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta/wasm/jsapi/idlharness-shadowrealm.window.js.ini delete mode 100644 tests/wpt/meta/webidl/idlharness-shadowrealm.window.js.ini create mode 100644 tests/wpt/meta/webidl/idlharness.any.js.ini create mode 100644 tests/wpt/tests/WebCryptoAPI/crypto_key_cached_slots.https.any.js delete mode 100644 tests/wpt/tests/WebCryptoAPI/cryptokey_algorithm_returns_cached_object.https.any.js create mode 100644 tests/wpt/tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey_vectors.js create mode 100644 tests/wpt/tests/compat/webkit-box-item-shrink-001.html create mode 100644 tests/wpt/tests/compat/webkit-box-item-shrink-002.html delete mode 100644 tests/wpt/tests/compression/idlharness-shadowrealm.window.js delete mode 100644 tests/wpt/tests/console/idlharness-shadowrealm.window.js create mode 100644 tests/wpt/tests/content-security-policy/navigation/javascript-url-navigation-to-child-checks-snapshotted-csp-during-task-creation.html create mode 100644 tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-check-csp-order.html create mode 100644 tests/wpt/tests/css/css-anchor-position/anchor-as-multicol-crash.html create mode 100644 tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll-ref.html create mode 100644 tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll.html create mode 100644 tests/wpt/tests/css/css-anchor-position/chrome-380321441-crash.html create mode 100644 tests/wpt/tests/css/css-anchor-position/last-successful-iframe.html create mode 100644 tests/wpt/tests/css/css-anchor-position/position-area-scrolling-001.tentative.html create mode 100644 tests/wpt/tests/css/css-anchor-position/position-area-scrolling-002.tentative.html create mode 100644 tests/wpt/tests/css/css-anchor-position/position-area-scrolling-003.tentative.html create mode 100644 tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext-ref.html create mode 100644 tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext.html create mode 100644 tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby-ref.html create mode 100644 tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby.html create mode 100644 tests/wpt/tests/css/css-fonts/font-palette-23b.html create mode 100644 tests/wpt/tests/css/css-gaps/tentative/parsing/gap-decorations-style-computed.html create mode 100644 tests/wpt/tests/css/css-grid/computed-grid-column.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-ref.html delete mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-ref.html create mode 100644 tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid.html create mode 100644 tests/wpt/tests/css/css-images/cross-fade-legacy-2-crash.html delete mode 100644 tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge-ref.html delete mode 100644 tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge.html create mode 100644 tests/wpt/tests/css/css-multicol/column-pseudo-background-color-ref.html create mode 100644 tests/wpt/tests/css/css-multicol/column-pseudo-background-color.html create mode 100644 tests/wpt/tests/css/css-multicol/parsing/column-pseudo-computed.html create mode 100644 tests/wpt/tests/css/css-multicol/parsing/column-pseudo-invalid.html create mode 100644 tests/wpt/tests/css/css-multicol/parsing/column-pseudo-valid.html create mode 100644 tests/wpt/tests/css/css-nesting/parent-pseudo-in-placeholder-crash.html create mode 100644 tests/wpt/tests/css/css-overflow/scrollable-overflow-padding-input.html create mode 100644 tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-inline-subtree-print.html create mode 100644 tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-subtree-print.html create mode 100644 tests/wpt/tests/css/css-page/fixedpos-011-print-ref.html create mode 100644 tests/wpt/tests/css/css-page/fixedpos-011-print.html create mode 100644 tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print-ref.html create mode 100644 tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print.tentative.html create mode 100644 tests/wpt/tests/css/css-page/page-size-015-print-ref.html create mode 100644 tests/wpt/tests/css/css-page/page-size-015-print.tentative.html create mode 100644 tests/wpt/tests/css/css-page/page-size-016-print-ref.html create mode 100644 tests/wpt/tests/css/css-page/page-size-016-print.tentative.html create mode 100644 tests/wpt/tests/css/css-page/page-size-017-print-ref.html create mode 100644 tests/wpt/tests/css/css-page/page-size-017-print.tentative.html create mode 100644 tests/wpt/tests/css/css-rhythm/parsing/block-step-align-computed.html create mode 100644 tests/wpt/tests/css/css-rhythm/parsing/block-step-align-invalid.html create mode 100644 tests/wpt/tests/css/css-rhythm/parsing/block-step-align-valid.html create mode 100644 tests/wpt/tests/css/css-rhythm/parsing/block-step-round-computed.html create mode 100644 tests/wpt/tests/css/css-rhythm/parsing/block-step-round-invalid.html create mode 100644 tests/wpt/tests/css/css-rhythm/parsing/block-step-round-valid.html create mode 100644 tests/wpt/tests/css/css-rhythm/zero-outer-size-rounded-up-to-block-step-size.html create mode 100644 tests/wpt/tests/css/css-scoping/host-in-host-context-selector.html create mode 100644 tests/wpt/tests/css/css-scoping/host-in-host-selector.html create mode 100644 tests/wpt/tests/css/css-scoping/slotted-details-content-ref.html create mode 100644 tests/wpt/tests/css/css-scoping/slotted-details-content.html create mode 100644 tests/wpt/tests/css/css-scoping/slotted-file-selector-button-ref.html create mode 100644 tests/wpt/tests/css/css-scoping/slotted-file-selector-button.html create mode 100644 tests/wpt/tests/css/css-sizing/contain-intrinsic-size/forget-on-disconnect-in-iframe.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-alias-inline-size-001.tentative.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-inline-size-001.tentative.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-inline-size-001.tentative.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-block-size-001.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-inline-size-001.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-max-block-size-001.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-max-inline-size-001.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-min-block-size-001.html create mode 100644 tests/wpt/tests/css/css-sizing/stretch/stretch-min-inline-size-001.html create mode 100644 tests/wpt/tests/css/css-values/attr-universal-selector.html create mode 100644 tests/wpt/tests/css/css-values/calc-sibling-function-in-shadow-dom.html create mode 100644 tests/wpt/tests/css/cssom-view/scrollWidthHeight-contain-layout.html create mode 100644 tests/wpt/tests/css/selectors/invalidation/crashtests/has-pseudoclass-only-crash.html create mode 100644 tests/wpt/tests/css/selectors/invalidation/has-pseudoclass-only.html create mode 100644 tests/wpt/tests/docs/running-tests/wpewebkit_minibrowser.md delete mode 100644 tests/wpt/tests/dom/idlharness-shadowrealm.window.js delete mode 100644 tests/wpt/tests/encoding/idlharness-shadowrealm.window.js create mode 100644 tests/wpt/tests/fenced-frame/resources/unfenced-top-target.html create mode 100644 tests/wpt/tests/fenced-frame/unfenced-top-navigation-default.https.html delete mode 100644 tests/wpt/tests/hr-time/idlharness-shadowrealm.window.js rename tests/wpt/tests/html/cross-origin-opener-policy/{tentative/noopener => }/coop-noopener-allow-popups.https.html (86%) delete mode 100644 tests/wpt/tests/html/dom/idlharness-shadowrealm.window.js rename tests/wpt/tests/html/dom/{idlharness.worker.js => idlharness.any.js} (72%) create mode 100644 tests/wpt/tests/html/semantics/forms/the-textarea-element/text-area-disconnected-firefox-bug-1933919-crash.html create mode 100644 tests/wpt/tests/html/semantics/permission-element/lang-attribute-update.html create mode 100644 tests/wpt/tests/html/webappapis/the-shadowrealmglobalscope-interface/self.any.js delete mode 100644 tests/wpt/tests/performance-timeline/idlharness-shadowrealm.window.js create mode 100644 tests/wpt/tests/pointerevents/pointerevent_fractional_coordinates_untrusted.html delete mode 100644 tests/wpt/tests/resources/idlharness-shadowrealm.js create mode 100644 tests/wpt/tests/selection/fire-selectionchange-event-on-document-if-textcontrol-element-is-in-shadow-tree.html create mode 100644 tests/wpt/tests/selection/fire-selectionchange-event-on-textcontrol-element-on-pressing-backspace.html delete mode 100644 tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html create mode 100644 tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html delete mode 100644 tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html create mode 100644 tests/wpt/tests/shared-storage/same-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html create mode 100644 tests/wpt/tests/shared-storage/web-locks-header-modifier-method.tentative.https.sub.html create mode 100644 tests/wpt/tests/shared-storage/web-locks-pa-worklet-modifier-method.tentative.https.window.js create mode 100644 tests/wpt/tests/shared-storage/web-locks-window-batch-update.tentative.https.sub.html create mode 100644 tests/wpt/tests/shared-storage/web-locks-window-modifier-method.tentative.https.sub.html create mode 100644 tests/wpt/tests/shared-storage/web-locks-worklet-batch-update.tentative.https.sub.html create mode 100644 tests/wpt/tests/shared-storage/web-locks-worklet-modifier-method.tentative.https.sub.html create mode 100644 tests/wpt/tests/speculation-rules/prefetch/no-http-cache-interference.https.html create mode 100644 tests/wpt/tests/speculation-rules/prefetch/resources/conditional-status.py delete mode 100644 tests/wpt/tests/streams/idlharness-shadowrealm.window.js create mode 100644 tests/wpt/tests/streams/readable-byte-streams/patched-global.any.js create mode 100644 tests/wpt/tests/streams/readable-byte-streams/templated.any.js create mode 100644 tests/wpt/tests/streams/writable-streams/garbage-collection.any.js create mode 100644 tests/wpt/tests/subresource-integrity/identity-digest/tentative/fetch.any.js create mode 100644 tests/wpt/tests/subresource-integrity/identity-digest/tentative/resource.py create mode 100644 tests/wpt/tests/subresource-integrity/identity-digest/tentative/script.window.js create mode 100644 tests/wpt/tests/subresource-integrity/signatures/tentative/fetch.any.js create mode 100644 tests/wpt/tests/subresource-integrity/signatures/tentative/resource.py create mode 100644 tests/wpt/tests/tools/wptrunner/wptrunner/browsers/wpewebkit_minibrowser.py create mode 100644 tests/wpt/tests/trusted-types/Document-write-appending-line-feed.html delete mode 100644 tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.html create mode 100644 tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-innerHTML.html create mode 100644 tests/wpt/tests/trusted-types/eval-function-constructor-untrusted-arguments-and-applying-default-policy.html delete mode 100644 tests/wpt/tests/url/idlharness-shadowrealm.window.js delete mode 100644 tests/wpt/tests/user-timing/idlharness-shadowrealm.window.js delete mode 100644 tests/wpt/tests/wasm/jsapi/idlharness-shadowrealm.window.js rename tests/wpt/tests/web-animations/interfaces/Animation/{progress.tentative.html => overallProgress.tentative.html} (60%) rename tests/wpt/tests/web-animations/interfaces/Animation/{scroll-timeline-progress.tentative.html => scroll-timeline-overallProgress.tentative.html} (68%) create mode 100644 tests/wpt/tests/webcodecs/sfx-vorbis.ogg create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-bg.png create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-img.png create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-script.js create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-style.css create mode 100644 tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator.html delete mode 100644 tests/wpt/tests/webidl/idlharness-shadowrealm.window.js create mode 100644 tests/wpt/tests/webnn/conformance_tests/shared_arraybuffer_constant.https.any.js create mode 100644 tests/wpt/tests/webnn/conformance_tests/shared_arraybuffer_constant.https.any.js.headers create mode 100644 tests/wpt/tests/webnn/validation_tests/constant.https.any.js.headers create mode 100644 tests/wpt/tests/webnn/validation_tests/unprintableNames.https.any.js create mode 100644 tests/wpt/tests/webrtc/protocol/h264-unidirectional-codec-offer.https.html diff --git a/tests/wpt/meta-legacy-layout/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/meta-legacy-layout/FileAPI/url/url-in-tags-revoke.window.js.ini index 282ab0b2525..35fe4fd6e0d 100644 --- a/tests/wpt/meta-legacy-layout/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/meta-legacy-layout/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -14,3 +14,6 @@ [Opening a blob URL in a new window by clicking an tag works immediately before revoking the URL.] expected: TIMEOUT + + [Fetching a blob URL immediately before revoking it works in + + + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
XXXXXXX
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
XXXXXXX
+
+ +
+
XXXXXXX
+
+ diff --git a/tests/wpt/tests/compat/webkit-box-item-shrink-002.html b/tests/wpt/tests/compat/webkit-box-item-shrink-002.html new file mode 100644 index 00000000000..8981f75cda3 --- /dev/null +++ b/tests/wpt/tests/compat/webkit-box-item-shrink-002.html @@ -0,0 +1,124 @@ + + +CSS -webkit-box Test: Testing no automatic minimum size for flex items in a legacy column-oriented flex container + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
XXXXXXX
+
+ +
+ +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ +
+ +
+ +
+
XXXXXXX
+
+ +
+
XXXXXXX
+
+ diff --git a/tests/wpt/tests/compression/idlharness-shadowrealm.window.js b/tests/wpt/tests/compression/idlharness-shadowrealm.window.js deleted file mode 100644 index ead3dcc8376..00000000000 --- a/tests/wpt/tests/compression/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["compression"], ["streams"]); diff --git a/tests/wpt/tests/compression/idlharness.https.any.js b/tests/wpt/tests/compression/idlharness.https.any.js index 8d96cf523c4..d43f327de68 100644 --- a/tests/wpt/tests/compression/idlharness.https.any.js +++ b/tests/wpt/tests/compression/idlharness.https.any.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: global=window,dedicatedworker,shadowrealm-in-window 'use strict'; diff --git a/tests/wpt/tests/console/idlharness-shadowrealm.window.js b/tests/wpt/tests/console/idlharness-shadowrealm.window.js deleted file mode 100644 index fcd3817f227..00000000000 --- a/tests/wpt/tests/console/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,6 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js - -// https://console.spec.whatwg.org/ - -idl_test_shadowrealm(["console"], []); diff --git a/tests/wpt/tests/console/idlharness.any.js b/tests/wpt/tests/console/idlharness.any.js index 1e7ba76ecdd..820ee70fe10 100644 --- a/tests/wpt/tests/console/idlharness.any.js +++ b/tests/wpt/tests/console/idlharness.any.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: global=window,dedicatedworker,shadowrealm-in-window // https://console.spec.whatwg.org/ diff --git a/tests/wpt/tests/content-security-policy/navigation/javascript-url-navigation-to-child-checks-snapshotted-csp-during-task-creation.html b/tests/wpt/tests/content-security-policy/navigation/javascript-url-navigation-to-child-checks-snapshotted-csp-during-task-creation.html new file mode 100644 index 00000000000..dbd8fe882d1 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/navigation/javascript-url-navigation-to-child-checks-snapshotted-csp-during-task-creation.html @@ -0,0 +1,92 @@ + + + + + + + Test the snapshotted CSP is checked during task creation, not during + execution. + + + + + + + diff --git a/tests/wpt/tests/content-security-policy/navigation/support/utils.js b/tests/wpt/tests/content-security-policy/navigation/support/utils.js index 0bb402dccc6..bb13186b090 100644 --- a/tests/wpt/tests/content-security-policy/navigation/support/utils.js +++ b/tests/wpt/tests/content-security-policy/navigation/support/utils.js @@ -31,3 +31,9 @@ function assignJavascriptURLToInjectionSink(testCase) { element[testCase.navigationFunction](); } } + +function encodeURIWithApostrophes(uriWithApostrophes) { + const encodedURI = encodeURI(uriWithApostrophes); + // https://developer.mozilla.org/en-US/docs/Glossary/Percent-encoding + return encodedURI.replaceAll("'","%27"); +} diff --git a/tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-check-csp-order.html b/tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-check-csp-order.html new file mode 100644 index 00000000000..8f667902b03 --- /dev/null +++ b/tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-check-csp-order.html @@ -0,0 +1,99 @@ + + + + + + + + + + + +
a +a2 + + + + +i + + + + diff --git a/tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-child-csp.html b/tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-child-csp.html index 84d74ad3f8a..41945fa460f 100644 --- a/tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-child-csp.html +++ b/tests/wpt/tests/content-security-policy/navigation/to-javascript-parent-initiated-child-csp.html @@ -22,12 +22,6 @@ // https://web-platform-tests.org/writing-tests/testharness-api.html#determining-when-all-tests-are-complete. setup({explicit_done: true}); - function encodeURIWithApostrophes(uriWithApostrophes) { - const encodedURI = encodeURI(uriWithApostrophes); - // https://developer.mozilla.org/en-US/docs/Glossary/Percent-encoding - return encodedURI.replaceAll("'","%27"); - } - const kIframeURLPath = "support/frame-with-csp.sub.html"; // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/Sources#unsafe-inline diff --git a/tests/wpt/tests/content-security-policy/reporting/report-clips-sample.https.html b/tests/wpt/tests/content-security-policy/reporting/report-clips-sample.https.html index 696a27ba756..ae9e380bc2d 100644 --- a/tests/wpt/tests/content-security-policy/reporting/report-clips-sample.https.html +++ b/tests/wpt/tests/content-security-policy/reporting/report-clips-sample.https.html @@ -9,27 +9,73 @@ diff --git a/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-cross-site-subresource-to-same-site-redirect.tentative.https.html b/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-cross-site-subresource-to-same-site-redirect.tentative.https.html index 3a0afcec692..33ae0d0ca3c 100644 --- a/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-cross-site-subresource-to-same-site-redirect.tentative.https.html +++ b/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-cross-site-subresource-to-same-site-redirect.tentative.https.html @@ -55,6 +55,7 @@ .includes(partitionedCookie)); assert_true(iframe.contentDocument.cookie .includes(partitionedCookie)); + erase_cookie_from_js("ancestor", "Secure; Path=/; SameSite=None; Partitioned"); }, "Partitioned cookies are sent in embedded cross-site to same-site redirects"); diff --git a/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-same-site-subresource-to-cross-site-redirect.tentative.https.html b/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-same-site-subresource-to-cross-site-redirect.tentative.https.html index 971f7ccfef5..27278458dcb 100644 --- a/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-same-site-subresource-to-cross-site-redirect.tentative.https.html +++ b/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-same-site-subresource-to-cross-site-redirect.tentative.https.html @@ -53,6 +53,8 @@ promise_test(async () => { iframeHost = iframeUrl.hostname; assert_not_equals(window.location.hostname, iframeHost); + erase_cookie_from_js("ancestor", "Secure; Path=/; SameSite=None; Partitioned"); + }, "Partitioned cookies are not sent in embedded same-site to cross-site redirects"); diff --git a/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-top-level-redirect.tentative.https.html b/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-top-level-redirect.tentative.https.html index b3134295da8..e9dd82c1cec 100644 --- a/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-top-level-redirect.tentative.https.html +++ b/tests/wpt/tests/cookies/partitioned-cookies/partitioned-cookies-top-level-redirect.tentative.https.html @@ -42,7 +42,11 @@ test(() => { assert_true(document.cookie.includes(partitionedCookie)); assert_true(window.location.href.includes(partitionedCookie)); - },"Partitioned Cookies are available in top-level cross-site to same-site redirects"); + + erase_cookie_from_js("ancestor", "Secure; Path=/; SameSite=None; Partitioned"); + } + ,"Partitioned Cookies are available in top-level cross-site to same-site redirects"); + diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-as-multicol-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-as-multicol-crash.html new file mode 100644 index 00000000000..af474a965bd --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/anchor-as-multicol-crash.html @@ -0,0 +1,4 @@ + + + +
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll-ref.html b/tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll-ref.html new file mode 100644 index 00000000000..7f4ec4b416f --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll-ref.html @@ -0,0 +1,33 @@ + +CSS Anchor Positioning: scroll transforms respect anchor-scope (ref) + +
+
+
+ +
+
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll.html b/tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll.html new file mode 100644 index 00000000000..a335f54f21f --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/anchor-scope-scroll.html @@ -0,0 +1,48 @@ + + +CSS Anchor Positioning: scroll transforms respect anchor-scope + + + + +
+
+
+ +
+
+
+ +
+ + diff --git a/tests/wpt/tests/css/css-anchor-position/chrome-380321441-crash.html b/tests/wpt/tests/css/css-anchor-position/chrome-380321441-crash.html new file mode 100644 index 00000000000..85dfb27325f --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/chrome-380321441-crash.html @@ -0,0 +1,19 @@ + +Chrome crash while flipping position-area:start + + +
Anchor
+
diff --git a/tests/wpt/tests/css/css-anchor-position/last-successful-iframe.html b/tests/wpt/tests/css/css-anchor-position/last-successful-iframe.html new file mode 100644 index 00000000000..868400ef5d1 --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/last-successful-iframe.html @@ -0,0 +1,68 @@ + +CSS Anchor Positioning: basic last successful position fallback + + + + + + + diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-001.tentative.html b/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-001.tentative.html new file mode 100644 index 00000000000..7abe8e62580 --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-001.tentative.html @@ -0,0 +1,122 @@ + +position-area to include current scroll position at first layout + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-002.tentative.html b/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-002.tentative.html new file mode 100644 index 00000000000..73a94eca4c3 --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-002.tentative.html @@ -0,0 +1,150 @@ + +position-area to include current scroll position at first layout + + + + + + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-003.tentative.html b/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-003.tentative.html new file mode 100644 index 00000000000..1409c6d2b53 --- /dev/null +++ b/tests/wpt/tests/css/css-anchor-position/position-area-scrolling-003.tentative.html @@ -0,0 +1,141 @@ + +position-area to include current scroll position at first layout + + + + + + + diff --git a/tests/wpt/tests/css/css-animations/event-dispatch.tentative.html b/tests/wpt/tests/css/css-animations/event-dispatch.tentative.html index 3e577d6ea6c..8c5b7e3ae15 100644 --- a/tests/wpt/tests/css/css-animations/event-dispatch.tentative.html +++ b/tests/wpt/tests/css/css-animations/event-dispatch.tentative.html @@ -11,6 +11,14 @@ from { margin-left: 0px; } to { margin-left: 100px; } } +@keyframes anim2 { + from { margin-top: 100px; } + to { margin-top: 200px; } +} +@keyframes anim3 { + from { padding-left: 100px; } + to { padding-left: 200px; } +}
diff --git a/tests/wpt/tests/css/css-animations/parsing/animation-range-shorthand.html b/tests/wpt/tests/css/css-animations/parsing/animation-range-shorthand.html index 8acf0b1c557..25f5c140d8c 100644 --- a/tests/wpt/tests/css/css-animations/parsing/animation-range-shorthand.html +++ b/tests/wpt/tests/css/css-animations/parsing/animation-range-shorthand.html @@ -85,6 +85,7 @@ test_computed_value("animation-range", "normal 100px"); test_computed_value("animation-range", "100px"); test_computed_value("animation-range", "100px normal", "100px"); test_computed_value("animation-range", "10% normal", "10%"); +test_computed_value("animation-range", "10% calc(70% + 10% * sign(100em - 1px))", "10% 80%"); test_invalid_value("animation-range", "entry 50% 0s", "entry 50%"); test_invalid_value("animation-range", "0s entry 50%"); diff --git a/tests/wpt/tests/css/css-animations/parsing/animation-range-start-valid.html b/tests/wpt/tests/css/css-animations/parsing/animation-range-start-valid.html index 3ca885862e9..bb1dbe35c04 100644 --- a/tests/wpt/tests/css/css-animations/parsing/animation-range-start-valid.html +++ b/tests/wpt/tests/css/css-animations/parsing/animation-range-start-valid.html @@ -29,4 +29,5 @@ test_valid_value("animation-range-start", "cover"); test_valid_value("animation-range-start", "contain"); test_valid_value("animation-range-start", "entry"); test_valid_value("animation-range-start", "exit"); +test_valid_value("animation-range-start", "cover calc(sign(100em - 1px) * 1%)"); diff --git a/tests/wpt/tests/css/css-backgrounds/background-332.html b/tests/wpt/tests/css/css-backgrounds/background-332.html index 54c5e68c512..0b4db819b00 100644 --- a/tests/wpt/tests/css/css-backgrounds/background-332.html +++ b/tests/wpt/tests/css/css-backgrounds/background-332.html @@ -32,7 +32,7 @@ test(function() { assert_equals(cs.getPropertyValue("background-size"), - "160px", "background specified value for background-size"); + "160px auto", "background specified value for background-size"); }, "background_specified_size"); test(function() { diff --git a/tests/wpt/tests/css/css-backgrounds/background-size-001.html b/tests/wpt/tests/css/css-backgrounds/background-size-001.html index fee271de14a..ce1666c9a81 100644 --- a/tests/wpt/tests/css/css-backgrounds/background-size-001.html +++ b/tests/wpt/tests/css/css-backgrounds/background-size-001.html @@ -39,43 +39,43 @@ document.getElementById("test").style.backgroundSize = "0px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0px", "background-size supporting value"); + "0px auto", "background-size supporting value"); }, "background-size_length_zero"); document.getElementById("test").style.backgroundSize = "-0px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0px", "background-size supporting value"); + "0px auto", "background-size supporting value"); }, "background-size_length_negative_zero"); document.getElementById("test").style.backgroundSize = "+0px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0px", "background-size supporting value"); + "0px auto", "background-size supporting value"); }, "background-size_length_positive_zero"); document.getElementById("test").style.backgroundSize = "15px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "15px", "background-size supporting value"); + "15px auto", "background-size supporting value"); }, "background-size_length_normal"); document.getElementById("test").style.backgroundSize = "0%"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0%", "background-size supporting value"); + "0% auto", "background-size supporting value"); }, "background-size_percentage_min"); document.getElementById("test").style.backgroundSize = "50%"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "50%", "background-size supporting value"); + "50% auto", "background-size supporting value"); }, "background-size_percentage_normal"); document.getElementById("test").style.backgroundSize = "100%"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "100%", "background-size supporting value"); + "100% auto", "background-size supporting value"); }, "background-size_percentage_max"); document.getElementById("test").style.backgroundSize = "auto auto"; @@ -99,7 +99,7 @@ document.getElementById("test").style.backgroundSize = "15px auto"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "15px", "background-size supporting value"); + "15px auto", "background-size supporting value"); }, "background-size_length_auto"); document.getElementById("test").style.backgroundSize = "15px 15px"; @@ -117,7 +117,7 @@ document.getElementById("test").style.backgroundSize = "50% auto"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "50%", "background-size supporting value"); + "50% auto", "background-size supporting value"); }, "background-size_percentage_auto"); document.getElementById("test").style.backgroundSize = "50% 15px"; diff --git a/tests/wpt/tests/css/css-cascade/scope-invalidation.html b/tests/wpt/tests/css/css-cascade/scope-invalidation.html index d53257e8944..86c06f19a2d 100644 --- a/tests/wpt/tests/css/css-cascade/scope-invalidation.html +++ b/tests/wpt/tests/css/css-cascade/scope-invalidation.html @@ -26,6 +26,9 @@ function test_scope_invalidation(script_element, callback_fn, description) { function assert_green(element) { assert_equals(getComputedStyle(element).backgroundColor, 'rgb(0, 128, 0)'); } +function assert_red(element) { + assert_equals(getComputedStyle(element).backgroundColor, 'rgb(255, 0, 0)'); +} function assert_not_green(element) { assert_equals(getComputedStyle(element).backgroundColor, 'rgb(0, 0, 0)'); } @@ -780,3 +783,90 @@ test_scope_invalidation(document.currentScript, () => { }, ':nth-child() in scope limit'); + + + + + + + + + diff --git a/tests/wpt/tests/css/css-cascade/scope-nesting.html b/tests/wpt/tests/css/css-cascade/scope-nesting.html index fb39bc2c091..2811bb4635d 100644 --- a/tests/wpt/tests/css/css-cascade/scope-nesting.html +++ b/tests/wpt/tests/css/css-cascade/scope-nesting.html @@ -652,3 +652,28 @@ test((t) => { assert_equals(getComputedStyle(child).color, 'rgb(0, 128, 0)'); }, 'Insert a nested style rule within @scope, :scope'); + + + diff --git a/tests/wpt/tests/css/css-conditional/container-queries/support/cq-testcommon.js b/tests/wpt/tests/css/css-conditional/container-queries/support/cq-testcommon.js index 96ad77d55ba..357657870e6 100644 --- a/tests/wpt/tests/css/css-conditional/container-queries/support/cq-testcommon.js +++ b/tests/wpt/tests/css/css-conditional/container-queries/support/cq-testcommon.js @@ -73,7 +73,7 @@ function test_cq_condition_valid(condition, unknown) { assert_equals(style.sheet.rules.length, 2); const expected = unknown ? '' : 'true'; assert_equals(getComputedStyle(document.querySelector("#cq-main")).getPropertyValue('--match'), expected); - }, `Query condition should be valid: ${condition}`); + }, `Query condition should be valid${unknown ? ' but unknown' : ''}: ${condition}`); } function test_cq_condition_known(condition) { diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext-ref.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext-ref.html new file mode 100644 index 00000000000..b4a80b361bb --- /dev/null +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext-ref.html @@ -0,0 +1,10 @@ + + + + +PASS if innerText reads: "content-visibility does not apply to inline boxes" +
innerText: content-visibility does not apply to inline boxes
diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext.html new file mode 100644 index 00000000000..fa9f9d57a02 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-hidden-and-innertext.html @@ -0,0 +1,20 @@ + + + + + + +PASS if innerText reads: "content-visibility does not apply to inline boxes" +
content-visibility does not apply to inline boxes
+

+
diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby-ref.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby-ref.html
new file mode 100644
index 00000000000..3e9b0570548
--- /dev/null
+++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby-ref.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+

Test passes if both base and annotation are visible

+baseannotation + + + diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby.html new file mode 100644 index 00000000000..891853c1816 --- /dev/null +++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-on-ruby.html @@ -0,0 +1,17 @@ + + + + + + + + +

Test passes if both base and annotation are visible

+baseannotation + + + diff --git a/tests/wpt/tests/css/css-easing/timing-functions-syntax-computed.html b/tests/wpt/tests/css/css-easing/timing-functions-syntax-computed.html index ad37d2769e7..b03d2a0e233 100644 --- a/tests/wpt/tests/css/css-easing/timing-functions-syntax-computed.html +++ b/tests/wpt/tests/css/css-easing/timing-functions-syntax-computed.html @@ -31,6 +31,8 @@ test_computed_value("animation-timing-function", "steps(2, jump-both)"); test_computed_value("animation-timing-function", "steps(2, jump-none)"); test_computed_value("animation-timing-function", "linear, ease, linear"); + +test_computed_value("animation-timing-function", "steps(calc(2 + sign(100em - 1px)), end)", "steps(3)"); diff --git a/tests/wpt/tests/css/css-easing/timing-functions-syntax-valid.html b/tests/wpt/tests/css/css-easing/timing-functions-syntax-valid.html index a05768ccb90..07f2c2cfb96 100644 --- a/tests/wpt/tests/css/css-easing/timing-functions-syntax-valid.html +++ b/tests/wpt/tests/css/css-easing/timing-functions-syntax-valid.html @@ -31,6 +31,8 @@ test_valid_value("animation-timing-function", "steps(2, jump-both)"); test_valid_value("animation-timing-function", "steps(2, jump-none)"); test_valid_value("animation-timing-function", "linear, ease, linear"); + +test_valid_value("animation-timing-function", "steps(calc(2 + sign(100em - 1px)))"); diff --git a/tests/wpt/tests/css/css-fonts/font-palette-23b.html b/tests/wpt/tests/css/css-fonts/font-palette-23b.html new file mode 100644 index 00000000000..1c24666b51a --- /dev/null +++ b/tests/wpt/tests/css/css-fonts/font-palette-23b.html @@ -0,0 +1,25 @@ + + + + +Tests for font-palette and @font-palette-values: calc() in expressions + + + + + + + +
A
+ + diff --git a/tests/wpt/tests/css/css-fonts/font-shorthand-serialization-font-stretch.html b/tests/wpt/tests/css/css-fonts/font-shorthand-serialization-font-stretch.html index e39d6c6b198..3079cc06e7e 100644 --- a/tests/wpt/tests/css/css-fonts/font-shorthand-serialization-font-stretch.html +++ b/tests/wpt/tests/css/css-fonts/font-shorthand-serialization-font-stretch.html @@ -84,4 +84,18 @@ test(function() { assert_equals(div.style.fontStretch, "50.01%"); assert_equals(div.style.font, ""); }, "Percentages which cannot be transformed into keywords should prevent the font shorthand from serializing, but not fontStretch"); + +test(function() { + const div = document.getElementById("test"); + + // This isn't well-specified, but appears to be consistent across browsers. + div.style.fontStretch = "calc(50%)"; + assert_equals(div.style.fontStretch, "calc(50%)"); + assert_equals(div.style.font, "ultra-condensed medium serif"); + + div.style.fontStretch = "calc(50% + 25% * sign(100em - 1px))"; + assert_equals(div.style.fontStretch, "calc(50% + 25% * sign(100em - 1px))"); + assert_equals(div.style.font, ""); +}, "calc() transformation into keywords"); + diff --git a/tests/wpt/tests/css/css-gaps/tentative/parsing/gap-decorations-style-computed.html b/tests/wpt/tests/css/css-gaps/tentative/parsing/gap-decorations-style-computed.html new file mode 100644 index 00000000000..379fb89c071 --- /dev/null +++ b/tests/wpt/tests/css/css-gaps/tentative/parsing/gap-decorations-style-computed.html @@ -0,0 +1,30 @@ + + + + +CSS Gap Decoration: column-rule-style getComputedStyle() + + + + + + + + +
+ + + diff --git a/tests/wpt/tests/css/css-grid/computed-grid-column.html b/tests/wpt/tests/css/css-grid/computed-grid-column.html new file mode 100644 index 00000000000..1c42eb91818 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/computed-grid-column.html @@ -0,0 +1,32 @@ + +CSS Grid Layout Test: row/column is complex calc() + + + + +
+
X XX X
+
X XX X
+
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto-ref.html new file mode 100644 index 00000000000..3f5ca75fa8c --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto-ref.html @@ -0,0 +1,105 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto.html new file mode 100644 index 00000000000..6ea41862232 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-auto.html @@ -0,0 +1,103 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr-ref.html new file mode 100644 index 00000000000..e4bf5b7f7ac --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr-ref.html @@ -0,0 +1,105 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr.html new file mode 100644 index 00000000000..314ce6d6fc1 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-fr.html @@ -0,0 +1,103 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1-ref.html new file mode 100644 index 00000000000..db70b7beb5d --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1-ref.html @@ -0,0 +1,107 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1.html new file mode 100644 index 00000000000..048b0d2165b --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix1.html @@ -0,0 +1,103 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2-ref.html new file mode 100644 index 00000000000..e97edbd65dd --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2-ref.html @@ -0,0 +1,104 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2.html new file mode 100644 index 00000000000..e2db2700b2e --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-mix2.html @@ -0,0 +1,104 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-ref.html deleted file mode 100644 index eddbb9cbe19..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001-ref.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - Reference: Masonry layout intrinsic sizing - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001.html deleted file mode 100644 index ead5ad98086..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-001.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - intrinsic - - - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto-ref.html new file mode 100644 index 00000000000..dc883d323a7 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto-ref.html @@ -0,0 +1,107 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto.html new file mode 100644 index 00000000000..8c88f2fd4a2 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-auto.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr-ref.html new file mode 100644 index 00000000000..79c43c59948 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr-ref.html @@ -0,0 +1,106 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr.html new file mode 100644 index 00000000000..80e25cbc8ab --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-fr.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1-ref.html new file mode 100644 index 00000000000..4f3a51921f0 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1-ref.html @@ -0,0 +1,107 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1.html new file mode 100644 index 00000000000..584041cebf8 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix1.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2-ref.html new file mode 100644 index 00000000000..1651af50c39 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2-ref.html @@ -0,0 +1,106 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2.html new file mode 100644 index 00000000000..a726bf192ab --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-mix2.html @@ -0,0 +1,106 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-ref.html deleted file mode 100644 index d4b9892c22e..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002-ref.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - Reference: Masonry layout intrinsic sizing - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002.html deleted file mode 100644 index 03e8617f248..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-002.html +++ /dev/null @@ -1,351 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - min-content constraint - - - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto-ref.html new file mode 100644 index 00000000000..f3137038202 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto-ref.html @@ -0,0 +1,131 @@ + + + + + Reference: Masonry layout min-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto.html new file mode 100644 index 00000000000..2b781d1db2d --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-auto.html @@ -0,0 +1,104 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr-ref.html new file mode 100644 index 00000000000..856a76bfb8f --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr-ref.html @@ -0,0 +1,129 @@ + + + + + Reference: Masonry layout min-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr.html new file mode 100644 index 00000000000..830a22a4ec8 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-fr.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1-ref.html new file mode 100644 index 00000000000..d6f5674868e --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1-ref.html @@ -0,0 +1,131 @@ + + + + + Reference: Masonry layout min-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1.html new file mode 100644 index 00000000000..15876a47430 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix1.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2-ref.html new file mode 100644 index 00000000000..675e45bb175 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2-ref.html @@ -0,0 +1,132 @@ + + + + + Reference: Masonry layout min-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2.html new file mode 100644 index 00000000000..053b7a2ebde --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-mix2.html @@ -0,0 +1,106 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-ref.html deleted file mode 100644 index 9ffea0a5d21..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003-ref.html +++ /dev/null @@ -1,433 +0,0 @@ - - - - - Reference: Masonry layout min-content sizing - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003.html deleted file mode 100644 index 9b03ee44ab1..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-003.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - min-content - - - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto-ref.html new file mode 100644 index 00000000000..d01a543d06e --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto-ref.html @@ -0,0 +1,143 @@ + + + + + Reference: Masonry layout max-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto.html new file mode 100644 index 00000000000..a92c3d774f6 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-auto.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr-ref.html new file mode 100644 index 00000000000..9d757dd6228 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr-ref.html @@ -0,0 +1,135 @@ + + + + + Reference: Masonry layout max-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr.html new file mode 100644 index 00000000000..db8f9c0ec1c --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-fr.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1-ref.html new file mode 100644 index 00000000000..4793949c280 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1-ref.html @@ -0,0 +1,141 @@ + + + + + Reference: Masonry layout max-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1.html new file mode 100644 index 00000000000..9a399db534e --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix1.html @@ -0,0 +1,105 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2-ref.html new file mode 100644 index 00000000000..640d02d1144 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2-ref.html @@ -0,0 +1,136 @@ + + + + + Reference: Masonry layout max-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2.html new file mode 100644 index 00000000000..a63d43c051c --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-mix2.html @@ -0,0 +1,106 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-ref.html deleted file mode 100644 index 282dd280213..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004-ref.html +++ /dev/null @@ -1,460 +0,0 @@ - - - - - Reference: Masonry layout max-content sizing - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004.html deleted file mode 100644 index 3c2f1a20e11..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-004.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - max-content - - - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto-ref.html new file mode 100644 index 00000000000..d3bb9110be0 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto-ref.html @@ -0,0 +1,112 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto.html new file mode 100644 index 00000000000..e38cf2bec84 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-auto.html @@ -0,0 +1,110 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr-ref.html new file mode 100644 index 00000000000..f4a2c2bae63 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr-ref.html @@ -0,0 +1,111 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr.html new file mode 100644 index 00000000000..9ca29ead013 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-fr.html @@ -0,0 +1,110 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1-ref.html new file mode 100644 index 00000000000..c48319319a3 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1-ref.html @@ -0,0 +1,112 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1.html new file mode 100644 index 00000000000..e8bdf154537 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix1.html @@ -0,0 +1,110 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2-ref.html new file mode 100644 index 00000000000..80e8c0531a9 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2-ref.html @@ -0,0 +1,111 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2.html new file mode 100644 index 00000000000..dd557f6d76f --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-mix2.html @@ -0,0 +1,111 @@ + + + + + CSS Grid Test: Masonry layout column sizing - intrinsic + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-ref.html deleted file mode 100644 index 6214f6723ad..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001-ref.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - Reference: Masonry layout intrinsic sizing - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001.html deleted file mode 100644 index 45b5de5d0c8..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-001.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - intrinsic - - - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto-ref.html new file mode 100644 index 00000000000..9b30557c90b --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto-ref.html @@ -0,0 +1,113 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto.html new file mode 100644 index 00000000000..d6f3346f844 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-auto.html @@ -0,0 +1,111 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr-ref.html new file mode 100644 index 00000000000..442280db2a0 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr-ref.html @@ -0,0 +1,112 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr.html new file mode 100644 index 00000000000..e0c501828ed --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-fr.html @@ -0,0 +1,111 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1-ref.html new file mode 100644 index 00000000000..03efe6f7d67 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1-ref.html @@ -0,0 +1,113 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1.html new file mode 100644 index 00000000000..d60a77f70b6 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix1.html @@ -0,0 +1,111 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2-ref.html new file mode 100644 index 00000000000..ba2034119ef --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2-ref.html @@ -0,0 +1,112 @@ + + + + + Reference: Masonry layout intrinsic sizing + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2.html new file mode 100644 index 00000000000..c31a079286b --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-mix2.html @@ -0,0 +1,112 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content constraint + + + + + + + +
+ + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + + + + 1 + 2 + 3 + 4 + 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-ref.html deleted file mode 100644 index 38ede3202ad..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002-ref.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - Reference: Masonry layout intrinsic sizing - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 5 - -
- diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002.html deleted file mode 100644 index 5faf63c2c24..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-002.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - min-content constraint - - - - - - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
- - - -
- - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - 6 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - - - - 1 - 2 - 3 - 4 - 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto-ref.html new file mode 100644 index 00000000000..3b257ea4f7b --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto-ref.html @@ -0,0 +1,159 @@ + + + + + +Reference: Masonry layout min-content sizing + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto.html new file mode 100644 index 00000000000..a643ee11653 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto.html @@ -0,0 +1,137 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html new file mode 100644 index 00000000000..d498ba60d9b --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html @@ -0,0 +1,154 @@ + + + + + + Reference: Masonry layout min-content sizing + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr.html new file mode 100644 index 00000000000..f1999a8e2c6 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr.html @@ -0,0 +1,137 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1-ref.html new file mode 100644 index 00000000000..92171930afc --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1-ref.html @@ -0,0 +1,158 @@ + + + + + + Reference: Masonry layout min-content sizing + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1.html new file mode 100644 index 00000000000..3103ba4147e --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1.html @@ -0,0 +1,137 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2-ref.html new file mode 100644 index 00000000000..ce221c46aee --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2-ref.html @@ -0,0 +1,137 @@ + + + + + + Reference: Masonry layout min-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2.html new file mode 100644 index 00000000000..57632888706 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix2.html @@ -0,0 +1,112 @@ + + + + + CSS Grid Test: Masonry layout column sizing - min-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-ref.html deleted file mode 100644 index 3e2b0a2a3be..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-ref.html +++ /dev/null @@ -1,461 +0,0 @@ - - - - - - Reference: Masonry layout min-content sizing - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003.html deleted file mode 100644 index 5e0a150ef1f..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003.html +++ /dev/null @@ -1,356 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - min-content - - - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto-ref.html new file mode 100644 index 00000000000..013bd83da7a --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto-ref.html @@ -0,0 +1,165 @@ + + + + +Reference: Masonry layout max-content sizing + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto.html new file mode 100644 index 00000000000..51fa2ed51d6 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-auto.html @@ -0,0 +1,137 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr-ref.html new file mode 100644 index 00000000000..4a1cf906f8d --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr-ref.html @@ -0,0 +1,142 @@ + + + + + Reference: Masonry layout max-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr.html new file mode 100644 index 00000000000..779b30cf60e --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-fr.html @@ -0,0 +1,111 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1-ref.html new file mode 100644 index 00000000000..5682f74e230 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1-ref.html @@ -0,0 +1,156 @@ + + + + + Reference: Masonry layout max-content sizing + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1.html new file mode 100644 index 00000000000..68a8b93e935 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix1.html @@ -0,0 +1,138 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ \ No newline at end of file diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html new file mode 100644 index 00000000000..c1bf7d407e5 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html @@ -0,0 +1,137 @@ + + + + +Reference: Masonry layout max-content sizing + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2.html new file mode 100644 index 00000000000..75b7f879798 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2.html @@ -0,0 +1,112 @@ + + + + + CSS Grid Test: Masonry layout column sizing - max-content + + + + + + + +
+ + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + 6 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + + + + 1 + 2 2 + 3 3 + 4 + 5 5 + +
+ diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-ref.html deleted file mode 100644 index a79aca3b882..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-ref.html +++ /dev/null @@ -1,461 +0,0 @@ - - - - - Reference: Masonry layout max-content sizing - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004.html deleted file mode 100644 index 6bacac5255d..00000000000 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - CSS Grid Test: Masonry layout column sizing - max-content - - - - - - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
- - - -
- - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - 6 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - - - - 1 - 2 2 - 3 3 - 4 - 5 5 - -
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005-ref.html index 0c5eae740f6..fc1a6fd2a2a 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005-ref.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005-ref.html @@ -23,6 +23,9 @@ grid { item { writing-mode: vertical-lr; } +.hidden { + visibility: hidden; +} @@ -39,7 +42,7 @@ item { 9 9 - + 1 2 3 @@ -49,29 +52,41 @@ item { 7 8 9 9 + + + + - + + 5 5 1 2 3 4 - 5 5 6 7 8 9 9 + + + + - + 1 2 3 4 - 5 5 + 5 5 6 7 8 9 9 + + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005.html index 4c8e4373202..13d54a4388b 100644 --- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005.html +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-005.html @@ -55,11 +55,11 @@ item { + 5 5 1 2 3 4 - 5 5 6 7 8 diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007-ref.html new file mode 100644 index 00000000000..a173c4c6b64 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007-ref.html @@ -0,0 +1,43 @@ + + + + + CSS Grid Test: Masonry layout column width sizing + + + + + + + + + 1 + 5 + 2 + 3 + 4 + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007.html new file mode 100644 index 00000000000..95a8e93467c --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-007.html @@ -0,0 +1,43 @@ + + + + + CSS Grid Test: Masonry layout column width sizing + + + + + + + + + 1 + 2 + 3 + 4 + 5 + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex-ref.html new file mode 100644 index 00000000000..5e4c758a086 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex-ref.html @@ -0,0 +1,81 @@ + + + + + + Verify correct sizing of flex tracks when using subgrid in CSS Masonry + + + + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex.html b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex.html new file mode 100644 index 00000000000..c42ccb14643 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-flex.html @@ -0,0 +1,87 @@ + + + + + + Verify correct sizing of flex tracks when using subgrid in CSS Masonry + + + + + + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing-ref.html new file mode 100644 index 00000000000..c1b97841d43 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing-ref.html @@ -0,0 +1,81 @@ + + + + + + Verify correct sizing of intrinsically sized tracks when using subgrid in CSS Masonry + + + + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + + 1 + + 2 + 3 + 4 + + 5 + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing.html b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing.html new file mode 100644 index 00000000000..91215be2028 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-intrinsic-sizing.html @@ -0,0 +1,87 @@ + + + + + + Verify correct sizing of intrinsically sized tracks when using subgrid in CSS Masonry + + + + + + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-ref.html new file mode 100644 index 00000000000..b1ae12c8798 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid-ref.html @@ -0,0 +1,86 @@ + + + + + + Verify basic CSS Masonry Subgrid support to ensure items are properly placed in the grid + + + + + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid.html b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid.html new file mode 100644 index 00000000000..392f2afcca6 --- /dev/null +++ b/tests/wpt/tests/css/css-grid/masonry/tentative/subgrid/track-sizing/masonry-subgrid.html @@ -0,0 +1,87 @@ + + + + + + Verify basic CSS Masonry Subgrid support to ensure items are properly placed in the grid + + + + + + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + + + 1 + + 2 + 3 + 4 + + 5 + + + diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-template-columns-computed.html b/tests/wpt/tests/css/css-grid/parsing/grid-template-columns-computed.html index 54380ef455e..9604f0cfe85 100644 --- a/tests/wpt/tests/css/css-grid/parsing/grid-template-columns-computed.html +++ b/tests/wpt/tests/css/css-grid/parsing/grid-template-columns-computed.html @@ -40,4 +40,5 @@ test_computed_value("grid-template-columns", "100% [a] repeat(auto-fit, [b] 200% test_computed_value("grid-template-columns", "[a] 1em repeat(1, 2em [b] 3em) 4em [d]", "[a] 1px 2px [b] 3px 4px [d]"); test_computed_value("grid-template-columns", "[a] 1em repeat(auto-fill, 2em [b] 3em) 4em [d]", "[a] 1px 2px [b] 3px 4px [d]"); test_computed_value("grid-template-columns", "[a] 1em repeat(auto-fit, 2em [b] 3em) 4em [d]", "[a] 1px 0px [b] 0px 4px [d]"); +test_computed_value("grid-template-columns", "repeat(calc(1 + 3 * sign(100em - 1px)), 150px)", "150px 150px 150px 150px"); diff --git a/tests/wpt/tests/css/css-images/cross-fade-computed-value.html b/tests/wpt/tests/css/css-images/cross-fade-computed-value.html index dbecb4a6545..007696a5c22 100644 --- a/tests/wpt/tests/css/css-images/cross-fade-computed-value.html +++ b/tests/wpt/tests/css/css-images/cross-fade-computed-value.html @@ -47,6 +47,12 @@ test_computed_value('background-image', 'cross-fade(calc(-200%) red, green)', 'cross-fade(rgb(255, 0, 0) 0%, rgb(0, 128, 0))'); + + // The percentage here is not resolvable parse-time, but should always be 49% + // for all reasonable font sizes. + test_computed_value('background-image', + 'cross-fade(calc(50% + 1% * sign(1em - 10000px)) red, green)', + 'cross-fade(rgb(255, 0, 0) 49%, rgb(0, 128, 0))'); diff --git a/tests/wpt/tests/css/css-images/cross-fade-legacy-2-crash.html b/tests/wpt/tests/css/css-images/cross-fade-legacy-2-crash.html new file mode 100644 index 00000000000..37321f88c16 --- /dev/null +++ b/tests/wpt/tests/css/css-images/cross-fade-legacy-2-crash.html @@ -0,0 +1,14 @@ + + + + CSS Images Test: Legacy cross-fade syntax unresolvable at parse time crashes Chrome + + + + +
+

Test passes if the browser does not crash.

+ + diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge-ref.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge-ref.html deleted file mode 100644 index cfbf985055d..00000000000 --- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge-ref.html +++ /dev/null @@ -1,14 +0,0 @@ - - - -
-
ABC
-
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge.html deleted file mode 100644 index 5266274600e..00000000000 --- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-ignore-nested-text-box-edge.html +++ /dev/null @@ -1,27 +0,0 @@ - -Consult the block container requesting the trim for text-box-edge - - - - - -
-
-
ABC
-
-
diff --git a/tests/wpt/tests/css/css-multicol/column-pseudo-background-color-ref.html b/tests/wpt/tests/css/css-multicol/column-pseudo-background-color-ref.html new file mode 100644 index 00000000000..8a6d7415429 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-pseudo-background-color-ref.html @@ -0,0 +1,3 @@ + +CSS Test Reference +

You should see no red or "FAIL" below.

diff --git a/tests/wpt/tests/css/css-multicol/column-pseudo-background-color.html b/tests/wpt/tests/css/css-multicol/column-pseudo-background-color.html new file mode 100644 index 00000000000..f321b1076eb --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/column-pseudo-background-color.html @@ -0,0 +1,27 @@ + +CSS Multi-column Layout Test: ::column background-color has no effect + + + +

You should see no red or "FAIL" below.

+
+
+
diff --git a/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-computed.html b/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-computed.html new file mode 100644 index 00000000000..f5fee578eb2 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-computed.html @@ -0,0 +1,44 @@ + +CSS Multi-column Layout Test: Computed ::column style + + + + + +
+ diff --git a/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-invalid.html b/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-invalid.html new file mode 100644 index 00000000000..34f04ede127 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-invalid.html @@ -0,0 +1,14 @@ + +CSS Multi-column Layout Test: ::column pseudo element invalid parsing + + + + + diff --git a/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-valid.html b/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-valid.html new file mode 100644 index 00000000000..5b989620ef8 --- /dev/null +++ b/tests/wpt/tests/css/css-multicol/parsing/column-pseudo-valid.html @@ -0,0 +1,12 @@ + +CSS Multi-column Layout Test: ::column pseudo element valid parsing + + + + + diff --git a/tests/wpt/tests/css/css-nesting/parent-pseudo-in-placeholder-crash.html b/tests/wpt/tests/css/css-nesting/parent-pseudo-in-placeholder-crash.html new file mode 100644 index 00000000000..5d73bdff3e4 --- /dev/null +++ b/tests/wpt/tests/css/css-nesting/parent-pseudo-in-placeholder-crash.html @@ -0,0 +1,8 @@ + +CSS Nesting: Crash with '&' inside ::placeholder + + diff --git a/tests/wpt/tests/css/css-overflow/scrollable-overflow-padding-input.html b/tests/wpt/tests/css/css-overflow/scrollable-overflow-padding-input.html new file mode 100644 index 00000000000..6f19af1c1bf --- /dev/null +++ b/tests/wpt/tests/css/css-overflow/scrollable-overflow-padding-input.html @@ -0,0 +1,36 @@ + +CSS Overflow Test: Ensure that padding inflation does not cause block-direction scroll in input elements. + + + + + + + + + +
+
+
+
+ +
+ diff --git a/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-inline-subtree-print.html b/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-inline-subtree-print.html new file mode 100644 index 00000000000..634cf5f4f58 --- /dev/null +++ b/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-inline-subtree-print.html @@ -0,0 +1,12 @@ + + + +
+ +
+ diff --git a/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-subtree-print.html b/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-subtree-print.html new file mode 100644 index 00000000000..3752fa1e595 --- /dev/null +++ b/tests/wpt/tests/css/css-page/crashtests/match-media-listener-relayout-contained-subtree-print.html @@ -0,0 +1,12 @@ + + + +
+ +
+ diff --git a/tests/wpt/tests/css/css-page/fixedpos-011-print-ref.html b/tests/wpt/tests/css/css-page/fixedpos-011-print-ref.html new file mode 100644 index 00000000000..8f0be4ea2fa --- /dev/null +++ b/tests/wpt/tests/css/css-page/fixedpos-011-print-ref.html @@ -0,0 +1,29 @@ + + + +
+
+ There should be three pages. All pages should have a green square in the top + right corner. +
+
+
+
Second page
+
+
+
+
Third page
+
diff --git a/tests/wpt/tests/css/css-page/fixedpos-011-print.html b/tests/wpt/tests/css/css-page/fixedpos-011-print.html new file mode 100644 index 00000000000..556965138cc --- /dev/null +++ b/tests/wpt/tests/css/css-page/fixedpos-011-print.html @@ -0,0 +1,37 @@ + + + + + + +
+
+
+
+
+ There should be three pages. All pages should have a green square in the top + right corner. +
+
+
+
Second page
+
+
+
+
Third page
+
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print-ref.html new file mode 100644 index 00000000000..d61359f8aae --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print-ref.html @@ -0,0 +1,21 @@ + + + +
+
+
+
+
+ + The page area size should be 7.5 by 6 inches. There should be two identical + cyan boxes above. +
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print.tentative.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print.tentative.html new file mode 100644 index 00000000000..1f7bf1fdc09 --- /dev/null +++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-015-print.tentative.html @@ -0,0 +1,32 @@ + +Viewport units in page and page margin contexts are resolved against the default page box size + + + + + +
+ +The page area size should be 7.5 by 6 inches. There should be two identical +cyan boxes above. diff --git a/tests/wpt/tests/css/css-page/page-size-015-print-ref.html b/tests/wpt/tests/css/css-page/page-size-015-print-ref.html new file mode 100644 index 00000000000..be84cf799b7 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-size-015-print-ref.html @@ -0,0 +1,10 @@ + + + +The page size should be 7.5 by 6 inches. diff --git a/tests/wpt/tests/css/css-page/page-size-015-print.tentative.html b/tests/wpt/tests/css/css-page/page-size-015-print.tentative.html new file mode 100644 index 00000000000..1afc9b588a3 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-size-015-print.tentative.html @@ -0,0 +1,19 @@ + +Viewport units in @page context are resolved against the default page box size + + + + + +The page size should be 7.5 by 6 inches. diff --git a/tests/wpt/tests/css/css-page/page-size-016-print-ref.html b/tests/wpt/tests/css/css-page/page-size-016-print-ref.html new file mode 100644 index 00000000000..c9818f3af12 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-size-016-print-ref.html @@ -0,0 +1,15 @@ + + + +
+
+ The page size should be 7.5 by 6 inches. The page top margin should be 1in. +
diff --git a/tests/wpt/tests/css/css-page/page-size-016-print.tentative.html b/tests/wpt/tests/css/css-page/page-size-016-print.tentative.html new file mode 100644 index 00000000000..0fd12954c66 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-size-016-print.tentative.html @@ -0,0 +1,24 @@ + +Viewport units in @page context are resolved against the default page box size + + + + + +The page size should be 7.5 by 6 inches. The page top margin should be 1in. diff --git a/tests/wpt/tests/css/css-page/page-size-017-print-ref.html b/tests/wpt/tests/css/css-page/page-size-017-print-ref.html new file mode 100644 index 00000000000..72508e3d030 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-size-017-print-ref.html @@ -0,0 +1,16 @@ + + + +
+ The page box size should be 6 by 5 inches. Each page margin should be 0.5in, + resulting in a page area size of 5 by 4 inches. +
diff --git a/tests/wpt/tests/css/css-page/page-size-017-print.tentative.html b/tests/wpt/tests/css/css-page/page-size-017-print.tentative.html new file mode 100644 index 00000000000..e036e83f717 --- /dev/null +++ b/tests/wpt/tests/css/css-page/page-size-017-print.tentative.html @@ -0,0 +1,19 @@ + +Viewport units in @page context are resolved against the default page box size + + + + + +The page box size should be 6 by 5 inches. Each page margin should be 0.5in, +resulting in a page area size of 5 by 4 inches. diff --git a/tests/wpt/tests/css/css-pseudo/parsing/the-check-pseudo-element.tentative.html b/tests/wpt/tests/css/css-pseudo/parsing/the-check-pseudo-element.tentative.html index d6d9fc2fd90..f220e29bcd0 100644 --- a/tests/wpt/tests/css/css-pseudo/parsing/the-check-pseudo-element.tentative.html +++ b/tests/wpt/tests/css/css-pseudo/parsing/the-check-pseudo-element.tentative.html @@ -22,7 +22,7 @@ test_invalid_selector("::placeholder::checkmark"); test_invalid_selector("::checkmark::before"); test_invalid_selector("::checkmark::after"); -test_valid_selector("::checkmark::marker"); +test_invalid_selector("::checkmark::marker"); test_invalid_selector("::checkmark::placeholder"); test_invalid_selector("::slotted(*)::checkmark::slotted(*)"); diff --git a/tests/wpt/tests/css/css-pseudo/parsing/the-select-arrow-pseudo-element.tentative.html b/tests/wpt/tests/css/css-pseudo/parsing/the-select-arrow-pseudo-element.tentative.html index b71bfe23634..69e1d1e11dd 100644 --- a/tests/wpt/tests/css/css-pseudo/parsing/the-select-arrow-pseudo-element.tentative.html +++ b/tests/wpt/tests/css/css-pseudo/parsing/the-select-arrow-pseudo-element.tentative.html @@ -1,32 +1,32 @@ -CSS ::select-arrow Pseudo-Element Test +CSS ::picker-icon Pseudo-Element Test - + diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-computed.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-computed.html new file mode 100644 index 00000000000..f56309bad66 --- /dev/null +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-computed.html @@ -0,0 +1,21 @@ + + + +CSS Rhythm: block-step-align computed values + + + + + + + + +
+ + + diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-invalid.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-invalid.html new file mode 100644 index 00000000000..d1e3c9a3226 --- /dev/null +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-invalid.html @@ -0,0 +1,29 @@ + + + +CSS Rhythm: block-step-align invalid values + + + + + + + + + + + diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-valid.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-valid.html new file mode 100644 index 00000000000..e86db9d13ea --- /dev/null +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-align-valid.html @@ -0,0 +1,20 @@ + + + +CSS Rhythm: block-step-align valid values + + + + + + + + + + + diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-computed.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-computed.html index cedbe3b9ec8..4b0f4e8374d 100644 --- a/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-computed.html +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-computed.html @@ -8,7 +8,6 @@ - -
diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-valid.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-valid.html index f7b0b5a9e04..c1ef52d6502 100644 --- a/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-valid.html +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-insert-valid.html @@ -7,19 +7,13 @@ - - -
\ No newline at end of file diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-computed.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-computed.html new file mode 100644 index 00000000000..60f7d1a1cc1 --- /dev/null +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-computed.html @@ -0,0 +1,20 @@ + + + +CSS Rhythm: block-step-round computed values + + + + + + + + +
+ + + diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-invalid.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-invalid.html new file mode 100644 index 00000000000..558eebc9e3c --- /dev/null +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-invalid.html @@ -0,0 +1,34 @@ + + + +CSS Rhythm: block-step-round invalid values + + + + + + + + + + + diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-valid.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-valid.html new file mode 100644 index 00000000000..df36bbf6ecb --- /dev/null +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-round-valid.html @@ -0,0 +1,19 @@ + + + +CSS Rhythm: block-step-round valid values + + + + + + + + + + + diff --git a/tests/wpt/tests/css/css-rhythm/parsing/block-step-size-computed.html b/tests/wpt/tests/css/css-rhythm/parsing/block-step-size-computed.html index e90b608215d..ce12f04a6e1 100644 --- a/tests/wpt/tests/css/css-rhythm/parsing/block-step-size-computed.html +++ b/tests/wpt/tests/css/css-rhythm/parsing/block-step-size-computed.html @@ -8,7 +8,6 @@ - -
- - -
+ +
+ +
+ diff --git a/tests/wpt/tests/css/css-scoping/host-in-host-selector.html b/tests/wpt/tests/css/css-scoping/host-in-host-selector.html new file mode 100644 index 00000000000..2379d170b8f --- /dev/null +++ b/tests/wpt/tests/css/css-scoping/host-in-host-selector.html @@ -0,0 +1,20 @@ + +CSS Scoping: :host(:host) + + + +
+ +
+ diff --git a/tests/wpt/tests/css/css-scoping/slotted-details-content-ref.html b/tests/wpt/tests/css/css-scoping/slotted-details-content-ref.html new file mode 100644 index 00000000000..f99ca294977 --- /dev/null +++ b/tests/wpt/tests/css/css-scoping/slotted-details-content-ref.html @@ -0,0 +1,3 @@ + + +
This text should be green
diff --git a/tests/wpt/tests/css/css-scoping/slotted-details-content.html b/tests/wpt/tests/css/css-scoping/slotted-details-content.html new file mode 100644 index 00000000000..005098bd254 --- /dev/null +++ b/tests/wpt/tests/css/css-scoping/slotted-details-content.html @@ -0,0 +1,17 @@ + + +CSS Scoping Test: ::slotted() allows ::details-content + + + +
+
This text should be green
+
+ diff --git a/tests/wpt/tests/css/css-scoping/slotted-file-selector-button-ref.html b/tests/wpt/tests/css/css-scoping/slotted-file-selector-button-ref.html new file mode 100644 index 00000000000..284033716d3 --- /dev/null +++ b/tests/wpt/tests/css/css-scoping/slotted-file-selector-button-ref.html @@ -0,0 +1,6 @@ + + +

Test passes if ::file-selector-button has green text.

+ diff --git a/tests/wpt/tests/css/css-scoping/slotted-file-selector-button.html b/tests/wpt/tests/css/css-scoping/slotted-file-selector-button.html new file mode 100644 index 00000000000..7b11deda3e1 --- /dev/null +++ b/tests/wpt/tests/css/css-scoping/slotted-file-selector-button.html @@ -0,0 +1,18 @@ + + +CSS Scoping Test: ::slotted() allows ::file-selector-button + + + +

Test passes if ::file-selector-button has green text.

+
+ +
+ diff --git a/tests/wpt/tests/css/css-scoping/slotted-parsing.html b/tests/wpt/tests/css/css-scoping/slotted-parsing.html index e4657b588af..69eabb5c833 100644 --- a/tests/wpt/tests/css/css-scoping/slotted-parsing.html +++ b/tests/wpt/tests/css/css-scoping/slotted-parsing.html @@ -39,6 +39,8 @@ // Allow tree-abiding pseudo elements after ::slotted test_valid_selector("::slotted(*)::before"); test_valid_selector("::slotted(*)::after"); + test_valid_selector("::slotted(*)::details-content"); + test_valid_selector("::slotted(*)::file-selector-button"); test_valid_selector("::slotted(*)::placeholder"); test_valid_selector("::slotted(*)::marker"); diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-fling-in-large-area.html b/tests/wpt/tests/css/css-scroll-snap/snap-fling-in-large-area.html index 4797ddbd9a2..9becf28b8d4 100644 --- a/tests/wpt/tests/css/css-scroll-snap/snap-fling-in-large-area.html +++ b/tests/wpt/tests/css/css-scroll-snap/snap-fling-in-large-area.html @@ -32,7 +32,7 @@ + + diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative.html new file mode 100644 index 00000000000..a300b664d65 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-block-size-001.tentative.html @@ -0,0 +1,212 @@ + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-inline-size-001.tentative.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-inline-size-001.tentative.html new file mode 100644 index 00000000000..a2b6fea70a4 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-inline-size-001.tentative.html @@ -0,0 +1,212 @@ + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative.html new file mode 100644 index 00000000000..31257c7647f --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-block-size-001.tentative.html @@ -0,0 +1,234 @@ + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-inline-size-001.tentative.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-inline-size-001.tentative.html new file mode 100644 index 00000000000..828bf7e1d2f --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-max-inline-size-001.tentative.html @@ -0,0 +1,234 @@ + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative.html new file mode 100644 index 00000000000..bc03c684b26 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-block-size-001.tentative.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-inline-size-001.tentative.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-inline-size-001.tentative.html new file mode 100644 index 00000000000..2af9315848f --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-alias-min-inline-size-001.tentative.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-block-size-001.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-block-size-001.html new file mode 100644 index 00000000000..c5c02ea231d --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-block-size-001.html @@ -0,0 +1,206 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-inline-size-001.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-inline-size-001.html new file mode 100644 index 00000000000..ee59a7cfd35 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-inline-size-001.html @@ -0,0 +1,206 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-max-block-size-001.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-max-block-size-001.html new file mode 100644 index 00000000000..f836e84fcae --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-max-block-size-001.html @@ -0,0 +1,228 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-max-inline-size-001.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-max-inline-size-001.html new file mode 100644 index 00000000000..e17bc9a9cd9 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-max-inline-size-001.html @@ -0,0 +1,228 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-min-block-size-001.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-min-block-size-001.html new file mode 100644 index 00000000000..c7fc1272853 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-min-block-size-001.html @@ -0,0 +1,209 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-sizing/stretch/stretch-min-inline-size-001.html b/tests/wpt/tests/css/css-sizing/stretch/stretch-min-inline-size-001.html new file mode 100644 index 00000000000..60c01030f54 --- /dev/null +++ b/tests/wpt/tests/css/css-sizing/stretch/stretch-min-inline-size-001.html @@ -0,0 +1,209 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+ diff --git a/tests/wpt/tests/css/css-values/attr-all-types.html b/tests/wpt/tests/css/css-values/attr-all-types.html index 1e5547e80f3..56b87c92035 100644 --- a/tests/wpt/tests/css/css-values/attr-all-types.html +++ b/tests/wpt/tests/css/css-values/attr-all-types.html @@ -116,6 +116,7 @@ test_valid_attr('font-size', 'attr(data-foo type(), 10px)', 'abc', '10px'); test_valid_attr('font-size', 'attr(data-foo type( | ), 10)', '10px', '10px'); test_valid_attr('--x', 'attr(data-foo type(), abc)', '10', 'abc'); + test_valid_attr('--x', 'attr(data-foo type())', 'url("https://does-not-exist.test/404.png")', 'url("https://does-not-exist.test/404.png")'); test_valid_attr('width', 'attr(data-foo type())', '10px', '10px'); test_valid_attr('width', 'attr(data-foo type(), red)', '10px', '10px'); diff --git a/tests/wpt/tests/css/css-values/attr-security.html b/tests/wpt/tests/css/css-values/attr-security.html index b3c7dda9c56..e8c041671ed 100644 --- a/tests/wpt/tests/css/css-values/attr-security.html +++ b/tests/wpt/tests/css/css-values/attr-security.html @@ -5,11 +5,6 @@ + + + +
+ + + + diff --git a/tests/wpt/tests/css/css-values/calc-sibling-function-in-shadow-dom.html b/tests/wpt/tests/css/css-values/calc-sibling-function-in-shadow-dom.html new file mode 100644 index 00000000000..54faa941797 --- /dev/null +++ b/tests/wpt/tests/css/css-values/calc-sibling-function-in-shadow-dom.html @@ -0,0 +1,33 @@ + + + + sibling-index() within Shadow DOM + + + + + +
+
Some element.
+
Some other element.
+
This should be ignored.
+
Some third element.
+
+ diff --git a/tests/wpt/tests/css/css-values/calc-sibling-function.html b/tests/wpt/tests/css/css-values/calc-sibling-function.html index 19e08b7f9a9..368f305f6a5 100644 --- a/tests/wpt/tests/css/css-values/calc-sibling-function.html +++ b/tests/wpt/tests/css/css-values/calc-sibling-function.html @@ -11,6 +11,9 @@ counter-increment: foo calc(sibling-count()); left: calc(10% + 100px * sibling-index()); } + #test::before { + z-index: calc(sibling-index() * 2); + } @@ -36,6 +39,11 @@ test(() => { let style = getComputedStyle(document.getElementById('test')); assert_equals(style.left, 'calc(10% + 200px)'); }, 'sibling-index() in calc() with percentage'); + +test(() => { + let style = getComputedStyle(document.getElementById('test'), ':before'); + assert_equals(style.zIndex, '4'); +}, 'sibling-count on pseudo-element'); diff --git a/tests/wpt/tests/css/css-view-transitions/new-content-flat-transform-ancestor.html b/tests/wpt/tests/css/css-view-transitions/new-content-flat-transform-ancestor.html index 112a0af2c45..5642b8730fb 100644 --- a/tests/wpt/tests/css/css-view-transitions/new-content-flat-transform-ancestor.html +++ b/tests/wpt/tests/css/css-view-transitions/new-content-flat-transform-ancestor.html @@ -4,7 +4,7 @@ - + diff --git a/tests/wpt/tests/css/cssom-view/interrupt-hidden-smooth-scroll.html b/tests/wpt/tests/css/cssom-view/interrupt-hidden-smooth-scroll.html index 5d6033747e9..c52a43a5956 100644 --- a/tests/wpt/tests/css/cssom-view/interrupt-hidden-smooth-scroll.html +++ b/tests/wpt/tests/css/cssom-view/interrupt-hidden-smooth-scroll.html @@ -53,7 +53,7 @@ } }; scroller.onscroll = (event) => { - if (scroller.scrollTop > 1) { + if (scroller.scrollTop > 1 && scroller.scrollTop < 200) { // Interrupt the smooth scroll. scroller.scrollTop = 1; interrupted = true; diff --git a/tests/wpt/tests/css/cssom-view/scrollWidthHeight-contain-layout.html b/tests/wpt/tests/css/cssom-view/scrollWidthHeight-contain-layout.html new file mode 100644 index 00000000000..1afab088506 --- /dev/null +++ b/tests/wpt/tests/css/cssom-view/scrollWidthHeight-contain-layout.html @@ -0,0 +1,47 @@ + + + + + + + + +scroll{Width,Height} with contain: layout + + + +
+
+
+ diff --git a/tests/wpt/tests/css/cssom-view/scrollWidthHeightWhenNotScrollable.xht b/tests/wpt/tests/css/cssom-view/scrollWidthHeightWhenNotScrollable.xht index f0fd373b1de..8eb08d55203 100644 --- a/tests/wpt/tests/css/cssom-view/scrollWidthHeightWhenNotScrollable.xht +++ b/tests/wpt/tests/css/cssom-view/scrollWidthHeightWhenNotScrollable.xht @@ -77,23 +77,17 @@ assert_equals(elemOverflow.clientHeight, 90); }, "elemOverflow.clientHeight is the height of the padding edge"); - /* This test differs from the spec. All major browsers give the result here, ignoring - the bottom padding. - */ test(function(){ - assert_equals(elemOverflow.scrollHeight, 150); + assert_equals(elemOverflow.scrollHeight, 200); }, "elemOverflow.scrollHeight is the height of its scrolled contents (ignoring padding, since we overflowed)"); test(function(){ - }, "elemOverflow.clientWidth is the width of the padding edge"); assert_equals(elemOverflow.clientWidth, 240); + }, "elemOverflow.clientWidth is the width of the padding edge"); - /* This test differs from the spec. All major browsers give the result here, ignoring - the right padding. - */ test(function(){ - assert_equals(elemOverflow.scrollWidth, 250); - }, "elemOverflow.scrollHeight is the width of its scrolled contents (ignoring padding, since we overflowed)"); + assert_equals(elemOverflow.scrollWidth, 290); + }, "elemOverflow.scrollHeight is the width of its scrolled contents (plus padding)"); test(function(){ assert_equals(elemNestedOverflow.clientHeight, 90); diff --git a/tests/wpt/tests/css/selectors/invalidation/crashtests/has-pseudoclass-only-crash.html b/tests/wpt/tests/css/selectors/invalidation/crashtests/has-pseudoclass-only-crash.html new file mode 100644 index 00000000000..408e32cd534 --- /dev/null +++ b/tests/wpt/tests/css/selectors/invalidation/crashtests/has-pseudoclass-only-crash.html @@ -0,0 +1,21 @@ + + + + + +
+
+
+
+
+ diff --git a/tests/wpt/tests/css/selectors/invalidation/has-pseudoclass-only.html b/tests/wpt/tests/css/selectors/invalidation/has-pseudoclass-only.html new file mode 100644 index 00000000000..49b2263e31e --- /dev/null +++ b/tests/wpt/tests/css/selectors/invalidation/has-pseudoclass-only.html @@ -0,0 +1,84 @@ + +CSS Selectors Invalidation: :has() containing :empty, :first-child, :last-child, pseudoclasses only + + + + + + +
+ diff --git a/tests/wpt/tests/docs/README.md b/tests/wpt/tests/docs/README.md index a753462429d..8d4423613a1 100644 --- a/tests/wpt/tests/docs/README.md +++ b/tests/wpt/tests/docs/README.md @@ -15,10 +15,10 @@ If you would like to build the site locally, follow these instructions. variety of systems. 2. Download the source code. Clone this repository using the `git clone` command. -3. Install the Python dependencies. Run the following command in a terminal - from the "docs" directory of the WPT repository: +3. Install the Python dependencies. Run the following command in a terminal: - pip install -r requirements.txt + pip install -r docs/requirements.txt -4. Build the documentation. Windows users should execute the `make.bat` batch - file. GNU/Linux and macOS users should use the `make` command. +4. Build the documentation: + + ./wpt build-docs diff --git a/tests/wpt/tests/docs/running-tests/from-local-system.md b/tests/wpt/tests/docs/running-tests/from-local-system.md index 0d524ea356a..cccb17e43f9 100644 --- a/tests/wpt/tests/docs/running-tests/from-local-system.md +++ b/tests/wpt/tests/docs/running-tests/from-local-system.md @@ -173,6 +173,7 @@ here](command-line-arguments.html#run). android_webview safari webkitgtk_minibrowser + wpewebkit_minibrowser ``` ### Running in parallel diff --git a/tests/wpt/tests/docs/running-tests/webkitgtk_minibrowser.md b/tests/wpt/tests/docs/running-tests/webkitgtk_minibrowser.md index 5dd047536ed..55bcbf1bd6a 100644 --- a/tests/wpt/tests/docs/running-tests/webkitgtk_minibrowser.md +++ b/tests/wpt/tests/docs/running-tests/webkitgtk_minibrowser.md @@ -1,22 +1,74 @@ # WebKitGTK MiniBrowser +To be able to run tests with the [WebKitGTK](https://webkitgtk.org/) +MiniBrowser you need the following packages installed: -To be able to run tests with the WebKitGTK MiniBrowser you need the -following packages installed: - -* Fedora: `webkit2gtk3-devel` -* Debian or Ubuntu: `webkit2gtk-driver` - +* Fedora: `webkitgtk6.0` +* Debian or Ubuntu: `webkitgtk-driver` or `webkit2gtk-driver` +* Arch: `webkitgtk-6.0` The WebKitGTK MiniBrowser is not installed on the default binary path. The `wpt` script will try to automatically locate it, but if you need to run it manually you can find it on any of this paths: -* Fedora: `/usr/libexec/webkit2gtk-${VERSION}/MiniBrowser` -* Debian or Ubuntu: `/usr/lib/x86_64-linux-gnu/webkit2gtk-${VERSION}/MiniBrowser` -* Note: - * `VERSION` is `4.0` or `4.1`. - * If not Fedora and the machine architecture is not `x86_64`, then it will - be located inside: - `/usr/lib/${TRIPLET}/webkit2gtk-${VERSION}/MiniBrowser` - where `TRIPLET=$(gcc -dumpmachine)` +* Fedora: `/usr/libexec/webkitgtk-${APIVERSION}/MiniBrowser` +* Arch: `/usr/lib/webkitgtk-${APIVERSION}/MiniBrowser` +* Debian or Ubuntu: `/usr/lib/${TRIPLET}/webkitgtk-${APIVERSION}/MiniBrowser` + * Note: `${TRIPLET}` is the output of the command `gcc -dumpmachine` + +# Nightly universal bundle + +Alternatively you can pass to `wpt` the flags `--install-browser --channel=nightly` +and then `wpt` will automatically download the last bundle and unpack it on the +default `wpt` working directory (usually subdir `_venv3/browsers` in your `wpt` checkout) +Then it will use the unpacked `MiniBrowser` and `WebKitWebDriver` binaries to run the tests. + +This universal bundles should work on any Linux distribution as they include inside +the tarball all the system libraries and resources needed to run WebKitGTK, from libc +up to the Mesa graphics drivers without requiring the usage of containers. + +If you are using proprietary graphics drivers (NVIDIA, AMDGPU PRO, etc) and you experience +issues with this bundle then a possible workaround is to try to run the tests headless +inside a virtualized display like `Xvfb` (see command `xvfb-run -a` on Debian/Ubuntu). +You can do this also from inside a virtual machine or Docker container. + +# Headless mode + +WebKitGTK does not have a native headless mode, but you can workaround that +by running the tests inside a virtualized display. For example you can use +`weston` with the headless backend for a virtualized `Wayland` display, +or you can use `Xvfb` for a virtualized `X11` display. + +Example: + + xvfb-run -a ./wpt run [more-options] webkitgtk_minibrowser [tests-to-run] + + +# Using a custom WebKitGTK build + +If you want to test with a custom WebKitGTK build the easiest way is that you +install this build in a temporary directory (`/tmp/wkgtktest` in this example), +and then tell `wpt` to run it from there. + +Steps: + +1. Build WebKitGTK passing these arguments to `CMake`: + + -DENABLE_MINIBROWSER=ON -DCMAKE_INSTALL_PREFIX=/tmp/wkgtktest + +2. Install it: `ninja install` (or `make install`) +3. Locate the `MiniBrowser` and `WebKitWebDriver` binaries under the install directory. +4. Run `wpt` passing these two paths like this: + + ./wpt run --webdriver-binary=/tmp/wkgtktest/bin/WebKitWebDriver \ + --binary=/tmp/wkgtktest/libexec/MiniBrowser \ + [more-options] webkitgtk_minibrowser [tests-to-run] + +Note: It is important that you build WebKitGTK against the libraries of your system. +Do not build WebKitGTK inside Flatpak or other container unless you run `wpt` also +from inside this container. + +# Running tests locally + +Is a good idea that you increase the verbosity of `wpt` by passing to it the flag `--log-mach=-` +Also, please check the documentation about [Running Tests from the Local System](from-local-system). diff --git a/tests/wpt/tests/docs/running-tests/wpewebkit_minibrowser.md b/tests/wpt/tests/docs/running-tests/wpewebkit_minibrowser.md new file mode 100644 index 00000000000..7721279b041 --- /dev/null +++ b/tests/wpt/tests/docs/running-tests/wpewebkit_minibrowser.md @@ -0,0 +1,70 @@ +# WPE WebKit MiniBrowser + +To be able to run tests with the [WPE WebKit](https://wpewebkit.org) +MiniBrowser you need the following packages installed: + +* Fedora: N/A (build your own or use the nighly bundle) +* Debian or Ubuntu: `wpewebkit-driver` and `libwpewebkit` +* Arch: `wpewebkit` + +The WPE WebKit MiniBrowser is not installed on the default binary path. +The `wpt` script will try to automatically locate it, but if you need +to run it manually you can find it on any of this paths: + +* Arch: `/usr/lib/wpe-webkit-${APIVERSION}/MiniBrowser` +* Debian or Ubuntu: `/usr/lib/${TRIPLET}/wpe-webkit-${APIVERSION}/MiniBrowser` + * Note: `${TRIPLET}` is the output of the command `gcc -dumpmachine` + +# Nightly universal bundle + +Alternatively you can pass to `wpt` the flags `--install-browser --channel=nightly` +and then `wpt` will automatically download the last bundle and unpack it on the +default `wpt` working directory (usually subdir `_venv3/browsers` in your `wpt` checkout) +Then it will use the unpacked `MiniBrowser` and `WPEWebDriver` binaries to run the tests. + +This universal bundles should work on any Linux distribution as they include inside +the tarball all the system libraries and resources needed to run WPE WebKit, from libc +up to the Mesa graphics drivers without requiring the usage of containers. + +If you are using proprietary graphics drivers (NVIDIA, AMDGPU PRO, etc) and you experience +issues with this bundle then a possible workaround is to try to run the tests in +headless mode, for that pass the flag `--headless` to `wpt` + +# Headless mode + +The WPE MiniBrowser needs a Wayland display to run, but if you don't have one +or you want to enable headless mode you can pass the flag `--headless` to `wpt`. + +Example: +``` +./wpt run [more-options] --headless wpewebkit_minibrowser [tests-to-run] +``` + +# Using a custom WPE WebKit build + +If you want to test with a custom WPE WebKit build the easiest way is that you +install this build in a temporary directory (`/tmp/wpetest` in this example), +and then tell `wpt` to run it from there. + +Steps: + +1. Build WPE WebKit passing these arguments to `CMake`: + + -DENABLE_MINIBROWSER=ON -DCMAKE_INSTALL_PREFIX=/tmp/wpetest + +2. Install it: `ninja install` (or `make install`) +3. Locate the `MiniBrowser` and `WPEWebDriver` binaries under the install directory. +4. Run `wpt` passing these two paths like this: + + ./wpt run --webdriver-binary=/tmp/wpetest/bin/WPEWebDriver \ + --binary=/tmp/wpetest/libexec/MiniBrowser \ + [more-options] webkitgtk_minibrowser [tests-to-run] + +Note: It is important that you build WPE WebKit against the libraries of your system. +Do not build WPE WebKit inside Flatpak or other container unless you run `wpt` also +from inside this container. + +# Running tests locally + +Is a good idea that you increase the verbosity of `wpt` by passing to it the flag `--log-mach=-` +Also, please check the documentation about [Running Tests from the Local System](from-local-system). diff --git a/tests/wpt/tests/docs/writing-tests/wdspec.md b/tests/wpt/tests/docs/writing-tests/wdspec.md index 1943fb9e943..f4311dd5044 100644 --- a/tests/wpt/tests/docs/writing-tests/wdspec.md +++ b/tests/wpt/tests/docs/writing-tests/wdspec.md @@ -1,7 +1,8 @@ # wdspec tests The term "wdspec" describes a type of test in WPT which verifies some aspect of -[the WebDriver protocol](https://w3c.github.io/webdriver/). These tests are +[WebDriver Classic](https://w3c.github.io/webdriver/) or +[WebDriver BiDi](https://w3c.github.io/webdriver-bidi) protocols. These tests are written in [the Python programming language](https://www.python.org/) and structured with [the pytest testing framework](https://docs.pytest.org/en/latest/). @@ -66,3 +67,100 @@ a WebDriver session) are defined in terms of Pytest "fixtures" and must be loaded accordingly. For more detail on how to define and use test fixtures, please refer to [the pytest project's documentation on the topic](https://docs.pytest.org/en/latest/fixture.html). + +## WebDriver BiDi + +The wdspec tests for [WebDriver BiDi](https://w3c.github.io/webdriver-bidi) are +located in the `tests/bidi/` and `tests/interop` directories. Tests related to +external specifications are located in `external` subdirectories e.g. +[Permissions](https://www.w3.org/TR/permissions/) tests would go in +`tests/bidi/external/permissions/`. + +The `webdriver.bidi.client.BidiSession` class provides an abstraction for the BiDi +client and contains properties corresponding to the +[WebDriver BiDi modules](https://w3c.github.io/webdriver-bidi/#protocol-modules). It +can be retrieved by fixture `bidi_session`. + +### Extending WebDriver BiDi + +This section describes how to extend the WebDriver BiDi client with an example of +adding support for [Permissions](https://www.w3.org/TR/permissions/). + +#### Adding a New Module + +##### Create `BidiModule` + +BiDi modules are defined in the `tools/webdriver/webdriver/bidi/modules/` directory. +To add a new module called `permissions`, declare a Python class +`webdriver.bidi.modules.permissions.Permissions` that inherits from `BidiModule` and +store it in [`tools/webdriver/webdriver/bidi/modules/permissions.py`](https://github.com/web-platform-tests/wpt/blob/b81831169b8527a6c569a4ad92cf8a1baf4a7118/tools/webdriver/webdriver/bidi/modules/permissions.py#L7): + +```python +class Permissions(BidiModule): + pass +``` + +##### Import the Module in `bidi/modules/__init__.py` + +Import this class in `tools/webdriver/webdriver/bidi/modules/__init__.py`: + +```python +from .permissions import Permissions +``` + +##### Create an Instance of the Module in `webdriver.bidi.client.BidiSession` + +Modify the `webdriver.bidi.client.BidiSession.__init__` method to create an instance +of `Permissions` and store it in a `permissions` [property](https://github.com/web-platform-tests/wpt/blob/b81831169b8527a6c569a4ad92cf8a1baf4a7118/tools/webdriver/webdriver/bidi/client.py#L98): + +```python +self.permissions = modules.Permissions(self) +``` + +#### Adding a New Command + +[WebDriver BiDi commands](https://w3c.github.io/webdriver-bidi/#commands) are +represented as module methods decorated with +`@command` (`webdriver.bidi.modules._module.command`). To add a new command, add +a method with the corresponding name (translated from camel case to snake case) to +the module. The method should return a dictionary that represents the +[command parameters](https://w3c.github.io/webdriver-bidi/#command-command-parameters). + +For example, to add the +[`permissions.setPermission`](https://www.w3.org/TR/permissions/#webdriver-bidi-command-permissions-setPermission) +command, add the following `set_permission` method to the [`Permissions` class](https://github.com/web-platform-tests/wpt/blob/b81831169b8527a6c569a4ad92cf8a1baf4a7118/tools/webdriver/webdriver/bidi/modules/permissions.py#L9): + +```python +from ._module import command +... +class Permissions(BidiModule): +... + @command + def set_permission(self, + descriptor: Union[Optional[Mapping[str, Any]], Undefined] = UNDEFINED, + state: Union[Optional[str], Undefined] = UNDEFINED, + origin: Union[Optional[str], Undefined] = UNDEFINED, + user_context: Union[Optional[str], Undefined] = UNDEFINED) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = { + "descriptor": descriptor, + "state": state, + "origin": origin, + "userContext": user_context, + } + return params +``` + +### Adding Tests + +Generally, a single test file should contain tests for a single parameter or feature +and stored in `webdriver/tests/bidi/{MODULE}/{METHOD}/{FEATURE}.py` +For example, tests for +[`permissions.setPermission`](https://www.w3.org/TR/permissions/#webdriver-bidi-command-permissions-setPermission) +could be split into: + +* Invalid parameters: [`set_permission/invalid.py`](https://github.com/web-platform-tests/wpt/blob/aa019e3ff08cc75644edca41cfb095601477cb9d/webdriver/tests/bidi/external/permissions/set_permission/invalid.py) +* Common scenarios: [`set_permission/set_permission.py`](https://github.com/web-platform-tests/wpt/blob/aa019e3ff08cc75644edca41cfb095601477cb9d/webdriver/tests/bidi/external/permissions/set_permission/set_permission.py) +* User context: [`set_permission/user_context.py`](https://github.com/web-platform-tests/wpt/blob/master/webdriver/tests/bidi/external/permissions/set_permission/user_context.py) + +Tests should use `bidi_session`'s modules' methods to send commands and verify its +side effects. diff --git a/tests/wpt/tests/dom/idlharness-shadowrealm.window.js b/tests/wpt/tests/dom/idlharness-shadowrealm.window.js deleted file mode 100644 index d9312080264..00000000000 --- a/tests/wpt/tests/dom/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["dom"], ["html"]); diff --git a/tests/wpt/tests/dom/idlharness.any.js b/tests/wpt/tests/dom/idlharness.any.js index 26da3ab3bf9..98463561098 100644 --- a/tests/wpt/tests/dom/idlharness.any.js +++ b/tests/wpt/tests/dom/idlharness.any.js @@ -1,4 +1,4 @@ -// META: global=worker +// META: global=worker,shadowrealm-in-window // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: timeout=long diff --git a/tests/wpt/tests/editing/data/inserthtml.js b/tests/wpt/tests/editing/data/inserthtml.js index 412fa63ef31..fcfc32f1e92 100644 --- a/tests/wpt/tests/editing/data/inserthtml.js +++ b/tests/wpt/tests/editing/data/inserthtml.js @@ -487,7 +487,7 @@ var browserTests = [ {"inserthtml":[false,false,"",false,false,""]}], ["

{}

", [["inserthtml",""]], - "

{}

", + "

{}

", [true], {"inserthtml":[false,false,"",false,false,""]}], ["

{}

", @@ -521,7 +521,7 @@ var browserTests = [ {"inserthtml":[false,false,"",false,false,""]}], ["


{}

", [["inserthtml",""]], - "


", + "

", [true], {"inserthtml":[false,false,"",false,false,""]}], ["


{}

", @@ -567,19 +567,21 @@ var browserTests = [ {"inserthtml":[false,false,"",false,false,""]}], ["
[1234]
", [["inserthtml","
abc
"]], - "
abc
", + ["
abc
", + "
abc
"], [true], {"inserthtml":[false,false,"",false,false,""]}], // Empty inline elements shouldn't be deleted if they are inserted intentionally ["
a[]b
", [["inserthtml",""]], - "
ab
", + ["
ab
","
ab
"], [true], {"inserthtml":[false,false,"",false,false,""]}], ["
a[]c
", [["inserthtml","b"]], - "
abc
", + ["
abc
", + "
abc
"], [true], {"inserthtml":[false,false,"",false,false,""]}], ["{}", diff --git a/tests/wpt/tests/encoding/idlharness-shadowrealm.window.js b/tests/wpt/tests/encoding/idlharness-shadowrealm.window.js deleted file mode 100644 index 205b35cf04a..00000000000 --- a/tests/wpt/tests/encoding/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["encoding"], ["streams"]); diff --git a/tests/wpt/tests/encoding/idlharness.any.js b/tests/wpt/tests/encoding/idlharness.any.js index acd100c43b4..2617913c7a4 100644 --- a/tests/wpt/tests/encoding/idlharness.any.js +++ b/tests/wpt/tests/encoding/idlharness.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm-in-window // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js diff --git a/tests/wpt/tests/event-timing/modal-dialog-interrupt-paint.html b/tests/wpt/tests/event-timing/modal-dialog-interrupt-paint.html index 011311a03a3..1ac76810b1b 100644 --- a/tests/wpt/tests/event-timing/modal-dialog-interrupt-paint.html +++ b/tests/wpt/tests/event-timing/modal-dialog-interrupt-paint.html @@ -16,6 +16,9 @@ const events = ['click']; const showModalDialog = () => { alert(); + // Stay busy for a few more ms after dialog closes, to ensure processingEnd + // time is far from startTime + duration + mainThreadBusy(16); }; document.getElementById('testButtonId').addEventListener("click", showModalDialog); diff --git a/tests/wpt/tests/fenced-frame/resources/unfenced-top-target.html b/tests/wpt/tests/fenced-frame/resources/unfenced-top-target.html new file mode 100644 index 00000000000..9838f400e11 --- /dev/null +++ b/tests/wpt/tests/fenced-frame/resources/unfenced-top-target.html @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/tests/wpt/tests/fenced-frame/unfenced-top-navigation-default.https.html b/tests/wpt/tests/fenced-frame/unfenced-top-navigation-default.https.html new file mode 100644 index 00000000000..9daa0117fe4 --- /dev/null +++ b/tests/wpt/tests/fenced-frame/unfenced-top-navigation-default.https.html @@ -0,0 +1,37 @@ + +Test '_unfencedTop' navigation from a default-mode fenced frame + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js index 75a8b8368d4..44a5f284110 100644 --- a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js +++ b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js @@ -33,6 +33,7 @@ subsetTest(promise_test, async test => { "adComponentsLimit": 40, "joinCount": 1, "bidCount": 0, + "multiBidLimit": 1, "prevWinsMs": [] } let biddingLogicURL = createBiddingScriptURL( diff --git a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js index 6f16e5e1e8c..8e387588aa9 100644 --- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js +++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js @@ -2,7 +2,9 @@ const BASE_URL = document.baseURI.substring(0, document.baseURI.lastIndexOf('/') + 1); const BASE_PATH = (new URL(BASE_URL)).pathname; -const RESOURCE_PATH = `${BASE_PATH}resources/` + +// Allow overriding to allow other repositories to use these utility functions. +RESOURCE_PATH = `${BASE_PATH}resources/` const DEFAULT_INTEREST_GROUP_NAME = 'default name'; diff --git a/tests/wpt/tests/fullscreen/api/element-request-fullscreen-timing.html b/tests/wpt/tests/fullscreen/api/element-request-fullscreen-timing.html index 9ed6dc14936..19ef0b3f2a0 100644 --- a/tests/wpt/tests/fullscreen/api/element-request-fullscreen-timing.html +++ b/tests/wpt/tests/fullscreen/api/element-request-fullscreen-timing.html @@ -22,7 +22,8 @@ promise_test(async t => { if (event.type == 'fullscreenchange') { step_timeout(t.unreached_func('timer callback')); requestAnimationFrame(t.step_func_done(() => { - assert_array_equals(events, ['resize', 'fullscreenchange'], 'event order'); + // Removed 'resize' expectation for now, see https://crbug.com/381127087. + assert_array_equals(events, ['fullscreenchange'], 'event order'); resolve(); })); } diff --git a/tests/wpt/tests/hr-time/idlharness-shadowrealm.window.js b/tests/wpt/tests/hr-time/idlharness-shadowrealm.window.js deleted file mode 100644 index b5b2a2d3efd..00000000000 --- a/tests/wpt/tests/hr-time/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["hr-time"], ["html", "dom"]); diff --git a/tests/wpt/tests/hr-time/idlharness.any.js b/tests/wpt/tests/hr-time/idlharness.any.js index 6676b001a8b..2a6e6b81af8 100644 --- a/tests/wpt/tests/hr-time/idlharness.any.js +++ b/tests/wpt/tests/hr-time/idlharness.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm-in-window // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: timeout=long @@ -11,6 +11,10 @@ idl_test( ['hr-time'], ['html', 'dom'], async idl_array => { + if (self.GLOBAL.isShadowRealm()) { + return; + } + if (self.GLOBAL.isWorker()) { idl_array.add_objects({ WorkerGlobalScope: ['self'] }); } else { diff --git a/tests/wpt/tests/html/browsers/windows/consume-user-activation/window-open.html b/tests/wpt/tests/html/browsers/windows/consume-user-activation/window-open.html index 8328d99a1de..5304c656b2d 100644 --- a/tests/wpt/tests/html/browsers/windows/consume-user-activation/window-open.html +++ b/tests/wpt/tests/html/browsers/windows/consume-user-activation/window-open.html @@ -15,5 +15,19 @@ promise_test(async function(t) { testWin.close(); }); assert_false(navigator.userActivation.isActive, "User activation should be consumed"); -}); +}, "Opening a new window should consume user activation"); + +promise_test(async function(t) { + await test_driver.bless("user activation"); + const testWin = window.open("/resources/blank.html", "testWindow"); + assert_false(navigator.userActivation.isActive, "User activation should be consumed"); + t.add_cleanup(() => { + testWin.close(); + }); + + // Open the existing window again + await test_driver.bless("user activation"); + const testWin2 = window.open("/resources/blank.html", "testWindow"); + assert_true(navigator.userActivation.isActive, "User activation should not be consumed"); +}, "Opening an existing window should not consume user activation"); diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/noopener/coop-noopener-allow-popups.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/coop-noopener-allow-popups.https.html similarity index 86% rename from tests/wpt/tests/html/cross-origin-opener-policy/tentative/noopener/coop-noopener-allow-popups.https.html rename to tests/wpt/tests/html/cross-origin-opener-policy/coop-noopener-allow-popups.https.html index e8a1ea00092..80f205c13e3 100644 --- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/noopener/coop-noopener-allow-popups.https.html +++ b/tests/wpt/tests/html/cross-origin-opener-policy/coop-noopener-allow-popups.https.html @@ -9,8 +9,8 @@ - - + + diff --git a/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js b/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js index e6c9001c7f5..748130dfdc2 100644 --- a/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js +++ b/tests/wpt/tests/html/document-isolation-policy/credentialless-dedicated-worker.https.tentative.window.js @@ -29,7 +29,7 @@ promise_test(async test => { // One window with DIP:isolate-and-credentialless. (experiment) const w_credentialless_token = token(); const w_credentialless_url = same_origin + executor_path + - coep_credentialless + `&uuid=${w_credentialless_token}`; + dip_credentialless + `&uuid=${w_credentialless_token}`; const w_credentialless = window.open(w_credentialless_url); add_completion_callback(() => w_credentialless.close()); @@ -48,16 +48,12 @@ promise_test(async test => { const worker_token_2 = token(); // Used to check for errors creating the DedicatedWorker. - const worker_error_1 = token(); - const worker_error_2 = token(); + const worker_error = token(); const w_worker_src_1 = same_origin + executor_worker_path + coep_for_worker + `&uuid=${worker_token_1}`; send(w_control_token, ` - new Worker("${w_worker_src_1}", {}); - worker.onerror = () => { - send("${worker_error_1}", "Worker blocked"); - } + const worker = new Worker("${w_worker_src_1}", {}); `); const w_worker_src_2 = same_origin + executor_worker_path + @@ -65,7 +61,7 @@ promise_test(async test => { send(w_credentialless_token, ` const worker = new Worker("${w_worker_src_2}", {}); worker.onerror = () => { - send("${worker_error_2}", "Worker blocked"); + send("${worker_error}", "Worker blocked"); } `); @@ -82,16 +78,13 @@ promise_test(async test => { fetch("${request_url_2}", {mode: 'no-cors', credentials: 'include'}); `); - const response_control = await Promise.race([ - receive(worker_error_1), - receive(request_token_1).then(GetCookie) - ]); + const response_control = await receive(request_token_1).then(GetCookie); assert_equals(response_control, expected_cookies_control, "coep:none => "); const response_credentialless = await Promise.race([ - receive(worker_error_2), + receive(worker_error), receive(request_token_2).then(GetCookie) ]); assert_equals(response_credentialless, @@ -118,7 +111,7 @@ promise_test(async test => { dedicatedWorkerTest("cross-origin", cross_origin, dip_none, cookie_cross_origin, - "Worker blocked" // Owner's policy is credentialles, so we can't + "Worker blocked" // Owner's policy is credentialless, so we can't // create a worker with coep_none. ); diff --git a/tests/wpt/tests/html/dom/idlharness-shadowrealm.window.js b/tests/wpt/tests/html/dom/idlharness-shadowrealm.window.js deleted file mode 100644 index e0f2691ce2a..00000000000 --- a/tests/wpt/tests/html/dom/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["html"], ["wai-aria", "SVG", "cssom", "touch-events", "uievents", "dom", "xhr", "FileAPI", "mediacapture-streams", "performance-timeline"]); diff --git a/tests/wpt/tests/html/dom/idlharness.worker.js b/tests/wpt/tests/html/dom/idlharness.any.js similarity index 72% rename from tests/wpt/tests/html/dom/idlharness.worker.js rename to tests/wpt/tests/html/dom/idlharness.any.js index 88942ddfea1..399588dce1e 100644 --- a/tests/wpt/tests/html/dom/idlharness.worker.js +++ b/tests/wpt/tests/html/dom/idlharness.any.js @@ -1,12 +1,17 @@ -"use strict"; +// META: global=dedicatedworker,shadowrealm-in-window +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js -importScripts("/resources/testharness.js"); -importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js"); +"use strict"; idl_test( ["html"], ["wai-aria", "dom", "cssom", "touch-events", "uievents", "performance-timeline"], idlArray => { + if (self.GLOBAL.isShadowRealm()) { + return; + } + idlArray.add_untested_idls('typedef Window WindowProxy;'); idlArray.add_objects({ WorkerLocation: ['self.location'], @@ -18,5 +23,3 @@ idl_test( }); } ); - -done(); diff --git a/tests/wpt/tests/html/semantics/forms/the-option-element/dynamic-content-change-rendering.html b/tests/wpt/tests/html/semantics/forms/the-option-element/dynamic-content-change-rendering.html index 1108c45e11b..78896483ecb 100644 --- a/tests/wpt/tests/html/semantics/forms/the-option-element/dynamic-content-change-rendering.html +++ b/tests/wpt/tests/html/semantics/forms/the-option-element/dynamic-content-change-rendering.html @@ -4,7 +4,7 @@ - + diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex.tentative.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex.tentative.html index aa45ecaad4f..0d300595287 100644 --- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex.tentative.html +++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-popover-closedby-complex.tentative.html @@ -24,6 +24,7 @@ #popoverA { top: 150px; bottom: auto; padding:0; } #dialogB { top: 200px; bottom: auto; padding:0; } #popoverB { top: 250px; bottom: auto; padding:0; } + dialog { position: fixed; } + + + + + +
+
+
+ +
+
+
+ + + + diff --git a/tests/wpt/tests/html/webappapis/the-shadowrealmglobalscope-interface/self.any.js b/tests/wpt/tests/html/webappapis/the-shadowrealmglobalscope-interface/self.any.js new file mode 100644 index 00000000000..0cb7950c7c5 --- /dev/null +++ b/tests/wpt/tests/html/webappapis/the-shadowrealmglobalscope-interface/self.any.js @@ -0,0 +1,48 @@ +// META: title=The self attribute +// META: global=shadowrealm + +test(() => { + assert_equals(self, globalThis, "self should be the same object as globalThis"); +}, "self attribute is the global object"); + +test(() => { + assert_equals(self, self.self, "self should be the same object as self.self"); +}, "self attribute is the object itself"); + +test(() => { + assert_own_property(globalThis, "self", "self should be an own property"); + assert_readonly(globalThis, "self", "self should be a read-only property"); +}, "self is a readonly attribute"); + +test(() => { + // https://webidl.spec.whatwg.org/#define-the-attributes + const descr = Object.getOwnPropertyDescriptor(self, "self"); + assert_equals(descr.value, undefined, "self should be an accessor property"); + assert_true(descr.enumerable, "self should be enumerable"); + assert_true(descr.configurable, "self should be configurable"); +}, "self property descriptor"); + +test(() => { + const getter = Object.getOwnPropertyDescriptor(self, "self").get; + assert_equals(getter.name, "get self", "function should be named 'get self'"); +}, "self getter name"); + +test(() => { + const getter = Object.getOwnPropertyDescriptor(self, "self").get; + assert_equals(getter.length, 0, "function should take 0 arguments"); +}, "self getter length"); + +test(() => { + // https://webidl.spec.whatwg.org/#dfn-attribute-getter + const getter = Object.getOwnPropertyDescriptor(self, "self").get; + + assert_throws_js(TypeError, () => getter.call({}), + "the self getter should fail a brand check if it's an object not implementing ShadowRealmGlobalScope"); + assert_throws_js(TypeError, () => getter.call(42), + "the self getter should fail a brand check if a primitive"); + + assert_equals(getter.call(null), self, + "the self getter's this object should fall back to the realm's global object if null"); + assert_equals(getter.call(undefined), self, + "the self getter's this object should fall back to the realm's global object if undefined"); +}, "self getter steps"); diff --git a/tests/wpt/tests/infrastructure/testdriver/actions/touchEvents.js b/tests/wpt/tests/infrastructure/testdriver/actions/touchEvents.js index c1213b6693b..8424eedbe9f 100644 --- a/tests/wpt/tests/infrastructure/testdriver/actions/touchEvents.js +++ b/tests/wpt/tests/infrastructure/testdriver/actions/touchEvents.js @@ -1,6 +1,26 @@ function eventEquals(e, expected) { for (const prop of Object.keys(expected)) { - assert_equals(e[prop], expected[prop], `Event ${e.type} pointerId ${e.pointerId} property ${prop}`); + switch (prop) { + case "screenX": + case "screenY": + case "clientX": + case "clientY": + case "offsetX": + case "offsetY": + case "pageX": + case "pageY": + assert_true( + e[prop] >= expected[prop] - 0.5 && + e[prop] <= expected[prop] + 0.5, + `Event ${e.type} pointerId ${e.pointerId} property ${prop}, expected: ${ + expected[prop] + } ± 0.5, but got: ${e[prop]}` + ); + break; + default: + assert_equals(e[prop], expected[prop], `Event ${e.type} pointerId ${e.pointerId} property ${prop}`); + break; + } } } diff --git a/tests/wpt/tests/interfaces/compute-pressure.idl b/tests/wpt/tests/interfaces/compute-pressure.idl index 77537feb106..92bcc6e55e7 100644 --- a/tests/wpt/tests/interfaces/compute-pressure.idl +++ b/tests/wpt/tests/interfaces/compute-pressure.idl @@ -3,7 +3,7 @@ // (https://github.com/w3c/webref) // Source: Compute Pressure Level 1 (https://w3c.github.io/compute-pressure/) -enum PressureSource { "thermals", "cpu" }; +enum PressureSource { "cpu" }; enum PressureState { "nominal", "fair", "serious", "critical" }; diff --git a/tests/wpt/tests/interfaces/fedcm.idl b/tests/wpt/tests/interfaces/fedcm.idl index c308ee273b9..16b5b2faf10 100644 --- a/tests/wpt/tests/interfaces/fedcm.idl +++ b/tests/wpt/tests/interfaces/fedcm.idl @@ -53,7 +53,9 @@ dictionary IdentityProviderRequestOptions : IdentityProviderConfig { }; dictionary IdentityProviderWellKnown { - required sequence provider_urls; + sequence provider_urls; + USVString accounts_endpoint; + USVString login_url; }; dictionary IdentityProviderIcon { diff --git a/tests/wpt/tests/interfaces/html.idl b/tests/wpt/tests/interfaces/html.idl index aefa95dbd82..d4f8b9a7680 100644 --- a/tests/wpt/tests/interfaces/html.idl +++ b/tests/wpt/tests/interfaces/html.idl @@ -2520,6 +2520,11 @@ interface MessageChannel { readonly attribute MessagePort port2; }; +interface mixin MessageEventTarget { + attribute EventHandler onmessage; + attribute EventHandler onmessageerror; +}; + [Exposed=(Window,Worker,AudioWorklet), Transferable] interface MessagePort : EventTarget { undefined postMessage(any message, sequence transfer); @@ -2528,11 +2533,11 @@ interface MessagePort : EventTarget { undefined close(); // event handlers - attribute EventHandler onmessage; - attribute EventHandler onmessageerror; attribute EventHandler onclose; }; +MessagePort includes MessageEventTarget; + dictionary StructuredSerializeOptions { sequence transfer = []; }; @@ -2571,11 +2576,10 @@ interface DedicatedWorkerGlobalScope : WorkerGlobalScope { undefined postMessage(any message, optional StructuredSerializeOptions options = {}); undefined close(); - - attribute EventHandler onmessage; - attribute EventHandler onmessageerror; }; +DedicatedWorkerGlobalScope includes MessageEventTarget; + [Global=(Worker,SharedWorker),Exposed=SharedWorker] interface SharedWorkerGlobalScope : WorkerGlobalScope { [Replaceable] readonly attribute DOMString name; @@ -2597,8 +2601,6 @@ interface Worker : EventTarget { undefined postMessage(any message, sequence transfer); undefined postMessage(any message, optional StructuredSerializeOptions options = {}); - attribute EventHandler onmessage; - attribute EventHandler onmessageerror; }; dictionary WorkerOptions { @@ -2610,6 +2612,7 @@ dictionary WorkerOptions { enum WorkerType { "classic", "module" }; Worker includes AbstractWorker; +Worker includes MessageEventTarget; [Exposed=Window] interface SharedWorker : EventTarget { diff --git a/tests/wpt/tests/interfaces/long-animation-frames.idl b/tests/wpt/tests/interfaces/long-animation-frames.idl index 79a42ca8f0a..de0d7c9a66a 100644 --- a/tests/wpt/tests/interfaces/long-animation-frames.idl +++ b/tests/wpt/tests/interfaces/long-animation-frames.idl @@ -19,6 +19,8 @@ interface PerformanceLongAnimationFrameTiming : PerformanceEntry { [Default] object toJSON(); }; +PerformanceLongAnimationFrameTiming includes PaintTimingMixin; + enum ScriptInvokerType { "classic-script", "module-script", diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl index 112fa2bf832..9f17b6ceb71 100644 --- a/tests/wpt/tests/interfaces/webnn.idl +++ b/tests/wpt/tests/interfaces/webnn.idl @@ -33,6 +33,7 @@ interface ML { }; typedef record MLNamedArrayBufferViews; +typedef record MLNamedTensors; dictionary MLComputeResult { MLNamedArrayBufferViews inputs; @@ -41,8 +42,17 @@ dictionary MLComputeResult { [SecureContext, Exposed=(Window, DedicatedWorker)] interface MLContext { + // ISSUE(791): compute() will soon be removed in favor of dispatch(). Promise compute( MLGraph graph, MLNamedArrayBufferViews inputs, MLNamedArrayBufferViews outputs); + undefined dispatch(MLGraph graph, MLNamedTensors inputs, MLNamedTensors outputs); + + Promise createTensor(MLTensorDescriptor descriptor); + + Promise readTensor(MLTensor tensor); + Promise readTensor(MLTensor tensor, AllowSharedBufferSource outputData); + + undefined writeTensor(MLTensor tensor, AllowSharedBufferSource inputData); MLOpSupportLimits opSupportLimits(); }; @@ -105,6 +115,21 @@ dictionary MLOperatorOptions { typedef (bigint or unrestricted double) MLNumber; +dictionary MLTensorDescriptor : MLOperandDescriptor { + boolean readable = false; + boolean writable = false; +}; + +[SecureContext, Exposed=(Window, DedicatedWorker)] +interface MLTensor { + readonly attribute MLOperandDataType dataType; + readonly attribute FrozenArray shape; + readonly attribute boolean readable; + readonly attribute boolean writable; + + undefined destroy(); +}; + typedef record MLNamedOperands; [SecureContext, Exposed=(Window, DedicatedWorker)] diff --git a/tests/wpt/tests/largest-contentful-paint/animated/observe-cross-origin-animated-image.tentative.html b/tests/wpt/tests/largest-contentful-paint/animated/observe-cross-origin-animated-image.tentative.html index 993883c607b..49207f9d690 100644 --- a/tests/wpt/tests/largest-contentful-paint/animated/observe-cross-origin-animated-image.tentative.html +++ b/tests/wpt/tests/largest-contentful-paint/animated/observe-cross-origin-animated-image.tentative.html @@ -23,7 +23,7 @@ const entry = await load_and_observe(url); // anim-gr.png is 100 by 50. const size = 100 * 50; - checkImage(entry, url, 'image_id', size, beforeLoad, ["renderTimeIs0", "animated-zero"]); + checkImage(entry, url, 'image_id', size, beforeLoad, ["animated"]); }, "Same origin animated image is observable and has a first frame."); diff --git a/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js b/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js index d206beaef99..1333e9640ad 100644 --- a/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js +++ b/tests/wpt/tests/largest-contentful-paint/resources/largest-contentful-paint-helpers.js @@ -40,8 +40,6 @@ function checkImage(entry, expectedUrl, expectedID, expectedSize, timeLowerBound if (options.includes('skip')) { return; } - assert_between_inclusive(entry.loadTime, timeLowerBound, entry.renderTime, - 'loadTime should occur between the lower bound and the renderTime'); assert_greater_than_equal(performance.now(), entry.renderTime, 'renderTime should occur before the entry is dispatched to the observer.'); assert_approx_equals(entry.startTime, entry.renderTime, 0.001, @@ -55,14 +53,14 @@ function checkImage(entry, expectedUrl, expectedID, expectedSize, timeLowerBound } if (options.includes('animated')) { - assert_greater_than(entry.loadTime, entry.firstAnimatedFrameTime, - 'firstAnimatedFrameTime should be smaller than loadTime'); - assert_greater_than(entry.renderTime, entry.firstAnimatedFrameTime, - 'firstAnimatedFrameTime should be smaller than renderTime'); - assert_less_than(entry.firstAnimatedFrameTime, image_delay, - 'firstAnimatedFrameTime should be smaller than the delay applied to the second frame'); - assert_greater_than(entry.firstAnimatedFrameTime, 0, - 'firstAnimatedFrameTime should be larger than 0'); + assert_less_than(entry.renderTime, image_delay, + 'renderTime should be smaller than the delay applied to the second frame'); + assert_greater_than(entry.renderTime, 0, + 'renderTime should be larger than 0'); + } + else { + assert_between_inclusive(entry.loadTime, timeLowerBound, entry.renderTime, + 'loadTime should occur between the lower bound and the renderTime'); } } diff --git a/tests/wpt/tests/lint.ignore b/tests/wpt/tests/lint.ignore index ee19f061a74..32c22fecfec 100644 --- a/tests/wpt/tests/lint.ignore +++ b/tests/wpt/tests/lint.ignore @@ -28,6 +28,7 @@ TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.mp3 TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.m4a TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.mov TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.oga +TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.ogg TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.ogv TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.webm TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.mp4 @@ -608,6 +609,9 @@ WEB-PLATFORM.TEST:web-bundle/resources/wbn/*.wbn WEB-PLATFORM.TEST:web-bundle/subresource-loading/*.html WEB-PLATFORM.TEST:web-bundle/subresource-loading/resources/*.js +# The /.well-known/shared-stored/trusted-origins file uses hard-coded hosts +WEB-PLATFORM.TEST:shared-storage/resources/trusted-origins.py + # Tests that depend on resources in /gen/ in Chromium: # https://github.com/web-platform-tests/wpt/issues/16455 # Please consult with ecosystem-infra@chromium.org before adding more. diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-basic.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-basic.html index c6d3f8e32a2..aebfac5391c 100644 --- a/tests/wpt/tests/long-animation-frame/tentative/loaf-basic.html +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-basic.html @@ -12,16 +12,16 @@ diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-event-blocking-duration.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-event-blocking-duration.html index ed31244a1d6..34ea08a81e3 100644 --- a/tests/wpt/tests/long-animation-frame/tentative/loaf-event-blocking-duration.html +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-event-blocking-duration.html @@ -15,7 +15,7 @@ + +

Long Animation Frame: script blocks

@@ -26,7 +32,7 @@ promise_test(async t => { test_self_script_block(t => { const script = document.createElement("script"); script.type = "module"; - script.innerHTML = `(${busy_wait.toString()})()`; + script.innerHTML = `window.generate_loaf_now()`; document.body.appendChild(script); }, location.href, "module-script"); @@ -53,8 +59,7 @@ test_self_script_block(t => { }, new URL("resources/busy.js?import", location.href).href, "module-script"); const busy_wait_str = ` (function() { - const deadline = performance.now() + 365; - while (performance.now() < deadline) {} + generate_loaf_now(); })() `; diff --git a/tests/wpt/tests/long-animation-frame/tentative/loaf-script-nested-callback.html b/tests/wpt/tests/long-animation-frame/tentative/loaf-script-nested-callback.html index 8d1304fc802..c6fe2c8e7bc 100644 --- a/tests/wpt/tests/long-animation-frame/tentative/loaf-script-nested-callback.html +++ b/tests/wpt/tests/long-animation-frame/tentative/loaf-script-nested-callback.html @@ -13,7 +13,7 @@
diff --git a/tests/wpt/tests/mediacapture-record/MediaRecorder-mimetype.html b/tests/wpt/tests/mediacapture-record/MediaRecorder-mimetype.html index e54341ba77c..17eec0f6bf6 100644 --- a/tests/wpt/tests/mediacapture-record/MediaRecorder-mimetype.html +++ b/tests/wpt/tests/mediacapture-record/MediaRecorder-mimetype.html @@ -36,8 +36,8 @@ const VIDEO_CODECS_MIME_TYPES = [ 'video/webm; codecs="av1"', 'video/mp4; codecs="avc1"', 'video/mp4; codecs="vp9"', - 'video/mp4; codecs="hvc1"', - 'video/x-matroska; codecs="hvc1"', + 'video/mp4; codecs="hvc1.1.6.L186.B0"', + 'video/x-matroska; codecs="hvc1.1.6.L186.B0"', ]; const AUDIO_VIDEO_MIME_TYPES = [ @@ -48,9 +48,9 @@ const AUDIO_VIDEO_MIME_TYPES = [ 'video/webm; codecs="av1, opus"', 'video/mp4; codecs="avc1, mp4a.40.2"', 'video/mp4; codecs="vp9, opus"', - 'video/mp4; codecs="hvc1, mp4a.40.2"', - 'video/mp4; codecs="hvc1, opus"', - 'video/x-matroska; codecs="hvc1, opus"', + 'video/mp4; codecs="hvc1.1.6.L186.B0, mp4a.40.2"', + 'video/mp4; codecs="hvc1.1.6.L186.B0, opus"', + 'video/x-matroska; codecs="hvc1.1.6.L186.B0, opus"', ]; const AUDIO_MIME_TYPES = [ diff --git a/tests/wpt/tests/mediacapture-record/MediaRecorder-pause-resume.html b/tests/wpt/tests/mediacapture-record/MediaRecorder-pause-resume.html index 12c1c6fcbf6..1797953a0a2 100644 --- a/tests/wpt/tests/mediacapture-record/MediaRecorder-pause-resume.html +++ b/tests/wpt/tests/mediacapture-record/MediaRecorder-pause-resume.html @@ -13,9 +13,9 @@ - - - + + + diff --git a/tests/wpt/tests/mediacapture-record/MediaRecorder-peerconnection.https.html b/tests/wpt/tests/mediacapture-record/MediaRecorder-peerconnection.https.html index e63831ab4f9..f956a3d1e55 100644 --- a/tests/wpt/tests/mediacapture-record/MediaRecorder-peerconnection.https.html +++ b/tests/wpt/tests/mediacapture-record/MediaRecorder-peerconnection.https.html @@ -18,9 +18,9 @@ - - - + + + - - - + + + diff --git a/tests/wpt/tests/navigation-api/navigate-event/cross-origin-traversal-redirect.html b/tests/wpt/tests/navigation-api/navigate-event/cross-origin-traversal-redirect.html index 24ccc0956ac..f7bebae5100 100644 --- a/tests/wpt/tests/navigation-api/navigate-event/cross-origin-traversal-redirect.html +++ b/tests/wpt/tests/navigation-api/navigate-event/cross-origin-traversal-redirect.html @@ -3,10 +3,11 @@ + + diff --git a/tests/wpt/tests/performance-timeline/idlharness-shadowrealm.window.js b/tests/wpt/tests/performance-timeline/idlharness-shadowrealm.window.js deleted file mode 100644 index 671c172d3e6..00000000000 --- a/tests/wpt/tests/performance-timeline/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["performance-timeline"], ["hr-time", "dom"]); diff --git a/tests/wpt/tests/performance-timeline/idlharness.any.js b/tests/wpt/tests/performance-timeline/idlharness.any.js index 32efebe98ff..fb4d6ffa56a 100644 --- a/tests/wpt/tests/performance-timeline/idlharness.any.js +++ b/tests/wpt/tests/performance-timeline/idlharness.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm-in-window // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js @@ -10,6 +10,10 @@ idl_test( ['performance-timeline'], ['hr-time', 'dom'], async idl_array => { + if (self.GLOBAL.isShadowRealm()) { + return; + } + idl_array.add_objects({ Performance: ['performance'], PerformanceObserver: ['observer'], diff --git a/tests/wpt/tests/permissions-policy/resources/permissions-policy-payment-extension.html b/tests/wpt/tests/permissions-policy/resources/permissions-policy-payment-extension.html index a4ac736293d..9d74c4684bb 100644 --- a/tests/wpt/tests/permissions-policy/resources/permissions-policy-payment-extension.html +++ b/tests/wpt/tests/permissions-policy/resources/permissions-policy-payment-extension.html @@ -15,7 +15,7 @@ let authenticatorArgs = { window.onload = async function() { test_driver.set_test_context(parent); - await window.test_driver.add_virtual_authenticator(authenticatorArgs); + const authenticator = await window.test_driver.add_virtual_authenticator(authenticatorArgs); let enabled = true; let name = `OK`; try { @@ -56,6 +56,7 @@ window.onload = async function() { enabled = false; name = e.name; } + await window.test_driver.remove_virtual_authenticator(authenticator); parent.postMessage({ type: 'availability-result', enabled, name }, '*'); } diff --git a/tests/wpt/tests/pointerevents/pointerevent_fractional_coordinates_untrusted.html b/tests/wpt/tests/pointerevents/pointerevent_fractional_coordinates_untrusted.html new file mode 100644 index 00000000000..1a14b0659c0 --- /dev/null +++ b/tests/wpt/tests/pointerevents/pointerevent_fractional_coordinates_untrusted.html @@ -0,0 +1,192 @@ + + + + + +Fractional coordinates of untrusted events + + + + + + diff --git a/tests/wpt/tests/pointerevents/pointerevent_pointercapture_in_frame.html b/tests/wpt/tests/pointerevents/pointerevent_pointercapture_in_frame.html index 14be00968fa..9c26c4d5a38 100644 --- a/tests/wpt/tests/pointerevents/pointerevent_pointercapture_in_frame.html +++ b/tests/wpt/tests/pointerevents/pointerevent_pointercapture_in_frame.html @@ -59,9 +59,8 @@ var eventTimeout = ()=>(()=>new Promise((resolve, reject)=>{ function handleEvent(event) { if (event.type == 'pointerdown') { start_logging = true; - if (document.setPointerCaptureOnPointerDown) { - event.target.setPointerCapture(event.pointerId); - } + const target = document.captureTargetOverride || event.target; + target.setPointerCapture(event.pointerId); } // Only log the first pointermove event after pointerdown. We need to account @@ -84,7 +83,7 @@ document.testEventList.forEach(function(eventName) { }); function Reset() { - document.setPointerCaptureOnPointerDown = false; + document.captureTargetOverride = null; document.releasePointerCaptureOnFirstMove = false; receivedEventList = []; start_logging = false; @@ -92,10 +91,10 @@ function Reset() { } function run() { + Reset(); var pointerType = location.search.substring(1); promise_test (async(t) => { - Reset(); - document.setPointerCaptureOnPointerDown = true; + t.add_cleanup(Reset); expectedEventList = ["innerFrame received pointerdown", "innerFrame received gotpointercapture", "innerFrame received pointermove", @@ -124,12 +123,42 @@ function run() { // Wait for lostpointercapture to fire. await watcher_promise; assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList); - document.setPointerCaptureOnPointerDown = false; }, "Test " + pointerType + "pointer capture in same-origin frame: Pointer down at inner frame and set pointer capture."); promise_test (async(t) => { - Reset(); - document.setPointerCaptureOnPointerDown = true; + t.add_cleanup(Reset); + document.captureTargetOverride = document.getElementById('outerFrame'); + expectedEventList = ["innerFrame received pointerdown", + "innerFrame received pointermove", + "innerFrameDocument received pointerup"]; + var pointerId = pointerType + "Pointer1"; + + var innerFrame = document.getElementById('innerFrameElement'); + var innerFrameDocument = innerFrame.contentDocument; + // We are interested in tracking events only after pointerdown + var pointerdown_happened = new Promise((resolve, reject)=>{innerFrameDocument.addEventListener("pointerdown",resolve);}); + + var watcher_promise = pointerdown_happened.then(()=>{ + var watch_inner_frame = new EventWatcher(t, innerFrameDocument, ["pointerup"], eventTimeout()); + return watch_inner_frame.wait_for(["pointerup"]); + }); + + await new test_driver.Actions() + .addPointer(pointerId, pointerType) + .pointerMove(200, 200) + .pointerDown() + .pointerMove(150, 150) + .pointerMove(50, 50) + .pointerUp() + .pointerMove(75, 75) + .send(); + // Wait for pointerup to fire. + await watcher_promise; + assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList); + }, "Test " + pointerType + "pointer capture in same-origin frame: Pointer down at inner frame and set pointer capture to outer frame should not capture."); + + promise_test (async(t) => { + t.add_cleanup(Reset); expectedEventList = ["outerFrame received pointerdown", "outerFrame received gotpointercapture", "outerFrame received pointermove", @@ -158,13 +187,38 @@ function run() { // Wait for lostpointercapture to fire. await watcher_promise; assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList); - document.setPointerCaptureOnPointerDown = false; }, "Test " + pointerType + "pointer capture in same-origin frame: Pointer down at outer frame body and set pointer capture."); + promise_test (async(t) => { + t.add_cleanup(Reset); + document.captureTargetOverride = document.getElementById('innerFrameElement'); + expectedEventList = ["outerFrame received pointerdown", + "outerFrame received pointermove", + "outerFrame received pointerup"]; + var pointerId = pointerType + "Pointer1"; + + // We are interested in tracking events only after pointerdown + var pointerdown_happened = new Promise((resolve, reject)=>{document.getElementById('outerFrame').addEventListener("pointerdown",resolve);}); + var watcher_promise = pointerdown_happened.then(()=>{ + var watch_outer_frame = new EventWatcher(t, document.getElementById('outerFrame'), ["pointerup"], eventTimeout()); + return watch_outer_frame.wait_for("pointerup"); + }); + + await new test_driver.Actions() + .addPointer(pointerId, pointerType) + .pointerMove(25, 25) + .pointerDown() + .pointerMove(200, 200) + .pointerUp() + .pointerMove(25, 25) + .send(); + // Wait for lostpointercapture to fire. + await watcher_promise; + assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList); + }, "Test " + pointerType + "pointer capture in same-origin frame: Pointer down at outer frame body and set pointer capture in inner frame should not capture."); promise_test (async(t) => { - Reset(); - document.setPointerCaptureOnPointerDown = true; + t.add_cleanup(Reset); document.releasePointerCaptureOnFirstMove = true; // Mouse event has the frame capture, so after pointer capture released, events are // dispatched to innerFrameDocument. @@ -202,13 +256,11 @@ function run() { await watcher_promise; assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList); document.releasePointerCaptureOnFirstMove = false; - document.setPointerCaptureOnPointerDown = false; }, "Test " + pointerType + "pointer capture in same-origin frame: Pointerdown with set capture at inner frame, then release on next pointermove."); promise_test (async(t) => { - Reset(); - document.setPointerCaptureOnPointerDown = true; + t.add_cleanup(Reset); document.releasePointerCaptureOnFirstMove = true; expectedEventList = ["outerFrame received pointerdown", "outerFrame received gotpointercapture", @@ -244,7 +296,6 @@ function run() { await watcher_promise; assert_array_equals(receivedEventList, expectedEventList, "Received events: " + receivedEventList); document.releasePointerCaptureOnFirstMove = false; - document.setPointerCaptureOnPointerDown = false; }, "Test " + pointerType + "pointer capture in same-origin frame: Pointerdown with set capture at outer frame, then release on next pointermove."); } diff --git a/tests/wpt/tests/preload/prefetch-document.html b/tests/wpt/tests/preload/prefetch-document.html index 9f9810be46c..67f86d99e30 100644 --- a/tests/wpt/tests/preload/prefetch-document.html +++ b/tests/wpt/tests/preload/prefetch-document.html @@ -13,6 +13,7 @@ const {ORIGIN, REMOTE_ORIGIN, HTTP_NOTSAMESITE_ORIGIN} = get_host_info(); async function prefetch_document_and_count_fetches(options, t) { const {href, uid} = await prefetch({ + "cache-control": "public, max-age=3600", file: "prefetch-exec.html", type: "text/html", corssOrigin: "anonymous", diff --git a/tests/wpt/tests/resources/idlharness-shadowrealm.js b/tests/wpt/tests/resources/idlharness-shadowrealm.js deleted file mode 100644 index b959ca00e83..00000000000 --- a/tests/wpt/tests/resources/idlharness-shadowrealm.js +++ /dev/null @@ -1,52 +0,0 @@ -/* global shadowRealmEvalAsync */ - -// requires /resources/idlharness-shadowrealm-outer.js - -// TODO: it would be nice to support `idl_array.add_objects` -function fetch_text(url) { - return fetch(url).then(function (r) { - if (!r.ok) { - throw new Error("Error fetching " + url + "."); - } - return r.text(); - }); -} - -/** - * idl_test_shadowrealm is a promise_test wrapper that handles the fetching of the IDL, and - * running the code in a `ShadowRealm`, avoiding repetitive boilerplate. - * - * @see https://github.com/tc39/proposal-shadowrealm - * @param {String[]} srcs Spec name(s) for source idl files (fetched from - * /interfaces/{name}.idl). - * @param {String[]} deps Spec name(s) for dependency idl files (fetched - * from /interfaces/{name}.idl). Order is important - dependencies from - * each source will only be included if they're already know to be a - * dependency (i.e. have already been seen). - */ -function idl_test_shadowrealm(srcs, deps) { - promise_setup(async t => { - const realm = new ShadowRealm(); - const specs = await Promise.all(srcs.concat(deps).map(spec => { - return fetch_text("/interfaces/" + spec + ".idl"); - })); - const idls = JSON.stringify(specs); - await shadowRealmEvalAsync(realm, ` - await import("/resources/testharness-shadowrealm-inner.js"); - await import("/resources/testharness.js"); - await import("/resources/WebIDLParser.js"); - await import("/resources/idlharness.js"); - const idls = ${idls}; - const idl_array = new IdlArray(); - for (let i = 0; i < ${srcs.length}; i++) { - idl_array.add_idls(idls[i]); - } - for (let i = ${srcs.length}; i < ${srcs.length + deps.length}; i++) { - idl_array.add_dependency_idls(idls[i]); - } - idl_array.test(); - `); - await fetch_tests_from_shadow_realm(realm); - }); -} -// vim: set expandtab shiftwidth=4 tabstop=4 foldmarker=@{,@} foldmethod=marker: diff --git a/tests/wpt/tests/resources/idlharness.js b/tests/wpt/tests/resources/idlharness.js index 4cf19234af2..d52ba9fd3c4 100644 --- a/tests/wpt/tests/resources/idlharness.js +++ b/tests/wpt/tests/resources/idlharness.js @@ -734,7 +734,7 @@ IdlArray.prototype.test = function() Object.getOwnPropertyNames(this.members).forEach(function(memberName) { var member = this.members[memberName]; - if (!(member instanceof IdlInterface)) { + if (!(member instanceof IdlInterface || member instanceof IdlNamespace)) { return; } @@ -1421,7 +1421,7 @@ IdlInterface.prototype.test = function() if (!this.untested) { subsetTestByKey(this.name, test, function() { - assert_false(this.name in self); + assert_false(this.name in self, this.name + " interface should not exist"); }.bind(this), this.name + " interface: existence and properties of interface object"); } return; @@ -3451,6 +3451,17 @@ IdlNamespace.prototype.test_self = function () IdlNamespace.prototype.test = function () { + // If the namespace object is not exposed, only test that. Members can't be + // tested either + if (!this.exposed) { + if (!this.untested) { + subsetTestByKey(this.name, test, function() { + assert_false(this.name in self, this.name + " namespace should not exist"); + }.bind(this), this.name + " namespace: existence and properties of namespace object"); + } + return; + } + if (!this.untested) { this.test_self(); } @@ -3498,7 +3509,7 @@ function idl_test(srcs, deps, idl_setup_func) { "require-exposed" ]; return Promise.all( - srcs.concat(deps).map(fetch_spec)) + srcs.concat(deps).map(globalThis.fetch_spec)) .then(function(results) { const astArray = results.map(result => WebIDL2.parse(result.idl, { sourceName: result.spec }) @@ -3539,9 +3550,11 @@ function idl_test(srcs, deps, idl_setup_func) { }); }, 'idl_test setup'); } +globalThis.idl_test = idl_test; /** * fetch_spec is a shorthand for a Promise that fetches the spec's content. + * Note: ShadowRealm-specific implementation in testharness-shadowrealm-inner.js */ function fetch_spec(spec) { var url = '/interfaces/' + spec + '.idl'; diff --git a/tests/wpt/tests/resources/test/tests/functional/idlharness/IdlNamespace/test_operation.html b/tests/wpt/tests/resources/test/tests/functional/idlharness/IdlNamespace/test_operation.html index da70c8fa31c..d7fe20a5a57 100644 --- a/tests/wpt/tests/resources/test/tests/functional/idlharness/IdlNamespace/test_operation.html +++ b/tests/wpt/tests/resources/test/tests/functional/idlharness/IdlNamespace/test_operation.html @@ -67,7 +67,12 @@ namespace bar { namespace baz { DOMString LongStory(any hero, DOMString... details); DOMString ShortStory(DOMString... details); -};`); +}; +[Exposed=Worker] +namespace Absent { + undefined Lies(); +}; +`); idlArray.test(); + + +
+ + \ No newline at end of file diff --git a/tests/wpt/tests/selection/fire-selectionchange-event-on-textcontrol-element-on-pressing-backspace.html b/tests/wpt/tests/selection/fire-selectionchange-event-on-textcontrol-element-on-pressing-backspace.html new file mode 100644 index 00000000000..47650a43e38 --- /dev/null +++ b/tests/wpt/tests/selection/fire-selectionchange-event-on-textcontrol-element-on-pressing-backspace.html @@ -0,0 +1,47 @@ + + +Test selectionchange event fired on Text Control element + + + + + + + + \ No newline at end of file diff --git a/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html b/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html deleted file mode 100644 index 8242f3d1083..00000000000 --- a/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - diff --git a/tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html b/tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html new file mode 100644 index 00000000000..a76c1ff2336 --- /dev/null +++ b/tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html @@ -0,0 +1,64 @@ + + + + + + + + + + + diff --git a/tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-data-origin.tentative.https.sub.html b/tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-data-origin.tentative.https.sub.html index bc78433d8e9..3c4e91b52e3 100644 --- a/tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-data-origin.tentative.https.sub.html +++ b/tests/wpt/tests/shared-storage/cross-origin-worklet-select-url-and-verify-data-origin.tentative.https.sub.html @@ -3,64 +3,34 @@ + diff --git a/tests/wpt/tests/shared-storage/resources/simple-module.js b/tests/wpt/tests/shared-storage/resources/simple-module.js index e639f470008..4bd7085256e 100644 --- a/tests/wpt/tests/shared-storage/resources/simple-module.js +++ b/tests/wpt/tests/shared-storage/resources/simple-module.js @@ -122,6 +122,53 @@ class GetWaitIncrementWithinLockOperation { } } +class GetWaitSetWithinLockOperation { + async run(urls, data) { + if (data && data.hasOwnProperty('key') && data.hasOwnProperty('lock_name') + && data.hasOwnProperty('append_letter')) { + await navigator.locks.request(data['lock_name'], async (lock) => { + let value_read = await sharedStorage.get(data['key']); + + if (value_read === undefined) { + value_read = ""; + } + + await busyWaitMs(500); + + await sharedStorage.set(data['key'], value_read + data['append_letter']); + }); + + return 1; + } + return -1; + } +} + +class AppendWithLockOptionOperation { + async run(urls, data) { + if (data && data.hasOwnProperty('key') && data.hasOwnProperty('lock_name') + && data.hasOwnProperty('append_letter')) { + sharedStorage.append(data['key'], data['append_letter'], {withLock: data['lock_name']}); + return 1; + } + return -1; + } +} + +class BatchUpdateWithTwoAppendMethodsWithBatchLockOptionOperation { + async run(urls, data) { + if (data && data.hasOwnProperty('key') && data.hasOwnProperty('lock_name') + && data.hasOwnProperty('append_letter')) { + sharedStorage.batchUpdate([ + new SharedStorageAppendMethod(data['key'], data['append_letter']), + new SharedStorageAppendMethod(data['key'], data['append_letter']) + ], {withLock: data['lock_name']}); + return 1; + } + return -1; + } +} + register('test-url-selection-operation', TestURLSelectionOperation); register('test-url-selection-operation-2', TestURLSelectionOperationTwo); register('test-slow-url-selection-operation', TestSlowURLSelectionOperation); @@ -131,3 +178,6 @@ register('verify-key-value', VerifyKeyValue); register('verify-key-not-found', VerifyKeyNotFound); register('verify-interest-groups', VerifyInterestGroups); register('get-wait-increment-within-lock', GetWaitIncrementWithinLockOperation); +register('get-wait-set-within-lock', GetWaitSetWithinLockOperation); +register('append-with-lock-option', AppendWithLockOptionOperation); +register('batch-update-with-two-append-methods-with-batch-lock-option', BatchUpdateWithTwoAppendMethodsWithBatchLockOptionOperation); diff --git a/tests/wpt/tests/shared-storage/resources/trusted-origins.py b/tests/wpt/tests/shared-storage/resources/trusted-origins.py index c9e0a776a67..c57778a0403 100644 --- a/tests/wpt/tests/shared-storage/resources/trusted-origins.py +++ b/tests/wpt/tests/shared-storage/resources/trusted-origins.py @@ -1,7 +1,64 @@ import json +SUBDOMAIN_TUPLE_TO_ALLOWED_ORIGINS_MAP = { + ("", "web-platform"): [], + ("www", "web-platform"): [ + { + "scriptOrigin": "https://web-platform.test", + "contextOrigin": ["https://web-platform.test"], + }, + { + "scriptOrigin": "https://www.web-platform.test", + "contextOrigin": "*", + }, + ], + ("www1", "web-platform"): [ + { + "scriptOrigin": [ + "https://google.com", + "https://web-platform.test", + ], + "contextOrigin": "https://web-platform.test", + }, + { + "scriptOrigin": "https://www.web-platform.test", + "contextOrigin": ["*"], + }, + ], + ("www2", "web-platform"): [], + ("", "not-web-platform"): [], + ("www", "not-web-platform"): [], + ("www1", "not-web-platform"): [], + ("www2", "not-web-platform"): [], +} + +def get_host(request): + return request.url_parts.netloc.split(":")[0] + +def get_port(request): + if len(request.url_parts.netloc.split(":")) > 1: + return request.url_parts.netloc.split(":")[1] + return 0 + +def get_subdomain_tuple(request): + host = get_host(request) + host_list = host.split(".") + if len(host_list) == 0 or len(host_list) > 3: + raise ValueError("Invalid host " + host) + if len(host_list) == 1: + return ("", host_list[0]) + return (host_list[0], host_list[1]) + +def get_allowed_origins(request): + subdomain_tuple = get_subdomain_tuple(request) + origin_list = SUBDOMAIN_TUPLE_TO_ALLOWED_ORIGINS_MAP[subdomain_tuple] + origins_string = json.dumps(origin_list) + test_with_port = ".test:" + str(get_port(request)) + origins_with_ports = origins_string.replace(".test", test_with_port) + return origins_with_ports + def get_json(request, response): response.status = (200, b"OK") response.headers.set(b"Content-Type", b"application/json") response.headers.set(b"Access-Control-Allow-Origin", b"*") - response.content = json.dumps([]) + response.content = get_allowed_origins(request) diff --git a/tests/wpt/tests/shared-storage/resources/util.sub.js b/tests/wpt/tests/shared-storage/resources/util.sub.js index a5511a96800..8407d0d2632 100644 --- a/tests/wpt/tests/shared-storage/resources/util.sub.js +++ b/tests/wpt/tests/shared-storage/resources/util.sub.js @@ -118,22 +118,39 @@ async function loadNestedSharedStorageFrameInNewFrame(data) { return {frame: frame, nestedFrame: nestedFrame, nestedFrameUrl: nestedSrc}; } -async function testCreateWorkletWithDataOption( - test, data_origin, key, value, is_same_origin_script, expect_success) { +async function createWorkletAndVerifyDataOrigin( + t, data_origin, script_origin, expect_success, error_type) { + if (error_type) { + assert_false(expect_success); + } + const key = 'key0'; + const value = 'value0'; const sameOrigin = location.origin; - const crossOrigin = 'https://{{domains[www]}}:{{ports[https][0]}}'; const sameOriginScriptUrl = `/shared-storage/resources/simple-module.js`; - const scriptOrigin = is_same_origin_script ? sameOrigin : crossOrigin; - const scriptUrl = is_same_origin_script ? sameOriginScriptUrl : - crossOrigin + sameOriginScriptUrl; - const dataOrigin = - (data_origin === 'script-origin') ? scriptOrigin : sameOrigin; + const scriptUrl = (script_origin === location.origin) ? + sameOriginScriptUrl : + script_origin + sameOriginScriptUrl; + let dataOrigin = sameOrigin; + if (data_origin === 'script-origin') { + dataOrigin = script_origin; + } else if (data_origin !== '' && data_origin !== 'context-origin') { + try { + dataOrigin = new URL(data_origin).origin; + } catch (e) { + if (e.message !== 'Failed to construct \'URL\': Invalid URL') { + throw e; + } + assert_false(expect_success); + } + } + const options = (data_origin === '') ? + {credentials: 'omit'} : + {credentials: 'omit', dataOrigin: data_origin}; let success = false; let error = null; try { - const worklet = await sharedStorage.createWorklet( - scriptUrl, {credentials: 'omit', dataOrigin: data_origin}); + const worklet = await sharedStorage.createWorklet(scriptUrl, options); const ancestor_key = token(); let url0 = @@ -156,12 +173,12 @@ async function testCreateWorkletWithDataOption( success = true; } catch (e) { error = e; - assert_equals(e.name, 'TypeError'); + assert_equals(e.name, error_type, e.message); } finally { assert_equals( expect_success, success, error ? 'expected success but error thrown: ' + error.toString() : 'no error caught even though one was expected'); - test.done(); + t.done(); } } diff --git a/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html b/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html deleted file mode 100644 index c84246f65b1..00000000000 --- a/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - diff --git a/tests/wpt/tests/shared-storage/same-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html b/tests/wpt/tests/shared-storage/same-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html new file mode 100644 index 00000000000..d507ec2fc09 --- /dev/null +++ b/tests/wpt/tests/shared-storage/same-origin-worklet-select-url-and-verify-custom-data-origin.tentative.https.sub.html @@ -0,0 +1,64 @@ + + + + + + + + + + + diff --git a/tests/wpt/tests/shared-storage/setters.tentative.https.sub.html b/tests/wpt/tests/shared-storage/setters.tentative.https.sub.html index 891f8a7acb5..c5380f8dd85 100644 --- a/tests/wpt/tests/shared-storage/setters.tentative.https.sub.html +++ b/tests/wpt/tests/shared-storage/setters.tentative.https.sub.html @@ -48,5 +48,78 @@ promise_test(() => { return sharedStorage.delete("a"); }, 'sharedStorage.delete'); +test(() => { + try { + let a = new SharedStorageSetMethod('a'); + } catch (e) { + assert_equals(e.name, 'TypeError'); + return; + } + assert_unreached("did not throw"); +}, 'new SharedStorageSetMethod with 1 argument'); + +test(() => { + let a = new SharedStorageSetMethod('a', 'b'); +}, 'new SharedStorageSetMethod with 2 arguments'); + +test(() => { + try { + let a = new SharedStorageAppendMethod('a'); + } catch (e) { + assert_equals(e.name, 'TypeError'); + return; + } + assert_unreached("did not throw"); +}, 'new SharedStorageAppendMethod with 1 argument'); + +test(() => { + let a = new SharedStorageAppendMethod('a', 'b'); +}, 'new SharedStorageAppendMethod with 2 arguments'); + +test(() => { + try { + let a = new SharedStorageDeleteMethod(); + } catch (e) { + assert_equals(e.name, 'TypeError'); + return; + } + assert_unreached("did not throw"); +}, 'new SharedStorageDeleteMethod with no arguments'); + +test(() => { + let a = new SharedStorageDeleteMethod('a'); +}, 'new SharedStorageDeleteMethod with 1 argument'); + +test(() => { + try { + let a = SharedStorageClearMethod(); + } catch (e) { + assert_equals(e.name, 'TypeError'); + return; + } + assert_unreached("did not throw"); +}, 'call SharedStorageClearMethod() as a function'); + +test(() => { + let a = new SharedStorageClearMethod(); +}, 'new SharedStorageClearMethod with no arguments'); + +promise_test(() => { + return sharedStorage.batchUpdate([ + new SharedStorageSetMethod("key0", "value0", {withLock: "lock1"}), + new SharedStorageAppendMethod("key1", "value1"), + new SharedStorageDeleteMethod("key2"), + new SharedStorageClearMethod({withLock: "lock2"}) + ], {withLock: "lock3"}); +}, 'sharedStorage.batchUpdate'); + +promise_test(async t => { + return promise_rejects_js(t, TypeError, sharedStorage.batchUpdate()); +}, 'sharedStorage.batchUpdate without \'methods\' argument'); + +promise_test(async t => { + return promise_rejects_js(t, TypeError, sharedStorage.batchUpdate(["123"])); +}, 'sharedStorage.batchUpdate with invalid \'methods\' argument'); + diff --git a/tests/wpt/tests/shared-storage/web-locks-header-modifier-method.tentative.https.sub.html b/tests/wpt/tests/shared-storage/web-locks-header-modifier-method.tentative.https.sub.html new file mode 100644 index 00000000000..05ec7bf82bd --- /dev/null +++ b/tests/wpt/tests/shared-storage/web-locks-header-modifier-method.tentative.https.sub.html @@ -0,0 +1,75 @@ + + + + + + + + + + diff --git a/tests/wpt/tests/shared-storage/web-locks-pa-worklet-modifier-method.tentative.https.window.js b/tests/wpt/tests/shared-storage/web-locks-pa-worklet-modifier-method.tentative.https.window.js new file mode 100644 index 00000000000..e9112483e2c --- /dev/null +++ b/tests/wpt/tests/shared-storage/web-locks-pa-worklet-modifier-method.tentative.https.window.js @@ -0,0 +1,94 @@ +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/common/utils.js +// META: script=/fledge/tentative/resources/fledge-util.sub.js +// META: script=/common/subset-tests.js +// META: script=/shared-storage/resources/util.js +// META: script=/fenced-frame/resources/utils.js +// META: timeout=long + +"use strict;" + +subsetTest(promise_test, async test => { + let worklet = await sharedStorage.createWorklet('resources/simple-module.js'); + + const ancestor_key = token(); + let url0 = generateURL("/shared-storage/resources/frame0.html", + [ancestor_key]); + let url1 = generateURL("/shared-storage/resources/frame1.html", + [ancestor_key]); + + // Override the default resource path, as we are not running within the Fledge + // repository. + RESOURCE_PATH = '/fledge/tentative/resources/'; + + const pa_uuid = generateUuid(test); + + let biddingLogicURL = createBiddingScriptURL( + { + generateBid: + ` + sharedStorage.append('key', 'a', {withLock: 'lock1'}); + + return {}; + ` + }); + + let decisionLogicURL = createDecisionScriptURL(pa_uuid); + + // Invoke `selectURL()` to perform the following steps: + // 1. Acquires the lock. + // 2. Reads the current value at the given key. + // 3. Waits for 500ms. + // 4. Sets the shared storage value to the read value appended with the given letter. + // 5. Releases the lock. + // + // After 100ms, run a Protected Audience auction which triggers `append()` + // with the same lock and the same letter. + // + // Expected behavior: After both of them finish, the value at the given key + // should contain the letter repeated twice. + // + // This demonstrates that the `withLock` option is effective, preventing the + // `append()` method interfering with the "get and set" operation. If the lock + // were not used, the final value would likely be a single letter. + // + // Note: This test remains valid even if the `append()` happens outside + // the critical section protected by the lock within the worklet. The test + // effectively demonstrates mutual exclusion as long as there's a reasonable + // chance for `append()` to occur while the worklet is still running. + let select_url_result = await worklet.selectURL( + "get-wait-set-within-lock", + [{url: url0}, {url: url1}], + {data: {'key': 'key', + 'lock_name': 'lock1', + 'append_letter': 'a'}, + resolveToConfig: true}); + + // Busy wait for 100ms. + const startWaitTime = Date.now(); + while (Date.now() - startWaitTime < 100) {} + + // Run a Protected Audience auction which triggers `append()`` with the same + // lock and the same letter. + await joinGroupAndRunBasicFledgeTestExpectingNoWinner( + test, + { + uuid: pa_uuid, + interestGroupOverrides: { + name: pa_uuid, + biddingLogicURL: biddingLogicURL, + }, + auctionConfigOverrides: { + decisionLogicURL: decisionLogicURL + } + }); + + attachFencedFrame(select_url_result, 'opaque-ads'); + const result = await nextValueFromServer(ancestor_key); + assert_equals(result, "frame1_loaded"); + + await verifyKeyValueForOrigin('key', 'aa', location.origin); + + await deleteKeyForOrigin('key', location.origin); +}, 'Test for withLock option in a Protected Audience Worklet context'); diff --git a/tests/wpt/tests/shared-storage/web-locks-window-batch-update.tentative.https.sub.html b/tests/wpt/tests/shared-storage/web-locks-window-batch-update.tentative.https.sub.html new file mode 100644 index 00000000000..cc02f119ecb --- /dev/null +++ b/tests/wpt/tests/shared-storage/web-locks-window-batch-update.tentative.https.sub.html @@ -0,0 +1,74 @@ + + + + + + + + + + diff --git a/tests/wpt/tests/shared-storage/web-locks-window-modifier-method.tentative.https.sub.html b/tests/wpt/tests/shared-storage/web-locks-window-modifier-method.tentative.https.sub.html new file mode 100644 index 00000000000..fb83a2eb532 --- /dev/null +++ b/tests/wpt/tests/shared-storage/web-locks-window-modifier-method.tentative.https.sub.html @@ -0,0 +1,66 @@ + + + + + + + + + + diff --git a/tests/wpt/tests/shared-storage/web-locks-worklet-batch-update.tentative.https.sub.html b/tests/wpt/tests/shared-storage/web-locks-worklet-batch-update.tentative.https.sub.html new file mode 100644 index 00000000000..50a130a04b2 --- /dev/null +++ b/tests/wpt/tests/shared-storage/web-locks-worklet-batch-update.tentative.https.sub.html @@ -0,0 +1,85 @@ + + + + + + + + + + diff --git a/tests/wpt/tests/shared-storage/web-locks-worklet-modifier-method.tentative.https.sub.html b/tests/wpt/tests/shared-storage/web-locks-worklet-modifier-method.tentative.https.sub.html new file mode 100644 index 00000000000..05bd9613605 --- /dev/null +++ b/tests/wpt/tests/shared-storage/web-locks-worklet-modifier-method.tentative.https.sub.html @@ -0,0 +1,75 @@ + + + + + + + + + + diff --git a/tests/wpt/tests/shared-storage/web-locks.tentative.https.sub.html b/tests/wpt/tests/shared-storage/web-locks.tentative.https.sub.html index 49a039368a3..b9dc5754ced 100644 --- a/tests/wpt/tests/shared-storage/web-locks.tentative.https.sub.html +++ b/tests/wpt/tests/shared-storage/web-locks.tentative.https.sub.html @@ -56,6 +56,8 @@ promise_test(async t => { assert_equals(result2, "frame1_loaded"); await verifyKeyValueForOrigin('key', '2', location.origin); + + await deleteKeyForOrigin('key', location.origin); }, 'Basic test for Web Locks API in the shared storage worklet'); diff --git a/tests/wpt/tests/speculation-rules/prefetch/no-http-cache-interference.https.html b/tests/wpt/tests/speculation-rules/prefetch/no-http-cache-interference.https.html new file mode 100644 index 00000000000..e390edca785 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/no-http-cache-interference.https.html @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/conditional-status.py b/tests/wpt/tests/speculation-rules/prefetch/resources/conditional-status.py new file mode 100644 index 00000000000..a76e987af99 --- /dev/null +++ b/tests/wpt/tests/speculation-rules/prefetch/resources/conditional-status.py @@ -0,0 +1,19 @@ +import json +import os.path +from wptserve.pipes import template + +def main(request, response): + response.headers.set(b"Content-Type", b"text/html") + + prefetch = request.headers.get("Sec-Purpose", b"").decode("utf-8").startswith("prefetch") + + response.content = template( + request, + open(os.path.join(os.path.dirname(__file__), "executor.sub.html"), "rb").read()) + + if prefetch: + response.status = 503 + response.content += b"503" + else: + response.status = 200 + response.content += b"200" diff --git a/tests/wpt/tests/speculation-rules/prerender/clients-matchall.https.html b/tests/wpt/tests/speculation-rules/prerender/clients-matchall.https.html index 31fcc90391d..b86a18161ae 100644 --- a/tests/wpt/tests/speculation-rules/prerender/clients-matchall.https.html +++ b/tests/wpt/tests/speculation-rules/prerender/clients-matchall.https.html @@ -42,10 +42,11 @@ promise_test(async t => { navigator.serviceWorker.onmessage = resolve; get_newest_worker(registration).postMessage('invoke clients.matchAll()'); }); + const clients = message.data; - assert_array_equals( - message.data, - [ window.location.href, new URL(pageUrl, location).toString() ]); + // Don't use `assert_array_equals` as the clients may contain unrelated pages. + assert_true(clients.includes(window.location.href)); + assert_true(clients.includes(new URL(pageUrl, location).toString())); }, 'The client urls (including a prerender page) are exposed by ' + 'Clients#matchAll()'); diff --git a/tests/wpt/tests/streams/idlharness-shadowrealm.window.js b/tests/wpt/tests/streams/idlharness-shadowrealm.window.js deleted file mode 100644 index 9ec65f7bdf8..00000000000 --- a/tests/wpt/tests/streams/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["streams"], ["dom"]); diff --git a/tests/wpt/tests/streams/idlharness.any.js b/tests/wpt/tests/streams/idlharness.any.js index 42a17da58c5..0be03b2078f 100644 --- a/tests/wpt/tests/streams/idlharness.any.js +++ b/tests/wpt/tests/streams/idlharness.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm-in-window // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: timeout=long diff --git a/tests/wpt/tests/streams/readable-byte-streams/general.any.js b/tests/wpt/tests/streams/readable-byte-streams/general.any.js index cdce2244c3c..50f4f019ff2 100644 --- a/tests/wpt/tests/streams/readable-byte-streams/general.any.js +++ b/tests/wpt/tests/streams/readable-byte-streams/general.any.js @@ -236,6 +236,29 @@ promise_test(t => { }); }, 'ReadableStream with byte source: Test that erroring a stream does not release a BYOB reader automatically'); +promise_test(async t => { + const rs = new ReadableStream({ + type: 'bytes', + start(c) { + c.enqueue(new Uint8Array([1, 2, 3])); + } + }); + + const reader1 = rs.getReader({mode: 'byob'}); + reader1.releaseLock(); + + const reader2 = rs.getReader({mode: 'byob'}); + + // Should be a no-op + reader1.releaseLock(); + + const result = await reader2.read(new Uint8Array([0, 0, 0])); + assert_typed_array_equals(result.value, new Uint8Array([1, 2, 3]), + 'read() should still work on reader2 even after reader1 is released'); + assert_false(result.done, 'done'); + +}, 'ReadableStream with byte source: cannot use an already-released BYOB reader to unlock a stream again'); + promise_test(async t => { const stream = new ReadableStream({ type: 'bytes' @@ -870,11 +893,11 @@ promise_test(() => { start(c) { controller = c; }, - async pull() { + pull() { byobRequestDefined.push(controller.byobRequest !== null); const initialByobRequest = controller.byobRequest; - const transferredView = await transferArrayBufferView(controller.byobRequest.view); + const transferredView = transferArrayBufferView(controller.byobRequest.view); transferredView[0] = 0x01; controller.byobRequest.respondWithNewView(transferredView); @@ -992,6 +1015,69 @@ promise_test(() => { }, 'ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array enqueues the 1 byte ' + 'remainder'); +promise_test(() => { + let pullCount = 0; + + let controller; + let byobRequest; + let viewInfo; + + const stream = new ReadableStream({ + start(c) { + controller = c; + }, + pull() { + ++pullCount; + + byobRequest = controller.byobRequest; + const view = byobRequest.view; + viewInfo = extractViewInfo(view); + + view[0] = 0x01; + view[1] = 0x02; + view[2] = 0x03; + + controller.byobRequest.respond(3); + }, + type: 'bytes' + }); + + const reader = stream.getReader({ mode: 'byob' }); + const read1 = reader.read(new Uint16Array(2)); + const read2 = reader.read(new Uint8Array(1)); + + return read1.then(result => { + assert_equals(pullCount, 1); + + assert_false(result.done, 'done'); + + const view = result.value; + assert_equals(view.byteOffset, 0, 'byteOffset'); + assert_equals(view.byteLength, 2, 'byteLength'); + + const dataView = new DataView(view.buffer, view.byteOffset, view.byteLength); + assert_equals(dataView.getUint16(0), 0x0102); + + return read2; + }).then(result => { + assert_equals(pullCount, 1); + assert_not_equals(byobRequest, null, 'byobRequest must not be null'); + assert_equals(viewInfo.constructor, Uint8Array, 'view.constructor should be Uint8Array'); + assert_equals(viewInfo.bufferByteLength, 4, 'view.buffer.byteLength should be 4'); + assert_equals(viewInfo.byteOffset, 0, 'view.byteOffset should be 0'); + assert_equals(viewInfo.byteLength, 4, 'view.byteLength should be 4'); + + assert_false(result.done, 'done'); + + const view = result.value; + assert_equals(view.byteOffset, 0, 'byteOffset'); + assert_equals(view.byteLength, 1, 'byteLength'); + + assert_equals(view[0], 0x03); + }); +}, 'ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array fulfills second read(view) ' + + 'with the 1 byte remainder'); + promise_test(t => { const stream = new ReadableStream({ start(controller) { @@ -2288,7 +2374,7 @@ promise_test(async t => { await pullCalledPromise; // Transfer the original BYOB request's buffer, and respond with a new view on that buffer - const transferredView = await transferArrayBufferView(controller.byobRequest.view); + const transferredView = transferArrayBufferView(controller.byobRequest.view); const newView = transferredView.subarray(0, 1); newView[0] = 42; @@ -2328,7 +2414,7 @@ promise_test(async t => { await pullCalledPromise; // Transfer the original BYOB request's buffer, and respond with an empty view on that buffer - const transferredView = await transferArrayBufferView(controller.byobRequest.view); + const transferredView = transferArrayBufferView(controller.byobRequest.view); const newView = transferredView.subarray(0, 0); controller.close(); diff --git a/tests/wpt/tests/streams/readable-byte-streams/patched-global.any.js b/tests/wpt/tests/streams/readable-byte-streams/patched-global.any.js new file mode 100644 index 00000000000..ce2e9e9993a --- /dev/null +++ b/tests/wpt/tests/streams/readable-byte-streams/patched-global.any.js @@ -0,0 +1,54 @@ +// META: global=window,worker,shadowrealm +// META: script=../resources/test-utils.js +'use strict'; + +// Tests which patch the global environment are kept separate to avoid +// interfering with other tests. + +promise_test(async (t) => { + let controller; + const rs = new ReadableStream({ + type: 'bytes', + start(c) { + controller = c; + } + }); + const reader = rs.getReader({mode: 'byob'}); + + const length = 0x4000; + const buffer = new ArrayBuffer(length); + const bigArray = new BigUint64Array(buffer, length - 8, 1); + + const read1 = reader.read(new Uint8Array(new ArrayBuffer(0x100))); + const read2 = reader.read(bigArray); + + let flag = false; + Object.defineProperty(Object.prototype, 'then', { + get: t.step_func(() => { + if (!flag) { + flag = true; + assert_equals(controller.byobRequest, null, 'byobRequest should be null after filling both views'); + } + }), + configurable: true + }); + t.add_cleanup(() => { + delete Object.prototype.then; + }); + + controller.enqueue(new Uint8Array(0x110).fill(0x42)); + assert_true(flag, 'patched then() should be called'); + + // The first read() is filled entirely with 0x100 bytes + const result1 = await read1; + assert_false(result1.done, 'result1.done'); + assert_typed_array_equals(result1.value, new Uint8Array(0x100).fill(0x42), 'result1.value'); + + // The second read() is filled with the remaining 0x10 bytes + const result2 = await read2; + assert_false(result2.done, 'result2.done'); + assert_equals(result2.value.constructor, BigUint64Array, 'result2.value constructor'); + assert_equals(result2.value.byteOffset, length - 8, 'result2.value byteOffset'); + assert_equals(result2.value.length, 1, 'result2.value length'); + assert_array_equals([...result2.value], [0x42424242_42424242n], 'result2.value contents'); +}, 'Patched then() sees byobRequest after filling all pending pull-into descriptors'); diff --git a/tests/wpt/tests/streams/readable-byte-streams/templated.any.js b/tests/wpt/tests/streams/readable-byte-streams/templated.any.js new file mode 100644 index 00000000000..e4c10f76859 --- /dev/null +++ b/tests/wpt/tests/streams/readable-byte-streams/templated.any.js @@ -0,0 +1,24 @@ +// META: global=window,worker,shadowrealm +// META: script=../resources/test-utils.js +// META: script=../resources/rs-test-templates.js +'use strict'; + +templatedRSEmpty('ReadableStream with byte source (empty)', () => { + return new ReadableStream({ type: 'bytes' }); +}); + +templatedRSEmptyReader('ReadableStream with byte source (empty) default reader', () => { + const stream = new ReadableStream({ type: 'bytes' }); + const reader = stream.getReader(); + return { stream, reader, read: () => reader.read() }; +}); + +templatedRSEmptyReader('ReadableStream with byte source (empty) BYOB reader', () => { + const stream = new ReadableStream({ type: 'bytes' }); + const reader = stream.getReader({ mode: 'byob' }); + return { stream, reader, read: () => reader.read(new Uint8Array([0])) }; +}); + +templatedRSThrowAfterCloseOrError('ReadableStream with byte source', (extras) => { + return new ReadableStream({ type: 'bytes', ...extras }); +}); diff --git a/tests/wpt/tests/streams/readable-streams/from.any.js b/tests/wpt/tests/streams/readable-streams/from.any.js index 2a4212ab890..2b28a05fee3 100644 --- a/tests/wpt/tests/streams/readable-streams/from.any.js +++ b/tests/wpt/tests/streams/readable-streams/from.any.js @@ -150,6 +150,12 @@ const badIterables = [ ['an object with a non-callable @@asyncIterator method', { [Symbol.asyncIterator]: 42 }], + ['an object with an @@iterator method returning a non-object', { + [Symbol.iterator]: () => 42 + }], + ['an object with an @@asyncIterator method returning a non-object', { + [Symbol.asyncIterator]: () => 42 + }], ]; for (const [label, iterable] of badIterables) { @@ -244,6 +250,64 @@ promise_test(async t => { }, `ReadableStream.from: stream errors when next() rejects`); +promise_test(async t => { + const theError = new Error('a unique string'); + + const iterable = { + next() { + throw theError; + }, + [Symbol.asyncIterator]: () => iterable + }; + + const rs = ReadableStream.from(iterable); + const reader = rs.getReader(); + + await Promise.all([ + promise_rejects_exactly(t, theError, reader.read()), + promise_rejects_exactly(t, theError, reader.closed) + ]); + +}, 'ReadableStream.from: stream errors when next() throws synchronously'); + +promise_test(async t => { + + const iterable = { + next() { + return 42; // not a promise or an iterator result + }, + [Symbol.asyncIterator]: () => iterable + }; + + const rs = ReadableStream.from(iterable); + const reader = rs.getReader(); + + await Promise.all([ + promise_rejects_js(t, TypeError, reader.read()), + promise_rejects_js(t, TypeError, reader.closed) + ]); + +}, 'ReadableStream.from: stream errors when next() returns a non-object'); + +promise_test(async t => { + + const iterable = { + next() { + return Promise.resolve(42); // not an iterator result + }, + [Symbol.asyncIterator]: () => iterable + }; + + const rs = ReadableStream.from(iterable); + const reader = rs.getReader(); + + await Promise.all([ + promise_rejects_js(t, TypeError, reader.read()), + promise_rejects_js(t, TypeError, reader.closed) + ]); + +}, 'ReadableStream.from: stream errors when next() fulfills with a non-object'); + promise_test(async t => { const iterable = { @@ -360,6 +424,93 @@ promise_test(async t => { }, `ReadableStream.from: return() is not called when iterator completes normally`); +promise_test(async t => { + + const theError = new Error('a unique string'); + + const iterable = { + next: t.unreached_func('next() should not be called'), + throw: t.unreached_func('throw() should not be called'), + // no return method + [Symbol.asyncIterator]: () => iterable + }; + + const rs = ReadableStream.from(iterable); + const reader = rs.getReader(); + + await Promise.all([ + reader.cancel(theError), + reader.closed + ]); + +}, `ReadableStream.from: cancel() resolves when return() method is missing`); + +promise_test(async t => { + + const theError = new Error('a unique string'); + + const iterable = { + next: t.unreached_func('next() should not be called'), + throw: t.unreached_func('throw() should not be called'), + return: 42, + [Symbol.asyncIterator]: () => iterable + }; + + const rs = ReadableStream.from(iterable); + const reader = rs.getReader(); + + await promise_rejects_js(t, TypeError, reader.cancel(theError), 'cancel() should reject with a TypeError'); + + await reader.closed; + +}, `ReadableStream.from: cancel() rejects when return() is not a method`); + +promise_test(async t => { + + const cancelReason = new Error('cancel reason'); + const rejectError = new Error('reject error'); + + const iterable = { + next: t.unreached_func('next() should not be called'), + throw: t.unreached_func('throw() should not be called'), + async return() { + throw rejectError; + }, + [Symbol.asyncIterator]: () => iterable + }; + + const rs = ReadableStream.from(iterable); + const reader = rs.getReader(); + + await promise_rejects_exactly(t, rejectError, reader.cancel(cancelReason), 'cancel() should reject with error from return()'); + + await reader.closed; + +}, `ReadableStream.from: cancel() rejects when return() rejects`); + +promise_test(async t => { + + const cancelReason = new Error('cancel reason'); + const rejectError = new Error('reject error'); + + const iterable = { + next: t.unreached_func('next() should not be called'), + throw: t.unreached_func('throw() should not be called'), + return() { + throw rejectError; + }, + [Symbol.asyncIterator]: () => iterable + }; + + const rs = ReadableStream.from(iterable); + const reader = rs.getReader(); + + await promise_rejects_exactly(t, rejectError, reader.cancel(cancelReason), 'cancel() should reject with error from return()'); + + await reader.closed; + +}, `ReadableStream.from: cancel() rejects when return() throws synchronously`); + promise_test(async t => { const theError = new Error('a unique string'); diff --git a/tests/wpt/tests/streams/readable-streams/garbage-collection.any.js b/tests/wpt/tests/streams/readable-streams/garbage-collection.any.js index 13bd1fb3437..abcb4cf21b8 100644 --- a/tests/wpt/tests/streams/readable-streams/garbage-collection.any.js +++ b/tests/wpt/tests/streams/readable-streams/garbage-collection.any.js @@ -69,3 +69,22 @@ promise_test(async () => { 'old reader should still be locking the stream even after garbage collection')); }, 'Garbage-collecting a ReadableStreamDefaultReader should not unlock its stream'); + +promise_test(async () => { + + const promise = (() => { + const rs = new ReadableStream({ + pull(controller) { + controller.enqueue('words'); + } + }); + const reader = rs.getReader(); + return reader.read(); + })(); + await garbageCollect(); + const {value, done} = await promise; + // If we get here, the test passed. + assert_equals(value, 'words', 'value should be words'); + assert_false(done, 'we should not be done'); + +}, 'A ReadableStream and its reader should not be garbage collected while there is a read promise pending'); diff --git a/tests/wpt/tests/streams/readable-streams/templated.any.js b/tests/wpt/tests/streams/readable-streams/templated.any.js index dc75b805a10..4f2440c0880 100644 --- a/tests/wpt/tests/streams/readable-streams/templated.any.js +++ b/tests/wpt/tests/streams/readable-streams/templated.any.js @@ -13,7 +13,9 @@ templatedRSEmpty('ReadableStream (empty)', () => { }); templatedRSEmptyReader('ReadableStream (empty) reader', () => { - return streamAndDefaultReader(new ReadableStream()); + const stream = new ReadableStream(); + const reader = stream.getReader(); + return { stream, reader, read: () => reader.read() }; }); templatedRSClosed('ReadableStream (closed via call in start)', () => { @@ -138,6 +140,10 @@ templatedRSTwoChunksClosedReader('ReadableStream (two chunks enqueued, then clos return result; }, chunks); +templatedRSThrowAfterCloseOrError('ReadableStream', (extras) => { + return new ReadableStream({ ...extras }); +}); + function streamAndDefaultReader(stream) { return { stream, reader: stream.getReader() }; } diff --git a/tests/wpt/tests/streams/resources/rs-test-templates.js b/tests/wpt/tests/streams/resources/rs-test-templates.js index 25751c477f5..73ef0463768 100644 --- a/tests/wpt/tests/streams/resources/rs-test-templates.js +++ b/tests/wpt/tests/streams/resources/rs-test-templates.js @@ -200,7 +200,7 @@ self.templatedRSEmptyReader = (label, factory) => { test(() => { - const stream = factory().stream; + const { stream } = factory(); assert_true(stream.locked, 'locked getter should return true'); @@ -208,9 +208,9 @@ self.templatedRSEmptyReader = (label, factory) => { promise_test(t => { - const reader = factory().reader; + const { read } = factory(); - reader.read().then( + read().then( t.unreached_func('read() should not fulfill'), t.unreached_func('read() should not reject') ); @@ -221,14 +221,14 @@ self.templatedRSEmptyReader = (label, factory) => { promise_test(t => { - const reader = factory().reader; + const { read } = factory(); - reader.read().then( + read().then( t.unreached_func('read() should not fulfill'), t.unreached_func('read() should not reject') ); - reader.read().then( + read().then( t.unreached_func('read() should not fulfill'), t.unreached_func('read() should not reject') ); @@ -239,26 +239,24 @@ self.templatedRSEmptyReader = (label, factory) => { test(() => { - const reader = factory().reader; - assert_not_equals(reader.read(), reader.read(), 'the promises returned should be distinct'); + const { read } = factory(); + assert_not_equals(read(), read(), 'the promises returned should be distinct'); }, label + ': read() should return distinct promises each time'); test(() => { - const stream = factory().stream; + const { stream } = factory(); assert_throws_js(TypeError, () => stream.getReader(), 'stream.getReader() should throw a TypeError'); }, label + ': getReader() again on the stream should fail'); promise_test(async t => { - const streamAndReader = factory(); - const stream = streamAndReader.stream; - const reader = streamAndReader.reader; + const { stream, reader, read } = factory(); - const read1 = reader.read(); - const read2 = reader.read(); + const read1 = read(); + const read2 = read(); const closed = reader.closed; reader.releaseLock(); @@ -275,19 +273,19 @@ self.templatedRSEmptyReader = (label, factory) => { promise_test(t => { - const reader = factory().reader; + const { reader, read } = factory(); reader.releaseLock(); return Promise.all([ - promise_rejects_js(t, TypeError, reader.read()), - promise_rejects_js(t, TypeError, reader.read()) + promise_rejects_js(t, TypeError, read()), + promise_rejects_js(t, TypeError, read()) ]); }, label + ': releasing the lock should cause further read() calls to reject with a TypeError'); promise_test(t => { - const reader = factory().reader; + const { reader } = factory(); const closedBefore = reader.closed; reader.releaseLock(); @@ -301,9 +299,7 @@ self.templatedRSEmptyReader = (label, factory) => { test(() => { - const streamAndReader = factory(); - const stream = streamAndReader.stream; - const reader = streamAndReader.reader; + const { stream, reader } = factory(); reader.releaseLock(); assert_false(stream.locked, 'locked getter should return false'); @@ -312,10 +308,10 @@ self.templatedRSEmptyReader = (label, factory) => { promise_test(() => { - const reader = factory().reader; + const { reader, read } = factory(); reader.cancel(); - return reader.read().then(r => { + return read().then(r => { assert_object_equals(r, { value: undefined, done: true }, 'read()ing from the reader should give a done result'); }); @@ -323,7 +319,7 @@ self.templatedRSEmptyReader = (label, factory) => { promise_test(t => { - const stream = factory().stream; + const { stream } = factory(); return promise_rejects_js(t, TypeError, stream.cancel()); }, label + ': canceling via the stream should fail'); @@ -719,3 +715,62 @@ self.templatedRSTeeCancel = (label, factory) => { }, `${label}: erroring a teed stream should properly handle canceled branches`); }; + +self.templatedRSThrowAfterCloseOrError = (label, factory) => { + test(() => {}, 'Running templatedRSThrowAfterCloseOrError with ' + label); + + const theError = new Error('a unique string'); + + promise_test(async t => { + let controller; + const stream = factory({ + start: t.step_func((c) => { + controller = c; + }) + }); + + controller.close(); + + assert_throws_js(TypeError, () => controller.enqueue(new Uint8Array([1]))); + }, `${label}: enqueue() throws after close()`); + + promise_test(async t => { + let controller; + const stream = factory({ + start: t.step_func((c) => { + controller = c; + }) + }); + + controller.enqueue(new Uint8Array([1])); + controller.close(); + + assert_throws_js(TypeError, () => controller.enqueue(new Uint8Array([2]))); + }, `${label}: enqueue() throws after enqueue() and close()`); + + promise_test(async t => { + let controller; + const stream = factory({ + start: t.step_func((c) => { + controller = c; + }) + }); + + controller.error(theError); + + assert_throws_js(TypeError, () => controller.enqueue(new Uint8Array([1]))); + }, `${label}: enqueue() throws after error()`); + + promise_test(async t => { + let controller; + const stream = factory({ + start: t.step_func((c) => { + controller = c; + }) + }); + + controller.error(theError); + + assert_throws_js(TypeError, () => controller.close()); + }, `${label}: close() throws after error()`); +}; diff --git a/tests/wpt/tests/streams/resources/rs-utils.js b/tests/wpt/tests/streams/resources/rs-utils.js index f52dd6197b7..0f7742a5b3b 100644 --- a/tests/wpt/tests/streams/resources/rs-utils.js +++ b/tests/wpt/tests/streams/resources/rs-utils.js @@ -215,15 +215,7 @@ } function transferArrayBufferView(view) { - const noopByteStream = new ReadableStream({ - type: 'bytes', - pull(c) { - c.byobRequest.respond(c.byobRequest.view.byteLength); - c.close(); - } - }); - const reader = noopByteStream.getReader({ mode: 'byob' }); - return reader.read(view).then((result) => result.value); + return structuredClone(view, { transfer: [view.buffer] }); } self.RandomPushSource = RandomPushSource; diff --git a/tests/wpt/tests/streams/transform-streams/cancel.any.js b/tests/wpt/tests/streams/transform-streams/cancel.any.js index 5c7fc4eae5d..9b369bfb7c6 100644 --- a/tests/wpt/tests/streams/transform-streams/cancel.any.js +++ b/tests/wpt/tests/streams/transform-streams/cancel.any.js @@ -113,3 +113,93 @@ promise_test(async t => { const closePromise = ts.readable.cancel(1); await promise_rejects_exactly(t, thrownError, closePromise, 'closePromise should reject with thrownError'); }, 'writable.abort() and readable.cancel() should reject if a transformer.cancel() calls controller.error()'); + +promise_test(async t => { + const cancelReason = new Error('cancel reason'); + let controller; + let cancelPromise; + let flushCalled = false; + const ts = new TransformStream({ + start(c) { + controller = c; + }, + flush() { + flushCalled = true; + cancelPromise = ts.readable.cancel(cancelReason); + }, + cancel: t.unreached_func('cancel should not be called') + }); + await flushAsyncEvents(); // ensure stream is started + await ts.writable.close(); + assert_true(flushCalled, 'flush() was called'); + await cancelPromise; +}, 'readable.cancel() should not call cancel() when flush() is already called from writable.close()'); + +promise_test(async t => { + const cancelReason = new Error('cancel reason'); + const abortReason = new Error('abort reason'); + let cancelCalls = 0; + let controller; + let cancelPromise; + const ts = new TransformStream({ + start(c) { + controller = c; + }, + cancel() { + if (++cancelCalls === 1) { + cancelPromise = ts.readable.cancel(cancelReason); + } + }, + flush: t.unreached_func('flush should not be called') + }); + await flushAsyncEvents(); // ensure stream is started + await ts.writable.abort(abortReason); + assert_equals(cancelCalls, 1); + await cancelPromise; + assert_equals(cancelCalls, 1); +}, 'readable.cancel() should not call cancel() again when already called from writable.abort()'); + +promise_test(async t => { + const cancelReason = new Error('cancel reason'); + let controller; + let closePromise; + let cancelCalled = false; + const ts = new TransformStream({ + start(c) { + controller = c; + }, + cancel() { + cancelCalled = true; + closePromise = ts.writable.close(); + }, + flush: t.unreached_func('flush should not be called') + }); + await flushAsyncEvents(); // ensure stream is started + await ts.readable.cancel(cancelReason); + assert_true(cancelCalled, 'cancel() was called'); + await closePromise; +}, 'writable.close() should not call flush() when cancel() is already called from readable.cancel()'); + +promise_test(async t => { + const cancelReason = new Error('cancel reason'); + const abortReason = new Error('abort reason'); + let cancelCalls = 0; + let controller; + let abortPromise; + const ts = new TransformStream({ + start(c) { + controller = c; + }, + cancel() { + if (++cancelCalls === 1) { + abortPromise = ts.writable.abort(abortReason); + } + }, + flush: t.unreached_func('flush should not be called') + }); + await flushAsyncEvents(); // ensure stream is started + await promise_rejects_exactly(t, abortReason, ts.readable.cancel(cancelReason)); + assert_equals(cancelCalls, 1); + await promise_rejects_exactly(t, abortReason, abortPromise); + assert_equals(cancelCalls, 1); +}, 'writable.abort() should not call cancel() again when already called from readable.cancel()'); diff --git a/tests/wpt/tests/streams/writable-streams/aborting.any.js b/tests/wpt/tests/streams/writable-streams/aborting.any.js index 9171dbe158f..9d8e80b1de6 100644 --- a/tests/wpt/tests/streams/writable-streams/aborting.any.js +++ b/tests/wpt/tests/streams/writable-streams/aborting.any.js @@ -1472,6 +1472,8 @@ promise_test(async t => { promise_test(async t => { let ctrl; + let abortPromise; + let abortPromiseFromSignal; const e1 = SyntaxError(); const e2 = TypeError(); const ws = new WritableStream({ @@ -1479,9 +1481,87 @@ promise_test(async t => { }); const writer = ws.getWriter(); - ctrl.signal.addEventListener('abort', () => writer.abort(e2)); - writer.abort(e1); + ctrl.signal.addEventListener('abort', () => { + abortPromiseFromSignal = writer.abort(e2); + }); + abortPromise = writer.abort(e1); assert_true(ctrl.signal.aborted); - await promise_rejects_exactly(t, e2, writer.closed, 'closed'); -}, 'recursive abort() call'); + await Promise.all([ + abortPromise, + abortPromiseFromSignal, + promise_rejects_exactly(t, e2, writer.closed, 'closed') + ]); +}, 'recursive abort() call from abort() aborting signal (not started)'); + +promise_test(async t => { + let ctrl; + let abortPromise; + let abortPromiseFromSignal; + const e1 = SyntaxError(); + const e2 = TypeError(); + const ws = new WritableStream({ + start(c) { ctrl = c; }, + }); + await flushAsyncEvents(); // ensure stream is started + + const writer = ws.getWriter(); + ctrl.signal.addEventListener('abort', () => { + abortPromiseFromSignal = writer.abort(e2); + }); + abortPromise = writer.abort(e1); + assert_true(ctrl.signal.aborted); + + await Promise.all([ + abortPromise, + abortPromiseFromSignal, + promise_rejects_exactly(t, e2, writer.closed, 'closed') + ]); +}, 'recursive abort() call from abort() aborting signal'); + +promise_test(async t => { + let ctrl; + let abortPromise; + let closePromiseFromSignal; + const theError = SyntaxError(); + const ws = new WritableStream({ + start(c) { ctrl = c; }, + }); + + const writer = ws.getWriter(); + ctrl.signal.addEventListener('abort', () => { + closePromiseFromSignal = writer.close(); + }); + abortPromise = writer.abort(theError); + assert_true(ctrl.signal.aborted); + + await Promise.all([ + abortPromise, + promise_rejects_exactly(t, theError, closePromiseFromSignal, 'closed'), + promise_rejects_exactly(t, theError, writer.closed, 'closed') + ]); +}, 'recursive close() call from abort() aborting signal (not started)'); + +promise_test(async t => { + let ctrl; + let abortPromise; + let closePromiseFromSignal; + const theError = SyntaxError(); + const ws = new WritableStream({ + start(c) { ctrl = c; }, + }); + await flushAsyncEvents(); // ensure stream is started + + const writer = ws.getWriter(); + ctrl.signal.addEventListener('abort', () => { + closePromiseFromSignal = writer.close(); + }); + abortPromise = writer.abort(theError); + assert_true(ctrl.signal.aborted); + + await Promise.all([ + abortPromise, + closePromiseFromSignal, + writer.closed + ]); +}, 'recursive close() call from abort() aborting signal'); diff --git a/tests/wpt/tests/streams/writable-streams/constructor.any.js b/tests/wpt/tests/streams/writable-streams/constructor.any.js index 0abc7ef545e..bb382a33b8e 100644 --- a/tests/wpt/tests/streams/writable-streams/constructor.any.js +++ b/tests/wpt/tests/streams/writable-streams/constructor.any.js @@ -87,6 +87,10 @@ test(() => { new WritableStream(); }, 'WritableStream should be constructible with no arguments'); +test(() => { + assert_throws_js(RangeError, () => new WritableStream({ type: 'bytes' }), 'constructor should throw'); +}, `WritableStream can't be constructed with a defined type`); + test(() => { const underlyingSink = { get start() { throw error1; } }; const queuingStrategy = { highWaterMark: 0, get size() { throw error2; } }; diff --git a/tests/wpt/tests/streams/writable-streams/garbage-collection.any.js b/tests/wpt/tests/streams/writable-streams/garbage-collection.any.js new file mode 100644 index 00000000000..5e39e7c60d2 --- /dev/null +++ b/tests/wpt/tests/streams/writable-streams/garbage-collection.any.js @@ -0,0 +1,21 @@ +// META: global=window,worker,shadowrealm +// META: script=/common/gc.js +'use strict'; + +promise_test(async () => { + + let written = false; + const promise = (() => { + const rs = new WritableStream({ + write() { + written = true; + } + }); + const writer = rs.getWriter(); + return writer.write('something'); + })(); + await garbageCollect(); + await promise; + assert_true(written); + +}, 'A WritableStream and its writer should not be garbage collected while there is a write promise pending'); diff --git a/tests/wpt/tests/subresource-integrity/identity-digest/tentative/fetch.any.js b/tests/wpt/tests/subresource-integrity/identity-digest/tentative/fetch.any.js new file mode 100644 index 00000000000..9993646f8be --- /dev/null +++ b/tests/wpt/tests/subresource-integrity/identity-digest/tentative/fetch.any.js @@ -0,0 +1,143 @@ +// META: global=window,dedicatedworker,sharedworker +// META: script=/common/subset-tests-by-key.js +// META: variant=?include=integrity-none +// META: variant=?include=integrity-pass +// META: variant=?include=integrity-fail +// META: timeout=long + +// Given `{ digest: "...", body: "...", cors: true, type: "..." }`: +function resourceURL(data) { + let params = new URLSearchParams(data); + return "./resource.py?" + params.toString(); +} + +const hello_world = "hello world"; +const hello_hashes = { + "sha-256": "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=", + "sha-384": "/b2OdaZ/KfcBpOBAOF4uI5hjA+oQI5IRr5B/y7g1eLPkF8txzmRu/QgZ3YwIjeG9", + "sha-512": "MJ7MSJwS1utMxA9QyQLytNDtd+5RGnx6m808qG1M2G+YndNbxf9JlnDaNCVbRbDP2DDoH2Bdz33FVC6TrpzXbw==" +}; + +const dlrow_olleh = hello_world.split("").reverse().join(""); +const dlrow_hashes = { + "sha-256": "vT+a3uWsoxRxVJEINKfH4XZpLqsneOzhFVY98Y3iIz0=", + "sha-384": "rueKXz5kdtdmTpc6NbS9fCqr7z8h2mjNs43K9WUglTsZPJzKSUpR87dLs/FNemRN", + "sha-512": "N/peuevAy3l8KpS0bB6VTS8vc0fdAvjBJKYjVo2xb6sB6LpDfY6YlrXkWeeXGrP07UXDXEu1K3+SaUqMNjEkxQ==" +}; + +const EXPECT_BLOCKED = "block"; +const EXPECT_LOADED = "loaded"; +function generate_test(data, expectation, desc) { + subsetTestByKey("integrity-none", promise_test, test => { + let fetcher = fetch(resourceURL(data)); + if (expectation == EXPECT_BLOCKED) { + return promise_rejects_js(test, TypeError, fetcher); + } else { + return fetcher.then(async r => { + assert_equals(r.status, 200, "Response status is 200."); + assert_equals(await r.text(), data.body); + }); + } + }, "No integrity metadata + " + desc); + + subsetTestByKey("integrity-pass", promise_test, test => { + // Force CORS for the integrity check below: + const data_with_cors = structuredClone(data); + data_with_cors.cors = true; + + // The integrity check should pass, and nothing about the + // `Identity-Digest` check should be affected. + let fetcher = fetch(resourceURL(data_with_cors), { integrity: `sha256-${hello_hashes['sha-256']}`, mode: "cors" }); + if (expectation == EXPECT_BLOCKED) { + return promise_rejects_js(test, TypeError, fetcher); + } else { + return fetcher.then(async r => { + assert_equals(r.status, 200, "Response status is 200."); + assert_equals(await r.text(), data.body); + }); + } + }, "Good integrity metadata + " + desc); + + + subsetTestByKey("integrity-fail", promise_test, test => { + // Force CORS for the integrity check below: + const data_with_cors = structuredClone(data); + data_with_cors.cors = true; + + // The integrity check should fail, so the resource should be blocked, + // even with matching `Identity-Digest`s. + let fetcher = fetch(resourceURL(data_with_cors), { integrity: `sha256-${dlrow_hashes['sha-256']}`, mode: "cors" }); + return promise_rejects_js(test, TypeError, fetcher); + }, "Bad integrity metadata blocks everything, even: " + desc); +} + +// No header. +generate_test( + { body: hello_world }, + EXPECT_LOADED, + "No header: loads."); + +let good_header_list = []; +let bad_header_list = []; +let mixed_header_list = []; +for (const key in hello_hashes) { + let good_header = `${key}=:${hello_hashes[key]}:`; + good_header_list.push(good_header); + let bad_header = `${key}=:${dlrow_hashes[key]}:`; + bad_header_list.push(bad_header); + mixed_header_list.push(good_header, bad_header); + + // - Good single headers: + generate_test({ + body: hello_world, + digest: good_header + }, + EXPECT_LOADED, + `Good ${key} header: loads.`); + + // - Good multiple headers: + generate_test({ + body: hello_world, + digest: `${good_header},${good_header}` + }, + EXPECT_LOADED, + `Repeated ${key} header: loads.`); + + generate_test({ + body: hello_world, + digest: good_header_list.join(",") + }, + EXPECT_LOADED, + `Multiple good headers (previous += ${key}): loads.`); + + // - Bad single headers: + generate_test({ + body: hello_world, + digest: bad_header + }, + EXPECT_BLOCKED, + `Bad ${key} header: blocked.`); + + // - Bad multiple headers: + generate_test({ + body: hello_world, + digest: `${bad_header},${bad_header}` + }, + EXPECT_BLOCKED, + `Repeated ${key} header: blocked.`); + + generate_test({ + body: hello_world, + digest: bad_header_list.join(",") + }, + EXPECT_BLOCKED, + `Multiple bad headers (previous += ${key}): blocked.`); +} + +// - Mixed headers. +generate_test({ + body: hello_world, + digest: mixed_header_list.join(","), + }, + EXPECT_BLOCKED, + `Mixed good and bad headers: blocked.`); diff --git a/tests/wpt/tests/subresource-integrity/identity-digest/tentative/resource.py b/tests/wpt/tests/subresource-integrity/identity-digest/tentative/resource.py new file mode 100644 index 00000000000..5eec823f6d6 --- /dev/null +++ b/tests/wpt/tests/subresource-integrity/identity-digest/tentative/resource.py @@ -0,0 +1,27 @@ +''' +`Integrity-Digest` helper, generating responses that: + +* Include or exclude an `Integrity-Digest` header depending on the request's + `digest` parameter. + +* Include or exclude `Access-Control-Allow-Origin: *` depending on the + request's `cors` parameter. + +* Sets a `Content-Type` header from the request's `type` parameter. + +* Echos the `body` parameter into the response body. +''' +def main(request, response): + digest = request.GET.first(b'digest', b'') + if digest: + response.headers.set(b'identity-digest', digest) + + cors = request.GET.first(b'cors', '') + if cors: + response.headers.set(b'access-control-allow-origin', b'*') + + response.headers.set(b'content-type', + request.GET.first(b'type', b'text/plain')) + + response.status_code = 200 + response.content = request.GET.first(b'body', '') diff --git a/tests/wpt/tests/subresource-integrity/identity-digest/tentative/script.window.js b/tests/wpt/tests/subresource-integrity/identity-digest/tentative/script.window.js new file mode 100644 index 00000000000..c839243c7b2 --- /dev/null +++ b/tests/wpt/tests/subresource-integrity/identity-digest/tentative/script.window.js @@ -0,0 +1,148 @@ +// META: script=/common/subset-tests-by-key.js +// META: variant=?include=integrity-none +// META: variant=?include=integrity-pass +// META: variant=?include=integrity-fail +// META: timeout=long + +// Given `{ digest: "...", body: "...", cors: true }`: +function scriptURL(data) { + data.type = "application/javascript"; + let params = new URLSearchParams(data); + return "./resource.py?" + params.toString(); +} + +const executable_body = "window.hello = `world`;"; +const unreached_body = "assert_unreached(`This code should not execute.`);"; +const executable_hashes = { + "sha-256": "PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=", + "sha-384": "M5blqNh7AvXO/52MpQtxNMMV4B9uoKLMkdTte7k4mQz11WZDhH3P4QLWkvOA7llb", + "sha-512": "6qaEeboWnnFooKiwqnorS3SbkLk5rZcqoSsgEeB97srB0WIH6hJk2QDevHAen7gym6/jW244Ogf5MhZMjPYFrA==" +}; +const well_formed_but_incorrect_hashes = { + "sha-256": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "sha-384": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "sha-512": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" +}; + +const EXPECT_BLOCKED = "block"; +const EXPECT_LOADED = "loaded"; +function generate_test(data, expectation, desc) { + subsetTestByKey("integrity-none", async_test, t => { + let s = document.createElement('script'); + s.src = scriptURL(data); + if (expectation == EXPECT_BLOCKED) { + s.onerror = t.step_func_done(e => { + assert_equals("error", e.type); + }); + s.onload = t.unreached_func("Script should not execute."); + } else { + s.onload = t.step_func_done(e => { + assert_equals("load", e.type); + }); + s.onerror = t.unreached_func("Script should not fail."); + } + document.body.appendChild(s); + }, "No `integrity` attribute + " + desc); + + subsetTestByKey("integrity-pass", async_test, t => { + let s = document.createElement('script'); + s.src = scriptURL(data); + s.crossorigin = "anonymous"; + s.integrity = `sha256-${executable_hashes['sha-256']}` + if (expectation == EXPECT_BLOCKED) { + s.onerror = t.step_func_done(e => { + assert_equals("error", e.type); + }); + s.onload = t.unreached_func("Script should not execute."); + } else { + s.onload = t.step_func_done(e => { + assert_equals("load", e.type); + }); + s.onerror = t.unreached_func("Script should not fail."); + } + document.body.appendChild(s); + }, "Matching `integrity` attribute + " + desc); + + subsetTestByKey("integrity-fail", async_test, t => { + let s = document.createElement('script'); + s.src = scriptURL(data); + s.crossorigin = "anonymous"; + s.integrity = `sha512-${well_formed_but_incorrect_hashes['sha-512']}` + s.onerror = t.step_func_done(e => { + assert_equals("error", e.type); + }); + s.onload = t.unreached_func("Script should not execute."); + document.body.appendChild(s); + }, "Mismatching `integrity` attribute always blocks: " + desc); +} + +// No header. +generate_test( + { body: executable_body }, + EXPECT_LOADED, + "No header: loads."); + +let good_header_list = []; +let bad_header_list = []; +let mixed_header_list = []; +for (const key in executable_hashes) { + let good_header = `${key}=:${executable_hashes[key]}:`; + good_header_list.push(good_header); + let bad_header = `${key}=:${well_formed_but_incorrect_hashes[key]}:`; + bad_header_list.push(bad_header); + mixed_header_list.push(good_header, bad_header); + + // - Good single headers: + generate_test({ + body: executable_body, + digest: good_header + }, + EXPECT_LOADED, + `Good ${key} header: loads.`); + + // - Good multiple headers: + generate_test({ + body: executable_body, + digest: `${good_header},${good_header}` + }, + EXPECT_LOADED, + `Repeated ${key} header: loads.`); + + generate_test({ + body: executable_body, + digest: good_header_list.join(",") + }, + EXPECT_LOADED, + `Multiple good headers (previous += ${key}): loads.`); + + // - Bad single headers: + generate_test({ + body: executable_body, + digest: bad_header + }, + EXPECT_BLOCKED, + `Bad ${key} header: blocked.`); + + // - Bad multiple headers: + generate_test({ + body: executable_body, + digest: `${bad_header},${bad_header}` + }, + EXPECT_BLOCKED, + `Repeated ${key} header: blocked.`); + + generate_test({ + body: executable_body, + digest: bad_header_list.join(",") + }, + EXPECT_BLOCKED, + `Multiple bad headers (previous += ${key}): blocked.`); +} + +// - Mixed headers. +generate_test({ + body: executable_body, + digest: mixed_header_list.join(","), + }, + EXPECT_BLOCKED, + `Mixed good and bad headers: blocked.`); diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/fetch.any.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/fetch.any.js new file mode 100644 index 00000000000..86fd23f907b --- /dev/null +++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/fetch.any.js @@ -0,0 +1,116 @@ +// META: global=window,dedicatedworker,sharedworker + +// Given `{ digest: "...", body: "...", cors: true, type: "..." }`: +function resourceURL(data) { + let params = new URLSearchParams(data); + return "./resource.py?" + params.toString(); +} + +// A canonically validly signed response, generated using the steps at +// https://wicg.github.io/signature-based-sri/#examples, relying on the test +// key from https://www.rfc-editor.org/rfc/rfc9421.html#name-example-ed25519-test-key: +// +// ``` +// NOTE: '\' line wrapping per RFC 8792 +// +// HTTP/1.1 200 OK +// Date: Tue, 20 Apr 2021 02:07:56 GMT +// Content-Type: application/json +// Identity-Digest: sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=: +// Content-Length: 18 +// Signature-Input: signature=("identity-digest";sf);alg="ed25519"; \ +// keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="; \ +// tag="sri" +// Signature: signature=:H7AqWWgo1DJ7VdyF9DKotG/4hvatKDfRTq2mpuY/hvJupSn+EYzus \ +// 5p24qPK7DtVQcxJFhzSYDj4RBq9grZTAQ==: +// +// {"hello": "world"} +// ``` + +// Test key from https://www.rfc-editor.org/rfc/rfc9421.html#name-example-ed25519-test-key. +const kValidKey = "JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="; + +// A key with the right length that cannot be used to verify the HTTP response +// above. +const kInvalidKey = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; + +// Metadata from the response above: +const kRequestWithValidSignature = { + body: `{"hello": "world"}`, + digest: `sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:`, + signature: `signature=:H7AqWWgo1DJ7VdyF9DKotG/4hvatKDfRTq2mpuY/hvJupSn+EYzus5p24qPK7DtVQcxJFhzSYDj4RBq9grZTAQ==:`, + signatureInput: `signature=("identity-digest";sf);alg="ed25519";keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri"` +}; + +// Metadata from the response above, but with an incorrect signature: +const kRequestWithInvalidSignature = { + body: `{"hello": "world"}`, + digest: `sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:`, + signature: `signature=:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==:`, + signatureInput: `signature=("identity-digest";sf);alg="ed25519";keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri"` +}; + +const EXPECT_BLOCKED = "block"; +const EXPECT_LOADED = "loaded"; + +function generate_test(request_data, integrity, expectation, description) { + promise_test(test => { + const url = resourceURL(request_data); + let options = {}; + if (integrity != "") { + options.integrity = integrity; + } + + let fetcher = fetch(url, options); + if (expectation == EXPECT_LOADED) { + return fetcher.then(r => { + assert_equals(r.status, 200, "Response status is 200."); + }); + } else { + return promise_rejects_js(test, TypeError, fetcher); + } + }, description); +} + +generate_test({}, "", EXPECT_LOADED, + "No signature, no integrity check: loads."); + +generate_test({}, `ed25519-!!!`, EXPECT_LOADED, + "No signature, malformed integrity check: loads."); + +generate_test({}, `ed25519-${kValidKey}`, EXPECT_BLOCKED, + "No signature, valid integrity check: blocked."); + +// Valid signatures depend upon integrity checks. +generate_test(kRequestWithValidSignature, "", EXPECT_LOADED, + "Valid signature, no integrity check: loads."); + +generate_test(kRequestWithValidSignature, "ed25519-???", EXPECT_LOADED, + "Valid signature, malformed integrity check: loads."); + +generate_test(kRequestWithValidSignature, `ed25519-${kValidKey}`, EXPECT_LOADED, + "Valid signature, matching integrity check: loads."); + +generate_test(kRequestWithValidSignature, `ed25519-${kInvalidKey}`, EXPECT_BLOCKED, + "Valid signature, mismatched integrity check: blocked."); + +generate_test(kRequestWithValidSignature, + `ed25519-${kValidKey} ed25519-${kInvalidKey}`, EXPECT_LOADED, + "Valid signature, one valid integrity check: loads."); + +// Invalid signatures are all blocked. +generate_test(kRequestWithInvalidSignature, "", EXPECT_BLOCKED, + "Invalid signature, no integrity check: blocked."); + +generate_test(kRequestWithInvalidSignature, "ed25519-???", EXPECT_BLOCKED, + "Invalid signature, malformed integrity check: blocked."); + +generate_test(kRequestWithInvalidSignature, `ed25519-${kValidKey}`, EXPECT_BLOCKED, + "Invalid signature, matching integrity check: blocked."); + +generate_test(kRequestWithInvalidSignature, `ed25519-${kInvalidKey}`, EXPECT_BLOCKED, + "Invalid signature, mismatched integrity check: blocked."); + +generate_test(kRequestWithInvalidSignature, + `ed25519-${kValidKey} ed25519-${kInvalidKey}`, EXPECT_BLOCKED, + "Invalid signature, one valid integrity check: blocked."); diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/resource.py b/tests/wpt/tests/subresource-integrity/signatures/tentative/resource.py new file mode 100644 index 00000000000..3908b237038 --- /dev/null +++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/resource.py @@ -0,0 +1,38 @@ +''' +SRI Message Signature helper, generating responses that: + +* Include or exclude an `Integrity-Digest` header depending on the request's + `digest` parameter. +* Include or exclude an `Signature` header depending on the request's + `signature` parameter. +* Include or exclude an `Signature-Input` header depending on the request's + `signatureInput` parameter. + +* Include or exclude `Access-Control-Allow-Origin: *` depending on the + request's `cors` parameter. + +* Sets a `Content-Type` header from the request's `type` parameter. + +* Echos the `body` parameter into the response body. +''' +def main(request, response): + digest = request.GET.first(b'digest', b'') + signature = request.GET.first(b'signature', b'') + signatureInput = request.GET.first(b'signatureInput', b'') + if digest: + response.headers.set(b'identity-digest', digest) + if signature: + response.headers.set(b'signature', signature) + if signatureInput: + response.headers.set(b'signature-input', signatureInput) + + + cors = request.GET.first(b'cors', '') + if cors: + response.headers.set(b'access-control-allow-origin', b'*') + + response.headers.set(b'content-type', + request.GET.first(b'type', b'text/plain')) + + response.status_code = 200 + response.content = request.GET.first(b'body', '') diff --git a/tests/wpt/tests/tools/manifest/manifest.py b/tests/wpt/tests/tools/manifest/manifest.py index 959978f5283..e04872c6d53 100644 --- a/tests/wpt/tests/tools/manifest/manifest.py +++ b/tests/wpt/tests/tools/manifest/manifest.py @@ -25,7 +25,7 @@ from .sourcefile import SourceFile from .typedata import TypeData -CURRENT_VERSION: int = 8 +CURRENT_VERSION: int = 9 class ManifestError(Exception): diff --git a/tests/wpt/tests/tools/manifest/tests/test_manifest.py b/tests/wpt/tests/tools/manifest/tests/test_manifest.py index fc2314b8356..7511b21bc83 100644 --- a/tests/wpt/tests/tools/manifest/tests/test_manifest.py +++ b/tests/wpt/tests/tools/manifest/tests/test_manifest.py @@ -168,7 +168,7 @@ def test_manifest_to_json_forwardslash(): assert m.update(tree) is True assert m.to_json() == { - 'version': 8, + 'version': 9, 'url_base': '/', 'items': { 'testharness': {'a': {'b': [ @@ -306,7 +306,7 @@ def test_update_from_json_modified(): (None, {'timeout': 'long', 'pac': 'proxy.pac'}) ]}}, 'url_base': '/', - 'version': 8 + 'version': 9 } def test_manifest_spec_to_json(): @@ -326,7 +326,7 @@ def test_manifest_spec_to_json(): assert m.update(tree, True, manifest.compute_manifest_spec_items) is True assert m.to_json() == { - 'version': 8, + 'version': 9, 'url_base': '/', 'items': { 'spec': {'a': {'b': [ diff --git a/tests/wpt/tests/tools/serve/serve.py b/tests/wpt/tests/tools/serve/serve.py index 9d1283ff3e8..497e2613db5 100644 --- a/tests/wpt/tests/tools/serve/serve.py +++ b/tests/wpt/tests/tools/serve/serve.py @@ -452,7 +452,7 @@ class ShadowRealmInWindowHandler(HtmlWrapperHandler): await fetch_tests_from_shadow_realm(r); done(); -})(); +})().catch(e => setup(() => { throw e; })); """ @@ -504,7 +504,7 @@ class ShadowRealmInShadowRealmHandler(HtmlWrapperHandler): `); await fetch_tests_from_shadow_realm(outer); done(); -})(); +})().catch(e => setup(() => { throw e; })); """ @@ -625,23 +625,27 @@ class ShadowRealmWorkerWrapperHandler(BaseWorkerHandler): wrapper = """%(meta)s importScripts("/resources/testharness-shadowrealm-outer.js"); (async function() { - const r = new ShadowRealm(); - await shadowRealmEvalAsync(r, ` - await import("/resources/testharness-shadowrealm-inner.js"); - await import("/resources/testharness.js"); - `); - r.evaluate("setShadowRealmGlobalProperties")("%(query)s", fetchAdaptor); - - await shadowRealmEvalAsync(r, ` - %(script)s - await import("%(path)s"); - `); - const postMessageFunc = await getPostMessageFunc(); - function forwardMessage(msgJSON) { - postMessageFunc(JSON.parse(msgJSON)); + try { + const r = new ShadowRealm(); + await shadowRealmEvalAsync(r, ` + await import("/resources/testharness-shadowrealm-inner.js"); + await import("/resources/testharness.js"); + `); + r.evaluate("setShadowRealmGlobalProperties")("%(query)s", fetchAdaptor); + + await shadowRealmEvalAsync(r, ` + %(script)s + await import("%(path)s"); + `); + + function forwardMessage(msgJSON) { + postMessageFunc(JSON.parse(msgJSON)); + } + r.evaluate('begin_shadow_realm_tests')(forwardMessage); + } catch (e) { + postMessageFunc(createSetupErrorResult(e)); } - r.evaluate('begin_shadow_realm_tests')(forwardMessage); })(); """ @@ -655,25 +659,29 @@ class ShadowRealmServiceWorkerWrapperHandler(BaseWorkerHandler): importScripts("/resources/testharness-shadowrealm-outer.js"); (async function () { - const r = new ShadowRealm(); - setupFakeDynamicImportInShadowRealm(r, fetchAdaptor); - - await shadowRealmEvalAsync(r, ` - await fakeDynamicImport("/resources/testharness-shadowrealm-inner.js"); - await fakeDynamicImport("/resources/testharness.js"); - `); - r.evaluate("setShadowRealmGlobalProperties")("%(query)s", fetchAdaptor); - - await shadowRealmEvalAsync(r, ` - %(script)s - await fakeDynamicImport("%(path)s"); - `); - const postMessageFunc = await getPostMessageFunc(); - function forwardMessage(msgJSON) { - postMessageFunc(JSON.parse(msgJSON)); + try { + const r = new ShadowRealm(); + setupFakeDynamicImportInShadowRealm(r, fetchAdaptor); + + await shadowRealmEvalAsync(r, ` + await fakeDynamicImport("/resources/testharness-shadowrealm-inner.js"); + await fakeDynamicImport("/resources/testharness.js"); + `); + r.evaluate("setShadowRealmGlobalProperties")("%(query)s", fetchAdaptor); + + await shadowRealmEvalAsync(r, ` + %(script)s + await fakeDynamicImport("%(path)s"); + `); + + function forwardMessage(msgJSON) { + postMessageFunc(JSON.parse(msgJSON)); + } + r.evaluate("begin_shadow_realm_tests")(forwardMessage); + } catch (e) { + postMessageFunc(createSetupErrorResult(e)); } - r.evaluate("begin_shadow_realm_tests")(forwardMessage); })(); """ @@ -685,26 +693,30 @@ class ShadowRealmAudioWorkletWrapperHandler(BaseWorkerHandler): path_replace = [(".any.audioworklet-shadowrealm.js", ".any.js")] wrapper = """%(meta)s TestRunner.prototype.createShadowRealmAndStartTests = async function() { - const queryPart = import.meta.url.split('?')[1]; - const locationSearch = queryPart ? '?' + queryPart : ''; + try { + const queryPart = import.meta.url.split('?')[1]; + const locationSearch = queryPart ? '?' + queryPart : ''; - const r = new ShadowRealm(); - const adaptor = this.fetchOverPortExecutor.bind(this); - setupFakeDynamicImportInShadowRealm(r, adaptor); + const r = new ShadowRealm(); + const adaptor = this.fetchOverPortExecutor.bind(this); + setupFakeDynamicImportInShadowRealm(r, adaptor); - await shadowRealmEvalAsync(r, ` - await fakeDynamicImport("/resources/testharness-shadowrealm-inner.js"); - await fakeDynamicImport("/resources/testharness.js"); - `); - r.evaluate("setShadowRealmGlobalProperties")(locationSearch, adaptor); + await shadowRealmEvalAsync(r, ` + await fakeDynamicImport("/resources/testharness-shadowrealm-inner.js"); + await fakeDynamicImport("/resources/testharness.js"); + `); + r.evaluate("setShadowRealmGlobalProperties")(locationSearch, adaptor); - await shadowRealmEvalAsync(r, ` - %(script)s - await fakeDynamicImport("%(path)s"); - `); - const forwardMessage = (msgJSON) => - this.port.postMessage(JSON.parse(msgJSON)); - r.evaluate("begin_shadow_realm_tests")(forwardMessage); + await shadowRealmEvalAsync(r, ` + %(script)s + await fakeDynamicImport("%(path)s"); + `); + const forwardMessage = (msgJSON) => + this.port.postMessage(JSON.parse(msgJSON)); + r.evaluate("begin_shadow_realm_tests")(forwardMessage); + } catch (e) { + this.port.postMessage(createSetupErrorResult(e)); + } } """ diff --git a/tests/wpt/tests/tools/wpt/browser.py b/tests/wpt/tests/tools/wpt/browser.py index 923bf9904f1..0ac1b982ed0 100644 --- a/tests/wpt/tests/tools/wpt/browser.py +++ b/tests/wpt/tests/tools/wpt/browser.py @@ -2374,17 +2374,34 @@ class WebKitTestRunner(Browser): return f.read().strip() -class WebKitGTKMiniBrowser(WebKit): +class WebKitGlibBaseMiniBrowser(WebKit): + """WebKitGTK and WPE MiniBrowser specific interface (base class).""" + + # This class is not meant to be used directly. + # And the class variables below should be defined on the subclasses. + BASE_DOWNLOAD_URI = "" + PORT_PRETTY_NAME = "" + WEBDRIVER_BINARY_NAME = "" + LIBEXEC_SUBDIR_PREFIXES = [""] + product = "" + + def __init__(self, *args, **kwargs): + if self.__class__.__name__ == "WebKitGlibBaseMiniBrowser": + raise RuntimeError("class WebKitGlibBaseMiniBrowser should not be used directly, but subclassed") + for required_class_var in ["BASE_DOWNLOAD_URI", "PORT_PRETTY_NAME", "WEBDRIVER_BINARY_NAME", "LIBEXEC_SUBDIR_PREFIXES", "product"]: + class_var_value = getattr(self, required_class_var, "") + if all(len(i) == 0 for i in class_var_value): + raise NotImplementedError('subclass "%s" should define class variable "%s"' % (self.__class__.__name__, required_class_var)) + return super().__init__(*args, **kwargs) def download(self, dest=None, channel=None, rename=None): - base_dowload_uri = "https://webkitgtk.org/built-products/" - base_download_dir = base_dowload_uri + platform.machine() + "/release/" + channel + "/MiniBrowser/" + base_download_dir = self.BASE_DOWNLOAD_URI + platform.machine() + "/release/" + channel + "/MiniBrowser/" try: response = get(base_download_dir + "LAST-IS") except requests.exceptions.HTTPError as e: if e.response.status_code == 404: - raise RuntimeError("Can't find a WebKitGTK MiniBrowser %s bundle for %s at %s" - % (channel, platform.machine(), base_dowload_uri)) + raise RuntimeError("Can't find a %s MiniBrowser %s bundle for %s at %s" + % (self.PORT_PRETTY_NAME, channel, platform.machine(), self.BASE_DOWNLOAD_URI)) raise bundle_filename = response.text.strip() @@ -2393,7 +2410,7 @@ class WebKitGTKMiniBrowser(WebKit): dest = self._get_browser_download_dir(dest, channel) bundle_file_path = os.path.join(dest, bundle_filename) - self.logger.info("Downloading WebKitGTK MiniBrowser bundle from %s" % bundle_url) + self.logger.info("Downloading %s MiniBrowser bundle from %s" % (self.PORT_PRETTY_NAME, bundle_url)) with open(bundle_file_path, "w+b") as f: get_download_to_descriptor(f, bundle_url) @@ -2405,13 +2422,13 @@ class WebKitGTKMiniBrowser(WebKit): if bundle_expected_hash != bundle_computed_hash: self.logger.error("Calculated SHA256 hash is %s but was expecting %s" % (bundle_computed_hash, bundle_expected_hash)) - raise RuntimeError("The WebKitGTK MiniBrowser bundle at %s has incorrect SHA256 hash." % bundle_file_path) + raise RuntimeError("The %s MiniBrowser bundle at %s has incorrect SHA256 hash." % (self.PORT_PRETTY_NAME, bundle_file_path)) return bundle_file_path def install(self, dest=None, channel=None, prompt=True): dest = self._get_browser_binary_dir(dest, channel) bundle_path = self.download(dest, channel) - bundle_uncompress_directory = os.path.join(dest, "webkitgtk_minibrowser") + bundle_uncompress_directory = os.path.join(dest, self.product) # Clean it from previous runs if os.path.exists(bundle_uncompress_directory): @@ -2425,17 +2442,17 @@ class WebKitGTKMiniBrowser(WebKit): elif ".tar." in bundle_file_name: untar(f, bundle_uncompress_directory) else: - raise NotImplementedError("Unable to install WebKitGTK MiniBrowser bundle from file:" % bundle_file_name) + raise NotImplementedError("Don't know how to install the file: %s" % bundle_file_name) os.remove(bundle_path) - for expected_binary in ["MiniBrowser", "WebKitWebDriver"]: + for expected_binary in ["MiniBrowser", self.WEBDRIVER_BINARY_NAME]: binary_path = os.path.join(bundle_uncompress_directory, expected_binary) if not (os.path.isfile(binary_path) and os.access(binary_path, os.X_OK)): raise RuntimeError("Can't find a %s binary at %s" % (expected_binary, binary_path)) minibrowser_path = os.path.join(bundle_uncompress_directory, "MiniBrowser") version_str = subprocess.check_output([minibrowser_path, "--version"]).decode("utf-8").strip() - self.logger.info("WebKitGTK MiniBrowser bundle for channel %s installed: %s" % (channel, version_str)) + self.logger.info("%s MiniBrowser bundle for channel %s installed: %s" % (self.PORT_PRETTY_NAME, channel, version_str)) install_ok_file = os.path.join(bundle_uncompress_directory, ".installation-ok") open(install_ok_file, "w").close() # touch return minibrowser_path @@ -2443,41 +2460,44 @@ class WebKitGTKMiniBrowser(WebKit): def _find_executable_in_channel_bundle(self, binary, venv_path=None, channel=None): if venv_path: venv_base_path = self._get_browser_binary_dir(venv_path, channel) - bundle_dir = os.path.join(venv_base_path, "webkitgtk_minibrowser") + bundle_dir = os.path.join(venv_base_path, self.product) install_ok_file = os.path.join(bundle_dir, ".installation-ok") if os.path.isfile(install_ok_file): - return which(binary, path=bundle_dir) + return shutil.which(binary, path=bundle_dir) return None def find_binary(self, venv_path=None, channel=None): minibrowser_path = self._find_executable_in_channel_bundle("MiniBrowser", venv_path, channel) if minibrowser_path: + self.logger.info("Found %s MiniBrowser %s at path: %s" % (self.PORT_PRETTY_NAME, channel, minibrowser_path)) return minibrowser_path + # Find MiniBrowser on the system which is usually installed on the libexec dir triplet = "x86_64-linux-gnu" # Try to use GCC to detect this machine triplet - gcc = which("gcc") + gcc = shutil.which("gcc") if gcc: try: triplet = call(gcc, "-dumpmachine").strip() except subprocess.CalledProcessError: pass - - versions = ["4.0", "4.1"] - libexecpaths = [] - - for version in versions: - # Fedora paths. - libexecpaths.append(f"/usr/libexec/webkit2gtk-{version}") - # Debian/Ubuntu paths - libexecpaths.append(f"/usr/lib/{triplet}/webkit2gtk-{version}") - - return which("MiniBrowser", path=os.pathsep.join(libexecpaths)) + for libexec_dir in ["/usr/libexec", f"/usr/lib/{triplet}", "/usr/lib"]: + if os.path.isdir(libexec_dir): + for libexec_entry in sorted(os.listdir(libexec_dir), reverse=True): + for libexec_subdir_prefix in self.LIBEXEC_SUBDIR_PREFIXES: + if libexec_entry.startswith(libexec_subdir_prefix): + minibrowser_candidate_path = os.path.join(libexec_dir, libexec_entry, 'MiniBrowser') + if os.path.isfile(minibrowser_candidate_path) and os.access(minibrowser_candidate_path, os.X_OK): + self.logger.info("Found %s MiniBrowser at path: %s" % (self.PORT_PRETTY_NAME, minibrowser_candidate_path)) + return minibrowser_candidate_path + return None def find_webdriver(self, venv_path=None, channel=None): - webdriver_path = self._find_executable_in_channel_bundle("WebKitWebDriver", venv_path, channel) + webdriver_path = self._find_executable_in_channel_bundle(self.WEBDRIVER_BINARY_NAME, venv_path, channel) if not webdriver_path: - webdriver_path = which("WebKitWebDriver") + webdriver_path = shutil.which(self.WEBDRIVER_BINARY_NAME) + if webdriver_path: + self.logger.info("Found %s WebDriver at path: %s" % (self.PORT_PRETTY_NAME, webdriver_path)) return webdriver_path def version(self, binary=None, webdriver_binary=None): @@ -2489,7 +2509,7 @@ class WebKitGTKMiniBrowser(WebKit): return None # Example output: "WebKitGTK 2.26.1" if output: - m = re.match(r"WebKitGTK (.+)", output) + m = re.match(r"%s (.+)" % self.PORT_PRETTY_NAME, output) if not m: self.logger.warning("Failed to extract version from: %s" % output) return None @@ -2497,6 +2517,26 @@ class WebKitGTKMiniBrowser(WebKit): return None +class WebKitGTKMiniBrowser(WebKitGlibBaseMiniBrowser): + """WebKitGTK MiniBrowser specific interface.""" + + BASE_DOWNLOAD_URI = "https://webkitgtk.org/built-products/" + PORT_PRETTY_NAME = "WebKitGTK" + WEBDRIVER_BINARY_NAME = "WebKitWebDriver" + LIBEXEC_SUBDIR_PREFIXES = ["webkitgtk", "webkit2gtk"] + product = "webkitgtk_minibrowser" + + +class WPEWebKitMiniBrowser(WebKitGlibBaseMiniBrowser): + """WPE WebKit MiniBrowser specific interface.""" + + BASE_DOWNLOAD_URI = "https://wpewebkit.org/built-products/" + PORT_PRETTY_NAME = "WPE WebKit" + WEBDRIVER_BINARY_NAME = "WPEWebDriver" + LIBEXEC_SUBDIR_PREFIXES = ["wpe-webkit"] + product = "wpewebkit_minibrowser" + + class Epiphany(Browser): """Epiphany-specific interface.""" diff --git a/tests/wpt/tests/tools/wpt/install.py b/tests/wpt/tests/tools/wpt/install.py index 1e6408b0be6..e8f0a36a084 100644 --- a/tests/wpt/tests/tools/wpt/install.py +++ b/tests/wpt/tests/tools/wpt/install.py @@ -14,6 +14,7 @@ latest_channels = { 'safari': 'preview', 'servo': 'nightly', 'webkitgtk_minibrowser': 'nightly', + 'wpewebkit_minibrowser': 'nightly', 'wktr': 'main', } diff --git a/tests/wpt/tests/tools/wpt/run.py b/tests/wpt/tests/tools/wpt/run.py index 9c6acbc2a46..ee854bda2f9 100644 --- a/tests/wpt/tests/tools/wpt/run.py +++ b/tests/wpt/tests/tools/wpt/run.py @@ -816,9 +816,8 @@ class WebKitTestRunner(BrowserSetup): kwargs["binary"] = binary -class WebKitGTKMiniBrowser(BrowserSetup): - name = "webkitgtk_minibrowser" - browser_cls = browser.WebKitGTKMiniBrowser +class WebKitGlibBaseMiniBrowser(BrowserSetup): + """ Base class for WebKitGTKMiniBrowser and WPEWebKitMiniBrowser """ def install(self, channel=None): if self.prompt_install(self.name): @@ -838,10 +837,25 @@ class WebKitGTKMiniBrowser(BrowserSetup): venv_path=self.venv.path, channel=kwargs["browser_channel"]) if webdriver_binary is None: - raise WptrunError("Unable to find WebKitWebDriver in PATH") + raise WptrunError('Unable to find "%s" binary in PATH' % self.browser_cls.WEBDRIVER_BINARY_NAME) kwargs["webdriver_binary"] = webdriver_binary +class WebKitGTKMiniBrowser(WebKitGlibBaseMiniBrowser): + name = "webkitgtk_minibrowser" + browser_cls = browser.WebKitGTKMiniBrowser + + +class WPEWebKitMiniBrowser(WebKitGlibBaseMiniBrowser): + name = "wpewebkit_minibrowser" + browser_cls = browser.WPEWebKitMiniBrowser + + def setup_kwargs(self, kwargs): + if kwargs["headless"]: + kwargs["binary_args"].append("--headless") + super().setup_kwargs(kwargs) + + class Epiphany(BrowserSetup): name = "epiphany" browser_cls = browser.Epiphany @@ -883,6 +897,7 @@ product_setup = { "webkit": WebKit, "wktr": WebKitTestRunner, "webkitgtk_minibrowser": WebKitGTKMiniBrowser, + "wpewebkit_minibrowser": WPEWebKitMiniBrowser, "epiphany": Epiphany, "ladybird": Ladybird, } @@ -961,7 +976,7 @@ def setup_wptrunner(venv, **kwargs): if kwargs["install_browser"]: logger.info("Installing browser") - kwargs["binary"] = setup_cls.install(channel=channel) + kwargs["binary"] = setup_cls.install(channel=kwargs["browser_channel"]) setup_cls.setup(kwargs) diff --git a/tests/wpt/tests/tools/wpt/tests/test_browser.py b/tests/wpt/tests/tools/wpt/tests/test_browser.py index 3a45dab16e2..692a3af374a 100644 --- a/tests/wpt/tests/tools/wpt/tests/test_browser.py +++ b/tests/wpt/tests/tools/wpt/tests/test_browser.py @@ -341,8 +341,9 @@ def test_webkitgtk_minibrowser_version(mocked_check_output): assert webkitgtk_minibrowser.version(binary='MiniBrowser') == '2.26.1' # nightly version - mocked_check_output.return_value = b'WebKitGTK 2.27.1 (r250823)\n' - assert webkitgtk_minibrowser.version(binary='MiniBrowser') == '2.27.1 (r250823)' + mocked_check_output.return_value = b'WebKitGTK 2.47.1 (286783@main)\n' + assert webkitgtk_minibrowser.version(binary='MiniBrowser') == '2.47.1 (286783@main)' + @mock.patch('subprocess.check_output') def test_webkitgtk_minibrowser_version_errors(mocked_check_output): @@ -365,33 +366,137 @@ def test_webkitgtk_minibrowser_version_errors(mocked_check_output): # on Windows only works if the binary name ends with a ".exe" suffix. # But, WebKitGTK itself doesn't support Windows, so lets skip the test. @pytest.mark.skipif(sys.platform.startswith('win'), reason='test not needed on Windows') +@mock.patch('os.path.isdir', return_value=True) @mock.patch('os.access', return_value=True) -@mock.patch('os.path.exists') -def test_webkitgtk_minibrowser_find_binary(mocked_os_path_exists, _mocked_os_access): +@mock.patch('shutil.which') +@mock.patch('os.listdir') +@mock.patch('os.path.isfile') +def test_webkitgtk_minibrowser_find_binary(mocked_os_path_isfile, mocked_os_listdir, mocked_which, _mocked_os_access, _mocked_os_isdir): webkitgtk_minibrowser = browser.WebKitGTKMiniBrowser(logger) - # No MiniBrowser found - mocked_os_path_exists.side_effect = lambda path: path == '/etc/passwd' + # No WebKitGTK MiniBrowser found (WPE one shouldn't match) + mocked_os_path_isfile.side_effect = lambda path: path == '/usr/libexec/wpe-webkit-1.0/MiniBrowser' + mocked_os_listdir.side_effect = lambda contents: ['wpe-webkit-1.0', 'webkitgtk-6.0', 'webkit2gtk-4.0'] + mocked_which.side_effect = lambda found: None assert webkitgtk_minibrowser.find_binary() is None # Found on the default Fedora path fedora_minibrowser_path = '/usr/libexec/webkit2gtk-4.0/MiniBrowser' - mocked_os_path_exists.side_effect = lambda path: path == fedora_minibrowser_path + mocked_os_path_isfile.side_effect = lambda path: path == fedora_minibrowser_path + mocked_os_listdir.side_effect = lambda contents: ['wpe-webkit-1.0', 'webkitgtk-6.0', 'webkit2gtk-4.0'] + mocked_which.side_effect = lambda found: None assert webkitgtk_minibrowser.find_binary() == fedora_minibrowser_path # Found on the default Debian path for AMD64 (gcc not available) debian_minibrowser_path_amd64 = '/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/MiniBrowser' - mocked_os_path_exists.side_effect = lambda path: path == debian_minibrowser_path_amd64 + mocked_os_path_isfile.side_effect = lambda path: path == debian_minibrowser_path_amd64 + mocked_os_listdir.side_effect = lambda contents: ['wpe-webkit-1.0', 'webkitgtk-6.0', 'webkit2gtk-4.0'] + mocked_which.side_effect = lambda found: None assert webkitgtk_minibrowser.find_binary() == debian_minibrowser_path_amd64 # Found on the default Debian path for AMD64 (gcc available but gives an error) debian_minibrowser_path_amd64 = '/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/MiniBrowser' - mocked_os_path_exists.side_effect = lambda path: path in [debian_minibrowser_path_amd64, '/usr/bin/gcc'] + mocked_os_path_isfile.side_effect = lambda path: path in [debian_minibrowser_path_amd64, '/usr/bin/gcc'] + mocked_os_listdir.side_effect = lambda contents: ['wpe-webkit-1.0', 'webkitgtk-6.0', 'webkit2gtk-4.0'] + mocked_which.side_effect = lambda found: '/usr/bin/gcc' with mock.patch('subprocess.check_output', return_value = b'error', side_effect = subprocess.CalledProcessError(1, 'cmd')): assert webkitgtk_minibrowser.find_binary() == debian_minibrowser_path_amd64 - # Found on the default Debian path for ARM64 (gcc available) - debian_minibrowser_path_arm64 = '/usr/lib/aarch64-linux-gnu/webkit2gtk-4.0/MiniBrowser' - mocked_os_path_exists.side_effect = lambda path: path in [debian_minibrowser_path_arm64, '/usr/bin/gcc'] - with mock.patch('subprocess.check_output', return_value = b'aarch64-linux-gnu'): - assert webkitgtk_minibrowser.find_binary() == debian_minibrowser_path_arm64 + # Found on the default Debian path for ARM64 (gcc available) + debian_minibrowser_path_arm64 = '/usr/lib/aarch64-linux-gnu/webkit2gtk-4.0/MiniBrowser' + mocked_os_path_isfile.side_effect = lambda path: path in [debian_minibrowser_path_arm64, '/usr/bin/gcc'] + mocked_os_listdir.side_effect = lambda contents: sorted(['wpe-webkit-1.0', 'webkitgtk-6.0', 'webkit2gtk-4.0']) + mocked_which.side_effect = lambda found: '/usr/bin/gcc' + with mock.patch('subprocess.check_output', return_value = b'aarch64-linux-gnu'): + assert webkitgtk_minibrowser.find_binary() == debian_minibrowser_path_arm64 + + # Find first the MiniBrowser on the directory with the higher number in case two available + mocked_os_path_isfile.side_effect = lambda path: True + mocked_os_listdir.side_effect = lambda contents: ['wpe-webkit-1.0', 'webkitgtk-6.0', 'webkit2gtk-4.0'] + mocked_which.side_effect = lambda found: None + assert webkitgtk_minibrowser.find_binary() == '/usr/libexec/webkitgtk-6.0/MiniBrowser' + + +@mock.patch('subprocess.check_output') +def test_wpewebkit_minibrowser_version(mocked_check_output): + wpewebkit_minibrowser = browser.WPEWebKitMiniBrowser(logger) + + # stable version + mocked_check_output.return_value = b'WPE WebKit 2.26.1\n' + assert wpewebkit_minibrowser.version(binary='MiniBrowser') == '2.26.1' + + # nightly version + mocked_check_output.return_value = b'WPE WebKit 2.47.1 (286783@main)\n' + assert wpewebkit_minibrowser.version(binary='MiniBrowser') == '2.47.1 (286783@main)' + + +@mock.patch('subprocess.check_output') +def test_wpewebkit_minibrowser_version_errors(mocked_check_output): + wpewebkit_minibrowser = browser.WPEWebKitMiniBrowser(logger) + + # No binary + assert wpewebkit_minibrowser.version() is None + + # `MiniBrowser --version` return gibberish + mocked_check_output.return_value = b'gibberish' + assert wpewebkit_minibrowser.version(binary='MiniBrowser') is None + + # `MiniBrowser --version` fails (as it does for MiniBrowser <= 2.26.0) + mocked_check_output.return_value = b'dummy' + mocked_check_output.side_effect = subprocess.CalledProcessError(1, 'cmd') + assert wpewebkit_minibrowser.version(binary='MiniBrowser') is None + + +# The test below doesn't work on Windows because find_binary() +# on Windows only works if the binary name ends with a ".exe" suffix. +# But, WPE WebKit itself doesn't support Windows, so lets skip the test. +@pytest.mark.skipif(sys.platform.startswith('win'), reason='test not needed on Windows') +@mock.patch('os.path.isdir', return_value=True) +@mock.patch('os.access', return_value=True) +@mock.patch('shutil.which') +@mock.patch('os.listdir') +@mock.patch('os.path.isfile') +def test_wpewebkit_minibrowser_find_binary(mocked_os_path_isfile, mocked_os_listdir, mocked_which, _mocked_os_access, _mocked_os_isdir): + wpewebkit_minibrowser = browser.WPEWebKitMiniBrowser(logger) + + # No WPE MiniBrowser found (WebKitGTK one shouldn't match) + mocked_os_path_isfile.side_effect = lambda path: path == '/usr/libexec/wpewebkit-6.0/MiniBrowser' + mocked_os_listdir.side_effect = lambda contents: ['wpewebkit-6.0', 'webkit2gtk-4.0', 'wpe-webkit-1.0'] + mocked_which.side_effect = lambda found: None + assert wpewebkit_minibrowser.find_binary() is None + + # Found on the default Arch path + arch_minibrowser_path = '/usr/lib/wpe-webkit-1.0/MiniBrowser' + mocked_os_path_isfile.side_effect = lambda path: path == arch_minibrowser_path + mocked_os_listdir.side_effect = lambda contents: ['wpewebkit-6.0', 'webkit2gtk-4.0', 'wpe-webkit-1.0'] + mocked_which.side_effect = lambda found: None + assert wpewebkit_minibrowser.find_binary() == arch_minibrowser_path + + # Found on the default Debian path for AMD64 (gcc not available) + debian_minibrowser_path_amd64 = '/usr/lib/x86_64-linux-gnu/wpe-webkit-1.0/MiniBrowser' + mocked_os_path_isfile.side_effect = lambda path: path == debian_minibrowser_path_amd64 + mocked_os_listdir.side_effect = lambda contents: ['wpewebkit-6.0', 'webkit2gtk-4.0', 'wpe-webkit-1.0'] + mocked_which.side_effect = lambda found: None + assert wpewebkit_minibrowser.find_binary() == debian_minibrowser_path_amd64 + + # Found on the default Debian path for AMD64 (gcc available but gives an error) + debian_minibrowser_path_amd64 = '/usr/lib/x86_64-linux-gnu/wpe-webkit-1.0/MiniBrowser' + mocked_os_path_isfile.side_effect = lambda path: path in [debian_minibrowser_path_amd64, '/usr/bin/gcc'] + mocked_os_listdir.side_effect = lambda contents: ['wpewebkit-6.0', 'webkit2gtk-4.0', 'wpe-webkit-1.0'] + mocked_which.side_effect = lambda found: '/usr/bin/gcc' + with mock.patch('subprocess.check_output', return_value = b'error', side_effect = subprocess.CalledProcessError(1, 'cmd')): + assert wpewebkit_minibrowser.find_binary() == debian_minibrowser_path_amd64 + + # Found on the default Debian path for ARM64 (gcc available) + debian_minibrowser_path_arm64 = '/usr/lib/aarch64-linux-gnu/wpe-webkit-1.0/MiniBrowser' + mocked_os_path_isfile.side_effect = lambda path: path in [debian_minibrowser_path_arm64, '/usr/bin/gcc'] + mocked_os_listdir.side_effect = lambda contents: ['wpewebkit-6.0', 'webkit2gtk-4.0', 'wpe-webkit-1.0'] + mocked_which.side_effect = lambda found: '/usr/bin/gcc' + with mock.patch('subprocess.check_output', return_value = b'aarch64-linux-gnu'): + assert wpewebkit_minibrowser.find_binary() == debian_minibrowser_path_arm64 + + # Find first the MiniBrowser on the directory with the higher number in case two available + mocked_os_path_isfile.side_effect = lambda path: True + mocked_os_listdir.side_effect = lambda contents: sorted(['wpewebkit-6.0', 'webkit2gtk-4.0', 'wpe-webkit-2.0', 'wpe-webkit-1.0']) + mocked_which.side_effect = lambda found: None + assert wpewebkit_minibrowser.find_binary() == '/usr/libexec/wpe-webkit-2.0/MiniBrowser' diff --git a/tests/wpt/tests/tools/wpt/tests/test_testfiles.py b/tests/wpt/tests/tools/wpt/tests/test_testfiles.py index 790ee70a638..7685a5ce474 100644 --- a/tests/wpt/tests/tools/wpt/tests/test_testfiles.py +++ b/tests/wpt/tests/tools/wpt/tests/test_testfiles.py @@ -34,7 +34,7 @@ def test_affected_testfiles(): } }, "url_base": "/", - "version": 8, + "version": 9, } manifest = Manifest.from_json("/", manifest_json) with patch("tools.wpt.testfiles.load_manifest", return_value=manifest): diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py index aaf91a1dc86..c27ae7281dc 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py @@ -38,6 +38,7 @@ product_list = ["android_webview", "opera", "webkit", "webkitgtk_minibrowser", + "wpewebkit_minibrowser", "wktr", "epiphany", "ladybird"] diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/wpewebkit_minibrowser.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/wpewebkit_minibrowser.py new file mode 100644 index 00000000000..80f5acce1c5 --- /dev/null +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/wpewebkit_minibrowser.py @@ -0,0 +1,77 @@ +# mypy: allow-untyped-defs + +from .base import (NullBrowser, # noqa: F401 + certificate_domain_list, + get_timeout_multiplier, # noqa: F401 + maybe_add_args) +from .webkit import WebKitBrowser +from ..executors import executor_kwargs as base_executor_kwargs +from ..executors.base import WdspecExecutor # noqa: F401 +from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 + WebDriverRefTestExecutor, # noqa: F401 + WebDriverCrashtestExecutor) # noqa: F401 + +__wptrunner__ = {"product": "wpewebkit_minibrowser", + "check_args": "check_args", + "browser": "WPEWebKitMiniBrowser", + "browser_kwargs": "browser_kwargs", + "executor": {"testharness": "WebDriverTestharnessExecutor", + "reftest": "WebDriverRefTestExecutor", + "wdspec": "WdspecExecutor", + "crashtest": "WebDriverCrashtestExecutor"}, + "executor_kwargs": "executor_kwargs", + "env_extras": "env_extras", + "env_options": "env_options", + "run_info_extras": "run_info_extras", + "timeout_multiplier": "get_timeout_multiplier"} + + +def check_args(**kwargs): + pass + + +def browser_kwargs(logger, test_type, run_info_data, config, **kwargs): + # Workaround for https://gitlab.gnome.org/GNOME/libsoup/issues/172 + webdriver_required_args = ["--host=127.0.0.1"] + webdriver_args = maybe_add_args(webdriver_required_args, kwargs.get("webdriver_args")) + return {"binary": kwargs["binary"], + "webdriver_binary": kwargs["webdriver_binary"], + "webdriver_args": webdriver_args} + + +def capabilities(server_config, **kwargs): + browser_required_args = ["--automation"] + args = kwargs.get("binary_args", []) + args = maybe_add_args(browser_required_args, args) + return { + "browserName": "MiniBrowser", + "wpe:browserOptions": { + "binary": kwargs["binary"], + "args": args, + "certificates": certificate_domain_list(server_config.domains_set, kwargs["host_cert_path"])}} + + +def executor_kwargs(logger, test_type, test_environment, run_info_data, + **kwargs): + executor_kwargs = base_executor_kwargs(test_type, test_environment, run_info_data, **kwargs) + executor_kwargs["close_after_done"] = True + executor_kwargs["capabilities"] = capabilities(test_environment.config, **kwargs) + if test_type == "wdspec": + executor_kwargs["binary_args"] = executor_kwargs["capabilities"]["wpe:browserOptions"]["args"] + return executor_kwargs + + +def env_extras(**kwargs): + return [] + + +def env_options(): + return {} + + +def run_info_extras(logger, **kwargs): + return {"webkit_port": "wpe"} + + +class WPEWebKitMiniBrowser(WebKitBrowser): + pass diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py index 1dba97d9476..aef33574938 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py @@ -462,19 +462,19 @@ class RefTestImplementation: lhs_screenshots, rhs_screenshots)): comparison_screenshots = (lhs_screenshot, rhs_screenshot) - if not fuzzy or fuzzy == ((0, 0), (0, 0)): - equal = lhs_hash == rhs_hash - # sometimes images can have different hashes, but pixels can be identical. - if not equal: - self.logger.info("Image hashes didn't match%s, checking pixel differences" % - ("" if len(hashes) == 1 else " on page %i" % (page_idx + 1))) - max_per_channel, pixels_different = self.get_differences(comparison_screenshots, - urls) - equal = pixels_different == 0 and max_per_channel == 0 + if lhs_hash == rhs_hash: + max_per_channel, pixels_different = 0, 0 else: + # sometimes images can have different hashes, but pixels can be identical. + self.logger.info("Image hashes didn't match%s, checking pixel differences" % + ("" if len(hashes) == 1 else " on page %i" % (page_idx + 1))) max_per_channel, pixels_different = self.get_differences(comparison_screenshots, urls, page_idx if len(hashes) > 1 else None) + + if not fuzzy or fuzzy == ((0, 0), (0, 0)): + equal = pixels_different == 0 and max_per_channel == 0 + else: allowed_per_channel, allowed_different = fuzzy self.logger.info("Allowed %s pixels different, maximum difference per channel %s" % ("-".join(str(item) for item in allowed_different), diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_testloader.py b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_testloader.py index 0915f42381e..4555fb79661 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_testloader.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_testloader.py @@ -54,7 +54,7 @@ def manifest(): } }, "url_base": "/", - "version": 8, + "version": 9, } return WPTManifest.from_json("/", manifest_json) @@ -77,7 +77,7 @@ def test_loader_h2_tests(): } }, "url_base": "/", - "version": 8, + "version": 9, } manifest = WPTManifest.from_json("/", manifest_json) subsuites = {} @@ -228,7 +228,7 @@ def test_loader_filter_tags(): } }, "url_base": "/", - "version": 8, + "version": 9, } manifest = WPTManifest.from_json("/", manifest_json) diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_wptrunner.py b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_wptrunner.py index 3c9a0bc1fd4..4e0e7abc937 100644 --- a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_wptrunner.py +++ b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/test_wptrunner.py @@ -26,7 +26,7 @@ def test_get_pause_after_test(): # type: ignore } }, "url_base": "/", - "version": 8, + "version": 9, } kwargs = { diff --git a/tests/wpt/tests/trusted-types/Document-write-appending-line-feed.html b/tests/wpt/tests/trusted-types/Document-write-appending-line-feed.html new file mode 100644 index 00000000000..d5d1acbda7a --- /dev/null +++ b/tests/wpt/tests/trusted-types/Document-write-appending-line-feed.html @@ -0,0 +1,76 @@ + + + + + + + + diff --git a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-none.html b/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-none.html index 48c75937ead..badaf989eb7 100644 --- a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-none.html +++ b/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-none.html @@ -5,15 +5,41 @@ diff --git a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.html b/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.html index a564f9553f4..979de1e8145 100644 --- a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.html +++ b/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests.html @@ -3,25 +3,63 @@ - + diff --git a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.html b/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.html deleted file mode 100644 index 35870926dc6..00000000000 --- a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - diff --git a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-getAttributeType-event-handler-content-attributes.tentative.html b/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-getAttributeType-event-handler-content-attributes.tentative.html index efdcf265622..d8e82ab642b 100644 --- a/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-getAttributeType-event-handler-content-attributes.tentative.html +++ b/tests/wpt/tests/trusted-types/TrustedTypePolicyFactory-getAttributeType-event-handler-content-attributes.tentative.html @@ -10,7 +10,7 @@ diff --git a/tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-innerHTML.html b/tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-innerHTML.html new file mode 100644 index 00000000000..4b32db16581 --- /dev/null +++ b/tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-innerHTML.html @@ -0,0 +1,79 @@ + + + + + + + + + + +
+ + + diff --git a/tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html b/tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html index a76543b3f68..f61de6891f3 100644 --- a/tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html +++ b/tests/wpt/tests/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html @@ -12,9 +12,13 @@
diff --git a/tests/wpt/tests/trusted-types/default-policy-callback-arguments.html b/tests/wpt/tests/trusted-types/default-policy-callback-arguments.html index 9b07be00261..3e591bd63b1 100644 --- a/tests/wpt/tests/trusted-types/default-policy-callback-arguments.html +++ b/tests/wpt/tests/trusted-types/default-policy-callback-arguments.html @@ -47,7 +47,7 @@ [ "about:blank", "TrustedScriptURL", "HTMLScriptElement src", _ => script.src = "about:blank" ], [ "2+2", "TrustedScript", "eval", _ => eval("2+2") ], - [ "(function anonymous(\n) {\nreturn 2+2\n})", "TrustedScript", + [ "function anonymous(\n) {\nreturn 2+2\n}", "TrustedScript", "Function", _ => new Function("return 2+2") ], ]; for (var tc of cases) { diff --git a/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy-mutate.html b/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy-mutate.html index f7909a32a6e..b885b4f4de7 100644 --- a/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy-mutate.html +++ b/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy-mutate.html @@ -21,4 +21,20 @@ test(t => { assert_throws_js(EvalError, _ => new Function('return 1+1')); }, "Function constructor with string where default policy mutates value throws."); + + const AsyncFunction = async function() {}.constructor; + const GeneratorFunction = function*() {}.constructor; + const AsyncGeneratorFunction = async function*() {}.constructor; + + test(t => { + assert_throws_js(EvalError, _ => new AsyncFunction('return 1+1')); + }, "AsyncFunction constructor with string where default policy mutates value throws."); + + test(t => { + assert_throws_js(EvalError, _ => new GeneratorFunction('return 1+1')); + }, "GeneratorFunction constructor with string where default policy mutates value throws."); + + test(t => { + assert_throws_js(EvalError, _ => new AsyncGeneratorFunction('return 1+1')); + }, "AsyncGeneratorFunction constructor with string where default policy mutates value throws."); \ No newline at end of file diff --git a/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy.html b/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy.html index 4ca9c562f50..fe4deb16d59 100644 --- a/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy.html +++ b/tests/wpt/tests/trusted-types/eval-csp-tt-default-policy.html @@ -8,7 +8,18 @@ diff --git a/tests/wpt/tests/trusted-types/eval-csp-tt-no-default-policy.html b/tests/wpt/tests/trusted-types/eval-csp-tt-no-default-policy.html index c4e5d0911ac..06ebbfb05d0 100644 --- a/tests/wpt/tests/trusted-types/eval-csp-tt-no-default-policy.html +++ b/tests/wpt/tests/trusted-types/eval-csp-tt-no-default-policy.html @@ -40,5 +40,33 @@ test(t => { assert_throws_js(EvalError, _ => new Function('return 1+1')()); }, "Function constructor of string fails."); + + test(t => { + assert_equals(new Function(p.createScript('val'),p.createScript('return val+1'))(1), 2); + }, "Function constructor of all TrustedScripts works."); + + test(t => { + assert_throws_js(EvalError, _ => new Function('val', 'return val+1')(1)); + }, "Function constructor of all strings fails."); + + test(t => { + assert_throws_js(EvalError, _ => new Function('val', p.createScript('return val+1'))(1)); + }, "Function constructor of string and TrustedScript fails.");; + + const AsyncFunction = async function() {}.constructor; + const GeneratorFunction = function*() {}.constructor; + const AsyncGeneratorFunction = async function*() {}.constructor; + + test(t => { + assert_throws_js(EvalError, _ => new AsyncFunction('return 1+1')()); + }, "AsyncFunction constructor of string fails."); + + test(t => { + assert_throws_js(EvalError, _ => new GeneratorFunction('return 1+1')()); + }, "GeneratorFunction constructor of string fails."); + + test(t => { + assert_throws_js(EvalError, _ => new AsyncGeneratorFunction('return 1+1')()); + }, "AsyncGeneratorFunction constructor of string fails."); diff --git a/tests/wpt/tests/trusted-types/eval-function-constructor-untrusted-arguments-and-applying-default-policy.html b/tests/wpt/tests/trusted-types/eval-function-constructor-untrusted-arguments-and-applying-default-policy.html new file mode 100644 index 00000000000..8d1f498d058 --- /dev/null +++ b/tests/wpt/tests/trusted-types/eval-function-constructor-untrusted-arguments-and-applying-default-policy.html @@ -0,0 +1,61 @@ + + + + + + + + + + diff --git a/tests/wpt/tests/trusted-types/eval-function-constructor.html b/tests/wpt/tests/trusted-types/eval-function-constructor.html index a20bc4a78db..1ad0fc7e680 100644 --- a/tests/wpt/tests/trusted-types/eval-function-constructor.html +++ b/tests/wpt/tests/trusted-types/eval-function-constructor.html @@ -1,8 +1,11 @@ - - + + + + @@ -12,30 +15,74 @@ const args = ["a", "b", "c = 5", "return (a+b)*c;"]; const arg_max = 2 ** args.length -1; - // Call 'new Function(...args)', but with a subet of args being Strings, + const AsyncFunction = async function() {}.constructor; + const GeneratorFunction = function*() {}.constructor; + const AsyncGeneratorFunction = async function*() {}.constructor; + + // Call 'new Function(...args)', but with a subset of args being Strings, // and a subset being TrustedScript. We use a bitmask to determine which // argument gets to be trusted or not. - function new_function_with_maybe_trusted_args(mask) { + function new_function_with_maybe_trusted_args(mask, type) { let maybe_trusted_args = args.map((value, arg_nr) => { return (mask & (2**arg_nr)) ? policy.createScript(value) : value; }); - return new Function(...maybe_trusted_args); + switch (type) { + case "Function": + return new Function(...maybe_trusted_args); + case "AsyncFunction": + return new AsyncFunction(...maybe_trusted_args); + case "GeneratorFunction": + return new GeneratorFunction(...maybe_trusted_args); + case "AsyncGeneratorFunction": + return new AsyncGeneratorFunction(...maybe_trusted_args); + } } // Generate all combinations of String/TrustedScript, except for the one - // where all argumentes are TrustedScript. + // where all arguments are TrustedScript. The first String argument will set + // isTrusted=false in EnsureCSPDoesNotBlockStringCompilation and so + // "Get Trusted Type compliant string" will be executed on the function text. for (let mask = 0; mask < arg_max; mask++) { test(t => { assert_throws_js(EvalError, - _ => new_function_with_maybe_trusted_args(mask)); + _ => new_function_with_maybe_trusted_args(mask, "Function")); }, "Function constructor with mixed plain and trusted strings, mask #" + mask); + test(t => { + assert_throws_js(EvalError, + _ => new_function_with_maybe_trusted_args(mask, "AsyncFunction")); + }, "AsyncFunction constructor with mixed plain and trusted strings, mask #" + mask); + test(t => { + assert_throws_js(EvalError, + _ => new_function_with_maybe_trusted_args(mask, "GeneratorFunction")); + }, "GeneratorFunction constructor with mixed plain and trusted strings, mask #" + mask); + test(t => { + assert_throws_js(EvalError, + _ => new_function_with_maybe_trusted_args(mask, "AsyncGeneratorFunction")); + }, "AsyncGeneratorFunction constructor with mixed plain and trusted strings, mask #" + mask); } - // Now do one with all trusted arguments. + // Now do one with all trusted arguments. In that case, isTrusted=true in + // EnsureCSPDoesNotBlockStringCompilation and the function is built without + // error. test(t => { - const f = new_function_with_maybe_trusted_args(arg_max); + const f = new_function_with_maybe_trusted_args(arg_max, "Function"); assert_equals(f(1,2,3), 9); assert_equals(f(1,2), 15); - }, "Function constructor with mixed plain and trusted strings, mask #" + arg_max); + }, `Function constructor with mixed plain and trusted strings, mask #${arg_max}`); + + // Similarly wrap all args in TrustedScript objects, but forges the toString() + // method at one index so that it adds extra leading/trailing space compared + // to the trusted data. This string mismatch also lead to isTrusted=false in + // EnsureCSPDoesNotBlockStringCompilation. + args.forEach((_, index) => { + test(t => { + let mixed_args = args.map((arg_value, arg_index) => { + let obj = policy.createScript(arg_value); + return arg_index == index ? + Object.assign(obj, { toString: () => ` ${arg_value} ` }) : obj; + }); + assert_throws_js(EvalError, _ => new Function(...mixed_args)); + }, `Function constructor with trusted strings, and a forged toString() for the one at index ${index}`); + }); diff --git a/tests/wpt/tests/trusted-types/eval-no-csp-no-tt.html b/tests/wpt/tests/trusted-types/eval-no-csp-no-tt.html index 3f9799864d4..8fc8a89ca68 100644 --- a/tests/wpt/tests/trusted-types/eval-no-csp-no-tt.html +++ b/tests/wpt/tests/trusted-types/eval-no-csp-no-tt.html @@ -37,8 +37,20 @@ assert_equals(new Function(p.createScript('return 1+1'))(), 2); }, "Function constructor of TrustedScript works."); + test(t => { + assert_equals(new Function(p.createScript('val'),p.createScript('return val+1'))(1), 2); + }, "Function constructor of all TrustedScripts works."); + test(t => { assert_equals(new Function('return 1+1')(), 2); }, "Function constructor of string works."); + + test(t => { + assert_equals(new Function('val', 'return val+1')(1), 2); + }, "Function constructor of all strings works."); + + test(t => { + assert_equals(new Function('val', p.createScript('return val+1'))(1), 2); + }, "Function constructor of string and TrustedScript works."); diff --git a/tests/wpt/tests/trusted-types/modify-attributes-in-callback.html b/tests/wpt/tests/trusted-types/modify-attributes-in-callback.html index 4f94e088722..66d28d6d600 100644 --- a/tests/wpt/tests/trusted-types/modify-attributes-in-callback.html +++ b/tests/wpt/tests/trusted-types/modify-attributes-in-callback.html @@ -12,11 +12,13 @@ // This is a regression test for https://g-issues.chromium.org/issues/333739948 // The test should hold true for any browser that supports Trusted Types. - let target = "data-x"; + let iframeAttributeRemovedInCallback = null; trustedTypes.createPolicy("default", { createHTML: (s, _, sink) => { - assert_equals(sink, 'HTMLIFrameElement srcdoc'); - iframe.removeAttribute(target); + if (iframeAttributeRemovedInCallback) { + assert_equals(sink, 'HTMLIFrameElement srcdoc'); + iframe.removeAttribute(iframeAttributeRemovedInCallback); + } return s; }, createScript: (s) => { @@ -29,8 +31,16 @@ } }); + function cleanUpIFrameTest() { + iframeAttributeRemovedInCallback = null; + iframe.setAttribute("srcdoc", "content"); + iframe.setAttribute("data-x", ""); + } + test(t => { // Original bug report: Delete an attribute *before* the current one. + t.add_cleanup(cleanUpIFrameTest); + iframeAttributeRemovedInCallback = "data-x"; assert_equals(iframe.srcdoc, "content"); assert_equals(iframe.getAttribute("onmouseover"), ""); iframe.setAttribute("srcdoc", "alert(1)"); @@ -40,31 +50,55 @@ test(t => { // Second case: Delete the exact attribute. It still gets set. - target = "srcdoc"; - assert_equals(iframe.srcdoc, "alert(1)"); + t.add_cleanup(cleanUpIFrameTest); + iframeAttributeRemovedInCallback = "srcdoc"; + assert_equals(iframe.srcdoc, "content"); iframe.setAttribute("srcdoc", "new srcdoc value"); assert_equals(iframe.srcdoc, "new srcdoc value"); }, "Ensure the deleted attributes is modified."); test(t => { - div.toggleAttribute('onmouseover'); - assert_equals(div.attributes.length, 2); - assert_equals(div.attributes.onmouseover.value, ''); + t.add_cleanup(cleanUpIFrameTest); + iframeAttributeRemovedInCallback = "data-x"; + assert_equals(iframe.srcdoc, "content"); + assert_equals(iframe.getAttribute("onmouseover"), ""); + iframe.setAttributeNS(null, "srcdoc", "alert(1)"); + assert_equals(iframe.srcdoc, "alert(1)"); + assert_equals(iframe.getAttribute("onmouseover"), ""); + }, "Ensure the right attributes are modified (setAttributeNS)."); + + test(t => { + t.add_cleanup(cleanUpIFrameTest); + iframeAttributeRemovedInCallback = "srcdoc"; + assert_equals(iframe.srcdoc, "content"); + iframe.setAttributeNS(null, "srcdoc", "new srcdoc value"); + assert_equals(iframe.srcdoc, "new srcdoc value"); + }, "Ensure the deleted attributes is modified (setAttributeNS)."); + + function cleanUpDivTest() { div.removeAttribute('onmouseover'); + } + const expectedAttributeCount = 2; // id and onmouseover. + + test(t => { + t.add_cleanup(cleanUpDivTest); + div.toggleAttribute('onmouseover'); + assert_equals(div.attributes.length, expectedAttributeCount); + assert_equals(div.attributes.onmouseover.value, ''); }, "Ensure toggleAttribute results in an empty attribute."); test(t => { + t.add_cleanup(cleanUpDivTest); div.setAttribute('onmouseover', 'foo'); - assert_equals(div.attributes.length, 2); + assert_equals(div.attributes.length, expectedAttributeCount); assert_equals(div.attributes.onmouseover.value, 'foo'); - div.removeAttribute('onmouseover'); }, "Ensure setAttribute results in right attribute value."); test(t => { + t.add_cleanup(cleanUpDivTest); div.setAttributeNS(null, 'onmouseover', 'foo'); - assert_equals(div.attributes.length, 2); + assert_equals(div.attributes.length, expectedAttributeCount); assert_equals(div.attributes.onmouseover.value, 'foo'); - div.removeAttribute('onmouseover'); }, "Ensure setAttributeNS results in right attribute value."); diff --git a/tests/wpt/tests/url/idlharness-shadowrealm.window.js b/tests/wpt/tests/url/idlharness-shadowrealm.window.js deleted file mode 100644 index b090371e3c3..00000000000 --- a/tests/wpt/tests/url/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["url"], []); diff --git a/tests/wpt/tests/url/idlharness.any.js b/tests/wpt/tests/url/idlharness.any.js index 4a0e52f12b3..c0642729c0b 100644 --- a/tests/wpt/tests/url/idlharness.any.js +++ b/tests/wpt/tests/url/idlharness.any.js @@ -1,5 +1,6 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: global=window,dedicatedworker,shadowrealm-in-window idl_test( ['url'], diff --git a/tests/wpt/tests/url/resources/toascii.json b/tests/wpt/tests/url/resources/toascii.json index d02c4c7e866..6445db80e3c 100644 --- a/tests/wpt/tests/url/resources/toascii.json +++ b/tests/wpt/tests/url/resources/toascii.json @@ -1,5 +1,6 @@ [ - "This resource is focused on highlighting issues with UTS #46 ToASCII", + "This contains assorted IDNA tests that IdnaTestV2 might not cover.", + "Feel free to deduplicate with a clear commit message.", { "comment": "Label with hyphens in 3rd and 4th position", "input": "aa--", @@ -198,5 +199,175 @@ { "input": ">\u00AD\u0338", "output": "xn--hdh" + }, + "Tests below are from WebKit (fast/url/idna2003.html & fast/url/idna2008.html; contributed by Chris Weber back in 2011).", + { + "input": "fa\u00DF.de", + "output": "xn--fa-hia.de" + }, + { + "input": "\u03B2\u03CC\u03BB\u03BF\u03C2.com", + "output": "xn--nxasmm1c.com" + }, + { + "input": "\u0DC1\u0DCA\u200D\u0DBB\u0DD3.com", + "output": "xn--10cl1a0b660p.com" + }, + { + "input": "\u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com", + "output": "xn--mgba3gch31f060k.com" + }, + { + "input": "www.loo\u0138out.net", + "output": "www.xn--looout-5bb.net" + }, + { + "input": "\u15EF\u15EF\u15EF.lookout.net", + "output": "xn--1qeaa.lookout.net" + }, + { + "input": "www.lookout.\u0441\u043E\u043C", + "output": "www.lookout.xn--l1adi" + }, + { + "input": "www\u2025lookout.net", + "output": null + }, + { + "input": "www.lookout\u2027net", + "output": "www.xn--lookoutnet-406e" + }, + { + "input": "www.lookout.net\u2A7480", + "output": null + }, + { + "input": "www\u00A0.lookout.net", + "output": null + }, + { + "input": "\u1680lookout.net", + "output": null + }, + { + "input": "\u001flookout.net", + "output": null + }, + { + "input": "look\u06DDout.net", + "output": null + }, + { + "input": "look\u180Eout.net", + "output": null + }, + { + "input": "look\u2060out.net", + "output": "lookout.net" + }, + { + "input": "look\uFEFFout.net", + "output": "lookout.net" + }, + { + "input": "look\uD83F\uDFFEout.net", + "output": null + }, + { + "input": "look\uFFFAout.net", + "output": null + }, + { + "input": "look\u2FF0out.net", + "output": null + }, + { + "input": "look\u0341out.net", + "output": "xn--looout-kp7b.net" + }, + { + "input": "look\u202Eout.net", + "output": null + }, + { + "input": "look\u206Bout.net", + "output": null + }, + { + "input": "look\uDB40\uDC01out.net", + "output": null + }, + { + "input": "look\uDB40\uDC20out.net", + "output": null + }, + { + "input": "look\u05BEout.net", + "output": null + }, + { + "input": "B\u00FCcher.de", + "output": "xn--bcher-kva.de" + }, + { + "input": "\u2665.net", + "output": "xn--g6h.net" + }, + { + "input": "\u0378.net", + "output": null + }, + { + "input": "\u04C0.com", + "output": null + }, + { + "comment": "This is U+2F868 (which is mapped to U+36FC starting with Unicode 16.0)", + "input": "\uD87E\uDC68.com", + "output": "xn--snl.com" + }, + { + "input": "\u2183.com", + "output": null + }, + { + "input": "look\u034Fout.net", + "output": "lookout.net" + }, + { + "input": "gOoGle.com", + "output": "google.com" + }, + { + "input": "\u09dc.com", + "output": "xn--15b8c.com" + }, + { + "input": "\u1E9E.com", + "output": "xn--zca.com" + }, + { + "input": "\u1E9E.foo.com", + "output": "xn--zca.foo.com" + }, + { + "input": "-foo.bar.com", + "output": "-foo.bar.com" + }, + { + "input": "foo-.bar.com", + "output": "foo-.bar.com" + }, + { + "input": "ab--cd.com", + "output": "ab--cd.com" + }, + { + "input": "xn--0.com", + "output": null + }, + { + "input": "foo\u0300.bar.com", + "output": "xn--fo-3ja.bar.com" } ] diff --git a/tests/wpt/tests/user-timing/idlharness-shadowrealm.window.js b/tests/wpt/tests/user-timing/idlharness-shadowrealm.window.js deleted file mode 100644 index 52ad58faa22..00000000000 --- a/tests/wpt/tests/user-timing/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["user-timing"], ["hr-time", "performance-timeline", "dom"]); diff --git a/tests/wpt/tests/user-timing/idlharness.any.js b/tests/wpt/tests/user-timing/idlharness.any.js index 511f2d0455b..ee73f16dfc8 100644 --- a/tests/wpt/tests/user-timing/idlharness.any.js +++ b/tests/wpt/tests/user-timing/idlharness.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm-in-window // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: timeout=long @@ -11,6 +11,10 @@ idl_test( ['user-timing'], ['hr-time', 'performance-timeline', 'dom'], idl_array => { + if (self.GLOBAL.isShadowRealm()) { + return; + } + try { performance.mark('test'); performance.measure('test'); diff --git a/tests/wpt/tests/wasm/jsapi/idlharness-shadowrealm.window.js b/tests/wpt/tests/wasm/jsapi/idlharness-shadowrealm.window.js deleted file mode 100644 index 26348037f73..00000000000 --- a/tests/wpt/tests/wasm/jsapi/idlharness-shadowrealm.window.js +++ /dev/null @@ -1,3 +0,0 @@ -// META: script=/resources/testharness-shadowrealm-outer.js -// META: script=/resources/idlharness-shadowrealm.js -idl_test_shadowrealm(["wasm-js-api"], []); diff --git a/tests/wpt/tests/wasm/jsapi/idlharness.any.js b/tests/wpt/tests/wasm/jsapi/idlharness.any.js index 98713d4bf6e..6478f857c7a 100644 --- a/tests/wpt/tests/wasm/jsapi/idlharness.any.js +++ b/tests/wpt/tests/wasm/jsapi/idlharness.any.js @@ -1,6 +1,7 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: script=../resources/load_wasm.js +// META: global=window,dedicatedworker,shadowrealm-in-window 'use strict'; diff --git a/tests/wpt/tests/wasm/webapi/esm-integration/script-src-blocks-wasm.tentative.sub.html b/tests/wpt/tests/wasm/webapi/esm-integration/script-src-blocks-wasm.tentative.sub.html index 0d5c7ca6ed5..1fed3a15c69 100644 --- a/tests/wpt/tests/wasm/webapi/esm-integration/script-src-blocks-wasm.tentative.sub.html +++ b/tests/wpt/tests/wasm/webapi/esm-integration/script-src-blocks-wasm.tentative.sub.html @@ -18,4 +18,4 @@ assert_array_equals(log, ["script-src-elem"]); })); - + diff --git a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js index ee791e884c5..d182a4ec4f7 100644 --- a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js +++ b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js @@ -104,10 +104,22 @@ const gCSSProperties1 = { types: [ ] }, + 'block-step-align': { + // https://drafts.csswg.org/css-rhythm/#block-step-align + types: [ + { type: 'discrete', options: [ [ 'auto', 'center'], ['end', 'start'], ['start', 'center'] ] } + ] + }, 'block-step-insert': { // https://drafts.csswg.org/css-rhythm/#block-step-insert types: [ - { type: 'discrete', options: [ [ 'margin', 'padding' ] ] } + { type: 'discrete', options: [ [ 'margin-box', 'padding-box'], ['margin-box', 'content-box'], ['padding-box', 'content-box'] ] } + ] + }, + 'block-step-round': { + // https://drafts.csswg.org/css-rhythm/#block-step-round + types: [ + { type: 'discrete', options: [ [ 'up', 'down'], ['down', 'nearest'], ['nearest', 'up'] ] } ] }, 'block-step-size': { diff --git a/tests/wpt/tests/web-animations/interfaces/Animation/progress.tentative.html b/tests/wpt/tests/web-animations/interfaces/Animation/overallProgress.tentative.html similarity index 60% rename from tests/wpt/tests/web-animations/interfaces/Animation/progress.tentative.html rename to tests/wpt/tests/web-animations/interfaces/Animation/overallProgress.tentative.html index 38f37cbfeb8..96292017e72 100644 --- a/tests/wpt/tests/web-animations/interfaces/Animation/progress.tentative.html +++ b/tests/wpt/tests/web-animations/interfaces/Animation/overallProgress.tentative.html @@ -1,8 +1,8 @@ -Animation.progress +Animation.overallProgress +href="https://drafts.csswg.org/web-animations-2/#the-overall-progress-of-an-animation"> @@ -16,16 +16,20 @@ test(t => { const animation = new Animation(null); animation.startTime = document.timeline.currentTime; assert_time_equals_literal(animation.currentTime, 0, 'currentTime is zero'); - assert_equals(animation.progress, null, 'progress is unresolved'); -}, 'progress of a newly created animation without an effect is unresolved'); + assert_equals(animation.overallProgress, null, + 'overallProgress is unresolved'); +}, 'overallProgress of a newly created animation without an effect is ' + + 'unresolved'); test(t => { // currentTime should be unresolved because the animation has no associated // timeline. const animation = new Animation(new KeyframeEffect(createDiv(t), null), null); assert_equals(animation.currentTime, null, 'currentTime is unresolved'); - assert_equals(animation.progress, null, 'progress is unresolved'); -}, 'progress of an animation whose currentTime is unresolved is unresolved.'); + assert_equals(animation.overallProgress, null, + 'overallProgress is unresolved'); +}, 'overallProgress of an animation whose currentTime is unresolved is ' + + 'unresolved.'); test(t => { const animation = new Animation(new KeyframeEffect(createDiv(t), null, @@ -33,22 +37,25 @@ test(t => { // Set the startTime to 20 seconds into the future. animation.startTime = document.timeline.currentTime + 20 * MS_PER_SEC; assert_less_than(animation.currentTime, 0, 'currentTime is negative'); - assert_approx_equals(animation.progress, 0, 0.01, 'progress is zero'); -}, "progress of an animation whose effect's endTime is zero is zero if its " + - "currentTime is negative."); + assert_approx_equals(animation.overallProgress, 0, 0.01, 'overallProgress ' + + 'is zero'); +}, "overallProgress of an animation whose effect's endTime is zero is zero " + + "if its currentTime is negative."); test(t => { const animation = new Animation(new KeyframeEffect(createDiv(t), null, { duration: 0 }), document.timeline); animation.startTime = document.timeline.currentTime; assert_time_equals_literal(animation.currentTime, 0, 'currentTime is zero'); - assert_approx_equals(animation.progress, 1, 0.01, 'progress is one'); + assert_approx_equals(animation.overallProgress, 1, 0.01, + 'overallProgress is one'); animation.startTime = document.timeline.currentTime - 20 * MS_PER_SEC; assert_greater_than(animation.currentTime, 0, 'currentTime greater than zero'); - assert_approx_equals(animation.progress, 1, 0.01, 'progress is one'); -}, "progress of an animation whose effect's endTime is zero is one if its " + - "currentTime is non-negative."); + assert_approx_equals(animation.overallProgress, 1, 0.01, + 'overallProgress is one'); +}, "overallProgress of an animation whose effect's endTime is zero is one if " + + "its currentTime is non-negative."); test(t => { const animation = new Animation(new KeyframeEffect(createDiv(t), null, @@ -56,8 +63,9 @@ test(t => { animation.startTime = document.timeline.currentTime - 20 * MS_PER_SEC; assert_greater_than(animation.currentTime, 0, 'currentTime is positive'); - assert_approx_equals(animation.progress, 0, 0.01, 'progress is zero'); -}, "progress of an animation whose effect's endTime is infinity is zero."); + assert_approx_equals(animation.overallProgress, 0, 0.01, + 'overallProgress is zero'); +}, "overallProgress of an animation whose effect's endTime is infinity is zero."); test(t => { const animation = new Animation(new KeyframeEffect(createDiv(t), null, @@ -66,16 +74,20 @@ test(t => { animation.startTime = document.timeline.currentTime - 50 * MS_PER_SEC; assert_time_equals_literal(animation.currentTime, 100 * MS_PER_SEC, 'currentTime is 100s'); - assert_approx_equals(animation.progress, 0.5, 0.01, 'progress is zero'); + assert_approx_equals(animation.overallProgress, 0.5, 0.01, + 'overallProgress is zero'); animation.startTime = document.timeline.currentTime - 100 * MS_PER_SEC; assert_time_equals_literal(animation.currentTime, 200 * MS_PER_SEC, 'currentTime is 200s'); - assert_approx_equals(animation.progress, 1, 0.01, 'progress is one'); + assert_approx_equals(animation.overallProgress, 1, 0.01, + 'overallProgress is one'); animation.startTime = document.timeline.currentTime - 150 * MS_PER_SEC; assert_time_equals_literal(animation.currentTime, 300 * MS_PER_SEC, 'currentTime is 300s'); - assert_approx_equals(animation.progress, 1, 0.01, 'progress is still one'); -}, "progress of an animation is calculated by currentTime / effect endTime."); + assert_approx_equals(animation.overallProgress, 1, 0.01, + 'overallProgress is still one'); +}, "overallProgress of an animation is calculated by " + + "currentTime / effect endTime."); diff --git a/tests/wpt/tests/web-animations/interfaces/Animation/scroll-timeline-progress.tentative.html b/tests/wpt/tests/web-animations/interfaces/Animation/scroll-timeline-overallProgress.tentative.html similarity index 68% rename from tests/wpt/tests/web-animations/interfaces/Animation/scroll-timeline-progress.tentative.html rename to tests/wpt/tests/web-animations/interfaces/Animation/scroll-timeline-overallProgress.tentative.html index b40e72482ba..a337d688a08 100644 --- a/tests/wpt/tests/web-animations/interfaces/Animation/scroll-timeline-progress.tentative.html +++ b/tests/wpt/tests/web-animations/interfaces/Animation/scroll-timeline-overallProgress.tentative.html @@ -1,8 +1,8 @@ -Animation.progress +Animation.overallProgress +href="https://drafts.csswg.org/web-animations-2/#the-overall-progress-of-an-animation"> @@ -21,8 +21,8 @@ href="https://drafts.csswg.org/web-animations-2/#the-progress-of-an-animation"> width: 100%; } #target { - height: 100px; - width: 100px; + height: 100px; + width: 100px; background-color: green; margin-top: -1000px; } @@ -38,31 +38,32 @@ promise_test(async t => { assert_equals(animation.currentTime, null, "The current time is null in Idle state."); - assert_equals(animation.progress, null, - "The progress is null since the currentTime is unresolved."); + assert_equals(animation.overallProgress, null, + "The overallProgress is null since the currentTime is unresolved."); animation.play(); assert_true(animation.pending, "Animation is in the pending state."); assert_equals(animation.currentTime, null, "The current time remains null while in the pending state."); - assert_equals(animation.progress, null, - "The progress is null since the currentTime is unresolved."); + assert_equals(animation.overallProgress, null, + "The overallProgress is null since the currentTime is unresolved."); await animation.ready; // Verify initial start and current times once ready. assert_percents_equal(animation.currentTime, 0, "The current time is resolved when ready."); - assert_equals(animation.progress, 0, "The progress is should be zero."); + assert_equals(animation.overallProgress, 0, + "The overallProgress should be zero."); scroller.scrollTop = 0.4 * maxScroll; await waitForNextFrame(); assert_percents_equal(animation.currentTime, 40, - "currentTime reflects progress as a percentage"); - assert_approx_equals(animation.progress, 0.4, 0.01, - "The progress is should match the scroll progress."); -}, "animation.progress reflects the progress of a scroll animation as a "+ - "number between 0 and 1"); + "currentTime reflects overallProgress as a percentage"); + assert_approx_equals(animation.overallProgress, 0.4, 0.01, + "The overallProgress should match the scroll progress."); +}, "animation.overallProgress reflects the progress of a scroll animation as " + + "a number between 0 and 1"); promise_test(async t => { const animation = createScrollLinkedAnimation(t); @@ -74,31 +75,32 @@ promise_test(async t => { // Verify initial start and current times once ready. assert_percents_equal(animation.currentTime, 0, "The current time is resolved when ready."); - assert_equals(animation.progress, 0, "The progress is should be zero."); + assert_equals(animation.overallProgress, 0, + "The overallProgress should be zero."); scroller.scrollTop = 0.4 * maxScroll; await waitForNextFrame(); let timing = animation.effect.getComputedTiming(); - // iteration duration should be 100%, progress should reflect 40%. + // iteration duration should be 100%, overallProgress should reflect 40%. assert_percents_equal(timing.duration, 100); assert_percents_equal(animation.currentTime, 40, "currentTime reflects progress as a percentage"); - assert_approx_equals(animation.progress, 0.4, 0.01, - "The progress is should match the scroll progress."); + assert_approx_equals(animation.overallProgress, 0.4, 0.01, + "The overallProgress should match the scroll progress."); timing = animation.effect.getComputedTiming(); animation.effect.updateTiming({ iterations: 2 }); timing = animation.effect.getComputedTiming(); - // iteration duration should be 50%, progress should still reflect 40% + // iteration duration should be 50%, overallProgress should still reflect 40% // as it measures currentTime / effect endTime. assert_percents_equal(timing.duration, 50); assert_percents_equal(animation.currentTime, 40, "currentTime reflects progress as a percentage"); - assert_approx_equals(animation.progress, 0.4, 0.01, - "The progress is should match the scroll progress."); -}, "animation.progress reflects the overall progress of a scroll animation " + + assert_approx_equals(animation.overallProgress, 0.4, 0.01, + "The overallProgress is should match the scroll progress."); +}, "animation.overallProgress reflects the overall progress of a scroll " + "with multiple iterations."); promise_test(async t => { @@ -126,10 +128,11 @@ promise_test(async t => { const expected_current_time = timeline_time - start_time; assert_percents_equal(animation.currentTime, expected_current_time, "currentTime reflects progress as a percentage"); - assert_approx_equals(animation.progress, target_pct / 100, 0.01, - "progress should reflect fraction of view timeline range scroll through."); -}, "animation.progress reflects the overall progress of a scroll animation " + - "that uses a view-timeline."); + assert_approx_equals(animation.overallProgress, target_pct / 100, 0.01, + "overallProgress should reflect fraction of view timeline range scroll " + + "through."); +}, "animation.overallProgress reflects the overall progress of a scroll " + + "that uses a view-timeline."); promise_test(async t => { const scroller = createScroller(t); @@ -151,16 +154,16 @@ promise_test(async t => { await waitForNextFrame(); let timing = animation.effect.getComputedTiming(); assert_less_than(animation.currentTime.value, 0, "currentTime is negative"); - assert_approx_equals(animation.progress, 0, 0.01, "progress is zero when " + - "scroll offset is less than range start."); + assert_approx_equals(animation.overallProgress, 0, 0.01, "overallProgress " + + "is zero when scroll offset is less than range start."); scroller.scrollTop = 200; await waitForNextFrame(); assert_approx_equals(animation.currentTime.value, timing.endTime.value, 0.01, "currentTime has reached endTime"); - assert_approx_equals(animation.progress, 1, 0.01, "progress is one when " + - "scroll offset goes past than range end."); -}, "progresss of a view-timeline is bounded between 0 and 1."); + assert_approx_equals(animation.overallProgress, 1, 0.01, "overallProgress " + + "is one when scroll offset goes past than range end."); +}, "overallProgress of a view-timeline is bounded between 0 and 1."); diff --git a/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html b/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html index d2d6e9d4c9b..d1c1c96f7b0 100644 --- a/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html +++ b/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html @@ -169,7 +169,7 @@ const tests = { // no effect. rangeStart: UsePropertyTest(animation => animation.rangeStart), rangeEnd: UsePropertyTest(animation => animation.rangeEnd), - progress: UsePropertyTest(animation => animation.progress), + overallProgress: UsePropertyTest(animation => animation.overallProgress), replaceState: UsePropertyTest(animation => animation.replaceState), ready: UsePropertyTest(animation => animation.ready), finished: UsePropertyTest(animation => { diff --git a/tests/wpt/tests/web-animations/resources/keyframe-tests.js b/tests/wpt/tests/web-animations/resources/keyframe-tests.js index 43e0d7575f2..2bcce1ecf47 100644 --- a/tests/wpt/tests/web-animations/resources/keyframe-tests.js +++ b/tests/wpt/tests/web-animations/resources/keyframe-tests.js @@ -535,6 +535,16 @@ const gKeyframesTests = [ input: [{ offset: '0.5', left: '10px' }], output: [keyframe(offset(0.5), { left: '10px' })], }, + { + desc: 'a single keyframe sequence with a single calc() offset', + input: [{ offset: 'calc(0.5)', left: '10px' }], + output: [keyframe(offset(0.5), { left: '10px' })], + }, + { + desc: 'a single keyframe sequence with a complex calc() offset', + input: [{ offset: 'calc(0.5 + 0.25 * sign(100em - 1px))', left: '10px' }], + output: [keyframe(offset(0.75), { left: '10px' })], + }, { desc: 'a one property keyframe sequence with some omitted offsets', input: [{ offset: 0.00, left: '10px' }, @@ -824,4 +834,4 @@ const gAnimationTimelineTests = [ expectedTimelineDescription: 'document.timeline', description: 'with DocumentTimeline' }, -]; \ No newline at end of file +]; diff --git a/tests/wpt/tests/webcodecs/README.md b/tests/wpt/tests/webcodecs/README.md index e6cae317d0b..dce4ef3650e 100644 --- a/tests/wpt/tests/webcodecs/README.md +++ b/tests/wpt/tests/webcodecs/README.md @@ -152,6 +152,12 @@ done sox -n -r 48000 sfx.wav synth 1 sine 480 ffmpeg -i sfx.wav -frames:a 10 -acodec libopus -b:a 96K sfx-opus.ogg +### sfx-vorbis.ogg +``` +sox -n -r 48000 sfx.wav synth 1 sine 480 +ffmpeg -i sfx.wav -frames:a 10 -acodec libvorbis -b:a 96K sfx-vorbis.ogg +``` + ### av1.mp4 ``` ffmpeg -f lavfi -i testsrc=rate=10:n=1 -t 1 -pix_fmt yuv420p -vcodec libaom-av1 av1.mp4 diff --git a/tests/wpt/tests/webcodecs/audioDecoder-codec-specific.https.any.js b/tests/wpt/tests/webcodecs/audioDecoder-codec-specific.https.any.js index 6a4793c62c9..32eb6598c66 100644 --- a/tests/wpt/tests/webcodecs/audioDecoder-codec-specific.https.any.js +++ b/tests/wpt/tests/webcodecs/audioDecoder-codec-specific.https.any.js @@ -12,6 +12,7 @@ // META: variant=?pcm_s32 // META: variant=?pcm_f32 // META: variant=?flac +// META: variant=?vorbis const ADTS_AAC_DATA = { src: 'sfx.adts', @@ -128,6 +129,30 @@ const PCM_S24_DATA = pcm("pcm-s24", 0x66); const PCM_S32_DATA = pcm("pcm-s32", 0x66); const PCM_F32_DATA = pcm("pcm-f32", 0x72); +const VORBIS_DATA = { + src: 'sfx-vorbis.ogg', + config: { + codec: 'vorbis', + description: [ + 2, + 30, + 62, + {offset: 28, size: 30}, + {offset: 101, size: 62}, + {offset: 163, size: 3771} + ], + numberOfChannels: 1, + sampleRate: 48000, + }, + chunks: [ + {offset: 3968, size: 44}, {offset: 4012, size: 21}, + {offset: 4033, size: 57}, {offset: 4090, size: 37}, + {offset: 4127, size: 37}, {offset: 4164, size: 107}, + {offset: 4271, size: 172} + ], + duration: 21333 +}; + // Allows mutating `callbacks` after constructing the AudioDecoder, wraps calls // in t.step(). function createAudioDecoder(t, callbacks) { @@ -171,6 +196,7 @@ promise_setup(async () => { '?pcm_s32': PCM_S32_DATA, '?pcm_f32': PCM_F32_DATA, '?flac': FLAC_DATA, + '?vorbis': VORBIS_DATA, }[location.search]; // Don't run any tests if the codec is not supported. @@ -193,7 +219,28 @@ promise_setup(async () => { CONFIG = {...data.config}; if (data.config.description) { - CONFIG.description = view(buf, data.config.description); + // The description for decoding vorbis is expected to be in Xiph extradata format. + // https://w3c.github.io/webcodecs/vorbis_codec_registration.html#audiodecoderconfig-description + if (Array.isArray(data.config.description)) { + const length = data.config.description.reduce((sum, value) => sum + ((typeof value === 'number') ? 1 : value.size), 0); + const description = new Uint8Array(length); + + data.config.description.reduce((offset, value) => { + if (typeof value === 'number') { + description[offset] = value; + + return offset + 1; + } + + description.set(view(buf, value), offset); + + return offset + value.size; + }, 0); + + CONFIG.description = description; + } else { + CONFIG.description = view(buf, data.config.description); + } } CHUNK_DATA = []; @@ -300,7 +347,7 @@ promise_test(async t => { }); await decoder.flush(); - assert_equals(outputs, CHUNKS.length, 'outputs'); + assert_equals(outputs, CONFIG.codec === 'vorbis' ? CHUNKS.length - 1 : CHUNKS.length, 'outputs'); }, 'Test decoding'); promise_test(async t => { @@ -316,9 +363,11 @@ promise_test(async t => { decoder.configure(CONFIG); decoder.decode(new EncodedAudioChunk( {type: 'key', timestamp: -42, data: CHUNK_DATA[0]})); + decoder.decode(new EncodedAudioChunk( + {type: 'key', timestamp: CHUNKS[0].duration - 42, data: CHUNK_DATA[1]})); await decoder.flush(); - assert_equals(outputs, 1, 'outputs'); + assert_equals(outputs, CONFIG.codec === 'vorbis' ? 1 : 2, 'outputs'); }, 'Test decoding a with negative timestamp'); promise_test(async t => { @@ -333,13 +382,14 @@ promise_test(async t => { decoder.configure(CONFIG); decoder.decode(CHUNKS[0]); + decoder.decode(CHUNKS[1]); await decoder.flush(); - assert_equals(outputs, 1, 'outputs'); + assert_equals(outputs, CONFIG.codec === 'vorbis' ? 1 : 2, 'outputs'); - decoder.decode(CHUNKS[0]); + decoder.decode(CHUNKS[2]); await decoder.flush(); - assert_equals(outputs, 2, 'outputs'); + assert_equals(outputs, CONFIG.codec === 'vorbis' ? 2 : 3, 'outputs'); }, 'Test decoding after flush'); promise_test(async t => { diff --git a/tests/wpt/tests/webcodecs/sfx-vorbis.ogg b/tests/wpt/tests/webcodecs/sfx-vorbis.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e3eb4fcae1a05dd45f3fd27888e4efbb13483437 GIT binary patch literal 4443 zcmai14O~-4wjTr`0mKM_293T1N#P>wGYD#^?D8Qh0aPvoB$QeMQ6Yd52(E8Sr4lG0 zAVQ=VqK}URO(3W!DEL!)!btjiKOopZma<?QyJjueEm%BQMM z!aWFl8i0H1#6D{?eY!JOL0y}*`l>8^;BVn`-#USCJ3;|$x-Nr$6|8}KT^IYtX8Mn1 zMvQ?e2#frF`O1hFP=tASYgI}vX<7Leqgir+Ev=3eY-^GP6AJ6TXUK=-PX{=5@&~nQ zYR&bFMbR~G9qQ^DqX$z5o$rG$vEDVq5e!Uc#(4tRutW?5p|Fgp!bg?#ghRt zG4@;d1c2YR+@$Fb?`7naSqiAkMrP%rto?SCwd@{Dxu~>k4OgAF5qEY|W$iU;&Ok^? zF{1cwV}!B^#mb6ek6!mv{oZ|^MALkE&~N(0WlFFu8&K@&3n(san>>=)!dWL$wHf$J zR5F~4sZ0?CPGuyO2U0HBsQA!v|KoaX-ooJz>b0Ngk@hU8!`@y|%lvuK zyx8otxNjumXYvznN+!l~CdNuPe^l^WV7-eR1VJM;#-vP8!tPe&tq&rb9Q-zNGN|1L z=vNQ8hPApzjCcCMT}_ zO~9DKW@1e8LF5o2;=(DrzpldKedN@-mwmUgY;kCXYh1<0yQ{Vp$<>FB{GhJ4{!Qd; zFFsmbe6+B5s<6zxs4BTguIZ>x?QNOv{Fn7zZuPSA< zu;Rl?`@|wGEJ9ZB*whV`JDLSh5fa$q)>ys_AH*ih@m}@=I?m-BRYVPPNDHOCY|F!W z6ih{r8pOKk(*D2)ioBsfcZ3)h%-{)f_elyt6gPBtr|Y#!pD-#b%pv3&RXFAlF?P^r zz{fW-n%C#R8;$0TJ4Nu?SrHBq5r2#3IfU>WdDp8Vcx`Fde1x~6d3T(6qwT_Rr!Qlx zBooUb;^5T)RLNLX&SpbeLiHO~5mY0q<-DK21=%Nfapd$K$^rT&;k z?yk|OHSKAd7Hxd}LruM=w{@GQrMb8DcvDO2G*DZPX<9us8qcQI<`){z>GorqPHk`N ziJF$C>Gq#&E_+UQ?$orjG_^h^sGZtrea3X>(k~jZzQ(3Uo$Aic^y$uw{`NF_gXYnB zkG@MMdRu>*?)>-D5@sY%az~bMKNj>z+q~;Y{7imp+9zGw7rnq>{R*! z7}Gyp@~15;%T(Lsuv3k;M$O6xU`Iz9T% zgCO>|`W^IhOX&&Y%YksXRcn)z*fT@ECK}ggyzsmKT+(pdmfXD`uwh1E!=X2zj=5x3 z?n*Oc$(*7_Q9N{vEDHXJp^Ro*GBek6b#&QAZVFR&!$Z%AE(`5ZRN8a5W3mz4s!p|$ zE2@(jaM8)e8-gDhN+)izmu!TeqSoKwm&{9~cuy&l21CiJ(*yxnP1P#xg19OrHH_;O z(+@yy7ztdbR@z5}s@s5-O6e5FWw%q~)7b_(tWes=hhlnaRGODwzF5xyR#yq(Mi~#P zWx(oCUImw{Jy?PFD=G%I)l1Kh4{wuD z_%_B}Y1?8%DOx=UXQ^mm+>>oiqICA;d~ULq5U$oa#g~EbD3NcYA%!5sr}-P?nOv>m z23`t;#I(PT%K!4yTg?S2UV4K-O9=Nkd9VV6Pu}L2aAYF_U{!&az>4_Pj>f7KAjt83 zZIib%Q+=P`;5QR8!r%*$xxeFC44gW-<|rVSEUYDt5F%^?3-Q6wWQw?-<3SGU=eViG z;XxS2>klNc+6FlorZaFzER|E3hnFr!gkhkC7vvqru(gaR(wSM$i6f)c5XE{1oI94z zDq7wUO-W6pxTt907Zo)TY)i|u3-WMI91L{Fq#L;&SU!at%2Gj&YfXoIE_Fz@i4Gew zog<&y3T)X0jI3yHk9pE?uABNRu&7o7P*Cam`6=4dHv>r8e1mrw3!t!7d!?Gc1fj>U zp~uE^goVnjPynp~H%Y#NG z8zBfd_Xh@yVX7>GAj7Q@^4JL((TT{U%)JL{;mn+cb`xhNmt$2YTZ8EtvI-o;fl6wz zE!a*MLl9*A#|(f*s&6(0V5R2=bG5onq86sgAZYd-0}!`O%0*lthz2?k`gXPzI$^#b zWVsuS?BSDSR3euFW-MVBPzA;8DMc^|(^W%`(?}yy5BSIu`9}#5;8hO<&J>+!6q#l3 z6O;En^8cfR8uF}pG4Qq4(-x3SS@{}!<7;B-n0{yuyEy=OX zR_L|Wf|#`{vH3QhgpL$DNc1jO!;UQ%N(-=uN-4OfE||-4X8}qu4B!J1E#q?!W#YI8 zOI1Z29XI$~FW_y(QW@|Rkm5&DoxVYcx*50*QyKXCyddPb@G2eBFCqpz8eYzG;w zO5&U5uUd&m0Qn=1pM;n!~Rn#b4 z^iUxviQI5Fk;}f^EQ{f~AJ{u0Zf?u&hf5-ZgqBj6%f1RQqtbdnkkkT0wI?nNu|Ku2 z_}<>z+Sa;TnmLkejwsR|+XIE0Z0#L1U)2lz(56p6@3G3YEiFC0&*q``h1m(;N*Gdx z1+!3RMlH|Hb4dU5cXKwJy-4;8QP~;qz;}%o(uz3@7Z*9F%x?eOa>{{u750@5GJr2a zC(Lr^qFmS6g@uJ%%Nj1N(6uJbOcJ0l6_U4+^Dbg}NIww>(TyrSmT)3(l+66MSno~n>p=hr4I|JC8uct+Zv zg9lDrE0A97v*ksKw2tWR^Z$C)e>i!Q_iOW+zJ%uwn|@yMpgZx^($@bR_U?anNA$_P z>whY}_-J_7Ow+OU{gI72LD%W;n{ty+u8fNQH8w7%X;eP!vFFf_n-#10FOMJS_{%Tb zf9_f{`Q+-I@AfR3e4;+5d%ddvPSo*lU$46L{_oQ-k37D8W63vnDifY|iEsIP4($0T Nd+xr1iR^ar{{p*(CfEP~ literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/key.py b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/key.py index 9a04a1f31d3..7deb5f1fb99 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/key.py +++ b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/key.py @@ -19,6 +19,34 @@ async def test_invalid_browsing_context(bidi_session): await bidi_session.input.perform_actions(actions=actions, context="foo") +async def test_key_down_closes_browsing_context( + bidi_session, configuration, new_tab, inline +): + url = inline(""" + close + + """) + + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=url, + wait="complete", + ) + + actions = Actions() + ( + actions.add_key() + .key_down("w") + .pause(250 * configuration["timeout_multiplier"]) + .key_up("w") + ) + + with pytest.raises(NoSuchFrameException): + await bidi_session.input.perform_actions( + actions=actions, context=new_tab["context"] + ) + + async def test_key_backspace(bidi_session, top_context, setup_key_test): actions = Actions() actions.add_key().send_keys("efcd").send_keys([Keys.BACKSPACE, Keys.BACKSPACE]) diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse.py b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse.py index ab91c6709c5..ab861a90937 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse.py +++ b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_mouse.py @@ -1,6 +1,6 @@ import pytest -from webdriver.bidi.error import MoveTargetOutOfBoundsException +from webdriver.bidi.error import MoveTargetOutOfBoundsException, NoSuchFrameException from webdriver.bidi.modules.input import Actions, get_element_origin from tests.support.asserts import assert_move_to_coordinates @@ -17,6 +17,34 @@ from . import ( pytestmark = pytest.mark.asyncio +async def test_pointer_down_closes_browsing_context( + bidi_session, configuration, get_element, new_tab, inline +): + url = inline("""close""") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=url, + wait="complete", + ) + + element = await get_element("input", context=new_tab) + origin = get_element_origin(element) + + actions = Actions() + ( + actions.add_pointer() + .pointer_move(0, 0, origin=origin) + .pointer_down(button=0) + .pause(250 * configuration["timeout_multiplier"]) + .pointer_up(button=0) + ) + + with pytest.raises(NoSuchFrameException): + await bidi_session.input.perform_actions( + actions=actions, context=new_tab["context"] + ) + + async def test_click_at_coordinates(bidi_session, top_context, load_static_test_page): await load_static_test_page(page="test_actions.html") diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_pen.py b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_pen.py index 44ac435a21e..cfc6beaeb4b 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_pen.py +++ b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_pen.py @@ -1,6 +1,6 @@ import pytest -from webdriver.bidi.error import MoveTargetOutOfBoundsException +from webdriver.bidi.error import MoveTargetOutOfBoundsException, NoSuchFrameException from webdriver.bidi.modules.input import Actions, get_element_origin from .. import get_events @@ -14,6 +14,34 @@ from . import ( pytestmark = pytest.mark.asyncio +async def test_pointer_down_closes_browsing_context( + bidi_session, configuration, get_element, new_tab, inline +): + url = inline("""close""") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=url, + wait="complete", + ) + + element = await get_element("input", context=new_tab) + origin = get_element_origin(element) + + actions = Actions() + ( + actions.add_pointer(pointer_type="pen") + .pointer_move(0, 0, origin=origin) + .pointer_down(button=0) + .pause(250 * configuration["timeout_multiplier"]) + .pointer_up(button=0) + ) + + with pytest.raises(NoSuchFrameException): + await bidi_session.input.perform_actions( + actions=actions, context=new_tab["context"] + ) + + @pytest.mark.parametrize("origin", ["element", "pointer", "viewport"]) async def test_params_actions_origin_outside_viewport( bidi_session, get_actions_origin_page, top_context, get_element, origin diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_touch.py b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_touch.py index 6edc7f83202..4477162b322 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_touch.py +++ b/tests/wpt/tests/webdriver/tests/bidi/input/perform_actions/pointer_touch.py @@ -1,6 +1,6 @@ import pytest -from webdriver.bidi.error import MoveTargetOutOfBoundsException +from webdriver.bidi.error import MoveTargetOutOfBoundsException, NoSuchFrameException from webdriver.bidi.modules.input import Actions, get_element_origin from .. import get_events @@ -14,6 +14,34 @@ from . import ( pytestmark = pytest.mark.asyncio +async def test_pointer_down_closes_browsing_context( + bidi_session, configuration, get_element, new_tab, inline +): + url = inline("""close""") + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=url, + wait="complete", + ) + + element = await get_element("input", context=new_tab) + origin = get_element_origin(element) + + actions = Actions() + ( + actions.add_pointer(pointer_type="touch") + .pointer_move(0, 0, origin=origin) + .pointer_down(button=0) + .pause(250 * configuration["timeout_multiplier"]) + .pointer_up(button=0) + ) + + with pytest.raises(NoSuchFrameException): + await bidi_session.input.perform_actions( + actions=actions, context=new_tab["context"] + ) + + @pytest.mark.parametrize("origin", ["element", "pointer", "viewport"]) async def test_params_actions_origin_outside_viewport( bidi_session, get_actions_origin_page, top_context, get_element, origin diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py index 5decb28a1a9..dd0eae49ac1 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py @@ -80,8 +80,10 @@ def assert_request_data(request_data, expected_request, expected_time_range): { "bodySize": any_int_or_null, "cookies": any_list, + "destination": any_string, "headers": any_list, "headersSize": any_int, + "initiatorType": any_string_or_null, "method": any_string, "request": any_string, "timings": any_dict, @@ -175,8 +177,8 @@ def assert_before_request_sent_event( expected_time_range=None, ): # Assert initiator - assert isinstance(event["initiator"], dict) - assert isinstance(event["initiator"]["type"], str) + if "initiator" in event: + assert isinstance(event["initiator"], dict) # Assert base parameters assert_base_parameters( @@ -371,18 +373,26 @@ HTTP_STATUS_AND_STATUS_TEXT = [ (505, "HTTP Version Not Supported"), ] +BASE_URL = "/webdriver/tests/bidi/network/support" PAGE_DATA_URL_HTML = "data:text/html,
foo
" PAGE_DATA_URL_IMAGE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII=" -PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" -PAGE_EMPTY_IMAGE = "/webdriver/tests/bidi/network/support/empty.png" -PAGE_EMPTY_SCRIPT = "/webdriver/tests/bidi/network/support/empty.js" -PAGE_EMPTY_SVG = "/webdriver/tests/bidi/network/support/empty.svg" -PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt" +PAGE_EMPTY_HTML = f"{BASE_URL}/empty.html" +PAGE_EMPTY_IMAGE = f"{BASE_URL}/empty.png" +PAGE_EMPTY_SCRIPT = f"{BASE_URL}/empty.js" +PAGE_EMPTY_SVG = f"{BASE_URL}/empty.svg" +PAGE_EMPTY_TEXT = f"{BASE_URL}/empty.txt" PAGE_INVALID_URL = "https://not_a_valid_url.test/" -PAGE_OTHER_TEXT = "/webdriver/tests/bidi/network/support/other.txt" -PAGE_PROVIDE_RESPONSE_HTML = "/webdriver/tests/bidi/network/support/provide_response.html" -PAGE_PROVIDE_RESPONSE_SCRIPT = "/webdriver/tests/bidi/network/support/provide_response.js" -PAGE_PROVIDE_RESPONSE_STYLESHEET = "/webdriver/tests/bidi/network/support/provide_response.css" +PAGE_INITIATOR = { + "HTML": f"{BASE_URL}/initiator/simple-initiator.html", + "SCRIPT": f"{BASE_URL}/initiator/simple-initiator-script.js", + "STYLESHEET": f"{BASE_URL}/initiator/simple-initiator-style.css", + "IMAGE": f"{BASE_URL}/initiator/simple-initiator-img.png", + "BACKGROUND": f"{BASE_URL}/initiator/simple-initiator-bg.png", +} +PAGE_OTHER_TEXT = f"{BASE_URL}/other.txt" +PAGE_PROVIDE_RESPONSE_HTML = f"{BASE_URL}/provide_response.html" +PAGE_PROVIDE_RESPONSE_SCRIPT = f"{BASE_URL}/provide_response.js" +PAGE_PROVIDE_RESPONSE_STYLESHEET = f"{BASE_URL}/provide_response.css" PAGE_REDIRECT_HTTP_EQUIV = ( "/webdriver/tests/bidi/network/support/redirect_http_equiv.html" ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py index 5ba6955bd12..ebc3bf8fa86 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py @@ -13,6 +13,7 @@ from .. import ( PAGE_DATA_URL_IMAGE, PAGE_EMPTY_HTML, PAGE_EMPTY_TEXT, + PAGE_INITIATOR, PAGE_REDIRECT_HTTP_EQUIV, PAGE_REDIRECTED_HTML, PAGE_SERVICEWORKER_HTML, @@ -608,3 +609,55 @@ async def test_fetch_data_url( redirect_count=0, ) assert events[0]["navigation"] is None + + +@pytest.mark.asyncio +async def test_destination_initiator( + bidi_session, + top_context, + wait_for_event, + wait_for_future_safe, + fetch, + setup_network_test, + url, +): + network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT]) + events = network_events[BEFORE_REQUEST_SENT_EVENT] + + page_url = url(PAGE_INITIATOR["HTML"]) + + result = await bidi_session.browsing_context.navigate( + context=top_context["context"], url=page_url, wait="complete" + ) + + assert len(events) == 6 + + def assert_initiator_destination(url, initiator_type, destination): + event = next(e for e in events if url in e["request"]["url"]) + assert_before_request_sent_event( + event, + expected_request={ + "destination": destination, + "initiatorType": initiator_type, + }, + ) + + assert_initiator_destination(PAGE_INITIATOR["HTML"], None, "") + assert_initiator_destination(PAGE_INITIATOR["SCRIPT"], "script", "script") + assert_initiator_destination(PAGE_INITIATOR["STYLESHEET"], "link", "style") + assert_initiator_destination(PAGE_INITIATOR["IMAGE"], "img", "image") + assert_initiator_destination(PAGE_INITIATOR["BACKGROUND"], "css", "image") + assert_initiator_destination(PAGE_EMPTY_HTML, "iframe", "iframe") + + # Perform an additional fetch, and check its destination. + on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT) + await fetch(page_url, method="GET") + event = await wait_for_future_safe(on_before_request_sent) + + assert_before_request_sent_event( + event, + expected_request={ + "destination": "", + "initiatorType": "fetch", + }, + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py index ff406ceb952..812df763bd6 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py @@ -18,6 +18,7 @@ from .. import ( PAGE_EMPTY_SCRIPT, PAGE_EMPTY_SVG, PAGE_EMPTY_TEXT, + PAGE_INITIATOR, PAGE_SERVICEWORKER_HTML, RESPONSE_COMPLETED_EVENT, ) @@ -610,3 +611,55 @@ async def test_fetch_data_url( redirect_count=0, ) assert events[0]["navigation"] is None + + +@pytest.mark.asyncio +async def test_destination_initiator( + bidi_session, + top_context, + wait_for_event, + wait_for_future_safe, + fetch, + setup_network_test, + url, +): + network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT]) + events = network_events[RESPONSE_COMPLETED_EVENT] + + page_url = url(PAGE_INITIATOR["HTML"]) + + result = await bidi_session.browsing_context.navigate( + context=top_context["context"], url=page_url, wait="complete" + ) + + assert len(events) == 6 + + def assert_initiator_destination(url, initiator_type, destination): + event = next(e for e in events if url in e["request"]["url"]) + assert_response_event( + event, + expected_request={ + "destination": destination, + "initiatorType": initiator_type, + }, + ) + + assert_initiator_destination(PAGE_INITIATOR["HTML"], None, "") + assert_initiator_destination(PAGE_INITIATOR["SCRIPT"], "script", "script") + assert_initiator_destination(PAGE_INITIATOR["STYLESHEET"], "link", "style") + assert_initiator_destination(PAGE_INITIATOR["IMAGE"], "img", "image") + assert_initiator_destination(PAGE_INITIATOR["BACKGROUND"], "css", "image") + assert_initiator_destination(PAGE_EMPTY_HTML, "iframe", "iframe") + + # Perform an additional fetch, and check its destination. + on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT) + await fetch(page_url, method="GET") + event = await wait_for_future_safe(on_response_completed) + + assert_response_event( + event, + expected_request={ + "destination": "", + "initiatorType": "fetch", + }, + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py index 47ab922b0da..25f1179f07a 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py +++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py @@ -17,6 +17,7 @@ from .. import ( PAGE_EMPTY_SCRIPT, PAGE_EMPTY_SVG, PAGE_EMPTY_TEXT, + PAGE_INITIATOR, PAGE_SERVICEWORKER_HTML, RESPONSE_STARTED_EVENT, ) @@ -583,3 +584,55 @@ async def test_fetch_data_url( redirect_count=0, ) assert events[0]["navigation"] is None + + +@pytest.mark.asyncio +async def test_destination_initiator( + bidi_session, + top_context, + wait_for_event, + wait_for_future_safe, + fetch, + setup_network_test, + url, +): + network_events = await setup_network_test(events=[RESPONSE_STARTED_EVENT]) + events = network_events[RESPONSE_STARTED_EVENT] + + page_url = url(PAGE_INITIATOR["HTML"]) + + result = await bidi_session.browsing_context.navigate( + context=top_context["context"], url=page_url, wait="complete" + ) + + assert len(events) == 6 + + def assert_initiator_destination(url, initiator_type, destination): + event = next(e for e in events if url in e["request"]["url"]) + assert_response_event( + event, + expected_request={ + "destination": destination, + "initiatorType": initiator_type, + }, + ) + + assert_initiator_destination(PAGE_INITIATOR["HTML"], None, "") + assert_initiator_destination(PAGE_INITIATOR["SCRIPT"], "script", "script") + assert_initiator_destination(PAGE_INITIATOR["STYLESHEET"], "link", "style") + assert_initiator_destination(PAGE_INITIATOR["IMAGE"], "img", "image") + assert_initiator_destination(PAGE_INITIATOR["BACKGROUND"], "css", "image") + assert_initiator_destination(PAGE_EMPTY_HTML, "iframe", "iframe") + + # Perform an additional fetch, and check its destination. + on_response_started = wait_for_event(RESPONSE_STARTED_EVENT) + await fetch(page_url, method="GET") + event = await wait_for_future_safe(on_response_started) + + assert_response_event( + event, + expected_request={ + "destination": "", + "initiatorType": "fetch", + }, + ) diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-bg.png b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5bcd4ea834a9885ebc4fa04b2bde0d27ca2c2056 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRaZeY=5RT~NKj#m8n7?pgW8=qq eXXY7<3=WNK|26wVn}A9fJYD@<);T3KF#rI|B^5jX literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-img.png b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-img.png new file mode 100644 index 0000000000000000000000000000000000000000..5bcd4ea834a9885ebc4fa04b2bde0d27ca2c2056 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRaZeY=5RT~NKj#m8n7?pgW8=qq eXXY7<3=WNK|26wVn}A9fJYD@<);T3KF#rI|B^5jX literal 0 HcmV?d00001 diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-script.js b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-script.js new file mode 100644 index 00000000000..abdfcb50a85 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-script.js @@ -0,0 +1,3 @@ +"use strict"; + +// nothing important diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-style.css b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-style.css new file mode 100644 index 00000000000..15f8dd8f9c2 --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator-style.css @@ -0,0 +1,4 @@ +body { + background-image: url('simple-initiator-bg.png'); + background-repeat: no-repeat; +} diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator.html b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator.html new file mode 100644 index 00000000000..184a3b3a70c --- /dev/null +++ b/tests/wpt/tests/webdriver/tests/bidi/network/support/initiator/simple-initiator.html @@ -0,0 +1,17 @@ + + + + + + + + Simple initiator test page + + + + + + + diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py index 56ea5399143..ff73dff2757 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py @@ -96,3 +96,11 @@ async def get_default_partition_key(bidi_session, context=None): else: result = await bidi_session.storage.get_cookies(partition=BrowsingContextPartitionDescriptor(context)) return result['partitionKey'] + + +async def assert_partition_key(bidi_session, actual, expected = {}, context=None): + expected = { + **(await get_default_partition_key(bidi_session, context)), + **expected + } + recursive_compare(expected, actual) diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py index 7bfb743cfcf..1432da4709d 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py @@ -5,9 +5,9 @@ from webdriver.bidi.modules.storage import CookieFilter from . import assert_cookies_are_not_present from .. import ( assert_cookie_is_set, + assert_partition_key, create_cookie, format_expiry_string, - get_default_partition_key, generate_expiry_date, ) @@ -52,9 +52,7 @@ async def test_filter( result = await bidi_session.storage.delete_cookies( filter=filter, ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) @@ -103,9 +101,7 @@ async def test_filter_domain( result = await bidi_session.storage.delete_cookies( filter=filter, ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) @@ -179,9 +175,7 @@ async def test_filter_expiry( result = await bidi_session.storage.delete_cookies( filter=CookieFilter(expiry=expiry_to_delete), ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) @@ -225,9 +219,7 @@ async def test_filter_name(bidi_session, new_tab, test_page, add_cookie, domain_ result = await bidi_session.storage.delete_cookies( filter=filter, ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) @@ -294,9 +286,7 @@ async def test_filter_same_site( result = await bidi_session.storage.delete_cookies( filter=filter, ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) @@ -358,9 +348,7 @@ async def test_filter_secure( result = await bidi_session.storage.delete_cookies( filter=filter, ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) @@ -425,9 +413,7 @@ async def test_filter_path( result = await bidi_session.storage.delete_cookies( filter=filter, ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) @@ -497,9 +483,7 @@ async def test_filter_http_only( result = await bidi_session.storage.delete_cookies( filter=filter, ) - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, filter) diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py index bf23abb720c..4e0ca081bcd 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py @@ -8,8 +8,7 @@ from webdriver.bidi.modules.storage import ( ) from . import assert_cookies_are_not_present -from .. import assert_cookie_is_set, create_cookie, get_default_partition_key -from ... import recursive_compare +from .. import assert_cookie_is_set, create_cookie, assert_partition_key pytestmark = pytest.mark.asyncio @@ -63,9 +62,7 @@ async def test_default_partition( ) result = await bidi_session.storage.delete_cookies() - assert result == { - "partitionKey": (await get_default_partition_key(bidi_session)) - } + await assert_partition_key(bidi_session, actual=result["partitionKey"]) await assert_cookies_are_not_present(bidi_session) @@ -104,7 +101,7 @@ async def test_partition_context( ) result = await bidi_session.storage.delete_cookies(partition=partition) - assert result == {"partitionKey": (await get_default_partition_key(bidi_session, new_tab["context"]))} + await assert_partition_key(bidi_session, actual=result["partitionKey"], context=new_tab["context"]) await assert_cookies_are_not_present(bidi_session, partition) @@ -135,7 +132,7 @@ async def test_partition_context_iframe( ) result = await bidi_session.storage.delete_cookies(partition=frame_partition) - assert result == {"partitionKey": (await get_default_partition_key(bidi_session, new_tab["context"]))} + await assert_partition_key(bidi_session, actual=result["partitionKey"], context=new_tab["context"]) await assert_cookies_are_not_present(bidi_session, frame_partition) @@ -199,12 +196,10 @@ async def test_partition_source_origin( ) result = await bidi_session.storage.delete_cookies(partition=cookie1_partition) - assert result == { - "partitionKey": { - **(await get_default_partition_key(bidi_session)), - "sourceOrigin": cookie1_source_origin - } - } + + await assert_partition_key(bidi_session, actual=result["partitionKey"], expected={ + "sourceOrigin": cookie1_source_origin + }) await assert_cookies_are_not_present(bidi_session, partition=cookie1_partition) @@ -287,12 +282,10 @@ async def test_partition_user_context( result = await bidi_session.storage.delete_cookies( partition=StorageKeyPartitionDescriptor(user_context=user_context_1) ) - assert result == { - "partitionKey": { - **(await get_default_partition_key(bidi_session)), - "userContext": user_context_1 - } - } + + await assert_partition_key(bidi_session, actual=result["partitionKey"], expected={ + "userContext": user_context_1 + }) # Make sure that deleted cookies are not present. await assert_cookies_are_not_present(bidi_session, partition=cookie1_partition) diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py index efa22f7dc9a..89965499eed 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py @@ -2,7 +2,7 @@ import pytest from webdriver.bidi.modules.network import NetworkBase64Value, NetworkStringValue from webdriver.bidi.modules.storage import CookieFilter -from .. import create_cookie, format_expiry_string, get_default_partition_key, generate_expiry_date +from .. import assert_partition_key, create_cookie, format_expiry_string, generate_expiry_date from ... import recursive_compare pytestmark = pytest.mark.asyncio @@ -37,9 +37,7 @@ async def test_filter( filter=filter, ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 # Provide consistent cookies order. (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"]) @@ -104,9 +102,7 @@ async def test_filter_domain( filter=CookieFilter(domain=domain), ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 # Provide consistent cookies order. (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"]) @@ -195,9 +191,7 @@ async def test_filter_expiry( filter=CookieFilter(expiry=cookie1_expiry), ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 # Provide consistent cookies order. (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"]) @@ -309,9 +303,7 @@ async def test_filter_same_site( filter=CookieFilter(same_site=same_site_1), ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 # Provide consistent cookies order. (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"]) @@ -379,9 +371,7 @@ async def test_filter_secure( filter=CookieFilter(secure=secure_1), ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 # Provide consistent cookies order. (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"]) @@ -459,9 +449,7 @@ async def test_filter_path( filter=CookieFilter(path=path_1), ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"]) recursive_compare( @@ -540,9 +528,7 @@ async def test_filter_http_only( filter=CookieFilter(http_only=http_only_1), ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"]) recursive_compare( diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py index dbe882b8cfe..76fd6221a00 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py @@ -6,7 +6,7 @@ from webdriver.bidi.modules.storage import ( StorageKeyPartitionDescriptor, ) -from .. import create_cookie, get_default_partition_key +from .. import assert_partition_key, create_cookie from ... import recursive_compare pytestmark = pytest.mark.asyncio @@ -38,9 +38,7 @@ async def test_default_partition( cookies = await bidi_session.storage.get_cookies() - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=cookies["partitionKey"]) assert len(cookies["cookies"]) == 2 # Provide consistent cookies order. (cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["domain"]) @@ -103,10 +101,9 @@ async def test_partition_context( partition=BrowsingContextPartitionDescriptor(new_tab["context"]) ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session, new_tab["context"])), + await assert_partition_key(bidi_session, actual=cookies["partitionKey"], expected={ "userContext": "default" - } + }, context=new_tab["context"]) assert len(cookies["cookies"]) == 1 recursive_compare( { @@ -127,10 +124,9 @@ async def test_partition_context( partition=BrowsingContextPartitionDescriptor(new_context["context"]) ) - assert cookies["partitionKey"] == { - **(await get_default_partition_key(bidi_session, new_context["context"])), + await assert_partition_key(bidi_session, actual=cookies["partitionKey"], expected={ "userContext": user_context - } + }, context=new_context["context"]) assert len(cookies["cookies"]) == 0 diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py index 7aac38da695..f2469f8cedc 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py @@ -1,25 +1,23 @@ import pytest -from .. import assert_cookie_is_not_set, assert_cookie_is_set, create_cookie, get_default_partition_key +from .. import assert_cookie_is_not_set, assert_partition_key, assert_cookie_is_set, create_cookie from datetime import datetime, timedelta import time pytestmark = pytest.mark.asyncio -async def test_cookie_expiry_unset(bidi_session, set_cookie, test_page, domain_value): +async def test_cookie_expiry_unset(bidi_session, set_cookie, domain_value): set_cookie_result = await set_cookie( cookie=create_cookie( domain=domain_value(), expiry=None)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) await assert_cookie_is_set(bidi_session, expiry=None, domain=domain_value()) -async def test_cookie_expiry_future(bidi_session, set_cookie, test_page, domain_value): +async def test_cookie_expiry_future(bidi_session, set_cookie, domain_value): tomorrow = datetime.now() + timedelta(1) tomorrow_timestamp = time.mktime(tomorrow.timetuple()) @@ -28,14 +26,12 @@ async def test_cookie_expiry_future(bidi_session, set_cookie, test_page, domain_ domain=domain_value(), expiry=tomorrow_timestamp)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) await assert_cookie_is_set(bidi_session, expiry=tomorrow_timestamp, domain=domain_value()) -async def test_cookie_expiry_past(bidi_session, set_cookie, test_page, domain_value): +async def test_cookie_expiry_past(bidi_session, set_cookie, domain_value): yesterday = datetime.now() - timedelta(1) yesterday_timestamp = time.mktime(yesterday.timetuple()) @@ -44,8 +40,6 @@ async def test_cookie_expiry_past(bidi_session, set_cookie, test_page, domain_va domain=domain_value(), expiry=yesterday_timestamp)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) await assert_cookie_is_not_set(bidi_session) diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py index b2155d1ac20..f10935f5bf9 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py @@ -1,5 +1,5 @@ import pytest -from .. import assert_cookie_is_set, create_cookie, get_default_partition_key +from .. import assert_cookie_is_set, assert_partition_key, create_cookie pytestmark = pytest.mark.asyncio @@ -15,9 +15,7 @@ async def test_cookie_http_only(bidi_session, set_cookie, test_page, domain_valu set_cookie_result = await set_cookie( cookie=create_cookie(domain=domain_value(), http_only=http_only)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) # `httpOnly` defaults to `false`. expected_http_only = http_only if http_only is not None else False diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py index 70084dee6e5..d766638fe96 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py @@ -1,5 +1,5 @@ import pytest -from .. import assert_cookie_is_set, create_cookie, get_default_partition_key +from .. import assert_cookie_is_set, assert_partition_key, create_cookie pytestmark = pytest.mark.asyncio @@ -16,9 +16,7 @@ pytestmark = pytest.mark.asyncio async def test_cookie_path(bidi_session, test_page, set_cookie, domain_value, path): set_cookie_result = await set_cookie(cookie=create_cookie(domain=domain_value(), path=path)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) # `path` defaults to "/". expected_path = path if path is not None else "/" diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py index 27640bb9a6a..53d8ae99877 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py @@ -1,5 +1,5 @@ import pytest -from .. import assert_cookie_is_set, create_cookie, get_default_partition_key +from .. import assert_cookie_is_set, assert_partition_key, create_cookie pytestmark = pytest.mark.asyncio @@ -17,9 +17,7 @@ async def test_cookie_secure(bidi_session, set_cookie, test_page, domain_value, set_cookie_result = await set_cookie( cookie=create_cookie(domain=domain_value(), same_site=same_site)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) # `same_site` defaults to "none". expected_same_site = same_site if same_site is not None else 'none' diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py index 81e462c87cc..bc3201ab804 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py @@ -1,5 +1,5 @@ import pytest -from .. import assert_cookie_is_set, create_cookie, get_default_partition_key +from .. import assert_cookie_is_set, assert_partition_key, create_cookie pytestmark = pytest.mark.asyncio @@ -16,9 +16,7 @@ async def test_cookie_secure(bidi_session, set_cookie, test_page, domain_value, set_cookie_result = await set_cookie( cookie=create_cookie(domain=domain_value(), secure=secure)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) # `secure` defaults to `false`. expected_secure = secure if secure is not None else False diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py index 295b09c10e9..d25b52852f9 100644 --- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py +++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py @@ -1,6 +1,6 @@ import pytest from urllib.parse import urlparse -from .. import assert_cookie_is_set, create_cookie, get_default_partition_key +from .. import assert_cookie_is_set, assert_partition_key, create_cookie pytestmark = pytest.mark.asyncio @@ -17,9 +17,7 @@ async def test_page_protocols(bidi_session, set_cookie, get_test_page, protocol) domain = urlparse(url).hostname set_cookie_result = await set_cookie(cookie=create_cookie(domain=domain)) - assert set_cookie_result == { - 'partitionKey': (await get_default_partition_key(bidi_session)), - } + await assert_partition_key(bidi_session, actual=set_cookie_result["partitionKey"]) # Assert the cookie is actually set. await assert_cookie_is_set(bidi_session, domain=domain) diff --git a/tests/wpt/tests/webdriver/tests/classic/perform_actions/conftest.py b/tests/wpt/tests/webdriver/tests/classic/perform_actions/conftest.py index bb134a4eb1b..0c2f709bb04 100644 --- a/tests/wpt/tests/webdriver/tests/classic/perform_actions/conftest.py +++ b/tests/wpt/tests/webdriver/tests/classic/perform_actions/conftest.py @@ -74,7 +74,10 @@ def release_actions(session): ): time.sleep(0.1) - session.actions.release() + try: + session.actions.release() + except NoSuchWindowException: + pass @pytest.fixture diff --git a/tests/wpt/tests/webdriver/tests/classic/perform_actions/key.py b/tests/wpt/tests/webdriver/tests/classic/perform_actions/key.py index 7809fcd01a9..2d2a02d81a9 100644 --- a/tests/wpt/tests/webdriver/tests/classic/perform_actions/key.py +++ b/tests/wpt/tests/webdriver/tests/classic/perform_actions/key.py @@ -21,6 +21,20 @@ def test_no_browsing_context(session, closed_frame, key_chain): key_chain.key_up("a").perform() +def test_key_down_closes_browsing_context( + session, configuration, http_new_tab, inline, key_chain +): + session.url = inline(""" + close + + """) + with pytest.raises(NoSuchWindowException): + key_chain.key_down("w") \ + .pause(100 * configuration["timeout_multiplier"]) \ + .key_up("w") \ + .perform() + + def test_element_not_focused(session, test_actions_page, key_chain): key_reporter = session.find.css("#keys", all=False) 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 215085d9438..a3ff8ae80a9 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 @@ -34,6 +34,21 @@ def test_no_browsing_context(session, closed_frame, mouse_chain): mouse_chain.click().perform() +def test_pointer_down_closes_browsing_context( + session, configuration, http_new_tab, inline, mouse_chain +): + session.url = inline( + """close""") + origin = session.find.css("input", all=False) + + with pytest.raises(NoSuchWindowException): + mouse_chain.pointer_move(0, 0, origin=origin) \ + .pointer_down(button=0) \ + .pause(100 * configuration["timeout_multiplier"]) \ + .pointer_up(button=0) \ + .perform() + + @pytest.mark.parametrize("as_frame", [False, True], ids=["top_context", "child_context"]) def test_stale_element_reference(session, stale_element, mouse_chain, as_frame): element = stale_element("input#text", as_frame=as_frame) diff --git a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_pen.py b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_pen.py index 7c384ca97d8..ab51ce93fac 100644 --- a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_pen.py +++ b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_pen.py @@ -30,6 +30,21 @@ def test_no_browsing_context(session, closed_frame, pen_chain): pen_chain.click().perform() +def test_pointer_down_closes_browsing_context( + session, configuration, http_new_tab, inline, pen_chain +): + session.url = inline( + """close""") + origin = session.find.css("input", all=False) + + with pytest.raises(NoSuchWindowException): + pen_chain.pointer_move(0, 0, origin=origin) \ + .pointer_down(button=0) \ + .pause(100 * configuration["timeout_multiplier"]) \ + .pointer_up(button=0) \ + .perform() + + @pytest.mark.parametrize("as_frame", [False, True], ids=["top_context", "child_context"]) def test_stale_element_reference(session, stale_element, pen_chain, as_frame): element = stale_element("input#text", as_frame=as_frame) diff --git a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_touch.py b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_touch.py index 70ffd68e9ea..180424b5984 100644 --- a/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_touch.py +++ b/tests/wpt/tests/webdriver/tests/classic/perform_actions/pointer_touch.py @@ -29,6 +29,21 @@ def test_no_browsing_context(session, closed_frame, touch_chain): touch_chain.click().perform() +def test_pointer_down_closes_browsing_context( + session, configuration, http_new_tab, inline, touch_chain +): + session.url = inline( + """close""") + origin = session.find.css("input", all=False) + + with pytest.raises(NoSuchWindowException): + touch_chain.pointer_move(0, 0, origin=origin) \ + .pointer_down(button=0) \ + .pause(100 * configuration["timeout_multiplier"]) \ + .pointer_up(button=0) \ + .perform() + + @pytest.mark.parametrize("as_frame", [False, True], ids=["top_context", "child_context"]) def test_stale_element_reference(session, stale_element, touch_chain, as_frame): element = stale_element("input#text", as_frame=as_frame) diff --git a/tests/wpt/tests/webdriver/tests/support/html/test_actions_pointer.html b/tests/wpt/tests/webdriver/tests/support/html/test_actions_pointer.html index dd169f0c5bc..09d1693ea37 100644 --- a/tests/wpt/tests/webdriver/tests/support/html/test_actions_pointer.html +++ b/tests/wpt/tests/webdriver/tests/support/html/test_actions_pointer.html @@ -1,7 +1,13 @@  - + + + Test Actions