diff options
265 files changed, 7530 insertions, 979 deletions
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index d9ddaeefa1f..1ece24f4d06 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -13795,12 +13795,6 @@ {} ] ], - "pointerevents/pointerevent_pointermove-manual.html": [ - [ - "/pointerevents/pointerevent_pointermove-manual.html", - {} - ] - ], "pointerevents/pointerevent_pointermove_isprimary_same_as_pointerdown-manual.html": [ [ "/pointerevents/pointerevent_pointermove_isprimary_same_as_pointerdown-manual.html", @@ -104077,6 +104071,18 @@ {} ] ], + "css/css-backgrounds/background-size-one-value-1x1-image.html": [ + [ + "/css/css-backgrounds/background-size-one-value-1x1-image.html", + [ + [ + "/css/css-backgrounds/reference/background-size-one-value-1x1-image-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-backgrounds/background-size-with-negative-value.html": [ [ "/css/css-backgrounds/background-size-with-negative-value.html", @@ -113749,66 +113755,6 @@ {} ] ], - "css/css-filter/blur-clip-stacking-context-001.html": [ - [ - "/css/css-filter/blur-clip-stacking-context-001.html", - [ - [ - "/css/css-filter/blur-clip-stacking-context-ref.html", - "==" - ] - ], - {} - ] - ], - "css/css-filter/blur-clip-stacking-context-002.html": [ - [ - "/css/css-filter/blur-clip-stacking-context-002.html", - [ - [ - "/css/css-filter/blur-clip-stacking-context-ref.html", - "!=" - ] - ], - {} - ] - ], - "css/css-filter/filtered-block-is-container.html": [ - [ - "/css/css-filter/filtered-block-is-container.html", - [ - [ - "/css/css-filter/filtered-block-is-container-ref.html", - "==" - ] - ], - {} - ] - ], - "css/css-filter/filtered-html-is-not-container.html": [ - [ - "/css/css-filter/filtered-html-is-not-container.html", - [ - [ - "/css/css-filter/filtered-html-is-not-container-ref.html", - "==" - ] - ], - {} - ] - ], - "css/css-filter/filtered-inline-is-container.html": [ - [ - "/css/css-filter/filtered-inline-is-container.html", - [ - [ - "/css/css-filter/filtered-inline-is-container-ref.html", - "==" - ] - ], - {} - ] - ], "css/css-flexbox/Flexible-order.html": [ [ "/css/css-flexbox/Flexible-order.html", @@ -115405,6 +115351,30 @@ {} ] ], + "css/css-flexbox/flex-wrap-002.html": [ + [ + "/css/css-flexbox/flex-wrap-002.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/css-flexbox/flex-wrap-003.html": [ + [ + "/css/css-flexbox/flex-wrap-003.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-flexbox/flexbox-flex-direction-column-reverse.htm": [ [ "/css/css-flexbox/flexbox-flex-direction-column-reverse.htm", @@ -122445,6 +122415,42 @@ {} ] ], + "css/css-grid/grid-model/grid-container-scrollbar-001.html": [ + [ + "/css/css-grid/grid-model/grid-container-scrollbar-001.html", + [ + [ + "/css/css-grid/grid-model/grid-container-scrollbar-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html": [ + [ + "/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html", + [ + [ + "/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001.html": [ + [ + "/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001.html", + [ + [ + "/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-grid/grid-model/grid-display-grid-001.html": [ [ "/css/css-grid/grid-model/grid-display-grid-001.html", @@ -127437,6 +127443,18 @@ {} ] ], + "css/css-multicol/multicol-margin-003.html": [ + [ + "/css/css-multicol/multicol-margin-003.html", + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "css/css-multicol/multicol-margin-child-001.xht": [ [ "/css/css-multicol/multicol-margin-child-001.xht", @@ -127989,6 +128007,174 @@ {} ] ], + "css/css-multicol/multicol-span-all-dynamic-add-001.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-001.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-002.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-002.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-003.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-003.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-004.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-004.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-004-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-005.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-005.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-006.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-006.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-007.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-007.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-007-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-008.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-008.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-add-008-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-001.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-001.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-002.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-002.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-003.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-003.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-004.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-004.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-004-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-005.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-005.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-005-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-006.html": [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-006.html", + [ + [ + "/css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-multicol/multicol-span-all-margin-001.xht": [ [ "/css/css-multicol/multicol-span-all-margin-001.xht", @@ -128061,6 +128247,54 @@ {} ] ], + "css/css-multicol/multicol-span-all-restyle-001.html": [ + [ + "/css/css-multicol/multicol-span-all-restyle-001.html", + [ + [ + "/css/css-multicol/multicol-span-all-restyle-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-restyle-002.html": [ + [ + "/css/css-multicol/multicol-span-all-restyle-002.html", + [ + [ + "/css/css-multicol/multicol-span-all-restyle-002-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-restyle-003.html": [ + [ + "/css/css-multicol/multicol-span-all-restyle-003.html", + [ + [ + "/css/css-multicol/multicol-span-all-restyle-003-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-multicol/multicol-span-all-restyle-004.html": [ + [ + "/css/css-multicol/multicol-span-all-restyle-004.html", + [ + [ + "/css/css-multicol/multicol-span-all-restyle-004-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-multicol/multicol-span-float-001.xht": [ [ "/css/css-multicol/multicol-span-float-001.xht", @@ -140857,6 +141091,30 @@ {} ] ], + "css/css-text/white-space/tab-stop-threshold-001.html": [ + [ + "/css/css-text/white-space/tab-stop-threshold-001.html", + [ + [ + "/css/css-text/white-space/reference/tab-stop-threshold-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-text/white-space/tab-stop-threshold-002.html": [ + [ + "/css/css-text/white-space/tab-stop-threshold-002.html", + [ + [ + "/css/css-text/white-space/reference/tab-stop-threshold-002-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-text/white-space/textarea-break-spaces-001.html": [ [ "/css/css-text/white-space/textarea-break-spaces-001.html", @@ -167493,6 +167751,102 @@ {} ] ], + "css/filter-effects/backdrop-filter-basic-background-color.html": [ + [ + "/css/filter-effects/backdrop-filter-basic-background-color.html", + [ + [ + "/css/filter-effects/backdrop-filter-basic-background-color-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/backdrop-filter-basic-opacity.html": [ + [ + "/css/filter-effects/backdrop-filter-basic-opacity.html", + [ + [ + "/css/filter-effects/backdrop-filter-basic-opacity-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/backdrop-filter-basic.html": [ + [ + "/css/filter-effects/backdrop-filter-basic.html", + [ + [ + "/css/filter-effects/backdrop-filter-basic-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/backdrop-filter-border-radius.html": [ + [ + "/css/filter-effects/backdrop-filter-border-radius.html", + [ + [ + "/css/filter-effects/backdrop-filter-border-radius-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/backdrop-filter-isolation-isolate.html": [ + [ + "/css/filter-effects/backdrop-filter-isolation-isolate.html", + [ + [ + "/css/filter-effects/backdrop-filter-isolation-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/backdrop-filter-isolation.html": [ + [ + "/css/filter-effects/backdrop-filter-isolation.html", + [ + [ + "/css/filter-effects/backdrop-filter-isolation-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/blur-clip-stacking-context-001.html": [ + [ + "/css/filter-effects/blur-clip-stacking-context-001.html", + [ + [ + "/css/filter-effects/blur-clip-stacking-context-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/blur-clip-stacking-context-002.html": [ + [ + "/css/filter-effects/blur-clip-stacking-context-002.html", + [ + [ + "/css/filter-effects/blur-clip-stacking-context-ref.html", + "!=" + ] + ], + {} + ] + ], "css/filter-effects/css-filters-animation-blur.html": [ [ "/css/filter-effects/css-filters-animation-blur.html", @@ -167865,6 +168219,42 @@ {} ] ], + "css/filter-effects/filtered-block-is-container.html": [ + [ + "/css/filter-effects/filtered-block-is-container.html", + [ + [ + "/css/filter-effects/filtered-block-is-container-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/filtered-html-is-not-container.html": [ + [ + "/css/filter-effects/filtered-html-is-not-container.html", + [ + [ + "/css/filter-effects/filtered-html-is-not-container-ref.html", + "==" + ] + ], + {} + ] + ], + "css/filter-effects/filtered-inline-is-container.html": [ + [ + "/css/filter-effects/filtered-inline-is-container.html", + [ + [ + "/css/filter-effects/filtered-inline-is-container-ref.html", + "==" + ] + ], + {} + ] + ], "css/filter-effects/filters-drop-shadow.html": [ [ "/css/filter-effects/filters-drop-shadow.html", @@ -227126,12 +227516,7 @@ {} ] ], - "cors/resources/access-control-expose-headers-parsing-2.asis": [ - [ - {} - ] - ], - "cors/resources/access-control-expose-headers-parsing.asis": [ + "cors/resources/access-control-expose-headers.json": [ [ {} ] @@ -227161,6 +227546,11 @@ {} ] ], + "cors/resources/expose-headers.py": [ + [ + {} + ] + ], "cors/resources/image-tainting-checker.sub.html": [ [ {} @@ -249886,6 +250276,11 @@ {} ] ], + "css/css-backgrounds/reference/background-size-one-value-1x1-image-ref.html": [ + [ + {} + ] + ], "css/css-backgrounds/reference/background-size-ref.html": [ [ {} @@ -251451,31 +251846,6 @@ {} ] ], - "css/css-filter/META.yml": [ - [ - {} - ] - ], - "css/css-filter/blur-clip-stacking-context-ref.html": [ - [ - {} - ] - ], - "css/css-filter/filtered-block-is-container-ref.html": [ - [ - {} - ] - ], - "css/css-filter/filtered-html-is-not-container-ref.html": [ - [ - {} - ] - ], - "css/css-filter/filtered-inline-is-container-ref.html": [ - [ - {} - ] - ], "css/css-flexbox/META.yml": [ [ {} @@ -261501,6 +261871,21 @@ {} ] ], + "css/css-grid/grid-model/grid-container-scrollbar-001-ref.html": [ + [ + {} + ] + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001-ref.html": [ + [ + {} + ] + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001-ref.html": [ + [ + {} + ] + ], "css/css-grid/grid-model/support/grid.css": [ [ {} @@ -262826,6 +263211,56 @@ {} ] ], + "css/css-multicol/multicol-span-all-dynamic-add-001-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-002-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-003-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-004-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-007-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-add-008-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-002-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-004-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-dynamic-remove-005-ref.html": [ + [ + {} + ] + ], "css/css-multicol/multicol-span-all-margin-001-ref.xht": [ [ {} @@ -262851,6 +263286,26 @@ {} ] ], + "css/css-multicol/multicol-span-all-restyle-001-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-restyle-002-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-restyle-003-ref.html": [ + [ + {} + ] + ], + "css/css-multicol/multicol-span-all-restyle-004-ref.html": [ + [ + {} + ] + ], "css/css-multicol/multicol-span-float-001-ref.xht": [ [ {} @@ -268151,6 +268606,16 @@ {} ] ], + "css/css-text/white-space/reference/tab-stop-threshold-001-ref.html": [ + [ + {} + ] + ], + "css/css-text/white-space/reference/tab-stop-threshold-002-ref.html": [ + [ + {} + ] + ], "css/css-text/white-space/reference/textarea-pre-wrap-001-ref.html": [ [ {} @@ -275036,6 +275501,36 @@ {} ] ], + "css/filter-effects/backdrop-filter-basic-background-color-ref.html": [ + [ + {} + ] + ], + "css/filter-effects/backdrop-filter-basic-opacity-ref.html": [ + [ + {} + ] + ], + "css/filter-effects/backdrop-filter-basic-ref.html": [ + [ + {} + ] + ], + "css/filter-effects/backdrop-filter-border-radius-ref.html": [ + [ + {} + ] + ], + "css/filter-effects/backdrop-filter-isolation-ref.html": [ + [ + {} + ] + ], + "css/filter-effects/blur-clip-stacking-context-ref.html": [ + [ + {} + ] + ], "css/filter-effects/css-filters-animation-blur-ref.html": [ [ {} @@ -275126,11 +275621,6 @@ {} ] ], - "css/filter-effects/filter-external-002-filter.svg": [ - [ - {} - ] - ], "css/filter-effects/filter-grayscale-ref.html": [ [ {} @@ -275166,6 +275656,21 @@ {} ] ], + "css/filter-effects/filtered-block-is-container-ref.html": [ + [ + {} + ] + ], + "css/filter-effects/filtered-html-is-not-container-ref.html": [ + [ + {} + ] + ], + "css/filter-effects/filtered-inline-is-container-ref.html": [ + [ + {} + ] + ], "css/filter-effects/filters-drop-shadow-ref.html": [ [ {} @@ -275291,6 +275796,11 @@ {} ] ], + "css/filter-effects/support/filter-external-002-filter.svg": [ + [ + {} + ] + ], "css/filter-effects/support/import-green.css": [ [ {} @@ -298826,6 +299336,21 @@ {} ] ], + "network-error-logging/support/cached-for-one-minute.png": [ + [ + {} + ] + ], + "network-error-logging/support/cached-for-one-minute.png.sub.headers": [ + [ + {} + ] + ], + "network-error-logging/support/cached-with-validation.py": [ + [ + {} + ] + ], "network-error-logging/support/clear-policy-pass.png": [ [ {} @@ -298861,6 +299386,11 @@ {} ] ], + "network-error-logging/support/redirect.py": [ + [ + {} + ] + ], "network-error-logging/support/report.py": [ [ {} @@ -299336,6 +299866,11 @@ {} ] ], + "preload/resources/cross-origin-module.py": [ + [ + {} + ] + ], "preload/resources/dummy-preloads-subresource.css": [ [ {} @@ -305661,6 +306196,11 @@ {} ] ], + "service-workers/service-worker/resources/classic-worker.js": [ + [ + {} + ] + ], "service-workers/service-worker/resources/client-id-worker.js": [ [ {} @@ -306361,6 +306901,11 @@ {} ] ], + "service-workers/service-worker/resources/module-worker.js": [ + [ + {} + ] + ], "service-workers/service-worker/resources/multipart-image-iframe.html": [ [ {} @@ -314416,6 +314961,11 @@ {} ] ], + "tools/wpt/create.py": [ + [ + {} + ] + ], "tools/wpt/install.py": [ [ {} @@ -315351,11 +315901,46 @@ {} ] ], + "tools/wptserve/tests/functional/docroot/bar.any.worker.js": [ + [ + {} + ] + ], "tools/wptserve/tests/functional/docroot/document.txt": [ [ {} ] ], + "tools/wptserve/tests/functional/docroot/foo.any.html": [ + [ + {} + ] + ], + "tools/wptserve/tests/functional/docroot/foo.any.serviceworker.html": [ + [ + {} + ] + ], + "tools/wptserve/tests/functional/docroot/foo.any.sharedworker.html": [ + [ + {} + ] + ], + "tools/wptserve/tests/functional/docroot/foo.any.worker.html": [ + [ + {} + ] + ], + "tools/wptserve/tests/functional/docroot/foo.window.html": [ + [ + {} + ] + ], + "tools/wptserve/tests/functional/docroot/foo.worker.html": [ + [ + {} + ] + ], "tools/wptserve/tests/functional/docroot/invalid.py": [ [ {} @@ -315541,6 +316126,11 @@ {} ] ], + "tools/wptserve/tests/test_stash.py": [ + [ + {} + ] + ], "tools/wptserve/wptserve/__init__.py": [ [ {} @@ -317451,6 +318041,11 @@ {} ] ], + "webrtc/RTCQuicStream-helper.js": [ + [ + {} + ] + ], "webrtc/RTCQuicTransport-helper.js": [ [ {} @@ -320746,6 +321341,11 @@ {} ] ], + "worklets/resources/import-insecure-origin-redirected-empty-worklet-script.sub.js": [ + [ + {} + ] + ], "worklets/resources/import-nested-internal-worklet-script.js": [ [ {} @@ -320776,6 +321376,11 @@ {} ] ], + "worklets/resources/import-remote-origin-redirected-empty-worklet-script.sub.js": [ + [ + {} + ] + ], "worklets/resources/import-remote-origin-referrer-checker-worklet-script.sub.js": [ [ {} @@ -334893,6 +335498,16 @@ {} ] ], + "cors/cors-safelisted-request-header.any.js": [ + [ + "/cors/cors-safelisted-request-header.any.html", + {} + ], + [ + "/cors/cors-safelisted-request-header.any.worker.html", + {} + ] + ], "cors/credentials-flag.htm": [ [ "/cors/credentials-flag.htm", @@ -339911,6 +340526,12 @@ {} ] ], + "css/css-scroll-snap/nested-scrollIntoView-snaps.html": [ + [ + "/css/css-scroll-snap/nested-scrollIntoView-snaps.html", + {} + ] + ], "css/css-scroll-snap/overflowing-snap-areas.html": [ [ "/css/css-scroll-snap/overflowing-snap-areas.html", @@ -358461,6 +359082,12 @@ {} ] ], + "encoding/utf-32-from-win1252.html": [ + [ + "/encoding/utf-32-from-win1252.html", + {} + ] + ], "encoding/utf-32.html": [ [ "/encoding/utf-32.html", @@ -363125,6 +363752,12 @@ {} ] ], + "html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html": [ + [ + "/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html", + {} + ] + ], "html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html": [ [ "/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html", @@ -365173,6 +365806,12 @@ {} ] ], + "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-no-alt-replaced.html": [ + [ + "/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-no-alt-replaced.html", + {} + ] + ], "html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-auto.html": [ [ "/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-auto.html", @@ -376665,6 +377304,12 @@ {} ] ], + "mediacapture-streams/MediaDevices-getSupportedConstraints.html": [ + [ + "/mediacapture-streams/MediaDevices-getSupportedConstraints.html", + {} + ] + ], "mediacapture-streams/MediaDevices-getUserMedia.https.html": [ [ "/mediacapture-streams/MediaDevices-getUserMedia.https.html", @@ -379893,6 +380538,12 @@ {} ] ], + "network-error-logging/no-report-on-unexpired-cached-response.https.html": [ + [ + "/network-error-logging/no-report-on-unexpired-cached-response.https.html", + {} + ] + ], "network-error-logging/reports-are-not-observable.https.html": [ [ "/network-error-logging/reports-are-not-observable.https.html", @@ -379905,6 +380556,18 @@ {} ] ], + "network-error-logging/sends-report-on-cache-validation.https.html": [ + [ + "/network-error-logging/sends-report-on-cache-validation.https.html", + {} + ] + ], + "network-error-logging/sends-report-on-redirect.https.html": [ + [ + "/network-error-logging/sends-report-on-redirect.https.html", + {} + ] + ], "network-error-logging/sends-report-on-subdomain-dns-failure.https.html": [ [ "/network-error-logging/sends-report-on-subdomain-dns-failure.https.html", @@ -390217,6 +390880,14 @@ } ] ], + "picture-in-picture/mediastream.html": [ + [ + "/picture-in-picture/mediastream.html", + { + "testdriver": true + } + ] + ], "picture-in-picture/picture-in-picture-element.html": [ [ "/picture-in-picture/picture-in-picture-element.html", @@ -390293,6 +390964,14 @@ {} ] ], + "pointerevents/pointerevent_pointermove.html": [ + [ + "/pointerevents/pointerevent_pointermove.html", + { + "testdriver": true + } + ] + ], "pointerevents/pointerevent_touch-action-illegal.html": [ [ "/pointerevents/pointerevent_touch-action-illegal.html", @@ -399867,6 +400546,12 @@ {} ] ], + "screen-capture/historical.https.html": [ + [ + "/screen-capture/historical.https.html", + {} + ] + ], "screen-capture/idlharness.window.js": [ [ "/screen-capture/idlharness.window.html", @@ -404065,6 +404750,96 @@ {} ] ], + "svg/geometry/inheritance.svg": [ + [ + "/svg/geometry/inheritance.svg", + {} + ] + ], + "svg/geometry/parsing/cx-invalid.svg": [ + [ + "/svg/geometry/parsing/cx-invalid.svg", + {} + ] + ], + "svg/geometry/parsing/cx-valid.svg": [ + [ + "/svg/geometry/parsing/cx-valid.svg", + {} + ] + ], + "svg/geometry/parsing/cy-invalid.svg": [ + [ + "/svg/geometry/parsing/cy-invalid.svg", + {} + ] + ], + "svg/geometry/parsing/cy-valid.svg": [ + [ + "/svg/geometry/parsing/cy-valid.svg", + {} + ] + ], + "svg/geometry/parsing/r-invalid.svg": [ + [ + "/svg/geometry/parsing/r-invalid.svg", + {} + ] + ], + "svg/geometry/parsing/r-valid.svg": [ + [ + "/svg/geometry/parsing/r-valid.svg", + {} + ] + ], + "svg/geometry/parsing/rx-invalid.svg": [ + [ + "/svg/geometry/parsing/rx-invalid.svg", + {} + ] + ], + "svg/geometry/parsing/rx-valid.svg": [ + [ + "/svg/geometry/parsing/rx-valid.svg", + {} + ] + ], + "svg/geometry/parsing/ry-invalid.svg": [ + [ + "/svg/geometry/parsing/ry-invalid.svg", + {} + ] + ], + "svg/geometry/parsing/ry-valid.svg": [ + [ + "/svg/geometry/parsing/ry-valid.svg", + {} + ] + ], + "svg/geometry/parsing/x-invalid.svg": [ + [ + "/svg/geometry/parsing/x-invalid.svg", + {} + ] + ], + "svg/geometry/parsing/x-valid.svg": [ + [ + "/svg/geometry/parsing/x-valid.svg", + {} + ] + ], + "svg/geometry/parsing/y-invalid.svg": [ + [ + "/svg/geometry/parsing/y-invalid.svg", + {} + ] + ], + "svg/geometry/parsing/y-valid.svg": [ + [ + "/svg/geometry/parsing/y-valid.svg", + {} + ] + ], "svg/historical.html": [ [ "/svg/historical.html", @@ -404155,6 +404930,12 @@ {} ] ], + "svg/painting/inheritance.svg": [ + [ + "/svg/painting/inheritance.svg", + {} + ] + ], "svg/path/error-handling/bounding.svg": [ [ "/svg/path/error-handling/bounding.svg", @@ -404275,6 +405056,12 @@ {} ] ], + "svg/text/inheritance.svg": [ + [ + "/svg/text/inheritance.svg", + {} + ] + ], "svg/types/elements/SVGGeometryElement-rect.svg": [ [ "/svg/types/elements/SVGGeometryElement-rect.svg", @@ -409206,7 +409993,9 @@ "webrtc/RTCPeerConnection-track-stats.https.html": [ [ "/webrtc/RTCPeerConnection-track-stats.https.html", - {} + { + "timeout": "long" + } ] ], "webrtc/RTCPeerConnection-transceivers.https.html": [ @@ -436411,6 +437200,14 @@ {} ] ], + "webdriver/tests/fullscreen_window/stress.py": [ + [ + "/webdriver/tests/fullscreen_window/stress.py", + { + "timeout": "long" + } + ] + ], "webdriver/tests/fullscreen_window/user_prompts.py": [ [ "/webdriver/tests/fullscreen_window/user_prompts.py", @@ -436661,6 +437458,14 @@ {} ] ], + "webdriver/tests/maximize_window/stress.py": [ + [ + "/webdriver/tests/maximize_window/stress.py", + { + "timeout": "long" + } + ] + ], "webdriver/tests/maximize_window/user_prompts.py": [ [ "/webdriver/tests/maximize_window/user_prompts.py", @@ -436677,6 +437482,14 @@ } ] ], + "webdriver/tests/minimize_window/stress.py": [ + [ + "/webdriver/tests/minimize_window/stress.py", + { + "timeout": "long" + } + ] + ], "webdriver/tests/minimize_window/user_prompts.py": [ [ "/webdriver/tests/minimize_window/user_prompts.py", @@ -447493,7 +448306,7 @@ "testharness" ], "bluetooth/resources/bluetooth-helpers.js": [ - "725e56d3f340ea429ee0dd199151bcc85e9f048e", + "9b23d650baf2a77c105f61df2d8f197812aefce0", "support" ], "bluetooth/resources/health-thermometer-iframe.html": [ @@ -471901,7 +472714,7 @@ "support" ], "cors/access-control-expose-headers-parsing.window.js": [ - "58e7395cf83f7328fc54bbad78636c70cece25e8", + "a139ff6f1e71d3839c167f5ee8fa77d026fd2ca5", "testharness" ], "cors/basic.htm": [ @@ -471912,6 +472725,10 @@ "ee6c7ea7e86f032e3da96e99747c743a16ba44e2", "testharness" ], + "cors/cors-safelisted-request-header.any.js": [ + "d7bb5e70b8e739dbdd57b0bf61d50dd62d4d3765", + "testharness" + ], "cors/credentials-flag.htm": [ "45a714368560936439889855c36453463295ae51", "testharness" @@ -471968,12 +472785,8 @@ "2fc83b9aea3879320a76d7df44eca8f16f050bb2", "support" ], - "cors/resources/access-control-expose-headers-parsing-2.asis": [ - "9628a67ff14501f4a76252ad7263395a5b052f7e", - "support" - ], - "cors/resources/access-control-expose-headers-parsing.asis": [ - "7a4b2a12b603bd837e4ebd661f73a021a8a4f7b9", + "cors/resources/access-control-expose-headers.json": [ + "e8915f7ffe1533eb9b00292552ea216cc818c0ca", "support" ], "cors/resources/cache-304.py": [ @@ -471996,6 +472809,10 @@ "eab35eedfc9afbbf3896c31c473fb56468e2eaa8", "support" ], + "cors/resources/expose-headers.py": [ + "c350b3b87be64ee40e4d9bd033caae7f3f29953d", + "support" + ], "cors/resources/image-tainting-checker.sub.html": [ "59de9e7a23ce6ef949d03db610609c61ce4d98c1", "support" @@ -532348,6 +533165,10 @@ "6328af2ba20745f2926dc7e6778b61fef7255a46", "reftest" ], + "css/css-backgrounds/background-size-one-value-1x1-image.html": [ + "5caf2d49566331c496a71c6c6e00342a5522ea6f", + "reftest" + ], "css/css-backgrounds/background-size-with-negative-value.html": [ "a9d57f86d604a9b01e9ace6d7fce0f8a34cdbc5d", "reftest" @@ -534620,6 +535441,10 @@ "ea0dd78ba0e46ee2044128db8d44002ddac77ec7", "support" ], + "css/css-backgrounds/reference/background-size-one-value-1x1-image-ref.html": [ + "0a0404a9b5c29cd8d84615485064bd8dda4fdd51", + "support" + ], "css/css-backgrounds/reference/background-size-ref.html": [ "eabf1f8d6503537462853721180284e4ca4688ca", "support" @@ -539320,46 +540145,6 @@ "af56147f52291a8b4515c67f843505703875c594", "support" ], - "css/css-filter/META.yml": [ - "8d0683319b0fbbd1262cbdd12cdbcb727b2aa9a0", - "support" - ], - "css/css-filter/blur-clip-stacking-context-001.html": [ - "a96994a8afe126e474f9ee015338749f0015dc1f", - "reftest" - ], - "css/css-filter/blur-clip-stacking-context-002.html": [ - "0473f12949446da04849386ffea69e7436703010", - "reftest" - ], - "css/css-filter/blur-clip-stacking-context-ref.html": [ - "82b907334fd71791cd2f6530e2e85169e29afa41", - "support" - ], - "css/css-filter/filtered-block-is-container-ref.html": [ - "fc9467f8717dfc722dcb6dbbbb31bfd8c2baee3b", - "support" - ], - "css/css-filter/filtered-block-is-container.html": [ - "6f99f364e638028098ae10319290e8bf2a9a9457", - "reftest" - ], - "css/css-filter/filtered-html-is-not-container-ref.html": [ - "c1f179a676a5072e83cd6e376d98653880563e9e", - "support" - ], - "css/css-filter/filtered-html-is-not-container.html": [ - "8adc302f31cf747ae3ab55c271bbd43acc1d1552", - "reftest" - ], - "css/css-filter/filtered-inline-is-container-ref.html": [ - "aa6c12e33b5bc3779c9a49ee3c9edd69ffe2ed8f", - "support" - ], - "css/css-filter/filtered-inline-is-container.html": [ - "56f1d91ff9009ceebafc69f39f70cd7bc9200dbf", - "reftest" - ], "css/css-flexbox/Flexible-order.html": [ "9b61e1e8a8fd4cc41e461b10b86051ed0e536ef5", "reftest" @@ -540048,6 +540833,14 @@ "127100ac0ad9dc5c14e170a346dce38d114a0c99", "visual" ], + "css/css-flexbox/flex-wrap-002.html": [ + "d2e07afb45f88611f149a4acfa38928a50571e02", + "reftest" + ], + "css/css-flexbox/flex-wrap-003.html": [ + "a76e4449fb2e56a779c45c3a1c1c20ec31a093cf", + "reftest" + ], "css/css-flexbox/flex-wrap_nowrap.html": [ "ef53bb2decb00a9ee881ddcc96d350428b036595", "visual" @@ -552212,6 +553005,30 @@ "140d7bf115115043a844ac83852efc842340d42c", "testharness" ], + "css/css-grid/grid-model/grid-container-scrollbar-001-ref.html": [ + "31a9ef3db8e08d76b218a4f2bf1ea5cde5d889b3", + "support" + ], + "css/css-grid/grid-model/grid-container-scrollbar-001.html": [ + "1b3c6eef691d9959b4bc899b3d88c9c7e3f57e28", + "reftest" + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001-ref.html": [ + "512fb8a81d57788eb06e004982de9c897df3dd0f", + "support" + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html": [ + "ecdc7b768406922628b1bcf2e17b6ba7ee6b162b", + "reftest" + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001-ref.html": [ + "d8eeedfa07d572d5150e2e480b572769273fc1f3", + "support" + ], + "css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001.html": [ + "f2ab39ff505401436e23947feea4bffbff12629c", + "reftest" + ], "css/css-grid/grid-model/grid-display-grid-001.html": [ "732d67c8ec1a55adc09af9bf7a3cae59d03152aa", "reftest" @@ -552441,7 +553258,7 @@ "testharness" ], "css/css-grid/parsing/grid-template-areas-valid.html": [ - "8d8f6823267eea15e987ea89e992f1ed0b2f7726", + "9c9bd47ec894ccc0e389287120082fb4bf5c9905", "testharness" ], "css/css-grid/placement/grid-layout-grid-span.html": [ @@ -555112,6 +555929,10 @@ "8a91cd1f6b7bbf859bd5210a6a410a64dd7b30b9", "reftest" ], + "css/css-multicol/multicol-margin-003.html": [ + "b509d2eed75aaf0ada80611375ff6c82f5b85709", + "reftest" + ], "css/css-multicol/multicol-margin-child-001-ref.xht": [ "db9a49db40c3c7edce1bfc61a15d7df5caf21b18", "support" @@ -555452,6 +556273,102 @@ "83debd12d20b9f78d5beaf338ae7f068ed6bf693", "support" ], + "css/css-multicol/multicol-span-all-dynamic-add-001-ref.html": [ + "9f76ea15a0daa7753e76ad9b9a99948988c702d3", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-add-001.html": [ + "82b240cb91f934688c961ff55b13923d5b9b4946", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-add-002-ref.html": [ + "94f3028a473a9b59dcd96fb22ff688807c91049b", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-add-002.html": [ + "67eeff63ebf2882cdc18273b8247b21f97c895b5", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-add-003-ref.html": [ + "da623535087b3bb91e9555320b4ac55d07269e82", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-add-003.html": [ + "a9dd225aca1ff12dd4f5099c4530134a447dbbad", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-add-004-ref.html": [ + "1afda92071fc819561e413dd5a67e8badb7cfc6a", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-add-004.html": [ + "646fb332451020da46b12b073d6b9243124fb548", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-add-005.html": [ + "87d7f1b7fda867542ace30ad766faf549355c02d", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-add-006.html": [ + "9b5c1dced06508f8329ec5471ca4a8573ea7b557", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-add-007-ref.html": [ + "7f68a45a2c4af495261b610457e1ff7385665cd8", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-add-007.html": [ + "cdaaf430f55b09915ea2ca9fdbb42a00bfb49a0d", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-add-008-ref.html": [ + "c2df383b9394999fc1d3d7cdfd690791a3ef2d3e", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-add-008.html": [ + "14aeac8bca2b40634ce6a7e469b9e48e82479b24", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html": [ + "83c9fd4880f246e77a5f93dcc2755f4f2d812801", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-001.html": [ + "50a59d1225b65ee346619e837954458c322c87cd", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-002-ref.html": [ + "5bccbd7637850befb4e2e2a865ee85d3090a3cff", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-002.html": [ + "a6e297726982e75744fae6e7995d5c22235b7da6", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-003.html": [ + "fa6f167bd93c065ece33222a70cd2a98eb02a9e8", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-004-ref.html": [ + "d6e44f35f8406a3a940d98eb9bdc3a983b236cc6", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-004.html": [ + "99ea3d744d63226c05d7d789c80e5b878a8e89d9", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-005-ref.html": [ + "f0c6149b5c28732e4edd733ee2abb20d5a45d864", + "support" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-005.html": [ + "c0d868885cae8aa90717ef8fb2da8540eb3ad914", + "reftest" + ], + "css/css-multicol/multicol-span-all-dynamic-remove-006.html": [ + "bbcce11c40fb0ef58b686cd4879103bcdfabc479", + "reftest" + ], "css/css-multicol/multicol-span-all-margin-001-ref.xht": [ "6605ad8efb3ea3b3e5e6396dbbf31eb572613fef", "support" @@ -555496,6 +556413,38 @@ "c2977be7c7142b6d2b30f28a9cc4ddf2bff64f2e", "support" ], + "css/css-multicol/multicol-span-all-restyle-001-ref.html": [ + "41bf8631e04b3e9786ac8c0406847f4e5e923b93", + "support" + ], + "css/css-multicol/multicol-span-all-restyle-001.html": [ + "8d942c13b5c97ae665a6c0e79c454bd9a00858f6", + "reftest" + ], + "css/css-multicol/multicol-span-all-restyle-002-ref.html": [ + "92d469ab78b9183919cb4610b05a788d74ad6b47", + "support" + ], + "css/css-multicol/multicol-span-all-restyle-002.html": [ + "e8ad19e8bc11bee768bda13a5382799f0b950819", + "reftest" + ], + "css/css-multicol/multicol-span-all-restyle-003-ref.html": [ + "1396f66dcb79e1a14a7d8dc8c5f4e0de40bbcbde", + "support" + ], + "css/css-multicol/multicol-span-all-restyle-003.html": [ + "7190f8f87943f9a55c9538b05cf7df1bd20d862f", + "reftest" + ], + "css/css-multicol/multicol-span-all-restyle-004-ref.html": [ + "cd562cc1e1bf2120e973d1c53d4f8874f3c794e1", + "support" + ], + "css/css-multicol/multicol-span-all-restyle-004.html": [ + "41ac007f00009d60c43b034bce68ded4cf23a007", + "reftest" + ], "css/css-multicol/multicol-span-float-001-ref.xht": [ "50addc37797b085d7c59e7389f99fca1c54c50c1", "support" @@ -557137,7 +558086,7 @@ "testharness" ], "css/css-properties-values-api/var-reference-registered-properties-cycles.html": [ - "58d6c846ae3a4a1c62f239786dfe8827eb921d05", + "65d11697355c17fca39b4e9fa0dcf0db404e22eb", "testharness" ], "css/css-properties-values-api/var-reference-registered-properties.html": [ @@ -559844,6 +560793,10 @@ "b380cb400f2c291832fdfeeab72e9b5561b3c847", "testharness" ], + "css/css-scroll-snap/nested-scrollIntoView-snaps.html": [ + "b335de2c7f40dbcf07416c0a1283e20039ebb058", + "testharness" + ], "css/css-scroll-snap/overflowing-snap-areas.html": [ "6d3c1865fe7b1e05ea7897db4118abeabb73d02f", "testharness" @@ -564817,15 +565770,15 @@ "reftest" ], "css/css-text/overflow-wrap/overflow-wrap-min-content-size-001.html": [ - "e4a7ef4a3852d328e8410b81ef20c4d3de0d771e", + "608d4853a2425d9b4157bbe331fd78763985cecd", "reftest" ], "css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html": [ - "5b3b1f19d7ae6374224da75567b3ba5279d16127", + "52f34023b820b31f7bc5d1bde75d05210a97f6a3", "reftest" ], "css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html": [ - "d1af28ffad4161c1dba7567cacb3b06098b155fa", + "43dc1767856fde826a275b8dbf61d47f58fa8f27", "reftest" ], "css/css-text/overflow-wrap/reference/overflow-wrap-break-word-001-ref.html": [ @@ -566461,7 +567414,7 @@ "reftest" ], "css/css-text/white-space/pre-wrap-002.html": [ - "c0db9e671104d7dbe4ff404bfe150c0724686924", + "e42bd32f938eccca581eac5f3888131fe228f7e1", "reftest" ], "css/css-text/white-space/pre-wrap-003.html": [ @@ -566520,6 +567473,14 @@ "8a8b5132db197bb9a76b1b44e461405f4cd9d1bc", "support" ], + "css/css-text/white-space/reference/tab-stop-threshold-001-ref.html": [ + "5694dd2f526176b1a662f5e06c2b1d97cff425df", + "support" + ], + "css/css-text/white-space/reference/tab-stop-threshold-002-ref.html": [ + "35c568bbcac27aab56cf283a366969a9799b921b", + "support" + ], "css/css-text/white-space/reference/textarea-pre-wrap-001-ref.html": [ "d09873a64634fb1b1cb00cc0bb6f9bea07874651", "support" @@ -566628,6 +567589,14 @@ "52b7ce1f6ab15ac1833067cdf957b1e4c6b4af21", "testharness" ], + "css/css-text/white-space/tab-stop-threshold-001.html": [ + "dae6012bf7f42bfa4154f2c88c439db6959e80cb", + "reftest" + ], + "css/css-text/white-space/tab-stop-threshold-002.html": [ + "1147e4b04111a99b095bcb8755b6b4677111a5f9", + "reftest" + ], "css/css-text/white-space/textarea-break-spaces-001.html": [ "b109f45913ca9db04157ade71d90803fa56826b5", "reftest" @@ -568201,7 +569170,7 @@ "testharness" ], "css/css-transforms/parsing/rotate-parsing-valid.html": [ - "c82f6be8c5d75e4c323c0f2701cfa9d0a0540b4b", + "63243b5e9856f0223cefc02ec41f53666b95b918", "testharness" ], "css/css-transforms/parsing/scale-parsing-invalid.html": [ @@ -568241,7 +569210,7 @@ "testharness" ], "css/css-transforms/parsing/translate-parsing-valid.html": [ - "fe16d545e1f92f0086aa5bba0dd221c591696255", + "e000f6a7f577a1578c4796ee903cd1bab38bdb80", "testharness" ], "css/css-transforms/patternTransform/reference/svg-patternTransform-combination-ref.html": [ @@ -571593,7 +572562,7 @@ "reftest" ], "css/css-transforms/transforms-support-calc.html": [ - "71a046f56b0107fbe40f73477f5c1e1b67331d84", + "1ad1bcc4b68c5419e2fa0651dad1a3386223e36b", "testharness" ], "css/css-transforms/translate-getComputedStyle.html": [ @@ -585532,6 +586501,62 @@ "930b762b01a1a75e5b5ab4fb18dedd5939618fe1", "support" ], + "css/filter-effects/backdrop-filter-basic-background-color-ref.html": [ + "44dd8d44d64c1d89d09a2a35b76c86acfff87d51", + "support" + ], + "css/filter-effects/backdrop-filter-basic-background-color.html": [ + "c8d1a3ede5d58bc3179c2d66183957540778c5d2", + "reftest" + ], + "css/filter-effects/backdrop-filter-basic-opacity-ref.html": [ + "26d7715e15f3a8af09d697982df020b367e556e3", + "support" + ], + "css/filter-effects/backdrop-filter-basic-opacity.html": [ + "23e40a7ccdd7b78fbc7847797d4c40cad8c3ad5d", + "reftest" + ], + "css/filter-effects/backdrop-filter-basic-ref.html": [ + "049e7c888dcb08ba131ecf437e1fa100b9fad917", + "support" + ], + "css/filter-effects/backdrop-filter-basic.html": [ + "8f24c9b44a484a19d0169c632665c2facece6a64", + "reftest" + ], + "css/filter-effects/backdrop-filter-border-radius-ref.html": [ + "eabcd996697024260a5936f8f81a77f9d1decb48", + "support" + ], + "css/filter-effects/backdrop-filter-border-radius.html": [ + "d6d1f4b813011cc7a4a814c9f4382425087eaf00", + "reftest" + ], + "css/filter-effects/backdrop-filter-isolation-isolate.html": [ + "dba157c87c76b74ec75015be92ce0eea2348219f", + "reftest" + ], + "css/filter-effects/backdrop-filter-isolation-ref.html": [ + "58f5a7ec1edc11d59c2ef789bf078bace7dceb71", + "support" + ], + "css/filter-effects/backdrop-filter-isolation.html": [ + "dc7bd107c32a6032d9dd751d2e2d580abd520fc2", + "reftest" + ], + "css/filter-effects/blur-clip-stacking-context-001.html": [ + "a96994a8afe126e474f9ee015338749f0015dc1f", + "reftest" + ], + "css/filter-effects/blur-clip-stacking-context-002.html": [ + "0473f12949446da04849386ffea69e7436703010", + "reftest" + ], + "css/filter-effects/blur-clip-stacking-context-ref.html": [ + "82b907334fd71791cd2f6530e2e85169e29afa41", + "support" + ], "css/filter-effects/css-filters-animation-blur-ref.html": [ "3bde6f1826f7620fc0754fff46ed5ef382de3d4d", "support" @@ -585553,7 +586578,7 @@ "support" ], "css/filter-effects/css-filters-animation-combined-001.html": [ - "5b37d57f49e82e504973a5451c51d410aa7bab12", + "874f6e4a5070dffd0bd01aecf3c10e9f321b4097", "reftest" ], "css/filter-effects/css-filters-animation-contrast-ref.html": [ @@ -585565,11 +586590,11 @@ "reftest" ], "css/filter-effects/css-filters-animation-drop-shadow-ref.html": [ - "e1802341f74b2e8f1aca054b01a5a5bd61fe8f77", + "d6be73bcbdc0dd1db9084091ab161a3fda0db877", "support" ], "css/filter-effects/css-filters-animation-drop-shadow.html": [ - "e27bf4339077a5ffd4efa7ce56c19e61f7667985", + "9496bdb234d058ce8f1d530d6e32d1ad3e043c9c", "reftest" ], "css/filter-effects/css-filters-animation-grayscale-ref.html": [ @@ -585585,7 +586610,7 @@ "support" ], "css/filter-effects/css-filters-animation-hue-rotate.html": [ - "7c55b5011df9a3e04291da2acc23d8a1b51a5a69", + "1ebf2778bf8601717c6a2fbfd6ec7f5e9749a769", "reftest" ], "css/filter-effects/css-filters-animation-invert-ref.html": [ @@ -585609,7 +586634,7 @@ "support" ], "css/filter-effects/css-filters-animation-saturate.html": [ - "ed5207f457e9230c35a551a64318a52e72e3a35d", + "63de30aa89121f72bc9fe36a36b739d455d3abdb", "reftest" ], "css/filter-effects/css-filters-animation-sepia-ref.html": [ @@ -585621,11 +586646,11 @@ "reftest" ], "css/filter-effects/fecolormatrix-type-ref.html": [ - "bba0c091a29d94615609d11eb23ce28bf8d57b87", + "182b4b547c0d8f45c0b55a290d7d5b83e297364c", "support" ], "css/filter-effects/fecolormatrix-type.html": [ - "8caaede02f27a120278d9d1512084e6fd57ab27f", + "5d003f7f9c5175edfa869567d2fe69b95160644d", "reftest" ], "css/filter-effects/filter-cb-abspos-inline-001-ref.html": [ @@ -585669,27 +586694,23 @@ "support" ], "css/filter-effects/filter-contrast-003.html": [ - "8b324c770d51fe82946599958077be573662fe4f", + "255c4a0289508de1723614d1b375b7ebcdfc56bf", "reftest" ], "css/filter-effects/filter-external-001-ref.html": [ - "915cccd07f421857d6962d6632ad76e09b7b9fd1", + "794674da48456eeaee84710ddff8c2197de7cf9e", "support" ], "css/filter-effects/filter-external-001-test.html": [ - "c84c0524fc4c8ba84f144ee40138d9cabcf12327", + "ecef5571750142a20e03c3c3d97137f90290becb", "reftest" ], - "css/filter-effects/filter-external-002-filter.svg": [ - "638f5331f02a396d9c73d73b99ff8a4918242780", - "support" - ], "css/filter-effects/filter-external-002-test.html": [ - "65475b4021904359b19e9f1e6bb223657b960b8f", + "cb2d6554a08eb6dd1a175da2e0e71a093690505f", "reftest" ], "css/filter-effects/filter-grayscale-001.html": [ - "7027ee06fd9143ba4e0578e14ceb5a29894df745", + "c6fc1be727c3964368120a878166dbaaa41df0ed", "reftest" ], "css/filter-effects/filter-grayscale-002.html": [ @@ -585701,15 +586722,15 @@ "reftest" ], "css/filter-effects/filter-grayscale-004.html": [ - "b63d9c211c17b0ccc76612cd051028bc78575cc2", + "8b7d11a42ae75d5bf08d3adb25d72632da24bb20", "reftest" ], "css/filter-effects/filter-grayscale-005.html": [ - "110ce4d554c6f0fb9e11bac8c185a9b8199c94f9", + "0aa4a3b6bdc0c8e0e3a907789d22ad2bad81a215", "reftest" ], "css/filter-effects/filter-grayscale-ref.html": [ - "72700c2fe96a40d208402ddc5da96855de841358", + "beaa72aaa3c3e9a6fdbf95ef3f50c7c515a77b44", "support" ], "css/filter-effects/filter-hue_rotate-001-ref.html": [ @@ -585760,6 +586781,30 @@ "d00c1ce8c4c606c088efc9322301f71a8d1ce0d5", "reftest" ], + "css/filter-effects/filtered-block-is-container-ref.html": [ + "fc9467f8717dfc722dcb6dbbbb31bfd8c2baee3b", + "support" + ], + "css/filter-effects/filtered-block-is-container.html": [ + "6f99f364e638028098ae10319290e8bf2a9a9457", + "reftest" + ], + "css/filter-effects/filtered-html-is-not-container-ref.html": [ + "c1f179a676a5072e83cd6e376d98653880563e9e", + "support" + ], + "css/filter-effects/filtered-html-is-not-container.html": [ + "8adc302f31cf747ae3ab55c271bbd43acc1d1552", + "reftest" + ], + "css/filter-effects/filtered-inline-is-container-ref.html": [ + "aa6c12e33b5bc3779c9a49ee3c9edd69ffe2ed8f", + "support" + ], + "css/filter-effects/filtered-inline-is-container.html": [ + "56f1d91ff9009ceebafc69f39f70cd7bc9200dbf", + "reftest" + ], "css/filter-effects/filters-drop-shadow-ref.html": [ "3776a006095dd3ec5b9ea826e3260c91469711b6", "support" @@ -585813,7 +586858,7 @@ "reftest" ], "css/filter-effects/filters-test-brightness-003.html": [ - "9ecef28aa54d133dfaea55551dbed91305cf9d0e", + "69a7d54a7f82d96a419002e2e90c959af29e8b9a", "reftest" ], "css/filter-effects/inheritance.html": [ @@ -585940,6 +586985,10 @@ "85dd7324815b8f8ef1a1d0496224c1a0661db9d8", "support" ], + "css/filter-effects/support/filter-external-002-filter.svg": [ + "0d5fc65c6fdfe2b4f507326fb379e468dbe85d46", + "support" + ], "css/filter-effects/support/import-green.css": [ "537104e663364492c6ef388e4afce190e9c5bc58", "support" @@ -598269,7 +599318,7 @@ "support" ], "docs/_writing-tests/testharness-api.md": [ - "e7e53e4c3b629d1e5a48fb5830c71107a591f789", + "5d23e253946d17e1f497d1e7487605292a079db3", "support" ], "docs/_writing-tests/testharness.md": [ @@ -601745,35 +602794,35 @@ "support" ], "encoding/resources/utf-32-big-endian-bom.html": [ - "79679cac759429625fde26de63a959d9f4bcb782", + "db551fa89470cd864c5b671bb648d96e173c175a", "support" ], "encoding/resources/utf-32-big-endian-bom.xml": [ - "399c35af827db47ca43d09d552b973ef31208a08", + "c97662aa163f0bb609ed7bb468e3d6086f94911f", "support" ], "encoding/resources/utf-32-big-endian-nobom.html": [ - "fa2d3fe4a7d0bb1c664225b88fedd1c582a20b4e", + "fe32ab0408c4c6cc072e74b0c30a202326e8e59d", "support" ], "encoding/resources/utf-32-big-endian-nobom.xml": [ - "a237e853a08218858c343050c5a2ab6390218c77", + "f704501ccae0d6945406666ebd1e1c13eb747458", "support" ], "encoding/resources/utf-32-little-endian-bom.html": [ - "5648fca2835289424b07dcd7b9e7ee83e5eca8b9", + "432b96f26a0d6700cbab27b2657342c7b2e2600d", "support" ], "encoding/resources/utf-32-little-endian-bom.xml": [ - "8f5e8cba40093c5171366d217b72806fb488ca54", + "f896b511c7119a4e8f030bbb7db77cfd198dc3d1", "support" ], "encoding/resources/utf-32-little-endian-nobom.html": [ - "eda12372134a86d2954b39c882b2d3135e5360de", + "2de355aab17a4f7fdcc435bb8079d0824020bdc9", "support" ], "encoding/resources/utf-32-little-endian-nobom.xml": [ - "a9a7bf96e6efa908325bcbcc13595d13d1b5c907", + "465f44df5f782aea8c4e1a4b0cec04acd1d8c72e", "support" ], "encoding/single-byte-decoder.html": [ @@ -601884,8 +602933,12 @@ "461188ea2b4f7c74524970d906f945bb1aa64128", "testharness" ], + "encoding/utf-32-from-win1252.html": [ + "7b4a3d0c956bd519f09a68d322f22969eafa3cda", + "testharness" + ], "encoding/utf-32.html": [ - "7b173055d35ced56acf7910e70b8e512046144b9", + "ec72eb6fbf64706791ceaf51ed11347c31335d11", "testharness" ], "encrypted-media/META.yml": [ @@ -602617,7 +603670,7 @@ "manual" ], "entries-api/file-webkitRelativePath-manual.html": [ - "e36b821c9d30bf7703b12da542e642d48f8bfe30", + "695ccc47c37d52e0fa279f3e32f93ca71efb239f", "manual" ], "entries-api/filesystem-manual.html": [ @@ -604897,7 +605950,7 @@ "support" ], "fetch/sec-metadata/resources/record-header.py": [ - "4c30d1e52ac8bfb24c890f790df154ea17947043", + "b81e93ec3c09a4bbfae7190e39508b31b68edfd7", "support" ], "fetch/sec-metadata/resources/sharedWorker.js": [ @@ -608164,6 +609217,10 @@ "d3af35c6d7ac50de4fd8942066875d52229634f2", "testharness" ], + "html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html": [ + "e50e5e1657f11cc8484d864080e2c8e2b2a1922a", + "testharness" + ], "html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html": [ "a55d85dfdf293adc0b7160ed1bce213967d9822e", "testharness" @@ -609137,7 +610194,7 @@ "support" ], "html/dom/elements-obsolete.js": [ - "e37e34280f69aec0e37d6b9f277f36d53d7ff330", + "7f673cb7f0ee9bbeae746448163bbc11e31a1220", "support" ], "html/dom/elements-sections.js": [ @@ -615312,6 +616369,10 @@ "2d636c9417738423141203001302eb344151e295", "reftest" ], + "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-no-alt-replaced.html": [ + "896c7363113ca8872208059bbac51f7616b05f3f", + "testharness" + ], "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img_border-ref.xhtml": [ "0050c542cde7b176d0332af8da4687592b9fe3c3", "support" @@ -619753,7 +620814,7 @@ "testharness" ], "html/semantics/forms/the-input-element/type-change-state.html": [ - "de068f17a735c09d9ed2727bbab45b102f3ad23e", + "dc5dcbfdece11d08cfadabf14bc34e64bb5c012d", "testharness" ], "html/semantics/forms/the-input-element/url.html": [ @@ -621313,7 +622374,7 @@ "testharness" ], "html/semantics/scripting-1/the-script-element/module/credentials.sub.html": [ - "cf23e67ae40c59c7707e90bba642fc4f18ff99ae", + "983961ae44c596e937280b95197fc96c1cabc6f9", "testharness" ], "html/semantics/scripting-1/the-script-element/module/crossorigin-common.js": [ @@ -625213,7 +626274,7 @@ "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini": [ - "6644d52d1ff5f9faa1101c539afd35e6e94be182", + "8edb44d4148739d5fccfe61460f298e642285d7c", "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini": [ @@ -625221,7 +626282,7 @@ "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini": [ - "bfb5c0ae4bd5350c6a540fa48a5d2896d5be9503", + "8c60a97ad955a8f02e45657d36b2ffa4f6a476a0", "support" ], "infrastructure/metadata/infrastructure/testdriver/actions/multiDevice.html.ini": [ @@ -625369,7 +626430,7 @@ "testharness" ], "infrastructure/testdriver/actions/elementPosition.html": [ - "145852e7b51bd0cdc9e7b4ef5ebddcbf1c0235c5", + "ab9fb31ad093b129b2d1c0f4b471d4c6c5000866", "testharness" ], "infrastructure/testdriver/actions/elementTiming.html": [ @@ -625377,7 +626438,7 @@ "testharness" ], "infrastructure/testdriver/actions/eventOrder.html": [ - "c85b861c7fd9b199ce7baa5c9eac49525db4754b", + "bd7fef41e9af2909fa8e375867240a552f13d715", "testharness" ], "infrastructure/testdriver/actions/multiDevice.html": [ @@ -625605,7 +626666,7 @@ "support" ], "interfaces/css-transitions.idl": [ - "20669f4f6415071faec7247bc9b0053b56943d54", + "129f1463ed86523f9dedfaaf1dd0d460178c414c", "support" ], "interfaces/css-typed-om.idl": [ @@ -625869,7 +626930,7 @@ "support" ], "interfaces/selection-api.idl": [ - "b63951790b61f283cf68e206537201dac3952cfb", + "049759b799ef5e648af670398840e461ccf2c9c0", "support" ], "interfaces/server-timing.idl": [ @@ -625981,7 +627042,7 @@ "support" ], "interfaces/webrtc.idl": [ - "7496fff41dcbbeda6759977d56e12c21568b49f5", + "9cfd687c18b7802dd814f9a447dd75bb38c1f694", "support" ], "interfaces/webusb.idl": [ @@ -626305,7 +627366,7 @@ "support" ], "lint.whitelist": [ - "3de5698c229d7c8b7f32207030540283b9efec63", + "99b1d6a2be10de0f35b571431310a05dd7ff99c2", "support" ], "longtask-timing/META.yml": [ @@ -627680,6 +628741,10 @@ "c66251a03f30f2100670d07508fcb449f8609510", "testharness" ], + "mediacapture-streams/MediaDevices-getSupportedConstraints.html": [ + "fff4f349e1ccc01481be36c0ab0ff7c174fea681", + "testharness" + ], "mediacapture-streams/MediaDevices-getUserMedia.https.html": [ "afa3abeb6408261497936607d3e7b556d161488d", "testharness" @@ -627809,15 +628874,15 @@ "support" ], "mimesniff/mime-types/README.md": [ - "89e1bf426be66eea1be33c40f5d1da910bb4ab54", + "3a2681ec74fe698912594e8be311b3b3b0196488", "support" ], "mimesniff/mime-types/charset-parameter.window.js": [ - "c288de8349a252f53f41b4bb58250c2655b3822c", + "ddac81b74d3b41652e28d39c299d4f8ebf0c118c", "testharness" ], "mimesniff/mime-types/parsing.any.js": [ - "beacada1b10f4bfd5c635cc1d367629e48cb56d5", + "640a46b9e98ee145cdfaf44cc458023e1f1ac4bd", "testharness" ], "mimesniff/mime-types/resources/generated-mime-types.json": [ @@ -627829,11 +628894,11 @@ "support" ], "mimesniff/mime-types/resources/mime-charset.py": [ - "433a5bb74b924a0195e117fc0386dcd5e7d14a02", + "a4f90f52c323fc6df7957f956f0727c9f4f54a38", "support" ], "mimesniff/mime-types/resources/mime-types.json": [ - "8918b355bf5a4f287904834a14378be94eb26dca", + "64654b90d5aca0832c645e6e17bd79ee47cd9937", "support" ], "mixed-content/META.yml": [ @@ -630776,6 +631841,10 @@ "5fd6d4fb41231c5ca5f345b890927c5d1b9411ab", "testharness" ], + "network-error-logging/no-report-on-unexpired-cached-response.https.html": [ + "8248aa52ecb1ea7b425bb348f182a4e539dc316e", + "testharness" + ], "network-error-logging/reports-are-not-observable.https.html": [ "35ab4f3c23507617c4f26981339741d9b3c385be", "testharness" @@ -630784,6 +631853,14 @@ "38bdc014501e90f5a99bae1ac0d433191f557afb", "testharness" ], + "network-error-logging/sends-report-on-cache-validation.https.html": [ + "b87053cb7f7519c67f7592cabc68c8359201fb36", + "testharness" + ], + "network-error-logging/sends-report-on-redirect.https.html": [ + "c9ba405f6faa638701af43cde94c270382fffb9d", + "testharness" + ], "network-error-logging/sends-report-on-subdomain-dns-failure.https.html": [ "8913857af8acb01760589b6a7546a110a359f192", "testharness" @@ -630796,6 +631873,18 @@ "68fddaa0c70b8dd0fd22194b351ba1157f836bdc", "testharness" ], + "network-error-logging/support/cached-for-one-minute.png": [ + "2fa1e0ac0663a65deae6602621521cc2844b93de", + "support" + ], + "network-error-logging/support/cached-for-one-minute.png.sub.headers": [ + "63d4c4de0303b75221dc2b6f450d2e7357b2ba1b", + "support" + ], + "network-error-logging/support/cached-with-validation.py": [ + "f98a503a51ed8ccd79da1952a9aaa6c2987ff55e", + "support" + ], "network-error-logging/support/clear-policy-pass.png": [ "2fa1e0ac0663a65deae6602621521cc2844b93de", "support" @@ -630809,7 +631898,7 @@ "support" ], "network-error-logging/support/nel.sub.js": [ - "c6b4783bd94c00579047627b6c2b137478ae1c2e", + "759d0337fa677da751c93146f057b05c53f9fa57", "support" ], "network-error-logging/support/no-policy-pass.png": [ @@ -630824,8 +631913,12 @@ "70796e913ace97d4d1a21ac0b1c19f6fbb6d01fc", "support" ], + "network-error-logging/support/redirect.py": [ + "00813504da6e39fda4e95782e3b16bf4e1cdff99", + "support" + ], "network-error-logging/support/report.py": [ - "7c05b51b9eb011f4d32bd5e774f6a0d3ead2cd9c", + "49af9fe34ccac87f3dffa7c9da9b4486eb140764", "support" ], "network-error-logging/support/subdomains-pass.png": [ @@ -638208,6 +639301,10 @@ "04de95e47ecc6373fd45906b28ba88ad46f4fcc8", "testharness" ], + "picture-in-picture/mediastream.html": [ + "7a2cc958eacdd7e7bd2d074fcc909813fdeeeaa3", + "testharness" + ], "picture-in-picture/picture-in-picture-element.html": [ "2763eca476d716aeb88bf923f32279a3bc55998a", "testharness" @@ -638229,7 +639326,7 @@ "support" ], "picture-in-picture/shadow-dom.html": [ - "17816b93c94b1de504062f934437ecc090213819", + "2bf4374607522dcf6d1840eaab1de23a684f8c8e", "testharness" ], "pointerevents/META.yml": [ @@ -638404,9 +639501,9 @@ "bb6dcc4236b0cc5183855275d85208db6460a5cb", "manual" ], - "pointerevents/pointerevent_pointermove-manual.html": [ - "cf1a1ee4ee852e94cef7010fd2f2351e974d23b9", - "manual" + "pointerevents/pointerevent_pointermove.html": [ + "4b168439a4ee1455e5a5960b48a0c3192e767edf", + "testharness" ], "pointerevents/pointerevent_pointermove_isprimary_same_as_pointerdown-manual.html": [ "b43d59f4f6e822f3d03d25b17015cd50d332ed7b", @@ -638749,7 +639846,7 @@ "support" ], "preload/modulepreload.html": [ - "addd67d46ac76e928bfa766a656921a97a3456c0", + "8950daf1f87403e8799570cb8019a2af03bda0c6", "testharness" ], "preload/onerror-event.html": [ @@ -638788,6 +639885,10 @@ "360e6686bfb65ed33d811d15e1ba7183a736d552", "support" ], + "preload/resources/cross-origin-module.py": [ + "f771c967124f25f694349874fa192918ae2c1d77", + "support" + ], "preload/resources/dummy-preloads-subresource.css": [ "5097166a058a166a3b2aded255744d8c70774282", "support" @@ -647893,7 +648994,7 @@ "support" ], "resources/idlharness.js": [ - "9e6ed236b0a43f32ffaecbbbb2b8fbe7540b83c5", + "926a615e59c9cd6f602c6e700494d1600ac6d0a5", "support" ], "resources/idlharness.js.headers": [ @@ -647997,7 +649098,7 @@ "support" ], "resources/test/tests/functional/idlharness/IdlInterface/test_partial_interface_of.html": [ - "ee42a37355e5b9c93607f517dc0bb2a6876b7357", + "0c752bdc6cd2c50796175a383e862af0d2bd3341", "support" ], "resources/test/tests/functional/idlharness/IdlInterface/test_primary_interface_of.html": [ @@ -648209,7 +649310,7 @@ "support" ], "resources/testdriver-actions.js": [ - "46c68858e4574646ad3efaa5a6dba10127b27a29", + "82cac85347bfa6f65a3757fa8e3c76d113ce06be", "support" ], "resources/testdriver-vendor.js": [ @@ -648221,7 +649322,7 @@ "support" ], "resources/testdriver.js": [ - "e0741e8d61d4d67c99ccbfc860f65e796c44c78a", + "8ffd765072c4e7351e95f221b447a9d8ecde5152", "support" ], "resources/testdriver.js.headers": [ @@ -649081,7 +650182,11 @@ "support" ], "screen-capture/getdisplaymedia.https.html": [ - "36e0f22933a08921b7aea57f29191b477f767e1d", + "2dd01777687bdfc18526857ee286735910bfc5aa", + "testharness" + ], + "screen-capture/historical.https.html": [ + "d510bc42089b8b386b9469c3ce99ba810ae37b63", "testharness" ], "screen-capture/idlharness.window.js": [ @@ -649369,7 +650474,7 @@ "testharness" ], "selection/idlharness.window.js": [ - "b211797777ddbca73d26372a62c27813583a5734", + "543fcb3eff5bb4fd0c51c7e4cc1e5338a0b74cbc", "testharness" ], "selection/isCollapsed.html": [ @@ -651045,7 +652150,7 @@ "testharness" ], "service-workers/service-worker/navigation-redirect.https.html": [ - "6f03fd8f2f0db54f4895d284a2ced78723d9965c", + "e8b8e9afd5820acf9422d11f4410c0158fa31732", "testharness" ], "service-workers/service-worker/navigation-timing.https.html": [ @@ -651280,6 +652385,10 @@ "53f210cf7634993f86310cdefec9a15fd6b699a0", "support" ], + "service-workers/service-worker/resources/classic-worker.js": [ + "36a32b1a1f84daaac25032261c80d173ce7ba899", + "support" + ], "service-workers/service-worker/resources/client-id-worker.js": [ "ec71b3458b7214fc7675f6f75997cc82a47cac82", "support" @@ -651840,6 +652949,10 @@ "cbe70304d89c3835663d6ab9782a44482134af7c", "support" ], + "service-workers/service-worker/resources/module-worker.js": [ + "385fe7101503cb4c7ca77e95e023459b29267741", + "support" + ], "service-workers/service-worker/resources/multipart-image-iframe.html": [ "c59b95594ff505913e856377459eba28b00b8c6d", "support" @@ -652021,7 +653134,7 @@ "support" ], "service-workers/service-worker/resources/redirect-worker.js": [ - "0c5bc3bd9aa5bff83df74ce5e0a8a244f21a85a7", + "ddcc2cf5478942292dc8c5e30d156dc42886365e", "support" ], "service-workers/service-worker/resources/redirect.py": [ @@ -652457,7 +653570,7 @@ "testharness" ], "service-workers/service-worker/update-registration-with-type.https.html": [ - "00c8a3345bb3d837c7f0004ce7436065b655476c", + "b712c30f71e9a81a2832c0cd5afe7f5630e34071", "testharness" ], "service-workers/service-worker/update-result.https.html": [ @@ -654924,6 +656037,66 @@ "000c107b53b70e4548ee320331c2ab33be967a9c", "testharness" ], + "svg/geometry/inheritance.svg": [ + "760328ac31818d86a9410fd7c412d803e30416a2", + "testharness" + ], + "svg/geometry/parsing/cx-invalid.svg": [ + "4b1b90158fcc7c1747f8b1ab382cd78f394f142c", + "testharness" + ], + "svg/geometry/parsing/cx-valid.svg": [ + "e7f627ac721fcc90597314ef0c97765566c343b3", + "testharness" + ], + "svg/geometry/parsing/cy-invalid.svg": [ + "528eed02ceadb26ff53a42c9950bf508170c2c83", + "testharness" + ], + "svg/geometry/parsing/cy-valid.svg": [ + "4372c36ea225328926030830e895f64858e73784", + "testharness" + ], + "svg/geometry/parsing/r-invalid.svg": [ + "a14c52266ce2b7b66847a18327cab0346d083115", + "testharness" + ], + "svg/geometry/parsing/r-valid.svg": [ + "70cd5503b795cef3f5db7eb4db1034d63b3e63fc", + "testharness" + ], + "svg/geometry/parsing/rx-invalid.svg": [ + "9ce0603bea13ceb2cf06c7da8ba0ac2b4ccb04a1", + "testharness" + ], + "svg/geometry/parsing/rx-valid.svg": [ + "e2b628f1de4bd8e2a3fec98fda1aa76b6af79b87", + "testharness" + ], + "svg/geometry/parsing/ry-invalid.svg": [ + "7a25a1ec0e61e4a36e65b7884d9667bb1614adfa", + "testharness" + ], + "svg/geometry/parsing/ry-valid.svg": [ + "4ce5bec4084cf0e6cf1e6744701b756cc18e2f91", + "testharness" + ], + "svg/geometry/parsing/x-invalid.svg": [ + "31ad29524e11dc5fe95c970506691953f0e611d0", + "testharness" + ], + "svg/geometry/parsing/x-valid.svg": [ + "5ff2fbd831d7373faee706538f08528dc4ac8a99", + "testharness" + ], + "svg/geometry/parsing/y-invalid.svg": [ + "d6ea944dbd649d1ec73da75e162f2ac3a3dfa818", + "testharness" + ], + "svg/geometry/parsing/y-valid.svg": [ + "24885ccfc7059dd9e26e57e3839571d2883f73c3", + "testharness" + ], "svg/historical.html": [ "1b73ca8d2236c7afdb9b331c532c84b6083f2968", "testharness" @@ -657316,6 +658489,10 @@ "bff502c22bab402ca2ef2fbd2ced5c06f1de9dcd", "reftest" ], + "svg/painting/inheritance.svg": [ + "4499b9249a84a9d7de4a5a101993ad14f9cc21c9", + "testharness" + ], "svg/painting/reftests/markers-orient-001-ref.svg": [ "871003f3a2303404696d467a7cfaad729b811206", "support" @@ -657780,6 +658957,10 @@ "51303171f09d28e3958ab74ecdce7f9cf120bd12", "testharness" ], + "svg/text/inheritance.svg": [ + "1f4609d7ac6c5384f68d109733be01c7ea915df4", + "testharness" + ], "svg/text/reftests/text-complex-001-ref.svg": [ "5ade69dce1de95954861271c0e523767230ae275", "support" @@ -658165,7 +659346,7 @@ "support" ], "tools/ci/check_stability.py": [ - "fa0cc3ba88a15e9280f04bf9ddee34e0af71db00", + "cbed7a3521d3ba7ea2b5a21dc7daa14bcdff88d7", "support" ], "tools/ci/ci_built_diff.sh": [ @@ -662953,11 +664134,15 @@ "support" ], "tools/wpt/browser.py": [ - "46afdfed64b607d09faa092eea746916f27c9d06", + "16cb075ad2dde0d42fd208ac8371d9d9c0c26d27", "support" ], "tools/wpt/commands.json": [ - "0ea6b25276ff481340b54b4c72340a3790403837", + "161a9defbd1400c69985e031e2edfc4800929359", + "support" + ], + "tools/wpt/create.py": [ + "696609a68ce28c3755620d0255fccbc47481b686", "support" ], "tools/wpt/install.py": [ @@ -662977,7 +664162,7 @@ "support" ], "tools/wpt/run.py": [ - "1894492d267532fdfdefc14a96a4eab97b42635a", + "e10f895294f7d193cfd1dcb26eed0fc9a424887a", "support" ], "tools/wpt/testfiles.py": [ @@ -662993,7 +664178,7 @@ "support" ], "tools/wpt/tests/test_run.py": [ - "94b1202736f5de76b189e3a3b2f30346f6d6727c", + "aaff0fa5331498f898dc36fcf36186cebe989927", "support" ], "tools/wpt/tests/test_wpt.py": [ @@ -663245,7 +664430,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/chrome.py": [ - "d7c21cddfd60a4077b4fe803379ca89f0109dcde", + "061e549685cad2f58b45bbad572325cbdfe87d8c", "support" ], "tools/wptrunner/wptrunner/browsers/chrome_android.py": [ @@ -663473,7 +664658,7 @@ "support" ], "tools/wptrunner/wptrunner/testloader.py": [ - "2313a80c745bfac9946119926411234c506c6654", + "8e563b85a5ab663d092ebc6c4669068d1ef9ce47", "support" ], "tools/wptrunner/wptrunner/testrunner.py": [ @@ -663589,7 +664774,7 @@ "support" ], "tools/wptrunner/wptrunner/wptmanifest/parser.py": [ - "82aad5f61350795eb9e807ca33015762e1a9f581", + "9e0ff029b847a4599f7844bec7d63e4b5834afc0", "support" ], "tools/wptrunner/wptrunner/wptmanifest/serializer.py": [ @@ -663673,7 +664858,7 @@ "support" ], "tools/wptserve/docs/pipes.rst": [ - "8faeee489c9fab71387540f996023e01a46955d7", + "df0746fd0fdeee0e4402e5a21945b198824d7483", "support" ], "tools/wptserve/docs/request.rst": [ @@ -663705,13 +664890,41 @@ "support" ], "tools/wptserve/tests/functional/base.py": [ - "190e385f1020a7a5184fa34ad5bd59a75920a15c", + "b08f5eabe46ccdb27553babbd159b1dc6287efe8", + "support" + ], + "tools/wptserve/tests/functional/docroot/bar.any.worker.js": [ + "66b7be39049eeda1dc5d83d2e00aba4fbf88dee3", "support" ], "tools/wptserve/tests/functional/docroot/document.txt": [ "611dccd84487e6429631bd7ae92268a58efdda6b", "support" ], + "tools/wptserve/tests/functional/docroot/foo.any.html": [ + "88e2665c66904211d0d8417a057df2997af8e802", + "support" + ], + "tools/wptserve/tests/functional/docroot/foo.any.serviceworker.html": [ + "8dcb11a37687ff76d84a3dba51309dc0339e6b18", + "support" + ], + "tools/wptserve/tests/functional/docroot/foo.any.sharedworker.html": [ + "277101697ff8cbe76af107826ad0fa243b75b048", + "support" + ], + "tools/wptserve/tests/functional/docroot/foo.any.worker.html": [ + "f77edd971a4ec0c5dfd48789a889f7d3c3b10a09", + "support" + ], + "tools/wptserve/tests/functional/docroot/foo.window.html": [ + "04c694ddf2aba20ec4bace871a7d3b451d5b255d", + "support" + ], + "tools/wptserve/tests/functional/docroot/foo.worker.html": [ + "3eddf36f1c3a911973b6ae31fa0c6162bcb56ecb", + "support" + ], "tools/wptserve/tests/functional/docroot/invalid.py": [ "017d4d9d697b9e4117c7c03af7b1f8eac2197105", "support" @@ -663821,11 +665034,11 @@ "support" ], "tools/wptserve/tests/functional/test_cookies.py": [ - "6bcb842e62561b5fe0f7c95b3faf5eb8a527672b", + "2e2d0d6771ba26a1fbe7e8fc8bb2e2598bc34223", "support" ], "tools/wptserve/tests/functional/test_handlers.py": [ - "759a096b79957079429ae387186d6e7891651ecf", + "db119616bd673e0b3fb4784fff0d603c7b6a05ab", "support" ], "tools/wptserve/tests/functional/test_input_file.py": [ @@ -663860,12 +665073,16 @@ "8d0f25058d49205155b84d1619f06a3a7d14cf5a", "support" ], + "tools/wptserve/tests/test_stash.py": [ + "4813504a7e1fa3ded7ef60aec5d7f063af09fec7", + "support" + ], "tools/wptserve/wptserve/__init__.py": [ "a286bfe0b3b718d3acb033d019ce955bfc68b210", "support" ], "tools/wptserve/wptserve/config.py": [ - "cb5435fdef4c20c65989f330392b918d171fad1a", + "57368f794d2344f364a44e3a0308e5f16cb8ccf2", "support" ], "tools/wptserve/wptserve/constants.py": [ @@ -663881,7 +665098,7 @@ "support" ], "tools/wptserve/wptserve/pipes.py": [ - "cbae6d6fcb93ada3773fb58e73b43c7da8b267e2", + "bb24cd310068a953bec34ac6d224e42bae3ddb3e", "support" ], "tools/wptserve/wptserve/ranges.py": [ @@ -663889,7 +665106,7 @@ "support" ], "tools/wptserve/wptserve/request.py": [ - "990774cbb9e6a1666dfd3356266ae024ea5f68db", + "b248a054d3b1f3b141d94125da9406463e5a894f", "support" ], "tools/wptserve/wptserve/response.py": [ @@ -663905,11 +665122,11 @@ "support" ], "tools/wptserve/wptserve/server.py": [ - "802ae9ca9a98feddcb68077985cf4be536d72f78", + "848fbb74c7b952a825ecbcda30cc1c4808e441fc", "support" ], "tools/wptserve/wptserve/sslutils/__init__.py": [ - "6699edb5964530e7e352497de43ff1e154b52a1d", + "e89bb96f82fbcc09a0ac792bedae8c64e838d8aa", "support" ], "tools/wptserve/wptserve/sslutils/base.py": [ @@ -663925,7 +665142,7 @@ "support" ], "tools/wptserve/wptserve/stash.py": [ - "ae48a86112333bb5ffcdf76c100d929de2b6fd91", + "d13703c16ebb2a6d7b497733dad1776760be00e0", "support" ], "tools/wptserve/wptserve/utils.py": [ @@ -664009,7 +665226,7 @@ "testharness" ], "trusted-types/HTMLElement-generic.tentative.html": [ - "2d38104511879943a4d538c9dc5b0031d7596b23", + "d1fafa70cd2768e7b98b5eab6da9f5eb77175fbc", "testharness" ], "trusted-types/Location-assign.tentative.html": [ @@ -664101,7 +665318,7 @@ "testharness" ], "trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [ - "2a7edab9db4aec7daa7c4e46769392f25676b07b", + "5fce3ff59e6e998bff8588acf73539147ccd8257", "testharness" ], "trusted-types/block-string-assignment-to-Location-assign.tentative.html": [ @@ -666489,7 +667706,7 @@ "support" ], "web-animations/animation-model/animation-types/property-types.js": [ - "a71783b99e14322639251f5b58ede826696a7c3a", + "519e38ae8aea2a6e5d762af56069ebddbb231838", "support" ], "web-animations/animation-model/animation-types/visibility.html": [ @@ -668205,7 +669422,7 @@ "wdspec" ], "webdriver/tests/element_click/center_point.py": [ - "21bf8f31fd8dd1c961008ab74330956dd11e14f2", + "da60a087277dc96ec456d250072a441fa78aec75", "wdspec" ], "webdriver/tests/element_click/click.py": [ @@ -668225,7 +669442,7 @@ "wdspec" ], "webdriver/tests/element_click/scroll_into_view.py": [ - "dde83a4244cb175c0ec7eafc179aacc053606682", + "5891be572fef6b4df849305d7c2475f1d42b09a5", "wdspec" ], "webdriver/tests/element_click/select.py": [ @@ -668404,6 +669621,10 @@ "3194426e1ae80f59262f8a8910494fb4507068ca", "wdspec" ], + "webdriver/tests/fullscreen_window/stress.py": [ + "b907a31f17e0167ff27a4e8ceb2ad44cd372b537", + "wdspec" + ], "webdriver/tests/fullscreen_window/user_prompts.py": [ "106bc457f0c18769afe1d9f76c39937d17783666", "wdspec" @@ -668628,6 +669849,10 @@ "b3ed7a680a9f320012b548a22a6042ab981bf449", "wdspec" ], + "webdriver/tests/maximize_window/stress.py": [ + "daa8a911928f42fabdde73c3749d96691f039167", + "wdspec" + ], "webdriver/tests/maximize_window/user_prompts.py": [ "032edc893a53a05dd0272cc081265bde6f0b5d53", "wdspec" @@ -668640,6 +669865,10 @@ "279511caf0afca09352fc312bb4f6b92b56af538", "wdspec" ], + "webdriver/tests/minimize_window/stress.py": [ + "8990f12669d70aa9693d798c6d75105c6075c3d6", + "wdspec" + ], "webdriver/tests/minimize_window/user_prompts.py": [ "19059b3c395ecd22690d999f60838257cbe93449", "wdspec" @@ -668861,7 +670090,7 @@ "support" ], "webdriver/tests/set_window_rect/set.py": [ - "c6eae2886e9e0a86f7889ddcd9a3487dca7d6d41", + "4017bc198e41ea618e73c2d71cfcb68312b0c4d0", "wdspec" ], "webdriver/tests/set_window_rect/user_prompts.py": [ @@ -668893,7 +670122,7 @@ "support" ], "webdriver/tests/support/helpers.py": [ - "6c62d756259b6677bd5e77fc6b6a48def4b3b46b", + "c955135f814c580dd93a5272987e3e508d07609b", "support" ], "webdriver/tests/support/http_request.py": [ @@ -668941,7 +670170,7 @@ "wdspec" ], "webdriver/tests/take_element_screenshot/__init__.py": [ - "d289ee3b912001e63cf3a34331098ce7b7258aa6", + "cf3b21905b774d55e7aed660fd232d60a7f99973", "support" ], "webdriver/tests/take_element_screenshot/screenshot.py": [ @@ -668953,7 +670182,7 @@ "wdspec" ], "webdriver/tests/take_screenshot/__init__.py": [ - "d38c8a0f79f81d5977d0a8dfa1a9f63e236988fb", + "13d7a623eda6a909c5fb3508f478ed989ac15907", "support" ], "webdriver/tests/take_screenshot/screenshot.py": [ @@ -669689,7 +670918,7 @@ "testharness" ], "webrtc/RTCPeerConnection-helper.js": [ - "8529fb4ef3cdf509a519608fbb4a5919c44f3e37", + "df277ff6d35585452a3a4c2af8dbde5542971794", "support" ], "webrtc/RTCPeerConnection-iceConnectionState.html": [ @@ -669729,7 +670958,7 @@ "testharness" ], "webrtc/RTCPeerConnection-setLocalDescription-offer.html": [ - "49eb522881a9abb914566b42a5e7aae7063fdb8b", + "41662f3158fe886b848121ffbc9e970160666a01", "testharness" ], "webrtc/RTCPeerConnection-setLocalDescription-pranswer.html": [ @@ -669773,7 +671002,7 @@ "testharness" ], "webrtc/RTCPeerConnection-track-stats.https.html": [ - "682e7e57e465ccde77c3d8887ce80cb5ea01bf54", + "3809530b74cac30b9f66398eaa59a97af0f81736", "testharness" ], "webrtc/RTCPeerConnection-transceivers.https.html": [ @@ -669784,8 +671013,12 @@ "7de7fcaeb10ef209ece63ad346f668e1c634c4db", "testharness" ], + "webrtc/RTCQuicStream-helper.js": [ + "a87668f5a21eebd64f810029330989c5be10f037", + "support" + ], "webrtc/RTCQuicStream.https.html": [ - "68c88e2757c2ab35736d3480dfbc6095580b06d3", + "b147414794ecc208c918834110f5513e5075172d", "testharness" ], "webrtc/RTCQuicTransport-helper.js": [ @@ -669873,7 +671106,7 @@ "testharness" ], "webrtc/RTCRtpTransceiver.https.html": [ - "7d16deaa8c7633928b39e1ed638f26e820e1e8d8", + "1614a11c1a1d6f6de8660117a47753d2c4154726", "testharness" ], "webrtc/RTCSctpTransport-constructor.html": [ @@ -671249,7 +672482,7 @@ "support" ], "webusb/resources/usb-helpers.js": [ - "161a7d270bbad085dc34300b389286dd045123a1", + "0abca1691a3aa320a82672a5f776abbfe19775b1", "support" ], "webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [ @@ -675853,7 +677086,7 @@ "support" ], "worklets/resources/csp-tests.js": [ - "0de1daae22853fb4480b7d21dd1029f312215fd6", + "d2ca05f399829122136f00a720106e3dc1875c47", "support" ], "worklets/resources/empty-worklet-script-with-cors-header.js": [ @@ -675881,7 +677114,11 @@ "support" ], "worklets/resources/import-insecure-origin-empty-worklet-script.sub.js": [ - "cc7f5f348a116af3bb5b6a1dd22e0e4709448e53", + "a04a2edf81212287dac386c9d8f70f7cf18026c5", + "support" + ], + "worklets/resources/import-insecure-origin-redirected-empty-worklet-script.sub.js": [ + "888d876bff9fa6490369932a96a92f5474794e53", "support" ], "worklets/resources/import-nested-internal-worklet-script.js": [ @@ -675905,7 +677142,11 @@ "support" ], "worklets/resources/import-remote-origin-empty-worklet-script.sub.js": [ - "c30889873393c351356706b2957b65c0c0ecbac7", + "06c1f87618cf07ffbfe916820ac9533558cf38af", + "support" + ], + "worklets/resources/import-remote-origin-redirected-empty-worklet-script.sub.js": [ + "7afa3523b9f30d7cee0de68a13c452a9f59c3691", "support" ], "worklets/resources/import-remote-origin-referrer-checker-worklet-script.sub.js": [ @@ -675921,7 +677162,7 @@ "support" ], "worklets/resources/import-tests.js": [ - "5ab841cd4a6c3f42e75d8837bc333f316f66e148", + "f504588cdb065cd0616cbde27a6747beb2e145f2", "support" ], "worklets/resources/referrer-checker.py": [ @@ -675937,7 +677178,7 @@ "support" ], "worklets/resources/service-worker-interception-tests.js": [ - "16d298737772507ee0616ab138adfc227aac3619", + "1298a626e4efbea9862f5be70c16909dc3f24c78", "support" ], "worklets/resources/service-worker.js": [ diff --git a/tests/wpt/metadata/cors/access-control-expose-headers-parsing.window.js.ini b/tests/wpt/metadata/cors/access-control-expose-headers-parsing.window.js.ini index efbfad792a9..3975e0c21ed 100644 --- a/tests/wpt/metadata/cors/access-control-expose-headers-parsing.window.js.ini +++ b/tests/wpt/metadata/cors/access-control-expose-headers-parsing.window.js.ini @@ -5,3 +5,27 @@ [Access-Control-Expose-Headers parsing: #2] expected: FAIL + [Parsing: Access-Control-Expose-Headers%3A%20bb-8%2C%20no%20no] + expected: FAIL + + [Parsing: Access-Control-Expose-Headers%3A%20bb-8%0B] + expected: FAIL + + [Parsing: Access-Control-Expose-Headers%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cbb-8] + expected: FAIL + + [Parsing: Access-Control-Expose-Headers%3A%20bb-8%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!] + expected: FAIL + + [Parsing: Access-Control-Expose-Headers%3A%20%22bb-8%22%2Cbb-8] + expected: FAIL + + [Parsing: Access-Control-Expose-Headers%3A%20bb-8%0B%2Cbb-8] + expected: FAIL + + [Parsing: Access-Control-Expose-Headers%3A%20bb-8%0D%0AAccess-Control-Expose-Headers%3A%20no%20no] + expected: FAIL + + [Parsing: Access-Control-Expose-Headers%3A%20bb-8%0C] + expected: FAIL + diff --git a/tests/wpt/metadata/cors/cors-safelisted-request-header.any.js.ini b/tests/wpt/metadata/cors/cors-safelisted-request-header.any.js.ini new file mode 100644 index 00000000000..654464bc02d --- /dev/null +++ b/tests/wpt/metadata/cors/cors-safelisted-request-header.any.js.ini @@ -0,0 +1,39 @@ +[cors-safelisted-request-header.any.worker.html] + [No preflight for {"content-type":"text/plain;"}] + expected: FAIL + + [Preflight for {"content-type":"text/plain\\f"}] + expected: FAIL + + [Preflight for {"content-type":"application/x-www-form-urlencoded;"}] + expected: FAIL + + [No preflight for {"content-type":"text/plain;garbage"}] + expected: FAIL + + [Preflight for {"content-type":"text/plain;garbage\\u0001\\u0002"}] + expected: FAIL + + [Preflight for {"content-type":"text/plain\\u000b"}] + expected: FAIL + + +[cors-safelisted-request-header.any.html] + [No preflight for {"content-type":"text/plain;"}] + expected: FAIL + + [Preflight for {"content-type":"text/plain\\f"}] + expected: FAIL + + [Preflight for {"content-type":"application/x-www-form-urlencoded;"}] + expected: FAIL + + [No preflight for {"content-type":"text/plain;garbage"}] + expected: FAIL + + [Preflight for {"content-type":"text/plain;garbage\\u0001\\u0002"}] + expected: FAIL + + [Preflight for {"content-type":"text/plain\\u000b"}] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-flexbox/flex-wrap-002.html.ini b/tests/wpt/metadata/css/css-flexbox/flex-wrap-002.html.ini new file mode 100644 index 00000000000..4de5819c0b2 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/flex-wrap-002.html.ini @@ -0,0 +1,2 @@ +[flex-wrap-002.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-text/white-space/tab-stop-threshold-001.html.ini b/tests/wpt/metadata/css/css-text/white-space/tab-stop-threshold-001.html.ini new file mode 100644 index 00000000000..745df31c422 --- /dev/null +++ b/tests/wpt/metadata/css/css-text/white-space/tab-stop-threshold-001.html.ini @@ -0,0 +1,2 @@ +[tab-stop-threshold-001.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-text/white-space/tab-stop-threshold-002.html.ini b/tests/wpt/metadata/css/css-text/white-space/tab-stop-threshold-002.html.ini new file mode 100644 index 00000000000..03ea5114da9 --- /dev/null +++ b/tests/wpt/metadata/css/css-text/white-space/tab-stop-threshold-002.html.ini @@ -0,0 +1,2 @@ +[tab-stop-threshold-002.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/parsing/rotate-parsing-valid.html.ini b/tests/wpt/metadata/css/css-transforms/parsing/rotate-parsing-valid.html.ini index 789ea6f6fcc..bc107c5939d 100644 --- a/tests/wpt/metadata/css/css-transforms/parsing/rotate-parsing-valid.html.ini +++ b/tests/wpt/metadata/css/css-transforms/parsing/rotate-parsing-valid.html.ini @@ -20,3 +20,12 @@ [e.style['rotate'\] = "400grad z" should set the property value] expected: FAIL + [e.style['rotate'\] = "1 0 0 400grad" should set the property value] + expected: FAIL + + [e.style['rotate'\] = "0 1 0 400grad" should set the property value] + expected: FAIL + + [e.style['rotate'\] = "0 0 1 400grad" should set the property value] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini index 8850ec200da..08392616318 100644 --- a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini +++ b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini @@ -71,6 +71,9 @@ [text-indent intermediate] expected: FAIL - [opacity end] + [border-top-width end] + expected: FAIL + + [border-bottom-width end] expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini new file mode 100644 index 00000000000..23f053f4f4a --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini @@ -0,0 +1,4 @@ +[elementsFromPoint-invalid-cases.html] + [The root element is the last element returned for valid queries] + expected: FAIL + diff --git a/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic-background-color.html.ini b/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic-background-color.html.ini new file mode 100644 index 00000000000..7bf80abd498 --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic-background-color.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-basic-background-color.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic-opacity.html.ini b/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic-opacity.html.ini new file mode 100644 index 00000000000..549ec344384 --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic-opacity.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-basic-opacity.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic.html.ini b/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic.html.ini new file mode 100644 index 00000000000..41f934fc9fe --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/backdrop-filter-basic.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-basic.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/backdrop-filter-border-radius.html.ini b/tests/wpt/metadata/css/filter-effects/backdrop-filter-border-radius.html.ini new file mode 100644 index 00000000000..e65378d0e3f --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/backdrop-filter-border-radius.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-border-radius.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/backdrop-filter-isolation-isolate.html.ini b/tests/wpt/metadata/css/filter-effects/backdrop-filter-isolation-isolate.html.ini new file mode 100644 index 00000000000..fba10fccfed --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/backdrop-filter-isolation-isolate.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-isolation-isolate.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/backdrop-filter-isolation.html.ini b/tests/wpt/metadata/css/filter-effects/backdrop-filter-isolation.html.ini new file mode 100644 index 00000000000..ac98c983cc8 --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/backdrop-filter-isolation.html.ini @@ -0,0 +1,2 @@ +[backdrop-filter-isolation.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/filter-contrast-003.html.ini b/tests/wpt/metadata/css/filter-effects/filter-contrast-003.html.ini deleted file mode 100644 index 1aa79453005..00000000000 --- a/tests/wpt/metadata/css/filter-effects/filter-contrast-003.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[filter-contrast-003.html] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/filter-grayscale-002.html.ini b/tests/wpt/metadata/css/filter-effects/filter-grayscale-002.html.ini deleted file mode 100644 index 92dcd8011eb..00000000000 --- a/tests/wpt/metadata/css/filter-effects/filter-grayscale-002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[filter-grayscale-002.html] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/filter-grayscale-003.html.ini b/tests/wpt/metadata/css/filter-effects/filter-grayscale-003.html.ini deleted file mode 100644 index 23655f850b3..00000000000 --- a/tests/wpt/metadata/css/filter-effects/filter-grayscale-003.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[filter-grayscale-003.html] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/filtered-block-is-container.html.ini b/tests/wpt/metadata/css/filter-effects/filtered-block-is-container.html.ini new file mode 100644 index 00000000000..34cbb382e03 --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/filtered-block-is-container.html.ini @@ -0,0 +1,2 @@ +[filtered-block-is-container.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/filtered-html-is-not-container.html.ini b/tests/wpt/metadata/css/filter-effects/filtered-html-is-not-container.html.ini new file mode 100644 index 00000000000..b366310b98b --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/filtered-html-is-not-container.html.ini @@ -0,0 +1,2 @@ +[filtered-html-is-not-container.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/filter-effects/filters-test-brightness-003.html.ini b/tests/wpt/metadata/css/filter-effects/filters-test-brightness-003.html.ini new file mode 100644 index 00000000000..df5382158af --- /dev/null +++ b/tests/wpt/metadata/css/filter-effects/filters-test-brightness-003.html.ini @@ -0,0 +1,2 @@ +[filters-test-brightness-003.html] + expected: FAIL diff --git a/tests/wpt/metadata/encoding/utf-32-from-win1252.html.ini b/tests/wpt/metadata/encoding/utf-32-from-win1252.html.ini new file mode 100644 index 00000000000..e4de65f4aa2 --- /dev/null +++ b/tests/wpt/metadata/encoding/utf-32-from-win1252.html.ini @@ -0,0 +1,16 @@ +[utf-32-from-win1252.html] + [Expect resources/utf-32-little-endian-bom.xml to parse as UTF-16LE] + expected: FAIL + + [Expect resources/utf-32-little-endian-bom.html to parse as UTF-16LE] + expected: FAIL + + [Expect resources/utf-32-big-endian-bom.html to parse as windows-1252] + expected: FAIL + + [Expect resources/utf-32-little-endian-nobom.html to parse as windows-1252] + expected: FAIL + + [Expect resources/utf-32-big-endian-nobom.html to parse as windows-1252] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html.ini b/tests/wpt/metadata/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html.ini new file mode 100644 index 00000000000..310f1af3ccf --- /dev/null +++ b/tests/wpt/metadata/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html.ini @@ -0,0 +1,11 @@ +[document_domain_feature_policy.tentative.sub.html] + expected: TIMEOUT + [Default "document-domain" feature policy ["*"\] allows cross-origin iframes.] + expected: TIMEOUT + + [Default "document-domain" feature policy ["*"\] allows same-origin iframes.] + expected: TIMEOUT + + [Feature policy "document-domain" can be disabled in cross-origin iframes using "allow" attribute.] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_timeupdate_noautoplay.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_timeupdate_noautoplay.html.ini index 22d1f1d6900..a6f7ac6f249 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_timeupdate_noautoplay.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_timeupdate_noautoplay.html.ini @@ -5,5 +5,5 @@ expected: NOTRUN [calling play() on a sufficiently long video should trigger timeupdate event] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini index 5125b59a955..e879de13c09 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html.ini @@ -5,14 +5,29 @@ expected: TIMEOUT [picture: source (max-width:500px) valid image, img valid image, resize to wide] - expected: TIMEOUT + expected: FAIL [picture: source (max-width:500px) valid image, img broken image, resize to narrow] expected: TIMEOUT [picture: source (max-width:500px) valid image, img valid image, resize to narrow] - expected: TIMEOUT + expected: FAIL [picture: same URL in source (max-width:500px) and img, resize to narrow] expected: FAIL + [picture: source (max-width:500px) broken image, img valid image, resize to narrow] + expected: FAIL + + [img (srcset 1 cand) valid image, resize to wide] + expected: FAIL + + [picture: same URL in source (max-width:500px) and img, resize to wide] + expected: FAIL + + [img (srcset 1 cand) valid image, resize to narrow] + expected: FAIL + + [picture: source (max-width:500px) valid image, img broken image, resize to wide] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode.html.ini index 72a023d1ce4..caa0aa5f39e 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode.html.ini @@ -1,5 +1,4 @@ [parse-a-sizes-attribute-standards-mode.html] - expected: TIMEOUT [<img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (standards mode)] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/type-change-state.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/type-change-state.html.ini index b4e046a284f..46cbb336bee 100644 --- a/tests/wpt/metadata/html/semantics/forms/the-input-element/type-change-state.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/type-change-state.html.ini @@ -36,45 +36,12 @@ [change state from tel to range] expected: FAIL - [change state from url to text] - expected: FAIL - - [change state from url to search] - expected: FAIL - - [change state from url to tel] - expected: FAIL - - [change state from url to password] - expected: FAIL - [change state from url to datetime] expected: FAIL [change state from url to range] expected: FAIL - [change state from email to hidden] - expected: FAIL - - [change state from email to checkbox] - expected: FAIL - - [change state from email to radio] - expected: FAIL - - [change state from email to submit] - expected: FAIL - - [change state from email to image] - expected: FAIL - - [change state from email to reset] - expected: FAIL - - [change state from email to button] - expected: FAIL - [change state from email to datetime] expected: FAIL @@ -141,27 +108,6 @@ [change state from number to range] expected: FAIL - [change state from range to hidden] - expected: FAIL - - [change state from range to checkbox] - expected: FAIL - - [change state from range to radio] - expected: FAIL - - [change state from range to submit] - expected: FAIL - - [change state from range to image] - expected: FAIL - - [change state from range to reset] - expected: FAIL - - [change state from range to button] - expected: FAIL - [change state from range to email] expected: FAIL @@ -222,21 +168,6 @@ [change state from datetime-local to range] expected: FAIL - [change state from range to text] - expected: FAIL - - [change state from range to search] - expected: FAIL - - [change state from range to tel] - expected: FAIL - - [change state from range to url] - expected: FAIL - - [change state from range to password] - expected: FAIL - [change state from color to range] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini deleted file mode 100644 index 9e522297c94..00000000000 --- a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini +++ /dev/null @@ -1,7 +0,0 @@ -[toggleEvent.html] - [Calling open twice on 'details' fires only one toggle event] - expected: FAIL - - [Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element] - expected: FAIL - diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-xml.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-xml.window.js.ini index 2314441517b..25f0d603b3d 100644 --- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-xml.window.js.ini +++ b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-xml.window.js.ini @@ -9,6 +9,3 @@ [document.open should throw an InvalidStateError with XML document even when the ignore-opens-during-unload counter is greater than 0 (during pagehide event)] expected: FAIL - [document.open should throw an InvalidStateError with XML document even when there is an active parser executing script] - expected: FAIL - diff --git a/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini b/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini index 7725b118e9d..99a24216c88 100644 --- a/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini +++ b/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini @@ -12,6 +12,3 @@ [Verifies the resolution of entry.startTime is at least 5 microseconds.] expected: TIMEOUT - [Verifies the resolution of performance.now() is at least 5 microseconds.] - expected: FAIL - diff --git a/tests/wpt/metadata/quirks/unitless-length/limited-quirks.html.ini b/tests/wpt/metadata/quirks/unitless-length/no-quirks.html.ini index c7e9c7434f5..818a429ed39 100644 --- a/tests/wpt/metadata/quirks/unitless-length/limited-quirks.html.ini +++ b/tests/wpt/metadata/quirks/unitless-length/no-quirks.html.ini @@ -1,4 +1,4 @@ -[limited-quirks.html] +[no-quirks.html] [top: -\\31 .5] expected: FAIL diff --git a/tests/wpt/metadata/quirks/unitless-length/quirks.html.ini b/tests/wpt/metadata/quirks/unitless-length/quirks.html.ini new file mode 100644 index 00000000000..2ed601c6ff4 --- /dev/null +++ b/tests/wpt/metadata/quirks/unitless-length/quirks.html.ini @@ -0,0 +1,283 @@ +[quirks.html] + [top: -\\31 .5] + expected: FAIL + + [bottom: -1A] + expected: FAIL + + [bottom: -1a] + expected: FAIL + + [top: @1] + expected: FAIL + + [top: "1a"] + expected: FAIL + + [top: @a] + expected: FAIL + + [bottom: "1"] + expected: FAIL + + [bottom: -/**/1] + expected: FAIL + + [top: +/**/1] + expected: FAIL + + [bottom: @1a] + expected: FAIL + + [top: 1\\31 ] + expected: FAIL + + [top: url('1')] + expected: FAIL + + [bottom: -\\31 ] + expected: FAIL + + [top: calc(1)] + expected: FAIL + + [top: \\31 ] + expected: FAIL + + [bottom: +1\\31 ] + expected: FAIL + + [bottom: 1\\31 .5] + expected: FAIL + + [bottom: #0001] + expected: FAIL + + [top: calc(2 * 2px)] + expected: FAIL + + [bottom: 1a] + expected: FAIL + + [bottom: A] + expected: FAIL + + [bottom: #01] + expected: FAIL + + [top: +\\31 .5] + expected: FAIL + + [bottom: #1] + expected: FAIL + + [top: -/**/1] + expected: FAIL + + [bottom: +\\31 .5] + expected: FAIL + + [bottom: \\31 ] + expected: FAIL + + [bottom: calc(1)] + expected: FAIL + + [top: #001] + expected: FAIL + + [top: +\\31 ] + expected: FAIL + + [bottom: +\\31 ] + expected: FAIL + + [top: +1.5] + expected: FAIL + + [top: +1\\31 ] + expected: FAIL + + [bottom: @a] + expected: FAIL + + [bottom: @1] + expected: FAIL + + [top: #1] + expected: FAIL + + [top: 1a] + expected: FAIL + + [bottom: +1a] + expected: FAIL + + [bottom: +1A] + expected: FAIL + + [bottom: "a"] + expected: FAIL + + [top: #00001] + expected: FAIL + + [bottom: -1\\31 .5] + expected: FAIL + + [top: "1"] + expected: FAIL + + [bottom: 1.5] + expected: FAIL + + [bottom: -\\31 .5] + expected: FAIL + + [bottom: url('1')] + expected: FAIL + + [bottom: -1.5] + expected: FAIL + + [top: \\31 .5] + expected: FAIL + + [bottom: "1a"] + expected: FAIL + + [bottom: calc(2 * 2px)] + expected: FAIL + + [bottom: +1\\31 .5] + expected: FAIL + + [bottom: 1\\31 ] + expected: FAIL + + [bottom: +/**/1] + expected: FAIL + + [bottom: #00001] + expected: FAIL + + [top: url(1)] + expected: FAIL + + [bottom: #001] + expected: FAIL + + [top: +1\\31 .5] + expected: FAIL + + [top: -1a] + expected: FAIL + + [top: -1A] + expected: FAIL + + [bottom: url(1)] + expected: FAIL + + [top: a] + expected: FAIL + + [top: A] + expected: FAIL + + [top: #000001] + expected: FAIL + + [top: 1] + expected: FAIL + + [top: 1\\31 .5] + expected: FAIL + + [bottom: a] + expected: FAIL + + [bottom: 1] + expected: FAIL + + [bottom: +1] + expected: FAIL + + [bottom: #000001] + expected: FAIL + + [bottom: +a] + expected: FAIL + + [bottom: +A] + expected: FAIL + + [top: 1.5] + expected: FAIL + + [top: +A] + expected: FAIL + + [top: +a] + expected: FAIL + + [top: +1] + expected: FAIL + + [top: -1.5] + expected: FAIL + + [top: -1\\31 .5] + expected: FAIL + + [top: +1a] + expected: FAIL + + [top: +1A] + expected: FAIL + + [top: @1a] + expected: FAIL + + [bottom: \\31 .5] + expected: FAIL + + [top: "a"] + expected: FAIL + + [top: #01] + expected: FAIL + + [bottom: +1.5] + expected: FAIL + + [bottom: -A] + expected: FAIL + + [bottom: -a] + expected: FAIL + + [bottom: -1\\31 ] + expected: FAIL + + [top: #0001] + expected: FAIL + + [bottom: -1] + expected: FAIL + + [top: -\\31 ] + expected: FAIL + + [top: -A] + expected: FAIL + + [top: -a] + expected: FAIL + + [top: -1] + expected: FAIL + + [top: -1\\31 ] + expected: FAIL + diff --git a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini index 9d72f08e38e..f806a845a2a 100644 --- a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini +++ b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini @@ -1,5 +1,6 @@ [005.html] type: testharness + expected: ERROR [dedicated worker in shared worker in dedicated worker] expected: FAIL diff --git a/tests/wpt/metadata/xhr/overridemimetype-blob.html.ini b/tests/wpt/metadata/xhr/overridemimetype-blob.html.ini index 92513ff0e20..e6daede70e3 100644 --- a/tests/wpt/metadata/xhr/overridemimetype-blob.html.ini +++ b/tests/wpt/metadata/xhr/overridemimetype-blob.html.ini @@ -210,3 +210,171 @@ [39) MIME types need to be parsed and serialized: x/x;test] expected: FAIL + [16) MIME types need to be parsed and serialized: text/html;charset='gbk'] + expected: FAIL + + [63) MIME types need to be parsed and serialized: </>] + expected: FAIL + + [23) MIME types need to be parsed and serialized: text/html;";charset=gbk] + expected: FAIL + + [13) MIME types need to be parsed and serialized: text/html;charset=\x0cgbk] + expected: FAIL + + [47) MIME types need to be parsed and serialized: x/x\n\r\t ;x=x] + expected: FAIL + + [60) MIME types need to be parsed and serialized: bogus/] + expected: FAIL + + [37) MIME types need to be parsed and serialized: text/html;charset=";charset=GBK] + expected: FAIL + + [61) MIME types need to be parsed and serialized: bogus/ ] + expected: FAIL + + [30) MIME types need to be parsed and serialized: text/html;charset=gbk"] + expected: FAIL + + [29) MIME types need to be parsed and serialized: text/html;charset="gbk] + expected: FAIL + + [57) MIME types need to be parsed and serialized: \t] + expected: FAIL + + [27) MIME types need to be parsed and serialized: text/html;charset=";charset=foo";charset=GBK] + expected: FAIL + + [14) MIME types need to be parsed and serialized: text/html;\x0bcharset=gbk] + expected: FAIL + + [56) MIME types need to be parsed and serialized: ] + expected: FAIL + + [65) MIME types need to be parsed and serialized: ÿ/ÿ] + expected: FAIL + + [59) MIME types need to be parsed and serialized: bogus] + expected: FAIL + + [51) MIME types need to be parsed and serialized: x/x;test=�;x=x] + expected: FAIL + + [64) MIME types need to be parsed and serialized: (/)] + expected: FAIL + + [44) MIME types need to be parsed and serialized: x/x;test="\\] + expected: FAIL + + [26) MIME types need to be parsed and serialized: text/html;charset= ";charset=GBK] + expected: FAIL + + [17) MIME types need to be parsed and serialized: text/html;charset='gbk] + expected: FAIL + + [25) MIME types need to be parsed and serialized: text/html;;;;charset=gbk] + expected: FAIL + + [66) MIME types need to be parsed and serialized: text/html(;doesnot=matter] + expected: FAIL + + [19) MIME types need to be parsed and serialized: text/html;charset=';charset=GBK] + expected: FAIL + + [21) MIME types need to be parsed and serialized: text/html;test=;charset=gbk] + expected: FAIL + + [20) MIME types need to be parsed and serialized: text/html;test;charset=gbk] + expected: FAIL + + [15) MIME types need to be parsed and serialized: text/html;\x0ccharset=gbk] + expected: FAIL + + [62) MIME types need to be parsed and serialized: bogus/bogus/;] + expected: FAIL + + [33) MIME types need to be parsed and serialized: text/html;charset="\\ gbk"] + expected: FAIL + + [67) MIME types need to be parsed and serialized: {/}] + expected: FAIL + + [35) MIME types need to be parsed and serialized: text/html;charset="gbk"x] + expected: FAIL + + [28) MIME types need to be parsed and serialized: text/html;charset="gbk"] + expected: FAIL + + [46) MIME types need to be parsed and serialized: x/x;x=\t] + expected: FAIL + + [68) MIME types need to be parsed and serialized: Ā/Ā] + expected: FAIL + + [50) MIME types need to be parsed and serialized: text/html;test=ÿ;charset=gbk] + expected: FAIL + + [41) MIME types need to be parsed and serialized: !#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] + expected: FAIL + + [54) MIME types need to be parsed and serialized: x/x\x0b] + expected: FAIL + + [42) MIME types need to be parsed and serialized: x/x;x="\t !\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"] + expected: FAIL + + [43) MIME types need to be parsed and serialized: x/x;test] + expected: FAIL + + [36) MIME types need to be parsed and serialized: text/html;charset="";charset=GBK] + expected: FAIL + + [38) MIME types need to be parsed and serialized: text/html;charset={gbk}] + expected: FAIL + + [34) MIME types need to be parsed and serialized: text/html;charset="\\g\\b\\k"] + expected: FAIL + + [45) MIME types need to be parsed and serialized: x/x;x= ] + expected: FAIL + + [52) MIME types need to be parsed and serialized: \x0bx/x] + expected: FAIL + + [48) MIME types need to be parsed and serialized: \n\r\t x/x;x=x\n\r\t ] + expected: FAIL + + [31) MIME types need to be parsed and serialized: text/html;charset=" gbk"] + expected: FAIL + + [49) MIME types need to be parsed and serialized: x/x;\n\r\t x=x\n\r\t ;x=y] + expected: FAIL + + [22) MIME types need to be parsed and serialized: text/html;';charset=gbk] + expected: FAIL + + [58) MIME types need to be parsed and serialized: /] + expected: FAIL + + [12) MIME types need to be parsed and serialized: text/html;charset=\x0bgbk] + expected: FAIL + + [32) MIME types need to be parsed and serialized: text/html;charset="gbk "] + expected: FAIL + + [53) MIME types need to be parsed and serialized: \x0cx/x] + expected: FAIL + + [55) MIME types need to be parsed and serialized: x/x\x0c] + expected: FAIL + + [24) MIME types need to be parsed and serialized: text/html ; ; charset=gbk] + expected: FAIL + + [18) MIME types need to be parsed and serialized: text/html;charset=gbk'] + expected: FAIL + + [39) MIME types need to be parsed and serialized: text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk] + expected: FAIL + diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js index 725e56d3f34..9b23d650baf 100644 --- a/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js +++ b/tests/wpt/web-platform-tests/bluetooth/resources/bluetooth-helpers.js @@ -26,8 +26,9 @@ function performChromiumSetup() { // Load the Chromium-specific resources. let prefix = '/resources/chromium'; let extra = []; - if (window.location.pathname.includes('/LayoutTests/')) { - let root = window.location.pathname.match(/.*LayoutTests/); + const pathname = window.location.pathname; + if (pathname.includes('/LayoutTests/') || pathname.includes('/web_tests/')) { + let root = pathname.match(/.*(?:LayoutTests|web_tests)/); prefix = `${root}/external/wpt/resources/chromium`; extra = [ `${root}/resources/bluetooth/bluetooth-fake-adapter.js`, diff --git a/tests/wpt/web-platform-tests/cors/access-control-expose-headers-parsing.window.js b/tests/wpt/web-platform-tests/cors/access-control-expose-headers-parsing.window.js index 58e7395cf83..a139ff6f1e7 100644 --- a/tests/wpt/web-platform-tests/cors/access-control-expose-headers-parsing.window.js +++ b/tests/wpt/web-platform-tests/cors/access-control-expose-headers-parsing.window.js @@ -1,13 +1,15 @@ -function exposeTest(resource, desc) { - const url = new URL("resources/" + resource, location.href).href.replace("://", "://élève."); +promise_test(() => fetch("resources/access-control-expose-headers.json").then(res => res.json()).then(runTests), "Loading JSON…"); - promise_test(() => { - return fetch(url).then(res => { - assert_equals(res.headers.get("content-language"), "sure") - assert_equals(res.headers.get("x-custom"), null); - }) - }, "Access-Control-Expose-Headers parsing: " + desc); +function runTests(allTestData) { + allTestData.forEach(testData => { + const encodedInput = encodeURIComponent(testData.input); + promise_test(() => { + const relativeURL = "resources/expose-headers.py?expose=" + encodedInput, + url = new URL(relativeURL, location.href).href.replace("://", "://élève."); + return fetch(url).then(res => { + assert_equals(res.headers.get("content-language"), "mkay"); + assert_equals(res.headers.get("bb-8"), (testData.exposed ? "hey" : null)); + }); + }, "Parsing: " + encodedInput); + }) } - -exposeTest("access-control-expose-headers-parsing.asis", "#1"); -exposeTest("access-control-expose-headers-parsing-2.asis", "#2") diff --git a/tests/wpt/web-platform-tests/cors/cors-safelisted-request-header.any.js b/tests/wpt/web-platform-tests/cors/cors-safelisted-request-header.any.js new file mode 100644 index 00000000000..d7bb5e70b8e --- /dev/null +++ b/tests/wpt/web-platform-tests/cors/cors-safelisted-request-header.any.js @@ -0,0 +1,43 @@ +// META: script=support.js?pipe=sub +// META: script=/common/utils.js + +// This is based on simple-requests.htm, with modifications to make the code more modern and test +// more esoteric cases of header value parsing. + +function safelist(headers, expectPreflight = false) { + promise_test(async t => { + const uuid = token(), + url = CROSSDOMAIN + "resources/preflight.py?token=" + uuid, + checkURL = "resources/preflight.py?check&token=" + uuid, + request = () => fetch(url, { method: "POST", headers, body: "data" }); + if (expectPreflight) { + await promise_rejects(t, TypeError(), request()); + } else { + const response = await request(); + assert_equals(response.headers.get("content-type"), "text/plain"); + assert_equals(await response.text(), "NO"); + } + const checkResponse = await fetch(checkURL, { method: "POST", body: "data" }); + assert_equals(await checkResponse.text(), (expectPreflight ? "1" : "0")); + }, (expectPreflight ? "Preflight" : "No preflight") + " for " + JSON.stringify(headers)); +} + +[ + ["text /plain", true], + ["text\t/\tplain", true], + ["text/plain;"], + ["text/plain;garbage"], + ["text/plain;garbage\u0001\u0002", true], + ["text/plain,", true], + [",text/plain", true], + ["text/plain,text/plain", true], + ["text/plain,x/x", true], + ["text/plain\u000B", true], + ["text/plain\u000C", true], + ["application/www-form-urlencoded", true], + ["application/x-www-form-urlencoded;\u007F", true], + ["multipart/form-data"], + ["multipart/form-data;\"", true] +].forEach(([mimeType, preflight = false]) => { + safelist({"content-type": mimeType}, preflight); +}) diff --git a/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers-parsing-2.asis b/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers-parsing-2.asis deleted file mode 100644 index 9628a67ff14..00000000000 --- a/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers-parsing-2.asis +++ /dev/null @@ -1,8 +0,0 @@ -HTTP/1.1 200 OK -Access-Control-Allow-Origin: * -Access-Control-Expose-Headers: not valid -Access-Control-Expose-Headers: x-custom -X-Custom: test -Content-Language: sure - -TEST diff --git a/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers-parsing.asis b/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers-parsing.asis deleted file mode 100644 index 7a4b2a12b60..00000000000 --- a/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers-parsing.asis +++ /dev/null @@ -1,7 +0,0 @@ -HTTP/1.1 200 OK -Access-Control-Allow-Origin: * -Access-Control-Expose-Headers: not valid, x-custom -X-Custom: test -Content-Language: sure - -TEST diff --git a/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers.json b/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers.json new file mode 100644 index 00000000000..e8915f7ffe1 --- /dev/null +++ b/tests/wpt/web-platform-tests/cors/resources/access-control-expose-headers.json @@ -0,0 +1,62 @@ +[ + { + "input": "access-control-expose-headers: BB-8", + "exposed": true + }, + { + "input": "Access-Control-Expose-Headers: bb-8,,@#$#%%&^&^*()()11!", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: bb-8, no no", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: @#$#%%&^&^*()()11!,bb-8", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: bb-8\r\nAccess-Control-Expose-Headers: no", + "exposed": true + }, + { + "input": "Access-Control-Expose-Headers: bb-8\r\nAccess-Control-Expose-Headers: no no", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: no\r\nAccess-Control-Expose-Headers: bb-8", + "exposed": true + }, + { + "input": "Access-Control-Expose-Headers:\r\nAccess-Control-Expose-Headers: bb-8", + "exposed": true + }, + { + "input": "Access-Control-Expose-Headers: ,bb-8", + "exposed": true + }, + { + "input": "Access-Control-Expose-Headers: bb-8\u000C", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: bb-8\u000B", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: bb-8\u000B,bb-8", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: 'bb-8'", + "exposed": false + }, + { + "input": "Access-Control-Expose-Headers: 'bb-8',bb-8", + "exposed": true + }, + { + "input": "Access-Control-Expose-Headers: \"bb-8\",bb-8", + "exposed": false + } +] diff --git a/tests/wpt/web-platform-tests/cors/resources/expose-headers.py b/tests/wpt/web-platform-tests/cors/resources/expose-headers.py new file mode 100644 index 00000000000..c350b3b87be --- /dev/null +++ b/tests/wpt/web-platform-tests/cors/resources/expose-headers.py @@ -0,0 +1,10 @@ +def main(request, response): + response.add_required_headers = False + output = "HTTP/1.1 221 ALL YOUR BASE BELONG TO H1\r\n" + output += "Access-Control-Allow-Origin: *\r\n" + output += "BB-8: hey\r\n" + output += "Content-Language: mkay\r\n" + output += request.GET.first("expose") + "\r\n" + output += "\r\n" + response.writer.write(output) + response.close_connection = True diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-size-one-value-1x1-image.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-size-one-value-1x1-image.html new file mode 100644 index 00000000000..5caf2d49566 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-size-one-value-1x1-image.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Background Test: A single size value with a 1x1 image should work as intended</title> + <link rel="author" title="schenney" href="mailto:schenney@chromium.org"> + <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-size"> + <link rel="match" href="reference/background-size-one-value-1x1-image-ref.html"> + <style type="text/css"> + .backgroundSize{ + background: url("support/1x1-green.png"); + background-size: 50%; + background-repeat: repeat-y; + height: 100px; + } + </style> +</head> +<body> + <div style="background: #7957d5"> + <div class="backgroundSize"></div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-size-one-value-1x1-image-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-size-one-value-1x1-image-ref.html new file mode 100644 index 00000000000..0a0404a9b5c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-size-one-value-1x1-image-ref.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Background Test Reference</title> + <link rel="author" title="schenney" href="mailto:schenney@chromium.org"> + <style type="text/css"> + .backgroundSize{ + background: url("../support/1x1-green.png"); + background-size: 50% 100%; + background-repeat: repeat-y; + height: 100px; + } + </style> +</head> +<body> + <div style="background: #7957d5"> + <div class="backgroundSize"></div> + </div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-filter/META.yml b/tests/wpt/web-platform-tests/css/css-filter/META.yml deleted file mode 100644 index 8d0683319b0..00000000000 --- a/tests/wpt/web-platform-tests/css/css-filter/META.yml +++ /dev/null @@ -1,3 +0,0 @@ -spec: https://drafts.fxtf.org/filter-effects/ -suggested_reviewers: - - chrishtr diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flex-wrap-002.html b/tests/wpt/web-platform-tests/css/css-flexbox/flex-wrap-002.html new file mode 100644 index 00000000000..d2e07afb45f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flex-wrap-002.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="author" title="Google LLC" href="http://www.google.com" /> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#cross-sizing" /> +<title>css-flexbox: Tests that we size items in a wrapping column flexbox as fit-content</title> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht" /> +<meta name="assert" content="The flexbox here should have two flex lines, each 50px wide and 100px tall. The flex items overflow but are transparent." /> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<!-- This makes sure that we only see green if the flex items are sized correctly --> +<div style="position: absolute; width: 100px; height: 100px; background: green;"></div> + +<div style="display: flex; flex-direction: column; flex-wrap: wrap; width: 50px; height: 100px; line-height: 20px;"> + <div style="background-color: red; height: 100px;"> + <!-- These zero-height divs give the flex item has a min-content width of + 25px and a max-content width of 125px --> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + </div> + <div style="background-color: red; height: 100px;"> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + <div style="width: 25px; display: inline-block;"></div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flex-wrap-003.html b/tests/wpt/web-platform-tests/css/css-flexbox/flex-wrap-003.html new file mode 100644 index 00000000000..a76e4449fb2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flex-wrap-003.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<link rel="author" title="Google LLC" href="http://www.google.com" /> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#cross-sizing" /> +<title>css-flexbox: Tests that we size items in a wrapping column flexbox as fit-content</title> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht" /> +<meta name="assert" content="The flexbox here should have one flex line, 100px by 100px. The flex items overflow but are transparent." /> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<!-- This makes sure that we only see green if the flex items are sized correctly --> +<div style="position: absolute; width: 100px; height: 100px; background: green;"></div> + +<div style="display: flex; flex-direction: column; flex-wrap: wrap; width: 100px; height: 100px; line-height: 20x;"> + <div style="background-color: red; height: 100px;"> + <!-- These zero-height divs give the flex item has a min-content width of + 50px and a max-content width of 250px --> + <div style="width: 50px; display: inline-block;"></div> + <div style="width: 50px; display: inline-block;"></div> + <div style="width: 50px; display: inline-block;"></div> + <div style="width: 50px; display: inline-block;"></div> + <div style="width: 50px; display: inline-block;"></div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-001-ref.html new file mode 100644 index 00000000000..31a9ef3db8e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-001-ref.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS container Layout Test Reference</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> + .container { + margin: 10px; + background: grey; + } + + .scrollX { + overflow-x: scroll; + } + + .scrollY { + overflow-y: scroll; + } + + .fixedSize { + width: 200px; + height: 50px; + } + + .container > div { + background: cyan; + width: 100%; + height: 100%; + } + + .directionRTL { + direction: rtl; + } +</style> + +<p>The test passes if it has the same output than the reference.</p> + +<div style="float: left; width: 350px;"> + + <h2>direction: ltr;</h2> + + <div class="container scrollX"> + <div>item</div> + </div> + + <div class="container scrollY"> + <div>item</div> + </div> + + <div class="container scrollX scrollY"> + <div>item</div> + </div> + + <div class="container fixedSize scrollX"> + <div>item</div> + </div> + + <div class="container fixedSize scrollY"> + <div>item</div> + </div> + + <div class="container fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> + +<div style="float: left; width: 350px;"> + + <h2>direction: rtl;</h2> + + <div class="directionRTL container scrollX"> + <div>item</div> + </div> + + <div class="directionRTL container scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container scrollX scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollX"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-001.html new file mode 100644 index 00000000000..1b3c6eef691 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-001.html @@ -0,0 +1,92 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: Grid container with scrollbars</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid/#grid-model"> +<link rel="match" href="grid-container-scrollbar-001-ref.html"> +<meta name="assert" content="This test verifes that scrollbars are properly painted on grid containers, and are shown in the expected position depending on the direction."> +<link href="support/grid.css" rel="stylesheet"> +<style> + .grid { + margin: 10px; + } + + .scrollX { + overflow-x: scroll; + } + + .scrollY { + overflow-y: scroll; + } + + .fixedSize { + width: 200px; + height: 50px; + } + + .grid > div { + background: cyan; + } +</style> + +<p>The test passes if it has the same output than the reference.</p> + +<div style="float: left; width: 350px;"> + + <h2>direction: ltr;</h2> + + <div class="grid scrollX"> + <div>item</div> + </div> + + <div class="grid scrollY"> + <div>item</div> + </div> + + <div class="grid scrollX scrollY"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollX"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollY"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> + +<div style="float: left; width: 350px;"> + + <h2>direction: rtl;</h2> + + <div class="directionRTL grid scrollX"> + <div>item</div> + </div> + + <div class="directionRTL grid scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid scrollX scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollX"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001-ref.html new file mode 100644 index 00000000000..512fb8a81d5 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001-ref.html @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS container Layout Test Reference</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> + .container { + margin: 10px; + background: grey; + writing-mode: vertical-lr; + } + + .scrollX { + overflow-x: scroll; + } + + .scrollY { + overflow-y: scroll; + } + + .fixedSize { + width: 200px; + height: 50px; + } + + .container > div { + background: cyan; + width: 100%; + height: 100%; + } + + .directionRTL { + direction: rtl; + } +</style> + +<p>The test passes if it has the same output than the reference.</p> + +<div style="float: left; width: 350px;"> + + <h2>direction: ltr;</h2> + + <div class="container scrollX"> + <div>item</div> + </div> + + <div class="container scrollY"> + <div>item</div> + </div> + + <div class="container scrollX scrollY"> + <div>item</div> + </div> + + <div class="container fixedSize scrollX"> + <div>item</div> + </div> + + <div class="container fixedSize scrollY"> + <div>item</div> + </div> + + <div class="container fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> + +<div style="float: left; width: 350px;"> + + <h2>direction: rtl;</h2> + + <div class="directionRTL container scrollX"> + <div>item</div> + </div> + + <div class="directionRTL container scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container scrollX scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollX"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html new file mode 100644 index 00000000000..ecdc7b76840 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: Grid container with scrollbars</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid/#grid-model"> +<link rel="match" href="grid-container-scrollbar-vertical-lr-001-ref.html"> +<meta name="assert" content="This test verifes that scrollbars are properly painted on grid containers, and are shown in the expected position depending on the direction."> +<link href="support/grid.css" rel="stylesheet"> +<style> + .grid { + margin: 10px; + writing-mode: vertical-lr; + } + + .scrollX { + overflow-x: scroll; + } + + .scrollY { + overflow-y: scroll; + } + + .fixedSize { + width: 200px; + height: 50px; + } + + .grid > div { + background: cyan; + } +</style> + +<p>The test passes if it has the same output than the reference.</p> + +<div style="float: left; width: 350px;"> + + <h2>direction: ltr;</h2> + + <div class="grid scrollX"> + <div>item</div> + </div> + + <div class="grid scrollY"> + <div>item</div> + </div> + + <div class="grid scrollX scrollY"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollX"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollY"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> + +<div style="float: left; width: 350px;"> + + <h2>direction: rtl;</h2> + + <div class="directionRTL grid scrollX"> + <div>item</div> + </div> + + <div class="directionRTL grid scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid scrollX scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollX"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001-ref.html new file mode 100644 index 00000000000..d8eeedfa07d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001-ref.html @@ -0,0 +1,96 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS container Layout Test Reference</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> + .container { + margin: 10px; + background: grey; + writing-mode: vertical-rl; + } + + .scrollX { + overflow-x: scroll; + } + + .scrollY { + overflow-y: scroll; + } + + .fixedSize { + width: 200px; + height: 50px; + } + + .container > div { + background: cyan; + width: 100%; + height: 100%; + } + + .directionRTL { + direction: rtl; + } +</style> + +<p>The test passes if it has the same output than the reference.</p> + +<div style="float: left; width: 350px;"> + + <h2>direction: ltr;</h2> + + <div class="container scrollX"> + <div>item</div> + </div> + + <div class="container scrollY"> + <div>item</div> + </div> + + <div class="container scrollX scrollY"> + <div>item</div> + </div> + + <div class="container fixedSize scrollX"> + <div>item</div> + </div> + + <div class="container fixedSize scrollY"> + <div>item</div> + </div> + + <div class="container fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> + +<div style="float: left; width: 350px;"> + + <h2>direction: rtl;</h2> + + <div class="directionRTL container scrollX"> + <div>item</div> + </div> + + <div class="directionRTL container scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container scrollX scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollX"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollY"> + <div>item</div> + </div> + + <div class="directionRTL container fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001.html new file mode 100644 index 00000000000..f2ab39ff505 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-container-scrollbar-vertical-rl-001.html @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Grid Layout Test: Grid container with scrollbars</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid/#grid-model"> +<link rel="match" href="grid-container-scrollbar-vertical-rl-001-ref.html"> +<meta name="assert" content="This test verifes that scrollbars are properly painted on grid containers, and are shown in the expected position depending on the direction."> +<link href="support/grid.css" rel="stylesheet"> +<style> + .grid { + margin: 10px; + writing-mode: vertical-rl; + } + + .scrollX { + overflow-x: scroll; + } + + .scrollY { + overflow-y: scroll; + } + + .fixedSize { + width: 200px; + height: 50px; + } + + .grid > div { + background: cyan; + } +</style> + +<p>The test passes if it has the same output than the reference.</p> + +<div style="float: left; width: 350px;"> + + <h2>direction: ltr;</h2> + + <div class="grid scrollX"> + <div>item</div> + </div> + + <div class="grid scrollY"> + <div>item</div> + </div> + + <div class="grid scrollX scrollY"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollX"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollY"> + <div>item</div> + </div> + + <div class="grid fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> + +<div style="float: left; width: 350px;"> + + <h2>direction: rtl;</h2> + + <div class="directionRTL grid scrollX"> + <div>item</div> + </div> + + <div class="directionRTL grid scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid scrollX scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollX"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollY"> + <div>item</div> + </div> + + <div class="directionRTL grid fixedSize scrollX scrollY"> + <div>item</div> + </div> + +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/parsing/grid-template-areas-valid.html b/tests/wpt/web-platform-tests/css/css-grid/parsing/grid-template-areas-valid.html index 8d8f6823267..9c9bd47ec89 100644 --- a/tests/wpt/web-platform-tests/css/css-grid/parsing/grid-template-areas-valid.html +++ b/tests/wpt/web-platform-tests/css/css-grid/parsing/grid-template-areas-valid.html @@ -19,11 +19,10 @@ test_valid_value("grid-template-areas", '"1st 2nd 3rd"'); test_valid_value("grid-template-areas", '"first second" "third fourth"'); test_valid_value("grid-template-areas", '"first second" "third ." "1st 2nd" "3rd 4th"'); -// Firefox preserves specific whitespace and full stop sequences. -// Other browsers consolidate to ' ' and '.' -test_valid_value("grid-template-areas", '" a \t b "', '"a b"'); // Fails in Firefox -test_valid_value("grid-template-areas", '"c\td"', ['"c d"', '"c\\9 d"']); -test_valid_value("grid-template-areas", '"first ..."', ['"first ."', '"first ..."']); +// https://github.com/w3c/csswg-drafts/issues/3261 +test_valid_value("grid-template-areas", '" a \t b "', '"a b"'); +test_valid_value("grid-template-areas", '"c\td"', '"c d"'); +test_valid_value("grid-template-areas", '"first ..."', '"first ."'); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-margin-003.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-margin-003.html new file mode 100644 index 00000000000..b509d2eed75 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-margin-003.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: multi-column and margin bottom of last child</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#the-multi-column-model"> + <link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> + <meta name="assert" content="This test checks the margin-bottom of the last child of a multi-column should not affect its parent's margin-bottom."> + + <style> + article { + font: 25px/25px Ahem; + color: green; + background-color: green; + width: 100px; + column-count: 2; + column-gap: 0; + margin-bottom: 0; + orphans: 1; + widows: 1; + } + + article div:last-child { + margin-bottom: 13px; + } + </style> + + <body> + <p>Test passes if there is a filled green square.</p> + <article> + <div>a1 a2 a3 a4</div> + <div>a5</div> + </article> + <article>b1 b2</article> + + <!-- + Expected result: + + |------+------| + | a1 | a4 | + | a2 | a5 | + | a3 |margin| + |------+------| + | b1 | b2 | + |------+------| + --> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-001-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-001-ref.html new file mode 100644 index 00000000000..9f76ea15a0d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-001-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Add the spanner as the first child of the columns</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <h3>spanner</h3> + <div>block1</div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-001.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-001.html new file mode 100644 index 00000000000..82b240cb91f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-001.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Add the spanner as the first child of the columns</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-001-ref.html"> + <meta name="assert" content="This test checks a dynamically added 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Add the spanner as the first child of the columns. */ + var spanner = document.createElement("h3"); + var text = document.createTextNode("spanner"); + spanner.appendChild(text); + + var column = document.getElementById("column"); + column.insertBefore(spanner, column.children[0]); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div>block1</div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-002-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-002-ref.html new file mode 100644 index 00000000000..94f3028a473 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-002-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Add the spanner as the second child of the columns</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <div>block1</div> + <h3>spanner</h3> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-002.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-002.html new file mode 100644 index 00000000000..67eeff63ebf --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-002.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Add the spanner as the second child of the columns</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-002-ref.html"> + <meta name="assert" content="This test checks a dynamically added 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Add the spanner as the second child of the columns. */ + var spanner = document.createElement("h3"); + var text = document.createTextNode("spanner"); + spanner.appendChild(text); + + var column = document.getElementById("column"); + column.insertBefore(spanner, column.children[1]); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div>block1</div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-003-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-003-ref.html new file mode 100644 index 00000000000..da623535087 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-003-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Add the spanner in block1. It should correctly span across all columns</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <div>block1<h3>spanner</h3></div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-003.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-003.html new file mode 100644 index 00000000000..a9dd225aca1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-003.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Add the spanner in block1. It should correctly span across all columns</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-003-ref.html"> + <meta name="assert" content="This test checks a dynamically added 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Add the spanner in block1. It should correctly span across all columns. */ + var spanner = document.createElement("h3"); + var text = document.createTextNode("spanner"); + spanner.appendChild(text); + + var block1 = document.getElementById("block1"); + block1.appendChild(spanner); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div id="block1">block1</div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-004-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-004-ref.html new file mode 100644 index 00000000000..1afda92071f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-004-ref.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Add the spanner to the inner column</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + body { + width: 600px; + } + article { + column-count: 2; + column-rule: 6px solid; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article> + <article> + <div>inner block1</div> + <h3>spanner</h3> + <div>inner block2</div> + </article> + <article> + <div>inner block3</div> + <h3>static spanner</h3> + <div>inner block4</div> + </article> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-004.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-004.html new file mode 100644 index 00000000000..646fb332451 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-004.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Add the spanner to the inner column</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-004-ref.html"> + <meta name="assert" content="This test checks a dynamically added 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Add the spanner to the inner column. */ + var spanner = document.createElement("h3"); + var text = document.createTextNode("spanner"); + spanner.appendChild(text); + + var innerColumn = document.getElementById("inner-column"); + innerColumn.insertBefore(spanner, innerColumn.children[1]); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + body { + width: 600px; + } + article { + column-count: 2; + column-rule: 6px solid; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <article id="inner-column"> + <div>inner block1</div> + <div>inner block2</div> + </article> + <article> + <div>inner block3</div> + <h3>static spanner</h3> + <div>inner block4</div> + </article> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-005.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-005.html new file mode 100644 index 00000000000..87d7f1b7fda --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-005.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Add block1 before block2. It should join the column content box with + block2, not with the spanner</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-001-ref.html"> + <meta name="assert" content="This test checks a dynamically added block element should be rendered correctly in a column hierarchy containing a column-span."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Add block1 before block2. It should join the column content box with + block2, not with the spanner. */ + var block = document.createElement("div"); + var text = document.createTextNode("block1"); + block.appendChild(text); + + var column = document.getElementById("column"); + column.insertBefore(block, column.children[1]); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <h3>spanner</h3> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-006.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-006.html new file mode 100644 index 00000000000..9b5c1dced06 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-006.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Append a text in column-span</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-002-ref.html"> + <meta name="assert" content="This test checks adding a text in column-span should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Append a text in column-span */ + var text = document.createTextNode("spanner"); + var spanner = document.getElementById("spanner"); + spanner.appendChild(text) + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div>block1</div> + <h3 id="spanner"></h3> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-007-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-007-ref.html new file mode 100644 index 00000000000..7f68a45a2c4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-007-ref.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Append the block to the inline element which contains "column-span"</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <span id="span"> + inline1 + <h3>spanner</h3> + <div>block1</div> + inline2 + <div>block2</div> + </span> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-007.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-007.html new file mode 100644 index 00000000000..cdaaf430f55 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-007.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Append the block to the inline element which contains "column-span"</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-007-ref.html"> + <meta name="assert" content="This test checks a dynamically added block element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Append the block to the inline element which contains "column-span". */ + var block = document.createElement("div"); + var text = document.createTextNode("block2"); + block.appendChild(text); + + var span = document.getElementById("span"); + span.appendChild(block); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <span id="span"> + inline1 + <h3>spanner</h3> + <div>block1</div> + inline2 + </span> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-008-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-008-ref.html new file mode 100644 index 00000000000..c2df383b939 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-008-ref.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Add a nested multi-column spanner to the outer column</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-count: 2; + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <div>block1</div> + <h3>multi-column spanner</h3> + <h3>spanner</h3> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-008.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-008.html new file mode 100644 index 00000000000..14aeac8bca2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-add-008.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Add a nested multi-column spanner to the outer column</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-add-008-ref.html"> + <meta name="assert" content="This test checks a dynamically added 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + /* Add a nested multi-column spanner to the outer column. */ + var spanner = document.createElement("h3"); + var text = document.createTextNode("multi-column spanner"); + spanner.appendChild(text); + + var column = document.getElementById("column"); + column.insertBefore(spanner, column.children[1]); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-count: 2; + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div>block1</div> + <h3>spanner</h3> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html new file mode 100644 index 00000000000..83c9fd4880f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-001-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Remove the spanner as the first child</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <div>block1</div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-001.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-001.html new file mode 100644 index 00000000000..50a59d1225b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-001.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Remove the spanner as the first child</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-remove-001-ref.html"> + <meta name="assert" content="This test checks removing a 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + document.getElementById("spanner").remove(); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <h3 id="spanner">spanner</h3> + <div>block1</div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-002-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-002-ref.html new file mode 100644 index 00000000000..5bccbd76378 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-002-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Remove the spanner in nested blocks</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <div>block1</div> + <div><div></div></div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-002.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-002.html new file mode 100644 index 00000000000..a6e29772698 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-002.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Remove the spanner in nested blocks</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-remove-002-ref.html"> + <meta name="assert" content="This test checks removing a 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + document.getElementById("spanner").remove(); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div>block1</div> + <div><div><h3 id="spanner">spanner</h3></div></div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-003.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-003.html new file mode 100644 index 00000000000..fa6f167bd93 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-003.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Remove the spanner in a block</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-remove-001-ref.html"> + <meta name="assert" content="This test checks removing a 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + document.getElementById("spanner").remove(); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div id="block1">block1<h3 id="spanner">spanner</h3></div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-004-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-004-ref.html new file mode 100644 index 00000000000..d6e44f35f84 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-004-ref.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Remove the spanner with block siblings in an inline element</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <span> + inline1 + <div>block1</div> + inline2 + <div>block2</div> + </span> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-004.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-004.html new file mode 100644 index 00000000000..99ea3d744d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-004.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Remove the spanner with a block sibling in an inline element</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-remove-004-ref.html"> + <meta name="assert" content="This test checks removing a 'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + document.getElementById("spanner").remove(); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <span> + inline1 + <h3 id="spanner">spanner</h3> + <div>block1</div> + inline2 + <div>block2</div> + </span> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-005-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-005-ref.html new file mode 100644 index 00000000000..f0c6149b5c2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-005-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Remove a block with spanner siblings</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body> + <article id="column"> + <h3>spanner1</h3> + <h3>spanner2</h3> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-005.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-005.html new file mode 100644 index 00000000000..c0d868885ca --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-005.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Remove a tall block (spliting across the three columns) with spanner siblings</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-remove-005-ref.html"> + <meta name="assert" content="This test checks removing a non-'column-span' element should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + document.getElementById("block").remove(); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + #block { + height: 400px; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <h3>spanner1</h3> + <div id="block">block</div> + <h3>spanner2</h3> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-006.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-006.html new file mode 100644 index 00000000000..bbcce11c40f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-dynamic-remove-006.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Remove the parent of a column-spanner</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="match" href="multicol-span-all-dynamic-remove-001-ref.html"> + <meta name="assert" content="This test checks removing the parent of a column-spanner should be rendered correctly."> + + <script> + function runTest() { + document.body.offsetHeight; + + document.getElementById("block").remove(); + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 3; + column-rule: 6px solid; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + outline: 1px solid blue; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div>block1</div> + <div id="block"> + <h3>inner spanner</h3> + <div>inner block</div> + </div> + <div>block2</div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-001-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-001-ref.html new file mode 100644 index 00000000000..41bf8631e04 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-001-ref.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Restyle column-span's parent that is a block</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 1; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + } + #div { + background-color: yellow; + } + </style> + + <body> + <article id="column"> + <div id="div"> + <div>yellow block1</div> + <h3>spanner (no background-color)</h3> + <div>yellow block2</div> + </div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-001.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-001.html new file mode 100644 index 00000000000..8d942c13b5c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-001.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Restyle column-span's parent that is a block</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/1072"> + <link rel="match" href="multicol-span-all-restyle-001-ref.html"> + <meta name="assert" content="This test checks change the style of the spanner's parent should not affect the spanner."> + + <script> + function runTest() { + document.body.offsetHeight; // flush layout + + var div = document.getElementById("div"); + div.style.backgroundColor = "yellow"; + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 1; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div id="div"> + <div>yellow block1</div> + <h3>spanner (no background-color)</h3> + <div>yellow block2</div> + </div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-002-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-002-ref.html new file mode 100644 index 00000000000..92d469ab78b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-002-ref.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Restyle column-span's parent that is an inline</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + html { + overflow: hidden; + } + #column { + column-count: 1; + } + #span { + position: relative; + left: 200px; + } + h3 { + column-span: all; + } + </style> + + <body> + <article id="column"> + <span id="span"> + All text should be offset 200px, except the spanner + <h3>Spanner</h3> + <div>Some more text</div> + </span> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-002.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-002.html new file mode 100644 index 00000000000..e8ad19e8bc1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-002.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Restyle column-span's parent that is an inline</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/1072"> + <link rel="match" href="multicol-span-all-restyle-002-ref.html"> + <meta name="assert" content="This test checks change the style of the spanner's parent should not affect the spanner."> + + <script> + function runTest() { + document.body.offsetHeight; // flush layout + + var span = document.getElementById("span"); + span.offsetWidth; + span.style.left = "200px"; + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + html { + overflow: hidden; + } + #column { + column-count: 1; + } + #span { + position: relative; + left: 100px; + } + h3 { + column-span: all; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <span id="span"> + All text should be offset 200px, except the spanner + <h3>Spanner</h3> + <div>Some more text</div> + </span> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-003-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-003-ref.html new file mode 100644 index 00000000000..1396f66dcb7 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-003-ref.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Restyle column-span's multi-column container</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 1; + width: 400px; + outline: 1px solid black; + background-color: yellow; + } + h3 { + column-span: all; + } + #div { + background-color: yellow; + } + </style> + + <body> + <article id="column"> + <div> + <div>block1</div> + <h3>spanner</h3> + <div>block2</div> + </div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-003.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-003.html new file mode 100644 index 00000000000..7190f8f8794 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-003.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Restyle column-span's multi-column container</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/1072"> + <link rel="match" href="multicol-span-all-restyle-003-ref.html"> + <meta name="assert" content="This test checks change the style of the spanner's multi-column container should not affect the spanner."> + + <script> + function runTest() { + document.body.offsetHeight; // flush layout + + var column = document.getElementById("column"); + column.style.backgroundColor = "yellow"; + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 1; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div> + <div>block1</div> + <h3>spanner</h3> + <div>block2</div> + </div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-004-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-004-ref.html new file mode 100644 index 00000000000..cd562cc1e1b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-004-ref.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test Reference: Restyle the column-span itself</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + + <style> + #column { + column-count: 1; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + background-color: yellow; + } + </style> + + <body> + <article id="column"> + <div> + <div>block1</div> + <h3>yellow spanner</h3> + <div>block2</div> + </div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-004.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-004.html new file mode 100644 index 00000000000..41ac007f000 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-span-all-restyle-004.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <meta charset="utf-8"> + <title>CSS Multi-column Layout Test: Restyle the column-span itself</title> + <link rel="author" title="Ting-Yu Lin" href="tlin@mozilla.com"> + <link rel="author" title="Mozilla" href="http://www.mozilla.org/"> + <link rel="help" href="https://drafts.csswg.org/css-multicol-1/#column-span"> + <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/1072"> + <link rel="match" href="multicol-span-all-restyle-004-ref.html"> + <meta name="assert" content="This test checks change the style of the spanner itself."> + + <script> + function runTest() { + document.body.offsetHeight; // flush layout + + var spanner = document.getElementById("spanner"); + spanner.style.backgroundColor = "yellow"; + + document.documentElement.removeAttribute("class"); + } + </script> + + <style> + #column { + column-count: 1; + width: 400px; + outline: 1px solid black; + } + h3 { + column-span: all; + } + </style> + + <body onload="runTest();"> + <article id="column"> + <div> + <div>block1</div> + <h3 id="spanner">yellow spanner</h3> + <div>block2</div> + </div> + </article> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/var-reference-registered-properties-cycles.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/var-reference-registered-properties-cycles.html index 58d6c846ae3..65d11697355 100644 --- a/tests/wpt/web-platform-tests/css/css-properties-values-api/var-reference-registered-properties-cycles.html +++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/var-reference-registered-properties-cycles.html @@ -25,14 +25,13 @@ test(function() { CSS.registerProperty({name: '--registered-1-d', syntax: '<length>', initialValue: '4px', inherits: false}); computedStyle = getComputedStyle(test1); - assert_equals(computedStyle.getPropertyValue('--registered-1-a'), '1px'); - assert_equals(computedStyle.getPropertyValue('--registered-1-b'), '2px'); - - assert_equals(computedStyle.getPropertyValue('--registered-1-c'), '2px'); - assert_equals(computedStyle.getPropertyValue('--registered-1-d'), '2px'); - assert_equals(computedStyle.getPropertyValue('--unregistered-1-a'), '1px'); - assert_equals(computedStyle.left, '1px'); - assert_equals(computedStyle.top, '2px'); + assert_equals(computedStyle.getPropertyValue('--registered-1-a'), ''); + assert_equals(computedStyle.getPropertyValue('--registered-1-b'), ''); + assert_equals(computedStyle.getPropertyValue('--registered-1-c'), '30px'); + assert_equals(computedStyle.getPropertyValue('--registered-1-d'), '4px'); + assert_equals(computedStyle.getPropertyValue('--unregistered-1-a'), ''); + assert_equals(computedStyle.left, '50px'); + assert_equals(computedStyle.top, '60px'); }, "A var() cycle between two registered properties is handled correctly."); </script> @@ -63,18 +62,18 @@ test(function() { CSS.registerProperty({name: '--registered-2-e', syntax: '<length>', initialValue: '5px', inherits: false}); computedStyle = getComputedStyle(test2); - assert_equals(computedStyle.getPropertyValue('--registered-2-a'), '1px'); + assert_equals(computedStyle.getPropertyValue('--registered-2-a'), ''); assert_equals(computedStyle.getPropertyValue('--unregistered-2-a'), ''); - assert_equals(computedStyle.getPropertyValue('--registered-2-b'), '1px'); - assert_equals(computedStyle.getPropertyValue('--registered-2-c'), '1px'); + assert_equals(computedStyle.getPropertyValue('--registered-2-b'), '30px'); + assert_equals(computedStyle.getPropertyValue('--registered-2-c'), '3px'); assert_equals(computedStyle.getPropertyValue('--registered-2-d'), '40px'); assert_equals(computedStyle.getPropertyValue('--registered-2-e'), '5px'); - assert_equals(computedStyle.getPropertyValue('--unregistered-2-b'), '1px'); - assert_equals(computedStyle.getPropertyValue('--unregistered-2-c'), '1px'); + assert_equals(computedStyle.getPropertyValue('--unregistered-2-b'), '50px'); + assert_equals(computedStyle.getPropertyValue('--unregistered-2-c'), ''); assert_equals(computedStyle.getPropertyValue('--unregistered-2-d'), '60px'); assert_equals(computedStyle.getPropertyValue('--unregistered-2-e'), ''); - assert_equals(computedStyle.left, '1px'); + assert_equals(computedStyle.left, '70px'); assert_equals(computedStyle.top, '80px'); }, "A var() cycle between a registered properties and an unregistered property is handled correctly."); </script> diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/nested-scrollIntoView-snaps.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/nested-scrollIntoView-snaps.html new file mode 100644 index 00000000000..b335de2c7f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/nested-scrollIntoView-snaps.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +div { + position: absolute; +} +:root { + overflow: scroll; + scroll-snap-type: both mandatory; +} +.scroller { + overflow: scroll; + scroll-snap-type: both mandatory; + padding: 0px; +} +#outer { + left: 1000px; + top: 1000px; + width: 600px; + height: 600px; +} +#out-snap-1 { + scroll-snap-align: start; + left: 1200px; + top: 1200px; + width: 10px; + height: 10px; +} +#out-snap-2 { + scroll-snap-align: start; + left: 1100px; + top: 1100px; + width: 10px; + height: 10px; +} +#inner { + left: 1000px; + top: 1000px; + width: 400px; + height: 400px; +} +.space { + left: 0px; + top: 0px; + width: 3000px; + height: 3000px; +} +#target { + scroll-snap-align: end; + left: 800px; + top: 800px; + width: 200px; + height: 200px; +} +</style> + +<div class="space"></div> +<div id="out-snap-1"></div> +<div id="out-snap-2"></div> +<div class="scroller" id="outer"> + <div class="space"></div> + <div class="scroller" id="inner"> + <div class="space"></div> + <div id="target"></div> + </div> +</div> + +<script> +var outer = document.getElementById("outer"); +var inner = document.getElementById("inner"); +var target = document.getElementById("target"); + +test(() => { + assert_equals(window.scrollX, 0); + assert_equals(window.scrollY, 0); + assert_equals(outer.scrollLeft, 0); + assert_equals(outer.scrollTop, 0); + assert_equals(inner.scrollLeft, 0); + assert_equals(inner.scrollTop, 0); + + target.scrollIntoView({inline: "start", block: "start"}); + // Although the scrollIntoView specified "start" as the alignment, the target + // has "end" as its snap-alignment. So the inner scroller finishes with "end" + // alignment + assert_equals(inner.scrollLeft, 1000 - inner.clientWidth, "ScrollIntoView lands on the target's snap position regardless of the specified alignment."); + assert_equals(inner.scrollTop, 1000 - inner.clientHeight, "ScrollIntoView lands on the target's snap position regardless of the specified alignment."); + + // Since there is no snap points defined in the outer scroller, the outer + // scroller finishes with "start" alignment, as specified in scrollIntoView. + // Note that the "start" alignment aligns the target's top-left corner + //(inner.left + inner.clientWidth - target.width, inner.top + inner.clientHeight - target.height) + // with the outer scroller's top-left corner. + assert_equals(outer.scrollLeft, 800 + inner.clientWidth, "ScrollIntoView ends with the specified alignment if no snap position is specified."); + assert_equals(outer.scrollTop, 800 + inner.clientHeight, "ScrollIntoView ends with the specified alignment if no snap position is specified."); + + // Although the scrollIntoView specified "start" as the alignment, the window + // has two other elements with snap points. So the window finishes with the + // closest snap point. + assert_equals(window.scrollX, 1100, "ScrollIntoView lands on the snap position closest to the specified alignment."); + assert_equals(window.scrollY, 1100, "ScrollIntoView lands on the snap position closest to the specified alignment."); +}, "All the scrollers affected by scrollIntoView should land on a snap position if one exists. Otherwise, land according to the specified alignment"); +</script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-001.html b/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-001.html index e4a7ef4a385..608d4853a24 100644 --- a/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-001.html +++ b/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-001.html @@ -1,14 +1,14 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Text Test: overflow-wrap: break-word and intrinsic sizing</title> +<title>CSS Text Test: overflow-wrap: anywhere and intrinsic sizing</title> <link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/"> <link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property"> <meta name="flags" content=""> <link rel="match" href="reference/overflow-wrap-min-content-size-001-ref.html"> -<meta name="assert" content="Soft wrap opportunities introduced by overflow-wrap:break-word **are** considered when calculating min-content intrinsic sizes."> +<meta name="assert" content="Soft wrap opportunities introduced by overflow-wrap:anywhere **are** considered when calculating min-content intrinsic sizes."> <style> table { - overflow-wrap: break-word; + overflow-wrap: anywhere; max-width: 0; border: 0; border-collapse: collapse; diff --git a/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html b/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html index 5b3b1f19d7a..52f34023b82 100644 --- a/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html +++ b/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html @@ -1,16 +1,16 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Text Test: overflow-wrap: break-word and intrinsic sizing</title> +<title>CSS Text Test: overflow-wrap: anywhere and intrinsic sizing</title> <link rel="author" title="Xidorn Quan" href="https://www.upsuper.org/"> <link rel="author" title="Mozilla" href="https://www.mozilla.org/"> <link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property"> <meta name="flags" content=""> <link rel="match" href="reference/overflow-wrap-min-content-size-002-ref.html"> -<meta name="assert" content="overflow-wrap:break-word doesn't break grapheme cluster and min-content intrinsic size should take that into account."> +<meta name="assert" content="overflow-wrap:anywhere doesn't break grapheme cluster and min-content intrinsic size should take that into account."> <style> #wrapper { width: 0px; - overflow-wrap: break-word; + overflow-wrap: anywhere; } #test { float: left; diff --git a/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html b/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html index d1af28ffad4..43dc1767856 100644 --- a/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html +++ b/tests/wpt/web-platform-tests/css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html @@ -1,17 +1,17 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Text Test: overflow-wrap: break-word and intrinsic sizing</title> +<title>CSS Text Test: overflow-wrap: anywhere and intrinsic sizing</title> <link rel="author" title="Xidorn Quan" href="https://www.upsuper.org/"> <link rel="author" title="Mozilla" href="https://www.mozilla.org/"> <link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property"> <meta name="flags" content="ahem"> <link rel="match" href="reference/overflow-wrap-min-content-size-003-ref.html"> -<meta name="assert" content="overflow-wrap:break-word breaks at edge of inline elements."> +<meta name="assert" content="overflow-wrap:anywhere breaks at edge of inline elements."> <style> #wrapper { width: 0px; font: 16px / 1 Ahem; - overflow-wrap: break-word; + overflow-wrap: anywhere; color: green; } #test { diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-002.html b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-002.html index c0db9e67110..e42bd32f938 100644 --- a/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-002.html +++ b/tests/wpt/web-platform-tests/css/css-text/white-space/pre-wrap-002.html @@ -1,6 +1,6 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on word-break:break-all</title> +<title>CSS Text level 3 Test: preserved white space at the end of the line and white-space:pre-wrap does not change based on word-break:break-all</title> <link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/"> <link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2"> <link rel="match" href="reference/pre-wrap-001-ref.html"> diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/reference/tab-stop-threshold-001-ref.html b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/tab-stop-threshold-001-ref.html new file mode 100644 index 00000000000..5694dd2f526 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/tab-stop-threshold-001-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test reference</title> +<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/"> +<style> +div { + white-space: pre; + font-family: monospace; +} +</style> + +<p>Test passes if the 4 letters bellow are vertically aligned. +<div> P</div> +<div> A</div> +<div> S</div> +<div> S</div> diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/reference/tab-stop-threshold-002-ref.html b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/tab-stop-threshold-002-ref.html new file mode 100644 index 00000000000..35c568bbcac --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/white-space/reference/tab-stop-threshold-002-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS test reference</title> +<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/"> +<style> +div { + white-space: pre; + font-family: monospace; + tab-size: 8; /* the initial value, but since we're measuring against it, we might as well be sure */ +} +</style> +<p>Test passes if the 4 letters bellow are vertically aligned. +<div> P</div> +<div> A</div> +<div> S</div> +<div> S</div> diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/tab-stop-threshold-001.html b/tests/wpt/web-platform-tests/css/css-text/white-space/tab-stop-threshold-001.html new file mode 100644 index 00000000000..dae6012bf7f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/white-space/tab-stop-threshold-001.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Text level 3 Test: the nearest tab stop is more than 0.5 ch away</title> +<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#tab-size-property"> +<link rel="match" href="reference/tab-stop-threshold-001-ref.html"> +<meta name="assert" content="A preserved tab pushes to the nearest tap stop as long as we're not closer to it than 0.5ch."> +<style> +div { + white-space: pre; + font-family: monospace; + tab-size: 8; /* the initial value, but since we're measuring against it, we might as well be sure */ +} +span { display: inline-block; } +#s1 { width: 6ch; } +#s2 { width: 7ch; } +#s3 { width: 7.3ch; } +</style> + +<p>Test passes if the 4 letters bellow are vertically aligned. +<div><span id=s1></span>	P</div> +<div><span id=s2></span>	A</div> +<div><span id=s3></span>	S</div> +<div> S</div> diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/tab-stop-threshold-002.html b/tests/wpt/web-platform-tests/css/css-text/white-space/tab-stop-threshold-002.html new file mode 100644 index 00000000000..1147e4b0411 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/white-space/tab-stop-threshold-002.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Text level 3 Test: the nearest tab stop is less than 0.5 ch away</title> +<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#tab-size-property"> +<link rel="match" href="reference/tab-stop-threshold-002-ref.html"> +<meta name="assert" content="A preserved tab pushes to the tab stop after the nearest one as long as we're closer to the nearest one than 0.5ch."> +<style> +div { + white-space: pre; + font-family: monospace; + tab-size: 8; /* the initial value, but since we're measuring against it, we might as well be sure */ +} +span { display: inline-block; } +#s1 { width: 7.6ch; } +#s2 { width: 7.8ch; } +#s3 { width: 7.9ch; } +</style> + +<p>Test passes if the 4 letters bellow are vertically aligned. +<div><span id=s1></span>	P</div> +<div><span id=s2></span>	A</div> +<div><span id=s3></span>	S</div> +<div> S</div> diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/rotate-parsing-valid.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/rotate-parsing-valid.html index c82f6be8c5d..63243b5e985 100644 --- a/tests/wpt/web-platform-tests/css/css-transforms/parsing/rotate-parsing-valid.html +++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/rotate-parsing-valid.html @@ -19,14 +19,17 @@ test_valid_value("rotate", "0deg"); test_valid_value("rotate", "100 200 300 400grad"); test_valid_value("rotate", "400grad 100 200 300", "100 200 300 400grad"); -test_valid_value("rotate", "x 400grad", "1 0 0 400grad"); -test_valid_value("rotate", "400grad x", "1 0 0 400grad"); +test_valid_value("rotate", "x 400grad"); +test_valid_value("rotate", "400grad x", "x 400grad"); +test_valid_value("rotate", "1 0 0 400grad", "x 400grad"); -test_valid_value("rotate", "y 400grad", "0 1 0 400grad"); -test_valid_value("rotate", "400grad y", "0 1 0 400grad"); +test_valid_value("rotate", "y 400grad"); +test_valid_value("rotate", "400grad y", "y 400grad"); +test_valid_value("rotate", "0 1 0 400grad", "y 400grad"); -test_valid_value("rotate", "z 400grad", "0 0 1 400grad"); -test_valid_value("rotate", "400grad z", "0 0 1 400grad"); +test_valid_value("rotate", "z 400grad"); +test_valid_value("rotate", "400grad z", "z 400grad"); +test_valid_value("rotate", "0 0 1 400grad", "z 400grad"); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/translate-parsing-valid.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/translate-parsing-valid.html index fe16d545e1f..e000f6a7f57 100644 --- a/tests/wpt/web-platform-tests/css/css-transforms/parsing/translate-parsing-valid.html +++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/translate-parsing-valid.html @@ -17,9 +17,12 @@ test_valid_value("translate", "none"); test_valid_value("translate", "0px"); test_valid_value("translate", "100%"); +test_valid_value("translate", "100px 0px", "100px"); +test_valid_value("translate", "100px 0%", "100px"); test_valid_value("translate", "100px 200%"); test_valid_value("translate", "100% 200px"); +test_valid_value("translate", "100px 200px 0px"); test_valid_value("translate", "100px 200px 300px"); test_valid_value("translate", "100% 200% 300px"); diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transforms-support-calc.html b/tests/wpt/web-platform-tests/css/css-transforms/transforms-support-calc.html index 71a046f56b0..1ad1bcc4b68 100644 --- a/tests/wpt/web-platform-tests/css/css-transforms/transforms-support-calc.html +++ b/tests/wpt/web-platform-tests/css/css-transforms/transforms-support-calc.html @@ -31,7 +31,7 @@ test(function(){ target.style = 'translate: calc(30px + 20%) calc(-200px + 100%);'; - assert_equals(getComputedStyle(target).translate, 'calc(30px + 20%) calc(-200px + 100%)'); + assert_equals(getComputedStyle(target).translate, 'calc(20% + 30px) calc(100% - 200px)'); }, 'translate supports calc'); test(function(){ diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-background-color-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-background-color-ref.html new file mode 100644 index 00000000000..44dd8d44d64 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-background-color-ref.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Basic operation of filter with background color</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> + + + +<div> + <p>Expected: A green box and an overlapping blue box, with a purple<br> + overlapping region.</p> +</div> +<div class="colorbox"></div> +<div class="box2outside"></div> +<div class="box2inside"></div> + +<style> +.colorbox { + position: absolute; + background: green; + width: 100px; + height: 100px; + left: 10px; + top: 100px; +} +.box2outside { + background: #000080; + position: absolute; + width: 100px; + height: 100px; + left: 60px; + top: 150px; +} +.box2inside { + background: #8040ff; + position: absolute; + width: 50px; + height: 50px; + left: 60px; + top: 150px; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-background-color.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-background-color.html new file mode 100644 index 00000000000..c8d1a3ede5d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-background-color.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Basic operation of filter with background color</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-basic-background-color-ref.html"> + +<div> + <p>Expected: A green box and an overlapping blue box, with a purple<br> + overlapping region.</p> +</div> +<div class="colorbox"> + <div class="filterbox"></div> +</div> + +<style> +.colorbox { + position: absolute; + background: green; + width: 100px; + height: 100px; + left: 10px; + top: 100px; +} +.filterbox { + position: absolute; + width: 100px; + height: 100px; + left: 50px; + top: 50px; + -webkit-backdrop-filter: invert(1); + backdrop-filter: invert(1); + opacity: 0.5; + background: blue; +} +</style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-opacity-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-opacity-ref.html new file mode 100644 index 00000000000..26d7715e15f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-opacity-ref.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Basic operation of filter with opacity</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> + + + +<div> + <p>Expected: A green box and an overlapping black box, with a magenta<br> + overlapping region.</p> +</div> +<div class="colorbox"></div> +<div class="box2outside"></div> +<div class="box2inside"></div> + +<style> +.colorbox { + position: absolute; + background: green; + width: 100px; + height: 100px; + left: 10px; + top: 100px; +} +.box2outside { + background: black; + position: absolute; + width: 100px; + height: 100px; + left: 60px; + top: 150px; +} +.box2inside { + background: #ff7fff; + position: absolute; + width: 50px; + height: 50px; + left: 60px; + top: 150px; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-opacity.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-opacity.html new file mode 100644 index 00000000000..23e40a7ccdd --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-opacity.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Basic operation of filter with opacity</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-basic-opacity-ref.html"> + +<div> + <p>Expected: A green box and an overlapping black box, with a magenta<br> + overlapping region.</p> +</div> +<div class="colorbox"> + <div class="filterbox"></div> +</div> + +<style> +.colorbox { + position: absolute; + background: green; + width: 100px; + height: 100px; + left: 10px; + top: 100px; +} +.filterbox { + position: absolute; + width: 100px; + height: 100px; + left: 50px; + top: 50px; + -webkit-backdrop-filter: invert(1); + backdrop-filter: invert(1); + opacity: 0.5; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-ref.html new file mode 100644 index 00000000000..049e7c888dc --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic-ref.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Basic operation of filter</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> + + + +<div> + <p>Expected: A green box and an overlapping black box, with a magenta<br> + overlapping region.</p> +</div> +<div class="colorbox"></div> +<div class="box2outside"></div> +<div class="box2inside"></div> + +<style> +.colorbox { + position: absolute; + background: green; + width: 100px; + height: 100px; + left: 10px; + top: 100px; +} +.box2outside { + background: black; + position: absolute; + width: 100px; + height: 100px; + left: 60px; + top: 150px; +} +.box2inside { + background: #ff7fff; + position: absolute; + width: 50px; + height: 50px; + left: 60px; + top: 150px; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic.html new file mode 100644 index 00000000000..8f24c9b44a4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-basic.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Basic operation of filter</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-basic-ref.html"> + +<div> + <p>Expected: A green box and an overlapping black box, with a magenta<br> + overlapping region.</p> +</div> +<div class="colorbox"> + <div class="filterbox"></div> +</div> + +<style> +.colorbox { + position: absolute; + background: green; + width: 100px; + height: 100px; + left: 10px; + top: 100px; +} +.filterbox { + position: absolute; + width: 100px; + height: 100px; + left: 50px; + top: 50px; + -webkit-backdrop-filter: invert(1); + backdrop-filter: invert(1); + opacity: 1.0; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-border-radius-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-border-radius-ref.html new file mode 100644 index 00000000000..eabcd996697 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-border-radius-ref.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Should clip using border radius.</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> + + + +<div style="opacity: 0.9999;"> + <div class="circle outside"></div> + <div class="circle inside"></div> +</div> + + +<style> +div { + position: absolute; + width: 100px; + height: 100px; + top: 10px; + left: 10px; + background: green; +} +.circle { + top: 30px; + left: 30px; + border-radius: 50px; + background: yellow; + will-change: transform; +} +.inside { + background: #ffd94d; + clip-path: inset(0px 30px 30px 0px); + will-change: transform; +} +.outside { + background: #ffff4d; + will-change: transform; +} +</style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-border-radius.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-border-radius.html new file mode 100644 index 00000000000..d6d1f4b8130 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-border-radius.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Should clip using border radius.</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-border-radius-ref.html"> + +<div style="opacity: 0.9999;"> + <div class="circle filter"></div> + +</div> + + +<style> +div { + position: absolute; + width: 100px; + height: 100px; + top: 10px; + left: 10px; + background: green; +} +.circle { + top: 30px; + left: 30px; + border-radius: 50px; + background: yellow; + will-change: transform; +} +.filter { + opacity: 0.7; + -webkit-backdrop-filter: invert(1); + backdrop-filter: invert(1); +} +</style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation-isolate.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation-isolate.html new file mode 100644 index 00000000000..dba157c87c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation-isolate.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Should not filter outside parent stacking context.</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-isolation-ref.html"> + +<div class="outside"> + <div class="stacking-context"> + <div class="filter"> + </div> + </div> +</div> + + +<style> +div { + position: absolute; + width: 100px; + height: 100px; + background: green; +} +.outside { + top: 10px; + left: 10px; +} +.stacking-context { + isolation: isolate; + top: 0px; + left: 120px; +} +.filter { + width: 160px; + height: 160px; + top: 30px; + left: -90px; + opacity: 0.3; + -webkit-backdrop-filter: invert(1); + backdrop-filter: invert(1); + background: yellow; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation-ref.html new file mode 100644 index 00000000000..58f5a7ec1ed --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation-ref.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Should not filter outside parent stacking context.</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> + + + +<div class="outside"> + <div class="stacking-context"> + <div class="filter"> + </div> + </div> +</div> +<div style="background:#ffa5b2;width:70px;height:70px;top:40px;left:130px;"></div> + +<style> +div { + position: absolute; + width: 100px; + height: 100px; + background: green; +} +.outside { + top: 10px; + left: 10px; +} +.stacking-context { + will-change: transform; + top: 0px; + left: 120px; +} +.filter { + width: 160px; + height: 160px; + top: 30px; + left: -90px; + opacity: 0.3; + will-change: transform; + background: yellow; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation.html b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation.html new file mode 100644 index 00000000000..dc7bd107c32 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/backdrop-filter-isolation.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>backdrop-filter: Should not filter outside parent stacking context.</title> +<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty"> +<link rel="match" href="backdrop-filter-isolation-ref.html"> + +<div class="outside"> + <div class="stacking-context"> + <div class="filter"> + </div> + </div> +</div> + + +<style> +div { + position: absolute; + width: 100px; + height: 100px; + background: green; +} +.outside { + top: 10px; + left: 10px; +} +.stacking-context { + opacity: 0.9999; + top: 0px; + left: 120px; +} +.filter { + width: 160px; + height: 160px; + top: 30px; + left: -90px; + opacity: 0.3; + -webkit-backdrop-filter: invert(1); + backdrop-filter: invert(1); + background: yellow; +} +</style> + diff --git a/tests/wpt/web-platform-tests/css/css-filter/blur-clip-stacking-context-001.html b/tests/wpt/web-platform-tests/css/filter-effects/blur-clip-stacking-context-001.html index a96994a8afe..a96994a8afe 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/blur-clip-stacking-context-001.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/blur-clip-stacking-context-001.html diff --git a/tests/wpt/web-platform-tests/css/css-filter/blur-clip-stacking-context-002.html b/tests/wpt/web-platform-tests/css/filter-effects/blur-clip-stacking-context-002.html index 0473f129494..0473f129494 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/blur-clip-stacking-context-002.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/blur-clip-stacking-context-002.html diff --git a/tests/wpt/web-platform-tests/css/css-filter/blur-clip-stacking-context-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/blur-clip-stacking-context-ref.html index 82b907334fd..82b907334fd 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/blur-clip-stacking-context-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/blur-clip-stacking-context-ref.html diff --git a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-combined-001.html b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-combined-001.html index 5b37d57f49e..874f6e4a507 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-combined-001.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-combined-001.html @@ -28,7 +28,7 @@ saturate(0%) hue-rotate(90deg) invert(100%) - opacity(100%) + opacity(0%) } 100% { filter: none; diff --git a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow-ref.html index e1802341f74..d6be73bcbdc 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow-ref.html @@ -10,7 +10,7 @@ width: 100px; height: 100px; background: blue; - filter: drop-shadow(15px 15px 0px gray); + filter: drop-shadow(15px 15px 0px rgba(0, 0, 0, 0.5)); } </style> </head> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow.html b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow.html index e27bf433907..9496bdb234d 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-drop-shadow.html @@ -9,7 +9,7 @@ <link rel="help" href="http://www.w3.org/TR/filter-effects-1/#funcdef-drop-shadow"> <link rel="help" href="http://www.w3.org/TR/css3-animations/#animations"> <link rel="match" href="css-filters-animation-drop-shadow-ref.html"> - <meta name="assert" content="The blue square should be in top of a gray one"> + <meta name="assert" content="The blue square should be on top of a gray one"> <style type="text/css"> @keyframes animate { 0% { diff --git a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-hue-rotate.html b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-hue-rotate.html index 7c55b5011df..1ebf2778bf8 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-hue-rotate.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-hue-rotate.html @@ -26,7 +26,7 @@ background: blue; animation-name: animate; animation-play-state: paused; - animation-delay: -1s; + animation-delay: -2s; animation-duration: 4s; animation-timing-function: linear; } diff --git a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-saturate.html b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-saturate.html index ed5207f457e..63de30aa891 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-saturate.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/css-filters-animation-saturate.html @@ -13,7 +13,7 @@ <style type="text/css"> @keyframes animate { 0% { - filter: saturate(5000%); + filter: saturate(4900%); } 100% { filter: none; diff --git a/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type-ref.html index bba0c091a29..182b4b547c0 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type-ref.html @@ -9,7 +9,7 @@ div{ width: 200px; height: 200px; - background-color: #a8d7c1; + background-color: rgba(39.3%, 68.6%, 53.4%, 1); } </style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type.html b/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type.html index 8caaede02f2..5d003f7f9c5 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/fecolormatrix-type.html @@ -28,7 +28,7 @@ <div></div> <svg> - <filter id="sepia"> + <filter id="sepia" color-interpolation-filters="sRGB"> <feColorMatrix type="matrix" values="0.393 0.189 0.349 0 0 0.686 0.168 0.272 0 0 0.534 0.131 0 0 0 diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-contrast-003.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-contrast-003.html index 8b324c770d5..255c4a02895 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-contrast-003.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-contrast-003.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <html> <head> - <title>CSS Filter contrast: Test for CSS contrast filter shotrhand</title> + <title>CSS Filter contrast: Test for CSS contrast filter shorthand</title> <link rel="author" title="Takeshi Kurosawa" href="mailto:taken.spc@gmail.com"> <link rel="reviewer" title="Dirk Schulze" href="mailto:dschulze@adobe.com"> <link rel="help" href="http://www.w3.org/TR/filter-effects-1/#FilterProperty"> @@ -14,7 +14,7 @@ div { width: 200px; height: 200px; - background-color: #400000; + background-color: #3f0000; filter: contrast(200%); } </style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-ref.html index 915cccd07f4..794674da484 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-ref.html @@ -8,7 +8,7 @@ div { width: 200px; height: 200px; - background: #00b60d; + background: rgb(0%, 46.896%, 0.396%); } </style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-test.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-test.html index c84c0524fc4..ecef5571750 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-test.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-external-001-test.html @@ -26,7 +26,7 @@ <div></div> <svg> - <filter id="filter"> + <filter id="filter" color-interpolation-filters="sRGB"> <feColorMatrix type="hueRotate" in="SourceGraphic" values="150"/> </filter> </svg> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-002-filter.svg b/tests/wpt/web-platform-tests/css/filter-effects/filter-external-002-filter.svg deleted file mode 100644 index 638f5331f02..00000000000 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-002-filter.svg +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg"> - <filter id="filter"> - <feColorMatrix type="hueRotate" in="SourceGraphic" values="120"/> - </filter> -</svg>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-002-test.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-external-002-test.html index 65475b40219..cb2d6554a08 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-external-002-test.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-external-002-test.html @@ -15,7 +15,7 @@ width: 200px; height: 200px; background: red; - filter: url( filter-external-002-filter.svg#filter ); + filter: url( support/filter-external-002-filter.svg#filter ); } </style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-001.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-001.html index 7027ee06fd9..c6fc1be727c 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-001.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-001.html @@ -22,9 +22,9 @@ </style> </head> <body> - <p>The test passes if the little box looks grey. (and not blue)</p> + <p>The test passes if the little box looks grey.</p> <div class="testzone"> <div class="box filter"></div> </div> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-004.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-004.html index b63d9c211c1..8b7d11a42ae 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-004.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-004.html @@ -22,9 +22,9 @@ </style> </head> <body> - <p>The test passes if the little box looks grey. (and not blue)</p> + <p>The test passes if the little box looks grey.</p> <div class="testzone"> <div class="box filter"></div> </div> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-005.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-005.html index 110ce4d554c..0aa4a3b6bdc 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-005.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-005.html @@ -22,9 +22,9 @@ </style> </head> <body> - <p>The test passes if the little box looks grey. (and not blue)</p> + <p>The test passes if the little box looks grey.</p> <div class="testzone"> <div class="box filter"></div> </div> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-ref.html index 72700c2fe96..beaa72aaa3c 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filter-grayscale-ref.html @@ -16,9 +16,9 @@ </style> </head> <body> - <p>The test passes if the little box looks grey. (and not blue)</p> + <p>The test passes if the little box looks grey.</p> <div class="testzone"> <div class="box"></div> </div> </body> -</html>
\ No newline at end of file +</html> diff --git a/tests/wpt/web-platform-tests/css/css-filter/filtered-block-is-container-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/filtered-block-is-container-ref.html index fc9467f8717..fc9467f8717 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/filtered-block-is-container-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filtered-block-is-container-ref.html diff --git a/tests/wpt/web-platform-tests/css/css-filter/filtered-block-is-container.html b/tests/wpt/web-platform-tests/css/filter-effects/filtered-block-is-container.html index 6f99f364e63..6f99f364e63 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/filtered-block-is-container.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filtered-block-is-container.html diff --git a/tests/wpt/web-platform-tests/css/css-filter/filtered-html-is-not-container-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/filtered-html-is-not-container-ref.html index c1f179a676a..c1f179a676a 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/filtered-html-is-not-container-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filtered-html-is-not-container-ref.html diff --git a/tests/wpt/web-platform-tests/css/css-filter/filtered-html-is-not-container.html b/tests/wpt/web-platform-tests/css/filter-effects/filtered-html-is-not-container.html index 8adc302f31c..8adc302f31c 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/filtered-html-is-not-container.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filtered-html-is-not-container.html diff --git a/tests/wpt/web-platform-tests/css/css-filter/filtered-inline-is-container-ref.html b/tests/wpt/web-platform-tests/css/filter-effects/filtered-inline-is-container-ref.html index aa6c12e33b5..aa6c12e33b5 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/filtered-inline-is-container-ref.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filtered-inline-is-container-ref.html diff --git a/tests/wpt/web-platform-tests/css/css-filter/filtered-inline-is-container.html b/tests/wpt/web-platform-tests/css/filter-effects/filtered-inline-is-container.html index 56f1d91ff90..56f1d91ff90 100644 --- a/tests/wpt/web-platform-tests/css/css-filter/filtered-inline-is-container.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filtered-inline-is-container.html diff --git a/tests/wpt/web-platform-tests/css/filter-effects/filters-test-brightness-003.html b/tests/wpt/web-platform-tests/css/filter-effects/filters-test-brightness-003.html index 9ecef28aa54..69a7d54a7f8 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/filters-test-brightness-003.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/filters-test-brightness-003.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <html> <head> - <title>CSS Writing Modes Test: drop-shadow offset test</title> + <title>CSS Filter Effects: brightness(...) without argument</title> <link rel="author" title="Jun Ichikawa" href="mailto:jun1ka0@gmail.com"> <link rel="reviewer" title="Dirk Schulze" href="mailto:dschulze@adobe.com"> <link rel="help" href="http://www.w3.org/TR/filter-effects-1/#FilterProperty"> @@ -16,6 +16,7 @@ width: 200px; height: 200px; background-color: rgb(0, 255, 0); + filter: brightness(0); filter: brightness(); } </style> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/support/filter-external-002-filter.svg b/tests/wpt/web-platform-tests/css/filter-effects/support/filter-external-002-filter.svg new file mode 100644 index 00000000000..0d5fc65c6fd --- /dev/null +++ b/tests/wpt/web-platform-tests/css/filter-effects/support/filter-external-002-filter.svg @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg"> + <filter id="filter" color-interpolation-filters="sRGB"> + <feColorMatrix type="hueRotate" in="SourceGraphic" values="150"/> + </filter> +</svg> diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md b/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md index e7e53e4c3b6..5d23e253946 100644 --- a/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md +++ b/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md @@ -434,7 +434,7 @@ is called, the two conditions above apply like normal. Dedicated and shared workers don't have an event that corresponds to the `load` event in a document. Therefore these worker tests always behave as if the `explicit_done` property is set to true. Service workers depend on the -[install](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#service-worker-global-scope-install-event) +[install](https://w3c.github.io/ServiceWorker/#service-worker-global-scope-install-event) event which is fired following the completion of [running the worker](https://html.spec.whatwg.org/multipage/workers.html#run-a-worker). @@ -610,7 +610,7 @@ capable of accessing the browsing context as either an ancestor or opener. The `testharness.js` script can be used from within [dedicated workers, shared workers](https://html.spec.whatwg.org/multipage/workers.html) and [service -workers](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/). +workers](https://w3c.github.io/ServiceWorker/). Testing from a worker script is different from testing from an HTML document in several ways: @@ -637,7 +637,7 @@ several ways: complete](#determining-when-all-tests-are-complete)). So these worker tests behave as if they were started with the `explicit_done` option. Service workers depend on the - [oninstall](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#service-worker-global-scope-install-event) + [oninstall](https://w3c.github.io/ServiceWorker/#service-worker-global-scope-install-event) event and don't require an explicit `done` call. Here's an example that uses a dedicated worker. @@ -674,7 +674,7 @@ fetch_tests_from_worker(new Worker("worker.js")); The argument to the `fetch_tests_from_worker` function can be a [`Worker`](https://html.spec.whatwg.org/multipage/workers.html#dedicated-workers-and-the-worker-interface), a [`SharedWorker`](https://html.spec.whatwg.org/multipage/workers.html#shared-workers-and-the-sharedworker-interface) -or a [`ServiceWorker`](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-obj). +or a [`ServiceWorker`](https://w3c.github.io/ServiceWorker/#serviceworker-interface). Once called, the containing document fetches all the tests from the worker and behaves as if those tests were running in the containing document itself. diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.html Binary files differindex 79679cac759..db551fa8947 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.html +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.html diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xml Binary files differindex 399c35af827..c97662aa163 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xml +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xml diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.html Binary files differindex fa2d3fe4a7d..fe32ab0408c 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.html +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.html diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xml Binary files differindex a237e853a08..f704501ccae 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xml +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xml diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.html Binary files differindex 5648fca2835..432b96f26a0 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.html +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.html diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xml Binary files differindex 8f5e8cba400..f896b511c71 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xml +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xml diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.html Binary files differindex eda12372134..2de355aab17 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.html +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.html diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xml Binary files differindex a9a7bf96e6e..465f44df5f7 100644 --- a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xml +++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xml diff --git a/tests/wpt/web-platform-tests/encoding/utf-32-from-win1252.html b/tests/wpt/web-platform-tests/encoding/utf-32-from-win1252.html new file mode 100644 index 00000000000..7b4a3d0c956 --- /dev/null +++ b/tests/wpt/web-platform-tests/encoding/utf-32-from-win1252.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<meta charset=windows-1252> +<title>Character Decoding: UTF-32 (not supported) subresource of windows-1252 document</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + +// Since UTF-32 is not supported: +// * HTML resources will use the parent encoding (windows-1252) +// * XML resources will default to UTF-8 +// ... except for the UTF-32LE-with-BOM case, where the UTF-32 +// BOM will be mistaken for a UTF-16LE BOM (FF FE 00 00), in which +// case it will be interpreted as UTF-16LE. + +const samples = [ + {file: 'resources/utf-32-big-endian-bom.html', + characterSet: 'windows-1252', + contentType: 'text/html' + }, + {file: 'resources/utf-32-big-endian-bom.xml', + characterSet: 'UTF-8', + contentType: 'application/xml' + }, + {file: 'resources/utf-32-big-endian-nobom.html', + characterSet: 'windows-1252', + contentType: 'text/html' + }, + {file: 'resources/utf-32-big-endian-nobom.xml', + characterSet: 'UTF-8', + contentType: 'application/xml' + }, + + {file: 'resources/utf-32-little-endian-bom.html', + characterSet: 'UTF-16LE', + contentType: 'text/html' + }, + {file: 'resources/utf-32-little-endian-bom.xml', + characterSet: 'UTF-16LE', + contentType: 'application/xml' + }, + {file: 'resources/utf-32-little-endian-nobom.html', + characterSet: 'windows-1252', + contentType: 'text/html' + }, + {file: 'resources/utf-32-little-endian-nobom.xml', + characterSet: 'UTF-8', + contentType: 'application/xml' + } +]; + +samples.forEach(expected => async_test(t => { + const iframe = document.createElement('iframe'); + iframe.src = expected.file; + iframe.onload = t.step_func_done(() => { + const doc = iframe.contentDocument; + assert_equals(doc.contentType, expected.contentType); + assert_equals(doc.characterSet, expected.characterSet); + // The following is a little quirky as non-well-formed XML isn't defined in sufficient detail to + // be able to use more precise assertions. + assert_true( + !('dataset' in doc.documentElement) || + doc.documentElement.dataset['parsed'] !== 'yes', + 'Should not have parsed as (X)HTML'); + }); + document.body.appendChild(iframe); + t.add_cleanup(() => iframe.remove()); +}, `Expect ${expected.file} to parse as ${expected.characterSet}`)); + +</script> +</body> diff --git a/tests/wpt/web-platform-tests/encoding/utf-32.html b/tests/wpt/web-platform-tests/encoding/utf-32.html index 7b173055d35..ec72eb6fbf6 100644 --- a/tests/wpt/web-platform-tests/encoding/utf-32.html +++ b/tests/wpt/web-platform-tests/encoding/utf-32.html @@ -1,37 +1,71 @@ <!DOCTYPE html> -<title>Character Decoding: UTF-32 (not supported)</title> +<meta charset=utf-8> +<title>Character Decoding: UTF-32 (not supported) subresource of UTF-8 document</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <body> <script> -// Since UTF-32 is not supported, such content will be interpreted -// as the default HTML encoding (windows-1252) unless it has a -// leading little endian BOM (FF FE 00 00), in which case it will -// be interpreted as UTF-16LE. +// Since UTF-32 is not supported: +// * HTML resources will use the parent encoding (UTF-8) +// * XML resources will default to UTF-8 +// ... except for the UTF-32LE-with-BOM case, where the UTF-32 +// BOM will be mistaken for a UTF-16LE BOM (FF FE 00 00), in which +// case it will be interpreted as UTF-16LE. const samples = [ - {file: 'resources/utf-32-big-endian-bom.html', expected: 'windows-1252'}, - {file: 'resources/utf-32-big-endian-bom.xml', expected: 'windows-1252'}, - {file: 'resources/utf-32-big-endian-nobom.html', expected: 'windows-1252'}, - {file: 'resources/utf-32-big-endian-nobom.xml', expected: 'windows-1252'}, + {file: 'resources/utf-32-big-endian-bom.html', + characterSet: 'UTF-8', + contentType: 'text/html' + }, + {file: 'resources/utf-32-big-endian-bom.xml', + characterSet: 'UTF-8', + contentType: 'application/xml' + }, + {file: 'resources/utf-32-big-endian-nobom.html', + characterSet: 'UTF-8', + contentType: 'text/html' + }, + {file: 'resources/utf-32-big-endian-nobom.xml', + characterSet: 'UTF-8', + contentType: 'application/xml' + }, - {file: 'resources/utf-32-little-endian-bom.html', expected: 'UTF-16LE'}, - {file: 'resources/utf-32-little-endian-bom.xml', expected: 'UTF-16LE'}, - {file: 'resources/utf-32-little-endian-nobom.html', expected: 'windows-1252'}, - {file: 'resources/utf-32-little-endian-nobom.xml', expected: 'windows-1252'} + {file: 'resources/utf-32-little-endian-bom.html', + characterSet: 'UTF-16LE', + contentType: 'text/html' + }, + {file: 'resources/utf-32-little-endian-bom.xml', + characterSet: 'UTF-16LE', + contentType: 'application/xml' + }, + {file: 'resources/utf-32-little-endian-nobom.html', + characterSet: 'UTF-8', + contentType: 'text/html' + }, + {file: 'resources/utf-32-little-endian-nobom.xml', + characterSet: 'UTF-8', + contentType: 'application/xml' + } ]; -samples.forEach(sample => async_test(t => { +samples.forEach(expected => async_test(t => { const iframe = document.createElement('iframe'); - iframe.src = sample.file; - iframe.onload = t.step_func(() => { - assert_equals(iframe.contentDocument.characterSet, sample.expected); - t.done(); + iframe.src = expected.file; + iframe.onload = t.step_func_done(() => { + const doc = iframe.contentDocument; + assert_equals(doc.contentType, expected.contentType); + assert_equals(doc.characterSet, expected.characterSet); + // The following is a little quirky as non-well-formed XML isn't defined in sufficient detail to + // be able to use more precise assertions. + assert_true( + !('dataset' in doc.documentElement) || + doc.documentElement.dataset['parsed'] !== 'yes', + 'Should not have parsed as (X)HTML'); }); document.body.appendChild(iframe); t.add_cleanup(() => iframe.remove()); -}, `Expect ${sample.file} to parse as ${sample.expected}`)); +}, `Expect ${expected.file} to parse as ${expected.characterSet}`)); </script> </body> diff --git a/tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html b/tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html index e36b821c9d3..695ccc47c37 100644 --- a/tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html +++ b/tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html @@ -23,9 +23,10 @@ promise_test(t => filesPromise.then(files => { (a, b) => a.name < b.name ? -1 : b.name < a.name ? 1 : 0); assert_equals(files[0].name, '1.txt'); assert_equals(files[1].name, '2.txt'); - assert_equals(files[0].webkitRelativePath, 'c/d/1.txt'); - assert_equals(files[1].webkitRelativePath, 'c/d/2.txt'); - assert_equals(files[2].webkitRelativePath, 'c/3.txt'); + assert_equals(files[2].name, '3.txt'); + assert_equals(files[0].webkitRelativePath, 'a/b/c/d/1.txt'); + assert_equals(files[1].webkitRelativePath, 'a/b/c/d/2.txt'); + assert_equals(files[2].webkitRelativePath, 'a/b/c/3.txt'); }), 'webkitRelativePath is shortest common ancestor'); diff --git a/tests/wpt/web-platform-tests/fetch/sec-metadata/resources/record-header.py b/tests/wpt/web-platform-tests/fetch/sec-metadata/resources/record-header.py index 4c30d1e52ac..b81e93ec3c0 100644 --- a/tests/wpt/web-platform-tests/fetch/sec-metadata/resources/record-header.py +++ b/tests/wpt/web-platform-tests/fetch/sec-metadata/resources/record-header.py @@ -3,10 +3,7 @@ import uuid import hashlib import time -resourcePath = os.getcwd() + "/fetch/sec-metadata/resources/" - def main(request, response): - ## Get the query parameter (key) from URL ## ## Tests will record POST requests (CSP Report) and GET (rest) ## if request.GET: @@ -57,7 +54,8 @@ def main(request, response): ## Return a valid SharedWorker ## if key.startswith("sharedworker"): response.headers.set("Content-Type", "application/javascript") - file = open(resourcePath + "sharedWorker.js", "r") + file = open(os.path.join(request.doc_root, "fetch", "sec-metadata", + "resources", "sharedWorker.js"), "r") shared_worker = file.read() file.close() return shared_worker diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html b/tests/wpt/web-platform-tests/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html new file mode 100644 index 00000000000..e50e5e1657f --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_feature_policy.tentative.sub.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/feature-policy/resources/featurepolicy.js></script> + <script> + run_all_fp_tests_allow_all( + 'http://{{domains[www]}}:{{ports[http][0]}}', + 'document-domain', + 'SecurityError', + () => { + return new Promise((resolve, reject) => { + try { + document.domain = "{{domains[]}}"; + resolve(); + } catch(e) { + reject(e); + } + }); + }); + </script> +</body> diff --git a/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js b/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js index e37e34280f6..7f673cb7f0e 100644 --- a/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js +++ b/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js @@ -13,9 +13,21 @@ var obsoleteElements = { width: "string", }, marquee: { - behavior: "string", + behavior: { + type: { + type: "enum", + keywords: ["scroll", "slide", "alternate"], + defaultVal: "scroll" + }, + }, bgColor: "string", - direction: "string", + direction: { + type: { + type: "enum", + keywords: ["up", "right", "down", "left"], + defaultVal: "left" + }, + }, height: "string", hspace: "unsigned long", scrollAmount: {type: "unsigned long", defaultVal: 6}, diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-no-alt-replaced.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-no-alt-replaced.html new file mode 100644 index 00000000000..896c7363113 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-no-alt-replaced.html @@ -0,0 +1,25 @@ +<!doctype html> +<title>Images without alt attribute or with an empty alt attribute render as replaced elements regardless of src</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="author" href="https://mozilla.org" title="Mozilla"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1196668"> +<style> + img { + width: 100px; + height: 150px; + } +</style> +<img> +<img src="broken"> +<img alt=""> +<script> +const t = async_test("Images without alt attribute or with an empty alt attribute render as replaced elements regardless of src"); +onload = t.step_func_done(function() { + for (const img of document.querySelectorAll("img")) { + assert_equals(img.offsetWidth, 100, `width: ${img.outerHTML}`); + assert_equals(img.offsetHeight, 150, `height: ${img.outerHTML}`); + } +}); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html index de068f17a73..dc5dcbfdece 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/type-change-state.html @@ -7,22 +7,70 @@ <script src="/resources/testharnessreport.js"></script> <div id="log"></div> <script> + + const INITIAL_VALUE = " foo\rbar "; + + // Sanitize algorithm implementations only for values used in this test. + function sanitizeText(value) { + switch (value) { + case INITIAL_VALUE: return " foobar "; + case " foobar ": return value; + case "foobar": return value; + case "50": return value; + case "#000000": return value; + case "": return value; + default: throw new DOMException(`Internal Error: Should add support of "${value}"`, "NotSupportedError"); + } + } + function sanitizeEmailOrUrl(value) { + switch (value) { + case INITIAL_VALUE: return "foobar"; + case " foobar ": return "foobar"; + case "foobar": return value; + case "50": return value; + case "#000000": return value; + case "": return value; + default: throw new DOMException(`Internal Error: Should add support of "${value}"`, "NotSupportedError"); + } + } + function sanitizeTemporal(value) { + // We have no test cases using valid temporal values. + return ""; + } + function sanitizeNumber(value) { + switch (value) { + case "50": return value; + default: + // We have no test cases using valid numbers other than "50". + return ""; + } + } + function sanitizeRange(value) { + // We have no test cases using valid numbers other than "50". + return "50"; + } + function sanitizeColor(value) { + // We have no test cases using valid colors other than "#000000". + return "#000000"; + } + + var types = [ { type: "hidden" }, - { type: "text", sanitizedValue: " foobar " }, - { type: "search", sanitizedValue: " foobar " }, - { type: "tel", sanitizedValue: " foobar " }, - { type: "url", sanitizedValue: "foobar" }, - { type: "email", sanitizedValue: "foobar" }, - { type: "password", sanitizedValue: " foobar " }, - { type: "datetime-local", sanitizedValue: "", overridesSanitization: true }, - { type: "date", sanitizedValue: "", overridesSanitization: true }, - { type: "month", sanitizedValue: "", overridesSanitization: true }, - { type: "week", sanitizedValue: "", overridesSanitization: true }, - { type: "time", sanitizedValue: "", overridesSanitization: true }, - { type: "number", sanitizedValue: "", overridesSanitization: true }, - { type: "range", sanitizedValue: "50", overridesSanitization: true }, - { type: "color", sanitizedValue: "#000000", overridesSanitization: true }, + { type: "text", sanitizer: sanitizeText }, + { type: "search", sanitizer: sanitizeText }, + { type: "tel", sanitizer: sanitizeText }, + { type: "url", sanitizer: sanitizeEmailOrUrl }, + { type: "email", sanitizer: sanitizeEmailOrUrl }, + { type: "password", sanitizer: sanitizeText }, + { type: "datetime-local", sanitizer: sanitizeTemporal }, + { type: "date", sanitizer: sanitizeTemporal }, + { type: "month", sanitizer: sanitizeTemporal }, + { type: "week", sanitizer: sanitizeTemporal }, + { type: "time", sanitizer: sanitizeTemporal }, + { type: "number", sanitizer: sanitizeNumber }, + { type: "range", sanitizer: sanitizeRange }, + { type: "color", sanitizer: sanitizeColor }, { type: "checkbox", defaultValue: "on" }, { type: "radio", defaultValue: "on" }, { type: "file" }, @@ -52,7 +100,7 @@ if (types[i] != types[j]) { test(function() { var input = document.createElement("input"); - var expected = " foo\rbar "; + var expected = INITIAL_VALUE; input.type = types[i].type; if (types[i].type === "file") { assert_throws("INVALID_STATE_ERR", function() { @@ -65,6 +113,7 @@ assert_equals(input.value, ""); } else { input.value = expected; + expected = input.value; const previouslySelectable = (input.selectionStart !== null); @@ -74,16 +123,9 @@ input.type = types[j].type; // change state - // type[i] sanitization - if (types[i].sanitizedValue || types[i].sanitizedValue === "") { - expected = types[i].sanitizedValue; - } - // type[j] sanitization - if (types[j].sanitizedValue || types[j].sanitizedValue === "") { - if ((expected !== "" && !types[i].overridesSanitization) || types[j].overridesSanitization) { - expected = types[j].sanitizedValue; - } + if (types[j].sanitizer) { + expected = types[j].sanitizer(expected); } // type[j] defaultValue diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html index cf23e67ae40..983961ae44c 100644 --- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html +++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html @@ -2,11 +2,8 @@ <meta charset="utf-8"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="/common/get-host-info.sub.js"></script> - -<script type="text/javascript"> -host_info = get_host_info(); +<script> document.cookie = 'same=1'; const setCookiePromise = fetch( diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini index 6644d52d1ff..8edb44d4148 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini @@ -1,3 +1,3 @@ [elementPosition.html] - expected: - if product == "chrome" or product == "safari" or product == "safari_webdriver": ERROR + [TestDriver actions: element position] + expected: FAIL diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini index bfb5c0ae4bd..8c60a97ad95 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini @@ -1,3 +1,3 @@ [eventOrder.html] - expected: - if product == "chrome" or product == "safari" or product == "safari_webdriver": ERROR + [TestDriver actions: event order] + expected: FAIL diff --git a/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/elementPosition.html b/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/elementPosition.html index 145852e7b51..ab9fb31ad09 100644 --- a/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/elementPosition.html +++ b/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/elementPosition.html @@ -34,7 +34,7 @@ async_test(t => { let div = document.getElementById("test"); let actions = new test_driver.Actions() .pointerMove(0, 0, {origin: test}) - .pointerDown() + .pointerDown(0, 0, {origin: test}) .pointerUp() .send() .then(t.step_func_done(() => assert_array_equals(events, [50, 25]))) diff --git a/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/eventOrder.html b/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/eventOrder.html index c85b861c7fd..bd7fef41e9a 100644 --- a/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/eventOrder.html +++ b/tests/wpt/web-platform-tests/infrastructure/testdriver/actions/eventOrder.html @@ -17,19 +17,17 @@ let events = []; async_test(t => { Array.prototype.forEach.call(document.getElementsByTagName("button"), - (x) => x.addEventListener("mousedown", () => {events.push(x.id)})); + (x) => x.addEventListener("pointerdown", () => {events.push(x.id)})); let button_a = document.getElementById("a"); let button_b = document.getElementById("b"); let actions = new test_driver.Actions() - .addPointer("pointer1") - .addPointer("pointer2") - .pointerMove(0, 0, {origin: button_a, sourceName: "pointer1"}) - .pointerMove(0, 0, {origin: button_b, sourceName: "pointer2"}) - .pointerDown({sourceName: "pointer2"}) - .pointerDown({sourceName: "pointer1"}) - .pointerUp({sourceName: "pointer2"}) + .addPointer("pointer1", "touch") + .addPointer("pointer2", "touch") + .pointerDown(0, 0, {origin: button_a, sourceName: "pointer1"}) + .pointerDown(0, 0, {origin: button_b, sourceName: "pointer2"}) .pointerUp({sourceName: "pointer1"}) + .pointerUp({sourceName: "pointer2"}) .send() .then(t.step_func_done(() => assert_array_equals(events, ["a", "b"]))) .catch(e => t.step_func(() => assert_unreached("Actions sequence failed " + e))); diff --git a/tests/wpt/web-platform-tests/interfaces/css-transitions.idl b/tests/wpt/web-platform-tests/interfaces/css-transitions.idl index 20669f4f641..129f1463ed8 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-transitions.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-transitions.idl @@ -17,7 +17,7 @@ dictionary TransitionEventInit : EventInit { CSSOMString pseudoElement = ""; }; -partial interface GlobalEventHandlers { +partial interface mixin GlobalEventHandlers { attribute EventHandler ontransitionrun; attribute EventHandler ontransitionstart; attribute EventHandler ontransitionend; diff --git a/tests/wpt/web-platform-tests/interfaces/selection-api.idl b/tests/wpt/web-platform-tests/interfaces/selection-api.idl index b63951790b6..049759b799e 100644 --- a/tests/wpt/web-platform-tests/interfaces/selection-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/selection-api.idl @@ -37,7 +37,7 @@ partial interface Window { Selection? getSelection(); }; -partial interface GlobalEventHandlers { +partial interface mixin GlobalEventHandlers { attribute EventHandler onselectstart; attribute EventHandler onselectionchange; }; diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc.idl b/tests/wpt/web-platform-tests/interfaces/webrtc.idl index 7496fff41dc..9cfd687c18b 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc.idl @@ -402,7 +402,7 @@ dictionary RTCRtpSynchronizationSource : RTCRtpContributingSource { }; [Exposed=Window] interface RTCDtlsTransport : EventTarget { - readonly attribute RTCIceTransport transport; + readonly attribute RTCIceTransport iceTransport; readonly attribute RTCDtlsTransportState state; sequence<ArrayBuffer> getRemoteCertificates(); attribute EventHandler onstatechange; diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist index 3de5698c229..99b1d6a2be1 100644 --- a/tests/wpt/web-platform-tests/lint.whitelist +++ b/tests/wpt/web-platform-tests/lint.whitelist @@ -378,7 +378,6 @@ SUPPORT-WRONG-DIR: css/CSS2/section-index.xht SUPPORT-WRONG-DIR: css/CSS2/other-formats/xml/background-18.css SUPPORT-WRONG-DIR: css/CSS2/other-formats/xml/background-19-alt.xml SUPPORT-WRONG-DIR: css/CSS2/other-formats/xml/background-19.css -SUPPORT-WRONG-DIR: css/filter-effects/filter-external-002-filter.svg SUPPORT-WRONG-DIR: css/vendor-imports/mozilla/mozilla-central-reftests/check-for-references.sh SUPPORT-WRONG-DIR: css/vendor-imports/mozilla/mozilla-central-reftests/sync-tests-filter SUPPORT-WRONG-DIR: css/vendor-imports/mozilla/mozilla-central-reftests/sync-tests.sh diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getSupportedConstraints.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getSupportedConstraints.html new file mode 100644 index 00000000000..fff4f349e1c --- /dev/null +++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-getSupportedConstraints.html @@ -0,0 +1,49 @@ +<!doctype html> +<html> +<head> +<title>Test navigator.mediaDevices.getSupportedConstraints()</title> +<link rel="help" href="https://w3c.github.io/mediacapture-main/#enumerating-devices"> +<meta name='assert' content='Test the getSupportedConstraints() method.'/> +</head> +<body> +<h1 class="instructions">Description</h1> +<p class="instructions">This test checks for the presence of the +<code>navigator.mediaDevices.getSupportedConstraints()</code> method.</p> +<div id='log'></div> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +"use strict"; +test(() => { + assert_inherits(navigator.mediaDevices, "getSupportedConstraints"); + assert_equals(typeof navigator.mediaDevices.getSupportedConstraints, "function"); +}, "navigator.mediaDevices.getSupportedConstraints exists"); + +{ + const properties = [ + "width", + "height", + "aspectRatio", + "frameRate", + "facingMode", + "resizeMode", + "volume", + "sampleRate", + "sampleSize", + "echoCancellation", + "autoGainControl", + "noiseSuppression", + "latency", + "channelCount", + "deviceId", + "groupId"]; + properties.forEach(property => { + test(()=>{ + const supportedConstraints = navigator.mediaDevices.getSupportedConstraints(); + assert_true(supportedConstraints[property]); + }, property + " is supported"); + }); +} +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/mimesniff/mime-types/README.md b/tests/wpt/web-platform-tests/mimesniff/mime-types/README.md index 89e1bf426be..3a2681ec74f 100644 --- a/tests/wpt/web-platform-tests/mimesniff/mime-types/README.md +++ b/tests/wpt/web-platform-tests/mimesniff/mime-types/README.md @@ -15,14 +15,11 @@ A wrapper for these JSON MIME type tests needs to take care that not all `input` function isByteCompatible(str) { for(let i = 0; i < str.length; i++) { const charCode = str.charCodeAt(i); - // See https://github.com/web-platform-tests/wpt/issues/8372 for 0x0B and 0x0C - // See https://fetch.spec.whatwg.org/#concept-header-value for the remainder + // See https://fetch.spec.whatwg.org/#concept-header-value if(charCode > 0xFF) { return "incompatible"; } else if(charCode === 0x00 || charCode === 0x0A || charCode === 0x0D) { return "header-value-incompatible"; - } else if(charCode === 0x0B || charCode === 0x0C) { - return "wptserve-incompatible"; } } return "compatible"; diff --git a/tests/wpt/web-platform-tests/mimesniff/mime-types/charset-parameter.window.js b/tests/wpt/web-platform-tests/mimesniff/mime-types/charset-parameter.window.js index c288de8349a..ddac81b74d3 100644 --- a/tests/wpt/web-platform-tests/mimesniff/mime-types/charset-parameter.window.js +++ b/tests/wpt/web-platform-tests/mimesniff/mime-types/charset-parameter.window.js @@ -6,14 +6,11 @@ promise_test(() => { function isByteCompatible(str) { for(let i = 0; i < str.length; i++) { const charCode = str.charCodeAt(i); - // See https://github.com/web-platform-tests/wpt/issues/8372 for 0x0B and 0x0C - // See https://fetch.spec.whatwg.org/#concept-header-value for the remainder + // See https://fetch.spec.whatwg.org/#concept-header-value if(charCode > 0xFF) { return "incompatible"; } else if(charCode === 0x00 || charCode === 0x0A || charCode === 0x0D) { return "header-value-incompatible"; - } else if(charCode === 0x0B || charCode === 0x0C) { - return "wptserve-incompatible"; } } return "compatible"; diff --git a/tests/wpt/web-platform-tests/mimesniff/mime-types/parsing.any.js b/tests/wpt/web-platform-tests/mimesniff/mime-types/parsing.any.js index beacada1b10..640a46b9e98 100644 --- a/tests/wpt/web-platform-tests/mimesniff/mime-types/parsing.any.js +++ b/tests/wpt/web-platform-tests/mimesniff/mime-types/parsing.any.js @@ -10,14 +10,11 @@ promise_test(() => { function isByteCompatible(str) { for(let i = 0; i < str.length; i++) { const charCode = str.charCodeAt(i); - // See https://github.com/web-platform-tests/wpt/issues/8372 for 0x0B and 0x0C - // See https://fetch.spec.whatwg.org/#concept-header-value for the remainder + // See https://fetch.spec.whatwg.org/#concept-header-value if(charCode > 0xFF) { return "incompatible"; } else if(charCode === 0x00 || charCode === 0x0A || charCode === 0x0D) { return "header-value-incompatible"; - } else if(charCode === 0x0B || charCode === 0x0C) { - return "wptserve-incompatible"; } } return "compatible"; diff --git a/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-charset.py b/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-charset.py index 433a5bb74b9..a4f90f52c32 100644 --- a/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-charset.py +++ b/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-charset.py @@ -1,3 +1,16 @@ def main(request, response): - response.headers.set("Content-Type", request.GET.first("type")); - response.content = "<meta charset=utf-8>\n<script>document.write(document.characterSet)</script>" + content = "<meta charset=utf-8>\n<script>document.write(document.characterSet)</script>" + + # This uses the following rather than + # response.headers.set("Content-Type", request.GET.first("type")); + # response.content = content + # to work around https://github.com/web-platform-tests/wpt/issues/8372. + + response.add_required_headers = False + output = "HTTP/1.1 200 OK\r\n" + output += "Content-Length: " + str(len(content)) + "\r\n" + output += "Content-Type: " + request.GET.first("type") + "\r\n" + output += "\r\n" + output += content + response.writer.write(output) + response.close_connection = True diff --git a/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-types.json b/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-types.json index 8918b355bf5..64654b90d5a 100644 --- a/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-types.json +++ b/tests/wpt/web-platform-tests/mimesniff/mime-types/resources/mime-types.json @@ -69,6 +69,31 @@ "navigable": true, "encoding": null }, + "0x0B and 0x0C", + { + "input": "text/html;charset=\u000Bgbk", + "output": "text/html", + "navigable": true, + "encoding": null + }, + { + "input": "text/html;charset=\u000Cgbk", + "output": "text/html", + "navigable": true, + "encoding": null + }, + { + "input": "text/html;\u000Bcharset=gbk", + "output": "text/html", + "navigable": true, + "encoding": null + }, + { + "input": "text/html;\u000Ccharset=gbk", + "output": "text/html", + "navigable": true, + "encoding": null + }, "Single quotes are a token, not a delimiter", { "input": "text/html;charset='gbk'", @@ -250,6 +275,18 @@ "input": "x/x;x=\t", "output": "x/x" }, + { + "input": "x/x\n\r\t ;x=x", + "output": "x/x;x=x" + }, + { + "input": "\n\r\t x/x;x=x\n\r\t ", + "output": "x/x;x=x" + }, + { + "input": "x/x;\n\r\t x=x\n\r\t ;x=y", + "output": "x/x;x=x" + }, "Latin1", { "input": "text/html;test=\u00FF;charset=gbk", @@ -264,6 +301,22 @@ }, "Failure", { + "input": "\u000Bx/x", + "output": null + }, + { + "input": "\u000Cx/x", + "output": null + }, + { + "input": "x/x\u000B", + "output": null + }, + { + "input": "x/x\u000C", + "output": null + }, + { "input": "", "output": null }, diff --git a/tests/wpt/web-platform-tests/network-error-logging/no-report-on-unexpired-cached-response.https.html b/tests/wpt/web-platform-tests/network-error-logging/no-report-on-unexpired-cached-response.https.html new file mode 100644 index 00000000000..8248aa52ecb --- /dev/null +++ b/tests/wpt/web-platform-tests/network-error-logging/no-report-on-unexpired-cached-response.https.html @@ -0,0 +1,33 @@ +<!DOCTYPE HTML> +<html> +<head> + <title> + Test that NEL reports are not sent for cached responses that don't hit the + network + </title> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='./support/nel.sub.js'></script> +</head> +<body> + <script> + nel_test(async t => { + // Fetch a resource that can be cached without validation. Do this + // *before* fetching the NEL policy for this origin, to ensure that we + // don't generate any report about this request. + await fetchCachedResource(); + // Fetch the NEL policy for this origin. + await fetchResourceWithBasicPolicy(); + // Fetch the now-cached resource again. This should not generate a new + // network request. + await fetchCachedResource(); + // Because the cached request did not generate a network request, we + // should never receive a report about the request. + assert_false(await reportExists({ + url: getURLForCachedResource(), + type: "network-error", + })); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/network-error-logging/sends-report-on-cache-validation.https.html b/tests/wpt/web-platform-tests/network-error-logging/sends-report-on-cache-validation.https.html new file mode 100644 index 00000000000..b87053cb7f7 --- /dev/null +++ b/tests/wpt/web-platform-tests/network-error-logging/sends-report-on-cache-validation.https.html @@ -0,0 +1,42 @@ +<!DOCTYPE HTML> +<html> +<head> + <title> + Test that NEL reports are sent for cache validation requests + </title> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='./support/nel.sub.js'></script> +</head> +<body> + <script> + nel_test(async t => { + // Fetch a resource that can be cached, but whose response requires + // validation. Do this *before* fetching the NEL policy for this origin, + // to ensure that we don't generate any report about this request. + await fetchValidatedCachedResource(); + // Fetch the NEL policy for this origin. + await fetchResourceWithBasicPolicy(); + // Fetch the now-cached resource again. Because the response requires + // validation, this will result in a network request. + await fetchValidatedCachedResource(); + // We should receive a report about the cache validation request. + assert_true(await reportExists({ + url: getURLForValidatedCachedResource(), + user_agent: navigator.userAgent, + type: "network-error", + body: { + method: "GET", + sampling_fraction: 1.0, + status_code: 304, + phase: "application", + type: "ok", + }, + metadata: { + content_type: "application/reports+json", + }, + })); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/network-error-logging/sends-report-on-redirect.https.html b/tests/wpt/web-platform-tests/network-error-logging/sends-report-on-redirect.https.html new file mode 100644 index 00000000000..c9ba405f6fa --- /dev/null +++ b/tests/wpt/web-platform-tests/network-error-logging/sends-report-on-redirect.https.html @@ -0,0 +1,55 @@ +<!DOCTYPE HTML> +<html> +<head> + <title> + Test that NEL reports are sent for redirects + </title> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='./support/nel.sub.js'></script> +</head> +<body> + <script> + nel_test(async t => { + // Make a request to a resource whose response headers include a NEL + // policy. + await fetchResourceWithBasicPolicy(); + // Then make a request that results in a redirect. + await fetchRedirectedResource(); + // We should receive a report about the redirect itself, and also about + // the resource that we were redirected to. + assert_true(await reportExists({ + url: getURLForRedirectedResource(), + user_agent: navigator.userAgent, + type: "network-error", + body: { + method: "GET", + sampling_fraction: 1.0, + status_code: 302, + phase: "application", + type: "ok", + }, + metadata: { + content_type: "application/reports+json", + }, + }), "receive report about redirected resource"); + assert_true(await reportExists({ + // This happens to be where we're redirected to. + url: getURLForResourceWithNoPolicy(), + user_agent: navigator.userAgent, + type: "network-error", + body: { + method: "GET", + sampling_fraction: 1.0, + status_code: 200, + phase: "application", + type: "ok", + }, + metadata: { + content_type: "application/reports+json", + }, + }), "receive report about redirect target"); + }); + </script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/network-error-logging/support/cached-for-one-minute.png b/tests/wpt/web-platform-tests/network-error-logging/support/cached-for-one-minute.png Binary files differnew file mode 100644 index 00000000000..2fa1e0ac066 --- /dev/null +++ b/tests/wpt/web-platform-tests/network-error-logging/support/cached-for-one-minute.png diff --git a/tests/wpt/web-platform-tests/network-error-logging/support/cached-for-one-minute.png.sub.headers b/tests/wpt/web-platform-tests/network-error-logging/support/cached-for-one-minute.png.sub.headers new file mode 100644 index 00000000000..63d4c4de030 --- /dev/null +++ b/tests/wpt/web-platform-tests/network-error-logging/support/cached-for-one-minute.png.sub.headers @@ -0,0 +1 @@ +Cache-Control: public, max-age=60, must-revalidate diff --git a/tests/wpt/web-platform-tests/network-error-logging/support/cached-with-validation.py b/tests/wpt/web-platform-tests/network-error-logging/support/cached-with-validation.py new file mode 100644 index 00000000000..f98a503a51e --- /dev/null +++ b/tests/wpt/web-platform-tests/network-error-logging/support/cached-with-validation.py @@ -0,0 +1,17 @@ +ETAG = '"123abc"' +CONTENT_TYPE = "text/plain" +CONTENT = "lorem ipsum dolor sit amet" + +def main(request, response): + # let caching kick in if possible (conditional GET) + etag = request.headers.get("If-None-Match", None) + if etag == ETAG: + response.headers.set("X-HTTP-STATUS", 304) + response.status = (304, "Not Modified") + return "" + + # cache miss, so respond with the actual content + response.status = (200, "OK") + response.headers.set("ETag", ETAG) + response.headers.set("Content-Type", CONTENT_TYPE) + return CONTENT diff --git a/tests/wpt/web-platform-tests/network-error-logging/support/nel.sub.js b/tests/wpt/web-platform-tests/network-error-logging/support/nel.sub.js index c6b4783bd94..759d0337fa6 100644 --- a/tests/wpt/web-platform-tests/network-error-logging/support/nel.sub.js +++ b/tests/wpt/web-platform-tests/network-error-logging/support/nel.sub.js @@ -107,12 +107,52 @@ function fetchMissingResource(subdomain) { } /* + * Fetches a resource that can be cached without validation. + */ + +function getURLForCachedResource(subdomain) { + return _getNELResourceURL(subdomain, "cached-for-one-minute.png"); +} + +function fetchCachedResource(subdomain) { + const url = getURLForCachedResource(subdomain); + return fetch(url, {mode: "no-cors"}); +} + +/* + * Fetches a resource that can be cached but requires validation. + */ + +function getURLForValidatedCachedResource(subdomain) { + return _getNELResourceURL(subdomain, "cached-with-validation.py"); +} + +function fetchValidatedCachedResource(subdomain) { + const url = getURLForValidatedCachedResource(subdomain); + return fetch(url, {mode: "no-cors"}); +} + +/* + * Fetches a resource that redirects once before returning a successful + * response. + */ + +function getURLForRedirectedResource(subdomain) { + return _getNELResourceURL(subdomain, "redirect.py?id="+reportID); +} + +function fetchRedirectedResource(subdomain) { + const url = getURLForRedirectedResource(subdomain); + return fetch(url, {mode: "no-cors"}); +} + +/* * Fetches resources that clear out any existing Reporting or NEL configurations * for all origins that any test case might use. */ function getURLForClearingConfiguration(subdomain) { - return _getNELResourceURL(subdomain, "clear-pass.png?id="+reportID); + return _getNELResourceURL(subdomain, "clear-policy-pass.png?id="+reportID); } async function clearReportingAndNELConfigurations(subdomain) { diff --git a/tests/wpt/web-platform-tests/network-error-logging/support/redirect.py b/tests/wpt/web-platform-tests/network-error-logging/support/redirect.py new file mode 100644 index 00000000000..00813504da6 --- /dev/null +++ b/tests/wpt/web-platform-tests/network-error-logging/support/redirect.py @@ -0,0 +1,3 @@ +# Always redirects to no-policy-pass.png. +def main(request, response): + return 302, [("Location", "no-policy-pass.png")], "" diff --git a/tests/wpt/web-platform-tests/network-error-logging/support/report.py b/tests/wpt/web-platform-tests/network-error-logging/support/report.py index 7c05b51b9eb..49af9fe34cc 100644 --- a/tests/wpt/web-platform-tests/network-error-logging/support/report.py +++ b/tests/wpt/web-platform-tests/network-error-logging/support/report.py @@ -8,6 +8,7 @@ def retrieve_from_stash(request, key, timeout, default_value): time.sleep(0.5) value = request.server.stash.take(key=key) if value is not None: + request.server.stash.put(key=key, value=value) return json.dumps(value) return default_value diff --git a/tests/wpt/web-platform-tests/picture-in-picture/mediastream.html b/tests/wpt/web-platform-tests/picture-in-picture/mediastream.html new file mode 100644 index 00000000000..7a2cc958eac --- /dev/null +++ b/tests/wpt/web-platform-tests/picture-in-picture/mediastream.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<title>Test mediastream video in Picture-in-Picture</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/picture-in-picture-helpers.js"></script> +<body></body> +<script> +promise_test(async t => { + const canvas = document.createElement('canvas'); + const video = document.createElement('video'); + const mediastreamVideoLoadedPromise = new Promise((resolve, reject) => { + video.autoplay = true; + video.srcObject = canvas.captureStream(60 /* fps */); + video.onloadedmetadata = () => { + resolve(video); + }; + video.onerror = error => { + reject(error); + }; + }); + await mediastreamVideoLoadedPromise; + + return requestPictureInPictureWithTrustedClick(video) + .then(pipWindow => { + assert_not_equals(pipWindow.width, 0); + assert_not_equals(pipWindow.height, 0); + }); +}, 'request Picture-in-Picture resolves on user click with Picture-in-Picture window'); +</script> diff --git a/tests/wpt/web-platform-tests/picture-in-picture/shadow-dom.html b/tests/wpt/web-platform-tests/picture-in-picture/shadow-dom.html index 17816b93c94..2bf43746075 100644 --- a/tests/wpt/web-platform-tests/picture-in-picture/shadow-dom.html +++ b/tests/wpt/web-platform-tests/picture-in-picture/shadow-dom.html @@ -58,5 +58,6 @@ promise_test(async t => { assert_equals(ids.root4.pictureInPictureElement, null); assert_equals(ids.root5.pictureInPictureElement, null); }) + .then(() => document.exitPictureInPicture()); }); </script> diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove.html index cf1a1ee4ee8..4b168439a4e 100644 --- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove-manual.html +++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove.html @@ -7,6 +7,9 @@ <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/resources/testdriver-vendor.js"></script> <!-- Additional helper script for common checks across event types --> <script type="text/javascript" src="pointerevent_support.js"></script> </head> @@ -32,6 +35,9 @@ eventTested = true; } }); + + // Inject the inputs to run this test. + new test_driver.Actions().pointerMove(0, 0, {origin: target0}).send(); } </script> <h1>Pointer Events pointermove Tests</h1> diff --git a/tests/wpt/web-platform-tests/preload/modulepreload.html b/tests/wpt/web-platform-tests/preload/modulepreload.html index addd67d46ac..8950daf1f87 100644 --- a/tests/wpt/web-platform-tests/preload/modulepreload.html +++ b/tests/wpt/web-platform-tests/preload/modulepreload.html @@ -1,8 +1,10 @@ <!DOCTYPE html> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/common/get-host-info.sub.js"></script> <body> <script> +host_info = get_host_info(); function verifyNumberOfDownloads(url, number) { var numDownloads = 0; @@ -48,6 +50,116 @@ promise_test(function(t) { }); }, 'link rel=modulepreload'); +/** + * Begin tests to ensure crossorigin value behaves the same on + * link rel=modulepreload as it does script elements. + */ +promise_test(function(t) { + document.cookie = 'same=1'; + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.crossorigin = 'anonymous'; + link.href = 'resources/dummy.js?sameOriginAnonymous'; + return attachAndWaitForLoad(link).then(() => { + verifyNumberOfDownloads('resources/dummy.js?sameOriginAnonymous', 1); + + // Verify that <script> doesn't fetch the module again. + var script = document.createElement('script'); + script.type = 'module'; + script.crossorigin = 'anonymous'; + script.src = 'resources/dummy.js?sameOriginAnonymous'; + return attachAndWaitForLoad(script); + }).then(() => { + verifyNumberOfDownloads('resources/dummy.js?sameOriginAnonymous', 1); + }); +}, 'same-origin link rel=modulepreload crossorigin=anonymous'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.crossorigin = 'use-credentials'; + link.href = 'resources/dummy.js?sameOriginUseCredentials'; + return attachAndWaitForLoad(link).then(() => { + verifyNumberOfDownloads('resources/dummy.js?sameOriginUseCredentials', 1); + + // Verify that <script> doesn't fetch the module again. + var script = document.createElement('script'); + script.type = 'module'; + script.crossorigin = 'use-credentials'; + script.src = 'resources/dummy.js?sameOriginUseCredentials'; + return attachAndWaitForLoad(script); + }).then(() => { + verifyNumberOfDownloads('resources/dummy.js?sameOriginUseCredentials', 1); + }); +}, 'same-origin link rel=modulepreload crossorigin=use-credentials'); + +promise_test(function(t) { + const setCookiePromise = fetch( + `${host_info.HTTP_REMOTE_ORIGIN}/cookies/resources/set-cookie.py?name=cross&path=/preload/`, + { + mode: 'no-cors', + credentials: 'include', + }); + + return setCookiePromise.then(() => { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.href = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginNone`; + return attachAndWaitForLoad(link); + }).then(() => { + verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginNone`, 1); + + // Verify that <script> doesn't fetch the module again. + var script = document.createElement('script'); + script.type = 'module'; + script.src = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginNone`; + return attachAndWaitForLoad(script); + }).then(() => { + verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginNone`, 1); + }); +}, 'cross-origin link rel=modulepreload'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.crossorigin = 'anonymous'; + link.href = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`; + return attachAndWaitForLoad(link).then(() => { + verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`, 1); + + // Verify that <script> doesn't fetch the module again. + var script = document.createElement('script'); + script.type = 'module'; + script.crossorigin = 'anonymous'; + script.src = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`; + return attachAndWaitForLoad(script); + }).then(() => { + verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginAnonymous`, 1); + }); +}, 'cross-origin link rel=modulepreload crossorigin=anonymous'); + +promise_test(function(t) { + var link = document.createElement('link'); + link.rel = 'modulepreload'; + link.crossorigin = 'use-credentials'; + link.href = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`; + return attachAndWaitForLoad(link).then(() => { + verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`, 1); + + // Verify that <script> doesn't fetch the module again. + var script = document.createElement('script'); + script.type = 'module'; + script.crossorigin = 'use-credentials'; + script.src = `${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`; + return attachAndWaitForLoad(script); + }).then(() => { + verifyNumberOfDownloads(`${host_info.HTTP_REMOTE_ORIGIN}/preload/resources/cross-origin-module.py?crossOriginUseCredentials`, 1); + }); +}, 'cross-origin link rel=modulepreload crossorigin=use-credentials'); +/** + * End link rel=modulepreload crossorigin attribute tests. + */ + promise_test(function(t) { var link = document.createElement('link'); link.rel = 'modulepreload'; diff --git a/tests/wpt/web-platform-tests/preload/resources/cross-origin-module.py b/tests/wpt/web-platform-tests/preload/resources/cross-origin-module.py new file mode 100644 index 00000000000..f771c967124 --- /dev/null +++ b/tests/wpt/web-platform-tests/preload/resources/cross-origin-module.py @@ -0,0 +1,9 @@ +def main(request, response): + headers = [ + ("Content-Type", "text/javascript"), + ("Access-Control-Allow-Origin", request.headers.get("Origin")), + ("Timing-Allow-Origin", request.headers.get("Origin")), + ("Access-Control-Allow-Credentials", "true") + ] + + return headers, "// Cross-origin module, nothing to see here" diff --git a/tests/wpt/web-platform-tests/resources/idlharness.js b/tests/wpt/web-platform-tests/resources/idlharness.js index 9e6ed236b0a..926a615e59c 100644 --- a/tests/wpt/web-platform-tests/resources/idlharness.js +++ b/tests/wpt/web-platform-tests/resources/idlharness.js @@ -298,15 +298,29 @@ IdlArray.prototype.add_dependency_idls = function(raw_idls, options) }.bind(this)); deps.forEach(function(name) { - new_options.only.push(name); + if (!new_options.only.includes(name)) { + new_options.only.push(name); + } const follow_up = new Set(); for (const dep_type of ["inheritance", "implements", "includes"]) { if (parsed[dep_type]) { const inheriting = parsed[dep_type]; const inheritor = parsed.name || parsed.target; - for (const dep of [inheriting, inheritor]) { - new_options.only.push(dep); + const deps = [inheriting]; + // For A includes B, we can ignore A, unless B (or some of its + // members) is being tested. + if (dep_type !== "includes" + || inheriting in this.members && !this.members[inheriting].untested + || this.partials.some(function(p) { + return p.name === inheriting; + })) { + deps.push(inheritor); + } + for (const dep of deps) { + if (!new_options.only.includes(dep)) { + new_options.only.push(dep); + } all_deps.add(dep); follow_up.add(dep); } @@ -320,7 +334,7 @@ IdlArray.prototype.add_dependency_idls = function(raw_idls, options) next.forEach(process); } } - }); + }.bind(this)); }.bind(this); for (let parsed of parsed_idls) { diff --git a/tests/wpt/web-platform-tests/resources/test/tests/functional/idlharness/IdlInterface/test_partial_interface_of.html b/tests/wpt/web-platform-tests/resources/test/tests/functional/idlharness/IdlInterface/test_partial_interface_of.html index ee42a37355e..0c752bdc6cd 100644 --- a/tests/wpt/web-platform-tests/resources/test/tests/functional/idlharness/IdlInterface/test_partial_interface_of.html +++ b/tests/wpt/web-platform-tests/resources/test/tests/functional/idlharness/IdlInterface/test_partial_interface_of.html @@ -63,6 +63,37 @@ namespace E {};`); idlArray.collapse_partials(); })(); + + (() => { + const idlArray = new IdlArray(); + idlArray.add_idls(` + partial interface F {}; + partial interface mixin G{}; + `); + idlArray.add_dependency_idls(` + interface F {}; + interface mixin G {}; + interface mixin H {}; + F includes H; + I includes H; + J includes G; + interface K : J {}; + interface L : F {}; + `); + test(() => { + // F is tested, so H is a dep. + assert_true('F' in idlArray.includes, 'Fs includes should be picked up'); + assert_true(idlArray.includes.F.includes('H'), 'H should be picked up'); + // H is not tested, so I is not a dep. + assert_false('I' in idlArray.includes, 'I should be ignored'); + // G is a dep, so J is a dep. + assert_true('J' in idlArray.includes, 'J should be picked up'); + // But, K isn't a dep just because of J. + assert_false('K' in idlArray.members, 'K should be ignored'); + // L inherits F, so should be picked up. + assert_false('L' in idlArray.members, 'L should be picked up'); + }, 'partial mixin dep implications'); + })(); </script> <script type="text/json" id="expected"> { @@ -118,6 +149,12 @@ "status_string": "FAIL", "properties": {}, "message": "assert_true: Original E definition should have type interface expected true got false" + }, + { + "name": "partial mixin dep implications", + "status_string": "PASS", + "properties": {}, + "message": null } ], "type": "complete" diff --git a/tests/wpt/web-platform-tests/resources/testdriver-actions.js b/tests/wpt/web-platform-tests/resources/testdriver-actions.js index 46c68858e45..82cac85347b 100644 --- a/tests/wpt/web-platform-tests/resources/testdriver-actions.js +++ b/tests/wpt/web-platform-tests/resources/testdriver-actions.js @@ -22,6 +22,14 @@ } Actions.prototype = { + ButtonType: { + LEFT: 0, + MIDDLE: 1, + RIGHT: 2, + BACK: 3, + FORWARD: 4, + }, + /** * Generate the action sequence suitable for passing to * test_driver.action_sequence @@ -98,7 +106,7 @@ * @returns {Actions} */ addKeyboard: function(name, set=true) { - this.createSource("key", name, true); + this.createSource("key", name); if (set) { this.setKeyboard(name); } @@ -125,7 +133,7 @@ * @returns {Actions} */ addPointer: function(name, pointerType="mouse", set=true) { - this.createSource("pointer", name, true, {pointerType: pointerType}); + this.createSource("pointer", name, {pointerType: pointerType}); if (set) { this.setPointer(name); } @@ -225,9 +233,9 @@ * pointer source * @returns {Actions} */ - pointerDown: function({button=0, sourceName=null}={}) { + pointerDown: function(x, y, {origin="viewport", button=this.ButtonType.LEFT, sourceName=null}={}) { let source = this.getSource("pointer", sourceName); - source.pointerDown(this, button); + source.pointerDown(this, button, x, y, origin); return this; }, @@ -239,7 +247,7 @@ * source * @returns {Actions} */ - pointerUp: function({button=0, sourceName=null}={}) { + pointerUp: function({button=this.ButtonType.LEFT, sourceName=null}={}) { let source = this.getSource("pointer", sourceName); source.pointerUp(this, button); return this; @@ -359,12 +367,12 @@ return data; }, - pointerDown: function(actions, button) { + pointerDown: function(actions, button, x, y, origin) { let tick = actions.tickIdx; if (this.actions.has(tick)) { tick = actions.addTick().tickIdx; } - this.actions.set(tick, {type: "pointerDown", button}); + this.actions.set(tick, {type: "pointerDown", button, x, y, origin}); }, pointerUp: function(actions, button) { diff --git a/tests/wpt/web-platform-tests/resources/testdriver.js b/tests/wpt/web-platform-tests/resources/testdriver.js index e0741e8d61d..8ffd765072c 100644 --- a/tests/wpt/web-platform-tests/resources/testdriver.js +++ b/tests/wpt/web-platform-tests/resources/testdriver.js @@ -192,7 +192,7 @@ * @returns {Promise} fufiled after the actions are performed, or rejected in * the cases the WebDriver command errors */ - action_sequence(actions) { + action_sequence: function(actions) { return window.test_driver_internal.action_sequence(actions); } }; @@ -233,7 +233,7 @@ /** * Send a sequence of pointer actions * - * @returns {Promise} fufilled after actions are sent, rejected if any actions + * @returns {Promise} fulfilled after actions are sent, rejected if any actions * fail */ action_sequence: function(actions) { diff --git a/tests/wpt/web-platform-tests/screen-capture/getdisplaymedia.https.html b/tests/wpt/web-platform-tests/screen-capture/getdisplaymedia.https.html index 36e0f22933a..2dd01777687 100644 --- a/tests/wpt/web-platform-tests/screen-capture/getdisplaymedia.https.html +++ b/tests/wpt/web-platform-tests/screen-capture/getdisplaymedia.https.html @@ -1,13 +1,15 @@ <!doctype html> <meta charset=utf-8> -<title>RTCDTMFSender.prototype.insertDTMF</title> +<title>getDisplayMedia</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> 'use strict'; +test(() => { + assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); +}, "getDisplayMedia in navigator.mediaDevices"); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const stream = await navigator.mediaDevices.getDisplayMedia({video: true}); const [track] = stream.getTracks(); t.add_cleanup(() => track.stop()); @@ -22,7 +24,6 @@ promise_test(async t => { // Note that this results in some non-intuitive cases returning a video track, // i.e. {video: false}. promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const stream = await navigator.mediaDevices.getDisplayMedia(); const [track] = stream.getTracks(); t.add_cleanup(() => track.stop()); @@ -32,7 +33,6 @@ promise_test(async t => { }, 'getDisplayMedia() with no constraints'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const stream = await navigator.mediaDevices.getDisplayMedia({video: false}); const [track] = stream.getTracks(); t.add_cleanup(() => track.stop()); @@ -42,7 +42,6 @@ promise_test(async t => { }, 'getDisplayMedia() with video false'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const stream = await navigator.mediaDevices.getDisplayMedia({audio: false}); const [track] = stream.getTracks(); t.add_cleanup(() => track.stop()); @@ -52,7 +51,6 @@ promise_test(async t => { }, 'getDisplayMedia() with audio false'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const stream = await navigator.mediaDevices.getDisplayMedia({audio: true}); const [track] = stream.getTracks(); t.add_cleanup(() => track.stop()); @@ -62,7 +60,6 @@ promise_test(async t => { }, 'getDisplayMedia() with audio true'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); try { const stream = await navigator.mediaDevices.getDisplayMedia( {video: {advanced: [{zoom: 1}]}}); @@ -74,7 +71,6 @@ promise_test(async t => { }, 'getDisplayMedia() with advanced constraint'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); try { const stream = await navigator.mediaDevices.getDisplayMedia( {video: {width: {min: 360}}}); @@ -86,7 +82,6 @@ promise_test(async t => { }, 'getDisplayMedia() with min constraint'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); try { const stream = await navigator.mediaDevices.getDisplayMedia( {video: {width: {exact: 360}}}); @@ -98,7 +93,6 @@ promise_test(async t => { }, 'getDisplayMedia() with exact constraint'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const maxWidth = 360; const stream = await navigator.mediaDevices.getDisplayMedia( {video: {width: {max: maxWidth}}}); @@ -111,7 +105,6 @@ promise_test(async t => { }, 'getDisplayMedia() with max constraint'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const maxWidth = 360; const maxFrameRate = 4; const stream = await navigator.mediaDevices.getDisplayMedia( @@ -126,7 +119,6 @@ promise_test(async t => { }, 'getDisplayMedia() with constraints applied'); promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); try { const stream = await navigator.mediaDevices.getDisplayMedia( {video: {width: {max: 0}}}); @@ -139,7 +131,6 @@ promise_test(async t => { // Content shell picks a fake desktop device by default. promise_test(async t => { - assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia'); const stream = await navigator.mediaDevices.getDisplayMedia({video: true}); const [track] = stream.getTracks(); t.add_cleanup(() => track.stop()); diff --git a/tests/wpt/web-platform-tests/screen-capture/historical.https.html b/tests/wpt/web-platform-tests/screen-capture/historical.https.html new file mode 100644 index 00000000000..d510bc42089 --- /dev/null +++ b/tests/wpt/web-platform-tests/screen-capture/historical.https.html @@ -0,0 +1,10 @@ +<!doctype html> +<meta charset=utf-8> +<title>getDisplayMedia historical tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + assert_false('getDisplayMedia' in navigator); +}, 'navigator.getDisplayMedia should not exist'); +</script> diff --git a/tests/wpt/web-platform-tests/selection/idlharness.window.js b/tests/wpt/web-platform-tests/selection/idlharness.window.js index b211797777d..543fcb3eff5 100644 --- a/tests/wpt/web-platform-tests/selection/idlharness.window.js +++ b/tests/wpt/web-platform-tests/selection/idlharness.window.js @@ -7,7 +7,7 @@ idl_test( ['selection-api'], - ['dom', 'html'], + ['html', 'dom'], idlArray => { idlArray.add_objects({ Window: ['window'], diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html index 6f03fd8f2f0..e8b8e9afd58 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html @@ -97,7 +97,7 @@ function check_clients(clients, Object.keys(clients).forEach(key => { const info = clients[key]; if (info.found) { - assert_true(expected_final_client_tag, + assert_true(!!expected_final_client_tag, `${worker_name} client tag exists`); assert_equals(key, expected_final_client_tag, `${worker_name} client tag matches`); @@ -120,10 +120,10 @@ function check_resulting_client_ids(infos, expected_infos, actual_ids, worker) { assert_equals(typeof(actual_id), 'string', `resultingClientId for ${url} request to ${worker}`); if (expected_id) { - assert_equals(requestInfos[0], expected_id, + assert_equals(actual_id, expected_id, `resultingClientId for ${url} request to ${worker}`); } else { - actual_ids[key] = actual_id; + actual_ids[tag] = actual_id; } } } @@ -489,7 +489,7 @@ redirect_test( url1, url2, [[{url: url1, resultingClientIdTag: 'a'}], [], []], - 'x', + null, 'SW-fallbacked redirect to other-origin out-scope.'); url1 = SCOPE1 + 'url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE); @@ -530,8 +530,8 @@ url2 = OUT_SCOPE; redirect_test( url1, url2, - [[{url: url1, resultingClientIdTag: 'a'}], [], []], - null, + [[{url: url1, resultingClientIdTag: 'x'}], [], []], + 'x', 'SW-generated redirect to same-origin out-scope.'); url1 = SCOPE1 + 'sw=gen&url=' + encodeURIComponent(OUT_SCOPE) + '#ref'; diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/classic-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/classic-worker.js new file mode 100644 index 00000000000..36a32b1a1f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/classic-worker.js @@ -0,0 +1 @@ +importScripts('./imported-classic-script.js'); diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/module-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/module-worker.js new file mode 100644 index 00000000000..385fe710150 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/module-worker.js @@ -0,0 +1 @@ +import * as module from './imported-module-script.js'; diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js index 0c5bc3bd9aa..ddcc2cf5478 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/redirect-worker.js @@ -114,7 +114,7 @@ self.addEventListener('fetch', function(event) { return; } - event.respondWith(waitUntilPromise.then(function() { + event.respondWith(waitUntilPromise.then(async () => { if (params['sw'] == 'gen') { return Response.redirect(params['url']); } else if (params['sw'] == 'fetch') { @@ -126,18 +126,13 @@ self.addEventListener('fetch', function(event) { } else if (params['sw'] == 'manual') { return fetch(new Request(event.request.url, {redirect: 'manual'})); } else if (params['sw'] == 'manualThroughCache') { - var url = event.request.url; - var cache; - return caches.delete(url) - .then(function() { return self.caches.open(url); }) - .then(function(c) { - cache = c; - return fetch(new Request(url, {redirect: 'manual'})); - }) - .then(function(res) { return cache.put(event.request, res); }) - .then(function() { return cache.match(url); }); + const url = event.request.url; + await caches.delete(url) + const cache = await self.caches.open(url); + const response = await fetch(new Request(url, {redirect: 'manual'})); + await cache.put(event.request, response); + return cache.match(url); } - // unexpected... trigger an interception failure })); }); diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/update-registration-with-type.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/update-registration-with-type.https.html index 00c8a3345bb..b712c30f71e 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/update-registration-with-type.https.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/update-registration-with-type.https.html @@ -7,8 +7,8 @@ <script src="/resources/testharnessreport.js"></script> <script src="resources/test-helpers.sub.js"></script> <script> -// These tests check that a registration is updated correctly with -// different script type. At first Service Worker is register as +// The following two tests check that a registration is updated correctly +// with different script type. At first Service Worker is registered as // classic script type, then it is re-registered as module script type, // and vice versa. A main script is also updated at the same time. promise_test(async t => { @@ -16,16 +16,17 @@ promise_test(async t => { const script = `resources/update-registration-with-type.py?classic_first=1&key=${key}`; const scope = 'resources/update-registration-with-type'; await service_worker_unregister(t, scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); // Register with classic script type. const firstRegistration = await navigator.serviceWorker.register(script, { scope: scope, type: 'classic' }); - firstRegistration.installing.postMessage(' '); - let msgEvent = await new Promise(resolve => { - navigator.serviceWorker.onmessage = resolve; - }); + const firstWorker = firstRegistration.installing; + await wait_for_state(t, firstWorker, 'activated'); + firstWorker.postMessage(' '); + let msgEvent = await new Promise(r => navigator.serviceWorker.onmessage = r); assert_equals(msgEvent.data, 'A classic script.'); // Re-register with module script type. @@ -33,11 +34,12 @@ promise_test(async t => { scope: scope, type: 'module' }); - secondRegistration.installing.postMessage(' '); - msgEvent = await new Promise(resolve => { - navigator.serviceWorker.onmessage = resolve; - }); + const secondWorker = secondRegistration.installing; + secondWorker.postMessage(' '); + msgEvent = await new Promise(r => navigator.serviceWorker.onmessage = r); assert_equals(msgEvent.data, 'A module script.'); + + assert_not_equals(firstWorker, secondWorker); assert_equals(firstRegistration, secondRegistration); }, 'Update the registration with a different script type (classic => module).'); @@ -46,16 +48,17 @@ promise_test(async t => { const script = `resources/update-registration-with-type.py?classic_first=0&key=${key}`; const scope = 'resources/update-registration-with-type'; await service_worker_unregister(t, scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); // Register with module script type. const firstRegistration = await navigator.serviceWorker.register(script, { scope: scope, type: 'module' }); - firstRegistration.installing.postMessage(' '); - let msgEvent = await new Promise(resolve => { - navigator.serviceWorker.onmessage = resolve; - }); + const firstWorker = firstRegistration.installing; + await wait_for_state(t, firstWorker, 'activated'); + firstWorker.postMessage(' '); + let msgEvent = await new Promise(r => navigator.serviceWorker.onmessage = r); assert_equals(msgEvent.data, 'A module script.'); // Re-register with classic script type. @@ -63,12 +66,143 @@ promise_test(async t => { scope: scope, type: 'classic' }); - secondRegistration.installing.postMessage(' '); - msgEvent = await new Promise(resolve => { - navigator.serviceWorker.onmessage = resolve; - }); + const secondWorker = secondRegistration.installing; + secondWorker.postMessage(' '); + msgEvent = await new Promise(r => navigator.serviceWorker.onmessage = r); assert_equals(msgEvent.data, 'A classic script.'); + + assert_not_equals(firstWorker, secondWorker); assert_equals(firstRegistration, secondRegistration); }, 'Update the registration with a different script type (module => classic).'); + +// The following two tests change the script type while keeping +// the script identical. +promise_test(async t => { + const script = 'resources/empty-worker.js'; + const scope = 'resources/update-registration-with-type'; + await service_worker_unregister(t, scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); + + // Register with classic script type. + const firstRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'classic' + }); + const firstWorker = firstRegistration.installing; + await wait_for_state(t, firstWorker, 'activated'); + + // Re-register with module script type. + const secondRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'module' + }); + const secondWorker = secondRegistration.installing; + + assert_not_equals(firstWorker, secondWorker); + assert_equals(firstRegistration, secondRegistration); +}, 'Update the registration with a different script type (classic => module) ' + + 'and with a same main script.'); + +promise_test(async t => { + const script = 'resources/empty-worker.js'; + const scope = 'resources/update-registration-with-type'; + await service_worker_unregister(t, scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); + + // Register with module script type. + const firstRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'module' + }); + const firstWorker = firstRegistration.installing; + await wait_for_state(t, firstWorker, 'activated'); + + // Re-register with classic script type. + const secondRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'classic' + }); + const secondWorker = secondRegistration.installing; + + assert_not_equals(firstWorker, secondWorker); + assert_equals(firstRegistration, secondRegistration); +}, 'Update the registration with a different script type (module => classic) ' + + 'and with a same main script.'); + +// This test checks that a registration is not updated with the same script +// type and the same main script. +promise_test(async t => { + const script = 'resources/empty-worker.js'; + const scope = 'resources/update-registration-with-type'; + await service_worker_unregister(t, scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); + + // Register with module script type. + const firstRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'module' + }); + await wait_for_state(t, firstRegistration.installing, 'activated'); + + // Re-register with module script type. + const secondRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'module' + }); + assert_equals(secondRegistration.installing, null); + + assert_equals(firstRegistration, secondRegistration); +}, 'Does not update the registration with the same script type and ' + + 'the same main script.'); + +// In the case (classic => module), a worker script contains importScripts() +// that is disallowed on module scripts, so the second registration is +// expected to fail script evaluation. +promise_test(async t => { + const script = 'resources/classic-worker.js'; + const scope = 'resources/update-registration-with-type'; + await service_worker_unregister(t, scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); + + // Register with classic script type. + const firstRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'classic' + }); + assert_not_equals(firstRegistration.installing, null); + await wait_for_state(t, firstRegistration.installing, 'activated'); + + // Re-register with module script type and expect TypeError. + return promise_rejects(t, new TypeError, navigator.serviceWorker.register(script, { + scope: scope, + type: 'module' + }), 'Registering with invalid evaluation should be failed.'); +}, 'Update the registration with a different script type (classic => module) ' + + 'and with a same main script. Expect evaluation failed.'); + +// In the case (module => classic), a worker script contains static-import +// that is disallowed on classic scripts, so the second registration is +// expected to fail script evaluation. +promise_test(async t => { + const script = 'resources/module-worker.js'; + const scope = 'resources/update-registration-with-type'; + await service_worker_unregister(t, scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); + + // Register with module script type. + const firstRegistration = await navigator.serviceWorker.register(script, { + scope: scope, + type: 'module' + }); + assert_not_equals(firstRegistration.installing, null); + await wait_for_state(t, firstRegistration.installing, 'activated'); + + // Re-register with classic script type and expect TypeError. + return promise_rejects(t, new TypeError, navigator.serviceWorker.register(script, { + scope: scope, + type: 'classic' + }), 'Registering with invalid evaluation should be failed.'); +}, 'Update the registration with a different script type (module => classic) ' + + 'and with a same main script. Expect evaluation failed.'); </script> </body> diff --git a/tests/wpt/web-platform-tests/svg/geometry/inheritance.svg b/tests/wpt/web-platform-tests/svg/geometry/inheritance.svg new file mode 100644 index 00000000000..760328ac318 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/inheritance.svg @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>Inheritance of geometry properties</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/> + <h:meta name="assert" content="None of the geometry properties inherit."/> + <h:meta name="assert" content="Properties have initial values according to spec."/> + </metadata> + <g id="container"> + <g id="target"></g> + </g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/inheritance-testcommon.js"/> + <script><![CDATA[ + +assert_not_inherited('cx', '0px', '-10px'); +assert_not_inherited('cy', '0px', '-10px'); +assert_not_inherited('r', '0px', '10px'); +assert_not_inherited('rx', 'auto', '10px'); +assert_not_inherited('ry', 'auto', '10px'); +assert_not_inherited('x', '0px', '-10px'); +assert_not_inherited('y', '0px', '-10px'); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/cx-invalid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/cx-invalid.svg new file mode 100644 index 00000000000..4b1b90158fc --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/cx-invalid.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing cx with invalid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#CX"/> + <h:meta name="assert" content="cx supports only the grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_invalid_value("cx", "10"); +test_invalid_value("cx", "auto"); +test_invalid_value("cx", "10px 20px"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/cx-valid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/cx-valid.svg new file mode 100644 index 00000000000..e7f627ac721 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/cx-valid.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing cx with valid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#CX"/> + <h:meta name="assert" content="cx supports the full grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_valid_value("cx", "0", "0px"); +test_valid_value("cx", "-1px"); +test_valid_value("cx", "calc(2em + 3ex)"); +test_valid_value("cx", "4%"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/cy-invalid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/cy-invalid.svg new file mode 100644 index 00000000000..528eed02cea --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/cy-invalid.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing cy with invalid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#CY"/> + <h:meta name="assert" content="cy supports only the grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_invalid_value("cy", "10"); +test_invalid_value("cy", "auto"); +test_invalid_value("cy", "10px 20px"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/cy-valid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/cy-valid.svg new file mode 100644 index 00000000000..4372c36ea22 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/cy-valid.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing cy with valid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#CY"/> + <h:meta name="assert" content="cy supports the full grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_valid_value("cy", "0", "0px"); +test_valid_value("cy", "-1px"); +test_valid_value("cy", "calc(2em + 3ex)"); +test_valid_value("cy", "4%"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/r-invalid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/r-invalid.svg new file mode 100644 index 00000000000..a14c52266ce --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/r-invalid.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing r with invalid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#R"/> + <h:meta name="assert" content="r supports only the grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_invalid_value("r", "10"); +test_invalid_value("r", "auto"); +test_invalid_value("r", "10px 20px"); +test_invalid_value("r", "-1px"); +test_invalid_value("r", "-10%"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/r-valid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/r-valid.svg new file mode 100644 index 00000000000..70cd5503b79 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/r-valid.svg @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing r with valid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#R"/> + <h:meta name="assert" content="r supports the full grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_valid_value("r", "0", "0px"); +test_valid_value("r", "1px"); +test_valid_value("r", "calc(2em + 3ex)"); +test_valid_value("r", "4%"); +test_valid_value("r", "5vmin"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/rx-invalid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/rx-invalid.svg new file mode 100644 index 00000000000..9ce0603bea1 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/rx-invalid.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing rx with invalid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#RX"/> + <h:meta name="assert" content="rx supports only the grammar '<length-percentage> | auto'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_invalid_value("rx", "10"); +test_invalid_value("rx", "none"); +test_invalid_value("rx", "10px 20px"); +test_invalid_value("rx", "-1px"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/rx-valid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/rx-valid.svg new file mode 100644 index 00000000000..e2b628f1de4 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/rx-valid.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing rx with valid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#RX"/> + <h:meta name="assert" content="rx supports the full grammar '<length-percentage> | auto'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_valid_value("rx", "auto"); + +test_valid_value("rx", "0", "0px"); +test_valid_value("rx", "1px"); +test_valid_value("rx", "calc(2em + 3ex)"); +test_valid_value("rx", "4%"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/ry-invalid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/ry-invalid.svg new file mode 100644 index 00000000000..7a25a1ec0e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/ry-invalid.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing rx with invalid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#RY"/> + <h:meta name="assert" content="rx supports only the grammar '<length-percentage> | auto'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_invalid_value("rx", "10"); +test_invalid_value("rx", "none"); +test_invalid_value("rx", "10px 20px"); +test_invalid_value("rx", "-1px"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/ry-valid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/ry-valid.svg new file mode 100644 index 00000000000..4ce5bec4084 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/ry-valid.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing rx with valid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#RY"/> + <h:meta name="assert" content="rx supports the full grammar '<length-percentage> | auto'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_valid_value("rx", "auto"); + +test_valid_value("rx", "0", "0px"); +test_valid_value("rx", "1px"); +test_valid_value("rx", "calc(2em + 3ex)"); +test_valid_value("rx", "4%"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/x-invalid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/x-invalid.svg new file mode 100644 index 00000000000..31ad29524e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/x-invalid.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing x with invalid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#X"/> + <h:meta name="assert" content="x supports only the grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_invalid_value("x", "10"); +test_invalid_value("x", "auto"); +test_invalid_value("x", "10px 20px"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/x-valid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/x-valid.svg new file mode 100644 index 00000000000..5ff2fbd831d --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/x-valid.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing x with valid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#X"/> + <h:meta name="assert" content="x supports the full grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_valid_value("x", "0", "0px"); +test_valid_value("x", "-1px"); +test_valid_value("x", "calc(2em + 3ex)"); +test_valid_value("x", "4%"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/y-invalid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/y-invalid.svg new file mode 100644 index 00000000000..d6ea944dbd6 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/y-invalid.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing y with invalid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#Y"/> + <h:meta name="assert" content="y supports only the grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_invalid_value("y", "10"); +test_invalid_value("y", "auto"); +test_invalid_value("y", "10px 20px"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/geometry/parsing/y-valid.svg b/tests/wpt/web-platform-tests/svg/geometry/parsing/y-valid.svg new file mode 100644 index 00000000000..24885ccfc70 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/geometry/parsing/y-valid.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>SVG Geometry Properties: parsing y with valid values</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html#Y"/> + <h:meta name="assert" content="y supports the full grammar '<length-percentage>'."/> + </metadata> + <g id="target"></g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/parsing-testcommon.js"/> + <script><![CDATA[ + +test_valid_value("y", "0", "0px"); +test_valid_value("y", "-1px"); +test_valid_value("y", "calc(2em + 3ex)"); +test_valid_value("y", "4%"); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/painting/inheritance.svg b/tests/wpt/web-platform-tests/svg/painting/inheritance.svg new file mode 100644 index 00000000000..4499b9249a8 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/painting/inheritance.svg @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>Inheritance of SVG painting properties</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/painting.html"/> + <h:meta name="assert" content="properties inherit according to the spec."/> + <h:meta name="assert" content="properties have expected initial values."/> + </metadata> + <g id="container"> + <g id="target"></g> + </g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/inheritance-testcommon.js"/> + <script><![CDATA[ + +assert_inherited('fill', 'rgb(0, 0, 0)', 'rgb(42, 53, 64)'); +assert_inherited('fill-rule', 'nonzero', 'evenodd'); +assert_inherited('fill-opacity', '1', '0.5'); +assert_inherited('stroke', 'none', 'rgb(42, 53, 64)'); +assert_inherited('stroke-opacity', '1', '0.5'); +assert_inherited('stroke-width', '1px', '3px'); +assert_inherited('stroke-linecap', 'butt', 'round'); +assert_inherited('stroke-linejoin', 'miter', 'round'); +assert_inherited('stroke-miterlimit', '4', '12'); +assert_inherited('stroke-dasharray', 'none', '1px, 2px, 3px'); +assert_inherited('stroke-dashoffset', '0px', '50%'); +assert_inherited('marker-start', 'none', 'url("https://example/com/diagram.svg#marker")'); +assert_inherited('marker-mid', 'none', 'url("https://example/com/diagram.svg#marker")'); +assert_inherited('marker-end', 'none', 'url("https://example/com/diagram.svg#marker")'); +assert_inherited('paint-order', 'normal', 'markers stroke'); +assert_inherited('color-interpolation', 'srgb', 'linearrgb'); +assert_inherited('color-rendering', 'auto', 'optimizespeed'); +assert_inherited('shape-rendering', 'auto', 'optimizespeed'); +assert_inherited('text-rendering', 'auto', 'optimizespeed'); +assert_inherited('image-rendering', 'auto', 'optimizequality'); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/text/inheritance.svg b/tests/wpt/web-platform-tests/svg/text/inheritance.svg new file mode 100644 index 00000000000..1f4609d7ac6 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/text/inheritance.svg @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:h="http://www.w3.org/1999/xhtml" + width="800px" height="8000px"> + <title>Inheritance of text properties</title> + <metadata> + <h:link rel="help" href="https://svgwg.org/svg2-draft/text.html"/> + <h:meta name="assert" content="text properties do not inherit."/> + <h:meta name="assert" content="text properties have expected initial values."/> + </metadata> + <g id="container"> + <g id="target"></g> + </g> + <h:script src="/resources/testharness.js"/> + <h:script src="/resources/testharnessreport.js"/> + <h:script src="/css/support/inheritance-testcommon.js"/> + <script><![CDATA[ + +assert_not_inherited('inline-size', 'auto', '10px'); +assert_not_inherited('shape-inside', 'auto', 'url("https://example/com/")'); +assert_not_inherited('shape-subtract', 'auto', 'url("https://example/com/")'); +assert_not_inherited('shape-margin', '0px', '10px'); +assert_inherited('text-anchor', 'start', 'middle'); +assert_not_inherited('text-decoration-fill', 'none', 'url("https://example/com/")'); +assert_not_inherited('text-decoration-stroke', 'none', 'url("https://example/com/")'); + + ]]></script> +</svg> diff --git a/tests/wpt/web-platform-tests/tools/ci/check_stability.py b/tests/wpt/web-platform-tests/tools/ci/check_stability.py index fa0cc3ba88a..cbed7a3521d 100644 --- a/tests/wpt/web-platform-tests/tools/ci/check_stability.py +++ b/tests/wpt/web-platform-tests/tools/ci/check_stability.py @@ -11,7 +11,7 @@ here = os.path.dirname(__file__) wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir)) sys.path.insert(0, wpt_root) -from tools.wpt import testfiles +from tools.wpt import run as wptrun, testfiles from tools.wpt.testfiles import get_git_cmd from tools.wpt.virtualenv import Virtualenv from tools.wpt.utils import Kwargs @@ -32,7 +32,7 @@ def setup_logging(): handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) - + wptrun.setup_logging({}) def do_delayed_imports(): global wptrunner, run_step, write_inconsistent, write_slow_tests, write_results @@ -208,6 +208,8 @@ def main(): def run(venv, wpt_args, **kwargs): do_delayed_imports() + setup_logging() + retcode = 0 wpt_args = create_parser().parse_args(wpt_args) @@ -229,8 +231,6 @@ def run(venv, wpt_args, **kwargs): except OSError: pass - setup_logging() - pr_number = pr() with TravisFold("browser_setup"): diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py index 46afdfed64b..16cb075ad2d 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py @@ -67,22 +67,28 @@ class Firefox(Browser): platform_ini = "browsers/firefox/platform.ini" requirements = "requirements_firefox.txt" - def platform_string_geckodriver(self): - platform = { - "Linux": "linux", - "Windows": "win", - "Darwin": "macos" - }.get(uname[0]) + platform = { + "Linux": "linux", + "Windows": "win", + "Darwin": "macos" + }.get(uname[0]) + + application_name = { + "stable": "Firefox.app", + "beta": "Firefox.app", + "nightly": "Firefox Nightly.app" + } - if platform is None: + def platform_string_geckodriver(self): + if self.platform is None: raise ValueError("Unable to construct a valid Geckodriver package name for current platform") - if platform in ("linux", "win"): + if self.platform in ("linux", "win"): bits = "64" if uname[4] == "x86_64" else "32" else: bits = "" - return "%s%s" % (platform, bits) + return "%s%s" % (self.platform, bits) def install(self, dest=None, channel="nightly"): """Install Firefox.""" @@ -102,24 +108,14 @@ class Firefox(Browser): "beta": "latest-beta", "nightly": "latest" } - application_name = { - "stable": "Firefox.app", - "beta": "Firefox.app", - "nightly": "Firefox Nightly.app" - } + if channel not in branch: raise ValueError("Unrecognised release channel: %s" % channel) from mozdownload import FactoryScraper import mozinstall - platform = { - "Linux": "linux", - "Windows": "win", - "Darwin": "mac" - }.get(uname[0]) - - if platform is None: + if self.platform is None: raise ValueError("Unable to construct a valid Firefox package name for current platform") if dest is None: @@ -136,10 +132,10 @@ class Firefox(Browser): try: mozinstall.install(filename, dest) except mozinstall.mozinstall.InstallError: - if platform == "mac" and os.path.exists(os.path.join(dest, application_name[channel])): + if self.platform == "macos" and os.path.exists(os.path.join(dest, self.application_name.get(channel, "Firefox Nightly.app"))): # mozinstall will fail if nightly is already installed in the venv because # mac installation uses shutil.copy_tree - mozinstall.uninstall(os.path.join(dest, application_name[channel])) + mozinstall.uninstall(os.path.join(dest, self.application_name.get(channel, "Firefox Nightly.app"))) mozinstall.install(filename, dest) else: raise @@ -150,46 +146,31 @@ class Firefox(Browser): def find_binary_path(self,path=None, channel="nightly"): """Looks for the firefox binary in the virtual environment""" - platform = { - "Linux": "linux", - "Windows": "win", - "Darwin": "mac" - }.get(uname[0]) - - application_name = { - "stable": "Firefox.app", - "beta": "Firefox.app", - "nightly": "Firefox Nightly.app" - }.get(channel) - if path is None: #os.getcwd() doesn't include the venv path path = os.path.join(os.getcwd(), "_venv", "browsers", channel) binary = None - if platform == "linux": + if self.platform == "linux": binary = find_executable("firefox", os.path.join(path, "firefox")) - elif platform == "win": + elif self.platform == "win": import mozinstall binary = mozinstall.get_binary(path, "firefox") - elif platform == "mac": - binary = find_executable("firefox", os.path.join(path, application_name, + elif self.platform == "macos": + binary = find_executable("firefox", os.path.join(path, self.application_name.get(channel, "Firefox Nightly.app"), "Contents", "MacOS")) return binary - def find_binary(self, venv_path=None, channel=None): + def find_binary(self, venv_path=None, channel="nightly"): if venv_path is None: venv_path = os.path.join(os.getcwd(), "_venv") - if channel is None: - channel = "nightly" - path = os.path.join(venv_path, "browsers", channel) binary = self.find_binary_path(path, channel) - if not binary and uname[0] == "Darwin": + if not binary and self.platform == "macos": macpaths = ["/Applications/Firefox Nightly.app/Contents/MacOS", os.path.expanduser("~/Applications/Firefox Nightly.app/Contents/MacOS"), "/Applications/Firefox Developer Edition.app/Contents/MacOS", @@ -282,7 +263,7 @@ class Firefox(Browser): url = self.get_profile_bundle_url(version, channel) - print("Installing test prefs from %s" % url) + logger.info("Installing test prefs from %s" % url) try: extract_dir = tempfile.mkdtemp() unzip(get(url).raw, dest=extract_dir) @@ -294,7 +275,7 @@ class Firefox(Browser): finally: shutil.rmtree(extract_dir) else: - print("Using cached test prefs from %s" % dest) + logger.info("Using cached test prefs from %s" % dest) return dest diff --git a/tests/wpt/web-platform-tests/tools/wpt/commands.json b/tests/wpt/web-platform-tests/tools/wpt/commands.json index 0ea6b25276f..161a9defbd1 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/commands.json +++ b/tests/wpt/web-platform-tests/tools/wpt/commands.json @@ -1,6 +1,7 @@ { "run": {"path": "run.py", "script": "run", "parser": "create_parser", "help": "Run tests in a browser", "virtualenv": true, "install": ["requests"], "requirements": ["../wptrunner/requirements.txt"]}, + "create": {"path": "create.py", "script": "run", "parser": "get_parser", "help": "Create a new wpt test"}, "update-expectations": {"path": "update.py", "script": "update_expectations", "parser": "create_parser_update", "help": "Update expectations files from raw logs.", "virtualenv": true, "install": ["requests"], diff --git a/tests/wpt/web-platform-tests/tools/wpt/create.py b/tests/wpt/web-platform-tests/tools/wpt/create.py new file mode 100644 index 00000000000..696609a68ce --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wpt/create.py @@ -0,0 +1,131 @@ +import subprocess +import os + +here = os.path.dirname(__file__) + +template_prefix = """<!doctype html> +%(documentElement)s<meta charset=utf-8> +""" +template_long_timeout = "<meta name=timeout content=long>\n" + +template_body_th = """<title></title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> + +</script> +""" + +template_body_reftest = """<title></title> +<link rel=%(match)s href=%(ref)s> +""" + +template_body_reftest_wait = """<script src="/common/reftest-wait.js"></script> +""" + +def get_parser(): + import argparse + p = argparse.ArgumentParser() + p.add_argument("--no-editor", action="store_true", + help="Don't try to open the test in an editor") + p.add_argument("-e", "--editor", action="store", help="Editor to use") + p.add_argument("--long-timeout", action="store_true", + help="Test should be given a long timeout (typically 60s rather than 10s, but varies depending on environment)") + p.add_argument("--overwrite", action="store_true", + help="Allow overwriting an existing test file") + p.add_argument("-r", "--reftest", action="store_true", + help="Create a reftest rather than a testharness (js) test"), + p.add_argument("-m", "--reference", dest="ref", help="Path to the reference file") + p.add_argument("--mismatch", action="store_true", + help="Create a mismatch reftest") + p.add_argument("--wait", action="store_true", + help="Create a reftest that waits until takeScreenshot() is called") + p.add_argument("--tests-root", action="store", default=os.path.join(here, "..", ".."), + help="Path to the root of the wpt directory") + p.add_argument("path", action="store", help="Path to the test file") + return p + + + +def rel_path(path, tests_root): + if path is None: + return + + abs_path = os.path.normpath(os.path.abspath(path)) + return os.path.relpath(abs_path, tests_root) + + +def run(_venv, **kwargs): + path = rel_path(kwargs["path"], kwargs["tests_root"]) + ref_path = rel_path(kwargs["ref"], kwargs["tests_root"]) + + if kwargs["ref"]: + kwargs["reftest"] = True + + if ".." in path: + print("""Test path %s is not under wpt root.""" % path) + return 1 + + if ref_path and ".." in ref_path: + print("""Reference path %s is not under wpt root""" % ref_path) + return 1 + + + if os.path.exists(path) and not kwargs["overwrite"]: + print("Test path already exists, pass --overwrite to replace") + return 1 + + if kwargs["mismatch"] and not kwargs["reftest"]: + print("--mismatch only makes sense for a reftest") + return 1 + + if kwargs["wait"] and not kwargs["reftest"]: + print("--wait only makes sense for a reftest") + return 1 + + args = {"documentElement": "<html class=reftest-wait>\n" if kwargs["wait"] else ""} + template = template_prefix % args + if kwargs["long_timeout"]: + template += template_long_timeout + + if kwargs["reftest"]: + args = {"match": "match" if not kwargs["mismatch"] else "mismatch", + "ref": os.path.relpath(ref_path, path) if kwargs["ref"] else '""'} + template += template_body_reftest % args + if kwargs["wait"]: + template += template_body_reftest_wait + else: + template += template_body_th + try: + os.makedirs(os.path.dirname(path)) + except OSError: + pass + with open(path, "w") as f: + f.write(template) + + ref_path = kwargs["ref"] + if ref_path and not os.path.exists(ref_path): + with open(ref_path, "w") as f: + f.write(template_prefix % {"documentElement": ""}) + + if kwargs["no_editor"]: + editor = None + elif kwargs["editor"]: + editor = kwargs["editor"] + elif "VISUAL" in os.environ: + editor = os.environ["VISUAL"] + elif "EDITOR" in os.environ: + editor = os.environ["EDITOR"] + else: + editor = None + + proc = None + if editor: + if ref_path: + path = "%s %s" % (path, ref_path) + proc = subprocess.Popen("%s %s" % (editor, path), shell=True) + else: + print("Created test %s" % path) + + if proc: + proc.wait() diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py index 1894492d267..e10f895294f 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/run.py @@ -179,6 +179,7 @@ class Firefox(BrowserSetup): def setup_kwargs(self, kwargs): if kwargs["binary"] is None: if kwargs["browser_channel"] is None: + kwargs["browser_channel"] = "nightly" logger.info("No browser channel specified. Running nightly instead.") binary = self.browser.find_binary(self.venv.path, @@ -197,7 +198,7 @@ Install Firefox or use --binary to set the binary path""") logger.info("""Can't find certutil, certificates will not be checked. Consider installing certutil via your OS package manager or directly.""") else: - print("Using certutil %s" % certutil) + logger.info("Using certutil %s" % certutil) kwargs["certutil_binary"] = certutil @@ -208,15 +209,15 @@ Consider installing certutil via your OS package manager or directly.""") install = self.prompt_install("geckodriver") if install: - print("Downloading geckodriver") + logger.info("Downloading geckodriver") webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path) else: - print("Using webdriver binary %s" % webdriver_binary) + logger.info("Using webdriver binary %s" % webdriver_binary) if webdriver_binary: kwargs["webdriver_binary"] = webdriver_binary else: - print("Unable to find or install geckodriver, skipping wdspec tests") + logger.info("Unable to find or install geckodriver, skipping wdspec tests") kwargs["test_types"].remove("wdspec") if kwargs["prefs_root"] is None: @@ -229,6 +230,11 @@ Consider installing certutil via your OS package manager or directly.""") kwargs["headless"] = True logger.info("Running in headless mode, pass --no-headless to disable") + # Turn off Firefox WebRTC ICE logging on WPT (turned on by mozrunner) + os.unsetenv('R_LOG_LEVEL') + os.unsetenv('R_LOG_DESTINATION') + os.unsetenv('R_LOG_VERBOSE') + # Allow WebRTC tests to call getUserMedia. kwargs["extra_prefs"].append("media.navigator.streams.fake=true") @@ -253,10 +259,10 @@ class Chrome(BrowserSetup): install = self.prompt_install("chromedriver") if install: - print("Downloading chromedriver") + logger.info("Downloading chromedriver") webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path) else: - print("Using webdriver binary %s" % webdriver_binary) + logger.info("Using webdriver binary %s" % webdriver_binary) if webdriver_binary: kwargs["webdriver_binary"] = webdriver_binary @@ -287,10 +293,10 @@ class ChromeAndroid(BrowserSetup): install = self.prompt_install("chromedriver") if install: - print("Downloading chromedriver") + logger.info("Downloading chromedriver") webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path) else: - print("Using webdriver binary %s" % webdriver_binary) + logger.info("Using webdriver binary %s" % webdriver_binary) if webdriver_binary: kwargs["webdriver_binary"] = webdriver_binary @@ -310,10 +316,10 @@ class Opera(BrowserSetup): install = self.prompt_install("operadriver") if install: - print("Downloading operadriver") + logger.info("Downloading operadriver") webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path) else: - print("Using webdriver binary %s" % webdriver_binary) + logger.info("Using webdriver binary %s" % webdriver_binary) if webdriver_binary: kwargs["webdriver_binary"] = webdriver_binary @@ -454,18 +460,12 @@ product_setup = { } -def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs): - from wptrunner import wptrunner, wptcommandline +def setup_logging(kwargs): import mozlog + from wptrunner import wptrunner global logger - kwargs = utils.Kwargs(kwargs.iteritems()) - - product_parts = kwargs["product"].split(":") - kwargs["product"] = product_parts[0] - sub_product = product_parts[1:] - # Use the grouped formatter by default where mozlog 3.9+ is installed if hasattr(mozlog.formatters, "GroupingFormatter"): default_formatter = "grouped" @@ -474,6 +474,16 @@ def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs): wptrunner.setup_logging(kwargs, {default_formatter: sys.stdout}) logger = wptrunner.logger + +def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs): + from wptrunner import wptcommandline + + kwargs = utils.Kwargs(kwargs.iteritems()) + + product_parts = kwargs["product"].split(":") + kwargs["product"] = product_parts[0] + sub_product = product_parts[1:] + check_environ(kwargs["product"]) args_general(kwargs) @@ -516,6 +526,8 @@ def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs): def run(venv, **kwargs): + setup_logging(kwargs) + # Remove arguments that aren't passed to wptrunner prompt = kwargs.pop("prompt", True) install_browser = kwargs.pop("install_browser", False) diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py index 94b1202736f..aaff0fa5331 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py @@ -39,6 +39,11 @@ def venv(): shutil.rmtree(venv.path) +@pytest.fixture(scope="module") +def logger(): + run.setup_logging({}) + + @pytest.mark.parametrize("platform", ["Windows", "Linux", "Darwin"]) def test_check_environ_fail(platform): m_open = mock.mock_open(read_data=b"") @@ -53,7 +58,7 @@ def test_check_environ_fail(platform): @pytest.mark.parametrize("product", product_list) -def test_setup_wptrunner(venv, product): +def test_setup_wptrunner(venv, logger, product): parser = run.create_parser() kwargs = vars(parser.parse_args(["--channel=nightly", product])) kwargs["prompt"] = False diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py index d7c21cddfd6..061e549685c 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -37,8 +37,6 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data, capabilities = { "browserName": "chrome", - "platform": "ANY", - "version": "", "goog:chromeOptions": { "prefs": { "profile": { diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py index 2313a80c745..8e563b85a5a 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py @@ -15,15 +15,13 @@ from mozlog import structured manifest = None manifest_update = None download_from_github = None -manifest_log = None def do_delayed_imports(): # This relies on an already loaded module having set the sys.path correctly :( - global manifest, manifest_update, download_from_github, manifest_log + global manifest, manifest_update, download_from_github from manifest import manifest from manifest import update as manifest_update from manifest.download import download_from_github - from manifest import log as manifest_log class TestChunker(object): @@ -406,7 +404,6 @@ class ManifestLoader(object): def update_manifest(self, manifest_path, tests_path, url_base="/", recreate=False, download=False): self.logger.info("Updating test manifest %s" % manifest_path) - manifest_log.setup() json_data = None if download: diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py index 82aad5f6135..9e0ff029b84 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/parser.py @@ -531,10 +531,12 @@ class Parser(object): def expect(self, type, value=None): if self.token[0] != type: - raise ParseError + raise ParseError(self.tokenizer.filename, self.tokenizer.line_number, + "Token '{}' doesn't equal expected type '{}'".format(self.token[0], type)) if value is not None: if self.token[1] != value: - raise ParseError + raise ParseError(self.tokenizer.filename, self.tokenizer.line_number, + "Token '{}' doesn't equal expected value '{}'".format(self.token[1], value)) self.consume() @@ -553,7 +555,8 @@ class Parser(object): while self.token == (token_types.paren, "["): self.consume() if self.token[0] != token_types.string: - raise ParseError + raise ParseError(self.tokenizer.filename, self.tokenizer.line_number, + "Token '{}' is not a string".format(self.token[0])) self.tree.append(DataNode(self.token[1])) self.consume() self.expect(token_types.paren, "]") @@ -582,7 +585,8 @@ class Parser(object): elif self.token[0] == token_types.atom: self.atom() else: - raise ParseError + raise ParseError(self.tokenizer.filename, self.tokenizer.line_number, + "Token '{}' is not a known type".format(self.token[0])) def list_value(self): self.tree.append(ListNode()) diff --git a/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst b/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst index 8faeee489c9..df0746fd0fd 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst +++ b/tests/wpt/web-platform-tests/tools/wptserve/docs/pipes.rst @@ -56,7 +56,7 @@ and `}}`. Inside the block the following variables are available: The query parameters for the request e.g. `{{GET[id]}}` for an id parameter sent with the request. -So, for example, to write a javascript file called `xhr.js` that +So, for example, to write a JavaScript file called `xhr.js` that depends on the host name of the server, without hardcoding, one might write:: diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py index 190e385f102..b08f5eabe46 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py @@ -108,3 +108,50 @@ class TestUsingH2Server: def teardown_method(self, test_method): self.conn.close() self.server.stop() + + +class TestWrapperHandlerUsingServer(TestUsingServer): + '''For a wrapper handler, a .js dummy testing file is requried to render + the html file. This class extends the TestUsingServer and do some some + extra work: it tries to generate the dummy .js file in setUp and + remove it in tearDown.''' + dummy_js_files = {} + + def gen_js_file(self, filename, empty=True, content=b''): + self.remove_js_file(filename) + + with open(filename, 'wb') as fp: + if not empty: + fp.write(content) + + def remove_js_file(self, filename): + if os.path.exists(filename): + os.remove(filename) + + def setUp(self): + super(TestWrapperHandlerUsingServer, self).setUp() + + for filename, content in self.dummy_js_files.items(): + filepath = os.path.join(doc_root, filename) + if content == '': + self.gen_js_file(filepath) + else: + self.gen_js_file(filepath, False, content) + + def run_wrapper_test(self, req_file, header_data, wrapper_handler): + route = ('GET', req_file, wrapper_handler()) + self.server.router.register(*route) + + resp = self.request(route[1]) + self.assertEqual(200, resp.getcode()) + self.assertEqual(header_data, resp.info()['Content-Type']) + + with open(os.path.join(doc_root, req_file), 'rb') as fp: + self.assertEqual(fp.read(), resp.read()) + + def tearDown(self): + super(TestWrapperHandlerUsingServer, self).tearDown() + + for filename, _ in self.dummy_js_files.items(): + filepath = os.path.join(doc_root, filename) + self.remove_js_file(filepath) diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/bar.any.worker.js b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/bar.any.worker.js new file mode 100644 index 00000000000..66b7be39049 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/bar.any.worker.js @@ -0,0 +1,9 @@ + +self.GLOBAL = { + isWindow: function() { return false; }, + isWorker: function() { return true; }, +}; +importScripts("/resources/testharness.js"); + +importScripts("/bar.any.js"); +done(); diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.html b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.html new file mode 100644 index 00000000000..88e2665c669 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.html @@ -0,0 +1,14 @@ +<!doctype html> +<meta charset=utf-8> + +<script> +self.GLOBAL = { + isWindow: function() { return true; }, + isWorker: function() { return false; }, +}; +</script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id=log></div> +<script src="/foo.any.js"></script> diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.serviceworker.html b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.serviceworker.html new file mode 100644 index 00000000000..8dcb11a3768 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.serviceworker.html @@ -0,0 +1,15 @@ +<!doctype html> +<meta charset=utf-8> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id=log></div> +<script> +(async function() { + const scope = 'does/not/exist'; + let reg = await navigator.serviceWorker.getRegistration(scope); + if (reg) await reg.unregister(); + reg = await navigator.serviceWorker.register("/foo.any.worker.js", {scope}); + fetch_tests_from_worker(reg.installing); +})(); +</script> diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.sharedworker.html b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.sharedworker.html new file mode 100644 index 00000000000..277101697ff --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.sharedworker.html @@ -0,0 +1,9 @@ +<!doctype html> +<meta charset=utf-8> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id=log></div> +<script> +fetch_tests_from_worker(new SharedWorker("/foo.any.worker.js")); +</script> diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.worker.html b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.worker.html new file mode 100644 index 00000000000..f77edd971a4 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.any.worker.html @@ -0,0 +1,9 @@ +<!doctype html> +<meta charset=utf-8> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id=log></div> +<script> +fetch_tests_from_worker(new Worker("/foo.any.worker.js")); +</script> diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.window.html b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.window.html new file mode 100644 index 00000000000..04c694ddf2a --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.window.html @@ -0,0 +1,8 @@ +<!doctype html> +<meta charset=utf-8> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<div id=log></div> +<script src="/foo.window.js"></script> diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.worker.html b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.worker.html new file mode 100644 index 00000000000..3eddf36f1c3 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/foo.worker.html @@ -0,0 +1,9 @@ +<!doctype html> +<meta charset=utf-8> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id=log></div> +<script> +fetch_tests_from_worker(new Worker("/foo.worker.js")); +</script> diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_cookies.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_cookies.py index 6bcb842e625..2e2d0d6771b 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_cookies.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_cookies.py @@ -1,4 +1,3 @@ -import sys import unittest import pytest @@ -51,7 +50,6 @@ class TestResponseSetCookie(TestUsingServer): #Should also check that expires is in the past class TestRequestCookies(TestUsingServer): - @pytest.mark.xfail(sys.version_info >= (3,), reason="wptserve only works on Py2") def test_set_cookie(self): @wptserve.handlers.handler def handler(request, response): diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py index 759a096b799..db119616bd6 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py @@ -9,7 +9,9 @@ from six.moves.urllib.error import HTTPError wptserve = pytest.importorskip("wptserve") from .base import TestUsingServer, TestUsingH2Server, doc_root +from .base import TestWrapperHandlerUsingServer +from serve import serve class TestFileHandler(TestUsingServer): def test_GET(self): @@ -388,5 +390,58 @@ class TestH2Handler(TestUsingH2Server): assert resp.read() == '' +class TestWorkersHandler(TestWrapperHandlerUsingServer): + dummy_js_files = {'foo.worker.js': b'', + 'foo.any.js': b''} + + def test_any_worker_html(self): + self.run_wrapper_test('foo.any.worker.html', + 'text/html', serve.WorkersHandler) + + def test_worker_html(self): + self.run_wrapper_test('foo.worker.html', + 'text/html', serve.WorkersHandler) + + +class TestWindowHandler(TestWrapperHandlerUsingServer): + dummy_js_files = {'foo.window.js': b''} + + def test_window_html(self): + self.run_wrapper_test('foo.window.html', + 'text/html', serve.WindowHandler) + + +class TestAnyHtmlHandler(TestWrapperHandlerUsingServer): + dummy_js_files = {'foo.any.js': b''} + + def test_any_html(self): + self.run_wrapper_test('foo.any.html', + 'text/html', serve.AnyHtmlHandler) + + +class TestSharedWorkersHandler(TestWrapperHandlerUsingServer): + dummy_js_files = {'foo.any.js': b'// META: global=sharedworker\n'} + + def test_any_sharedworkers_html(self): + self.run_wrapper_test('foo.any.sharedworker.html', + 'text/html', serve.SharedWorkersHandler) + + +class TestServiceWorkersHandler(TestWrapperHandlerUsingServer): + dummy_js_files = {'foo.any.js': b'// META: global=serviceworker\n'} + + def test_serviceworker_html(self): + self.run_wrapper_test('foo.any.serviceworker.html', + 'text/html', serve.ServiceWorkersHandler) + + +class TestAnyWorkerHandler(TestWrapperHandlerUsingServer): + dummy_js_files = {'bar.any.js': b''} + + def test_any_work_js(self): + self.run_wrapper_test('bar.any.worker.js', 'text/javascript', + serve.AnyWorkerHandler) + + if __name__ == '__main__': unittest.main() diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/test_stash.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/test_stash.py new file mode 100644 index 00000000000..4813504a7e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/test_stash.py @@ -0,0 +1,130 @@ +import threading +import multiprocessing +from multiprocessing.managers import BaseManager + +import pytest + +Stash = pytest.importorskip("wptserve.stash").Stash + +@pytest.fixture() +def add_cleanup(): + fns = [] + + def add(fn): + fns.append(fn) + + yield add + + for fn in fns: + fn() + +def run(process_queue, request_lock, response_lock): + """Create two Stash instances in parallel threads. Use the provided locks + to ensure the first thread is actively establishing an interprocess + communication channel at the moment the second thread executes.""" + + def target(thread_queue): + stash = Stash("/", ("localhost", 4543), b"some key") + + # The `lock` property of the Stash instance should always be set + # immediately following initialization. These values are asserted in + # the active test. + thread_queue.put(stash.lock is None) + + thread_queue = multiprocessing.Queue() + first = threading.Thread(target=target, args=(thread_queue,)) + second = threading.Thread(target=target, args=(thread_queue,)) + + request_lock.acquire() + response_lock.acquire() + first.start() + + request_lock.acquire() + + # At this moment, the `first` thread is waiting for a proxied object. + # Create a second thread in order to inspect the behavior of the Stash + # constructor at this moment. + + second.start() + + # Allow the `first` thread to proceed + + response_lock.release() + + # Wait for both threads to complete and report their stateto the test + process_queue.put(thread_queue.get()) + process_queue.put(thread_queue.get()) + + +def test_delayed_lock(add_cleanup): + """Ensure that delays in proxied Lock retrieval do not interfere with + initialization in parallel threads.""" + + class SlowLock(BaseManager): + pass + + request_lock = multiprocessing.Lock() + response_lock = multiprocessing.Lock() + + queue = multiprocessing.Queue() + + def mutex_lock_request(): + """This request handler allows the caller to delay execution of a + thread which has requested a proxied representation of the `lock` + property, simulating a "slow" interprocess communication channel.""" + + request_lock.release() + response_lock.acquire() + return threading.Lock() + + SlowLock.register("get_dict", callable=lambda: {}) + SlowLock.register("Lock", callable=mutex_lock_request) + + slowlock = SlowLock(("localhost", 4543), b"some key") + slowlock.start() + add_cleanup(lambda: slowlock.shutdown()) + + parallel = multiprocessing.Process(target=run, + args=(queue, request_lock, response_lock)) + parallel.start() + add_cleanup(lambda: parallel.terminate()) + + assert [queue.get(), queue.get()] == [False, False], ( + "both instances had valid locks") + +def test_delayed_dict(add_cleanup): + """Ensure that delays in proxied `dict` retrieval do not interfere with + initialization in parallel threads.""" + + class SlowDict(BaseManager): + pass + + request_lock = multiprocessing.Lock() + response_lock = multiprocessing.Lock() + + queue = multiprocessing.Queue() + + # This request handler allows the caller to delay execution of a thread + # which has requested a proxied representation of the "get_dict" property. + def mutex_dict_request(): + """This request handler allows the caller to delay execution of a + thread which has requested a proxied representation of the `get_dict` + property, simulating a "slow" interprocess communication channel.""" + request_lock.release() + response_lock.acquire() + return {} + + SlowDict.register("get_dict", callable=mutex_dict_request) + SlowDict.register("Lock", callable=lambda: threading.Lock()) + + slowdict = SlowDict(("localhost", 4543), b"some key") + slowdict.start() + add_cleanup(lambda: slowdict.shutdown()) + + parallel = multiprocessing.Process(target=run, + args=(queue, request_lock, response_lock)) + parallel.start() + add_cleanup(lambda: parallel.terminate()) + + assert [queue.get(), queue.get()] == [False, False], ( + "both instances had valid locks") diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/config.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/config.py index cb5435fdef4..57368f794d2 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/config.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/config.py @@ -101,7 +101,7 @@ class ConfigBuilder(object): The properties on the final configuration include those explicitly supplied and computed properties. The computed properties are - defined byt the computed_properites attribute on the class. This + defined by the computed_properties attribute on the class. This is a list of property names, each corresponding to a _get_<name> method on the class. These methods are called in the order defined in computed_properties and are passed a single argument, a diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py index cbae6d6fcb9..bb24cd31006 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py @@ -329,7 +329,7 @@ def sub(request, response, escape_type="html"): "html" and "none", with "html" the default for historic reasons. The format is a very limited template language. Substitutions are - enclosed by {{ and }}. There are several avaliable substitutions: + enclosed by {{ and }}. There are several available substitutions: host A simple string value and represents the primary host from which the diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py index 990774cbb9e..b248a054d3b 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/request.py @@ -1,7 +1,7 @@ import base64 import cgi from six.moves.http_cookies import BaseCookie -from six import BytesIO, binary_type, text_type +from six import BytesIO, binary_type, text_type, iteritems, PY3 import tempfile from six.moves.urllib.parse import parse_qsl, urlsplit @@ -319,9 +319,11 @@ class Request(object): if self._cookies is None: parser = BaseCookie() cookie_headers = self.headers.get("cookie", b"") + if PY3: + cookie_headers = cookie_headers.decode("iso-8859-1") parser.load(cookie_headers) cookies = Cookies() - for key, value in parser.iteritems(): + for key, value in iteritems(parser): cookies[key] = CookieValue(value) self._cookies = cookies return self._cookies @@ -619,7 +621,7 @@ class Authentication(object): header, or None Both attributes are binary strings (`str` in Py2, `bytes` in Py3), since - RFC7617 Section 2.1 does not specify the encoding for username & passsword + RFC7617 Section 2.1 does not specify the encoding for username & password (as long it's compatible with ASCII). UTF-8 should be a relatively safe choice if callers need to decode them as most browsers use it. """ diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py index 802ae9ca9a9..848fbb74c7b 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/server.py @@ -44,7 +44,7 @@ for parsing the incoming request. A RequestRewriter is then applied and may change the request data if it matches a supplied rule. -Once the request data had been finalised, Request and Reponse +Once the request data had been finalised, Request and Response objects are constructed. These are used by the other parts of the system to read information about the request and manipulate the response. @@ -154,7 +154,7 @@ class WebTestServer(ThreadingMixIn, BaseHTTPServer.HTTPServer): port specified in the server_address parameter. False to bind the server only to the port in the server_address parameter, but not to the address. - :param latency: Delay in ms to wait before seving each response, or + :param latency: Delay in ms to wait before serving each response, or callable that returns a delay in ms """ self.router = router @@ -591,7 +591,7 @@ class WebTestHttpd(object): :param config: Dictionary holding environment configuration settings for handlers to read, or None to use the default values. :param bind_address: Boolean indicating whether to bind server to IP address. - :param latency: Delay in ms to wait before seving each response, or + :param latency: Delay in ms to wait before serving each response, or callable that returns a delay in ms HTTP server designed for testing scenarios. @@ -621,7 +621,7 @@ class WebTestHttpd(object): .. attribute:: started - Boolean indictaing whether the server is running + Boolean indictating whether the server is running """ def __init__(self, host="127.0.0.1", port=8000, diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/sslutils/__init__.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/sslutils/__init__.py index 6699edb5964..e89bb96f82f 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/sslutils/__init__.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/sslutils/__init__.py @@ -11,4 +11,4 @@ def get_cls(name): try: return environments[name] except KeyError: - raise ValueError("%s is not a vaid ssl type." % name) + raise ValueError("%s is not a valid SSL type." % name) diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py index ae48a861123..d13703c16eb 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/stash.py @@ -104,6 +104,7 @@ class Stash(object): _proxy = None lock = None + _initializing = threading.Lock() def __init__(self, default_path, address=None, authkey=None): self.default_path = default_path @@ -115,7 +116,16 @@ class Stash(object): Stash._proxy = {} Stash.lock = threading.Lock() - if Stash._proxy is None: + # Initializing the proxy involves connecting to the remote process and + # retrieving two proxied objects. This process is not inherently + # atomic, so a lock must be used to make it so. Atomicity ensures that + # only one thread attempts to initialize the connection and that any + # threads running in parallel correctly wait for initialization to be + # fully complete. + with Stash._initializing: + if Stash.lock: + return + manager = ClientDictManager(address, authkey) manager.connect() Stash._proxy = manager.get_dict() diff --git a/tests/wpt/web-platform-tests/trusted-types/HTMLElement-generic.tentative.html b/tests/wpt/web-platform-tests/trusted-types/HTMLElement-generic.tentative.html index 2d381045118..d1fafa70cd2 100644 --- a/tests/wpt/web-platform-tests/trusted-types/HTMLElement-generic.tentative.html +++ b/tests/wpt/web-platform-tests/trusted-types/HTMLElement-generic.tentative.html @@ -8,7 +8,7 @@ <script> var testnb = 0; // TrustedURL Assignments - let testCases = [ + const URLTestCases = [ [ 'a', 'href' ], [ 'area', 'href' ], [ 'base', 'href' ], @@ -24,27 +24,27 @@ [ 'track', 'src' ] ]; - testCases.forEach(c => { + URLTestCases.forEach(c => { test(t => { assert_element_accepts_trusted_url(window, ++testnb, t, c[0], c[1], RESULTS.URL); }, c[0] + "." + c[1] + " assigned via policy (successful URL transformation)"); }); // TrustedScriptURL Assignments - let scriptTestCases = [ + const scriptURLTestCases = [ [ 'embed', 'src' ], [ 'script', 'src' ] ]; testnb = 0; - scriptTestCases.forEach(c => { + scriptURLTestCases.forEach(c => { test(t => { assert_element_accepts_trusted_script_url(window, ++testnb, t, c[0], c[1], RESULTS.SCRIPTURL); }, c[0] + "." + c[1] + " assigned via policy (successful ScriptURL transformation)"); }); // TrustedHTML Assignments - let HTMLTestCases = [ + const HTMLTestCases = [ [ 'div', 'innerHTML' ], [ 'iframe', 'srcdoc' ] ]; @@ -55,4 +55,18 @@ assert_element_accepts_trusted_html(window, ++testnb, t, c[0], c[1], RESULTS.HTML); }, c[0] + "." + c[1] + " assigned via policy (successful HTML transformation)"); }); + + // TrustedScript Assignments + const scriptTestCases = [ + [ 'script', 'text' ], + [ 'script', 'innerText' ], + [ 'script', 'textContent' ] + ]; + + testnb = 0; + scriptTestCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_script(window, c, t, c[0], c[1], RESULTS.SCRIPT); + }, c[0] + "." + c[1] + " assigned via policy (successful Script transformation)"); + }); </script> diff --git a/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html index 2a7edab9db4..5fce3ff59e6 100644 --- a/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html +++ b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html @@ -89,4 +89,20 @@ assert_element_accepts_trusted_type(c[0], c[1], null, "null"); }, c[0] + "." + c[1] + " accepts string and null after default policy was created"); }); + + // TrustedScript Assignments + const scriptTestCases = [ + [ 'script', 'text' ], + [ 'script', 'innerText' ], + [ 'script', 'textContent' ] + ]; + + testnb = 0; + scriptTestCases.forEach(c => { + test(t => { + assert_element_accepts_trusted_script(window, ++testnb, t, c[0], c[1], RESULTS.SCRIPT); + assert_throws_no_trusted_type(c[0], c[1], 'A string'); + assert_throws_no_trusted_type(c[0], c[1], null); + }, c[0] + "." + c[1] + " accepts only TrustedScript"); + }); </script> diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js index a71783b99e1..519e38ae8ae 100644 --- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js +++ b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js @@ -1720,7 +1720,7 @@ const rotateListType = { 1000); testAnimationSamples(animation, idlName, - [{ time: 500, expected: '0 1 0 45deg' }]); + [{ time: 500, expected: 'y 45deg' }]); }, `${property} with rotation axes`); test(t => { @@ -1733,7 +1733,7 @@ const rotateListType = { 1000); testAnimationSamples(animation, idlName, - [{ time: 250, expected: '0 1 0 180deg' }]); + [{ time: 250, expected: 'y 180deg' }]); }, `${property} with rotation axes and range over 360 degrees`); test(t => { @@ -1768,15 +1768,15 @@ const rotateListType = { // Rotation specified in transform property should not affect the computed // value of |property|. target.style.transform = 'rotate(20deg)'; - target.style[idlName] = '0 1 0 -45deg'; + target.style[idlName] = 'y -45deg'; const animation = target.animate({ [idlName]: ['0 1 0 90deg', '0 1 0 180deg'] }, { duration: 1000, fill: 'both', composite: 'add' }); testAnimationSamples(animation, idlName, - [{ time: 0, expected: '0 1 0 45deg' }, - { time: 1000, expected: '0 1 0 135deg' }]); + [{ time: 0, expected: 'y 45deg' }, + { time: 1000, expected: 'y 135deg' }]); }, `${property} with underlying transform`); test(t => { @@ -1816,8 +1816,8 @@ const rotateListType = { { duration: 1000, fill: 'both', composite: 'accumulate' }); testAnimationSamples(animation, idlName, - [{ time: 0, expected: '1 0 0 45deg' }, - { time: 1000, expected: '1 0 0 135deg' }]); + [{ time: 0, expected: 'x 45deg' }, + { time: 1000, expected: 'x 135deg' }]); }, `${property} with underlying transform`); test(t => { @@ -1885,7 +1885,7 @@ const translateListType = { 1000 ); testAnimationSamples(animation, idlName, - [{ time: 500, expected: '200px -25.5px 200px' }]); + [{ time: 500, expected: '200px calc(25% - 50.5px) 200px' }]); }, `${property} with combination of percentages and lengths`); }, testAddition: function(property, setup) { @@ -1924,8 +1924,8 @@ const translateListType = { { duration: 1000, fill: 'both', composite: 'add' }); testAnimationSamples(animation, idlName, - [ { time: 0, expected: '-150px' }, - { time: 1000, expected: '550px' }]); + [ { time: 0, expected: 'calc(50% - 200px)' }, + { time: 1000, expected: 'calc(50% + 500px)' }]); }, `${property} with underlying percentage value`); }, @@ -2181,7 +2181,7 @@ const filterListType = { const animation = target.animate( { [idlName]: // To make missing filter-function-lists, specified the opacity. - ['opoacity(1)', + ['opacity(1)', 'opacity(0) grayscale(1) invert(1) sepia(1) blur(10px)'] }, 1000); diff --git a/tests/wpt/web-platform-tests/webdriver/tests/element_click/center_point.py b/tests/wpt/web-platform-tests/webdriver/tests/element_click/center_point.py index 21bf8f31fd8..da60a087277 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/element_click/center_point.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/element_click/center_point.py @@ -1,7 +1,7 @@ -import math import pytest from tests.support.asserts import assert_error, assert_success +from tests.support.helpers import center_point from tests.support.inline import inline @@ -12,28 +12,6 @@ def element_click(session, element): element_id=element.id)) -def center_point(element): - """Calculates the in-view center point of a web element.""" - inner_width, inner_height = element.session.execute_script( - "return [window.innerWidth, window.innerHeight]") - rect = element.rect - - # calculate the intersection of the rect that is inside the viewport - visible = { - "left": max(0, min(rect["x"], rect["x"] + rect["width"])), - "right": min(inner_width, max(rect["x"], rect["x"] + rect["width"])), - "top": max(0, min(rect["y"], rect["y"] + rect["height"])), - "bottom": min(inner_height, max(rect["y"], rect["y"] + rect["height"])), - } - - # arrive at the centre point of the visible rectangle - x = (visible["left"] + visible["right"]) / 2.0 - y = (visible["top"] + visible["bottom"]) / 2.0 - - # convert to CSS pixels, as centre point can be float - return (math.floor(x), math.floor(y)) - - def square(size): return inline(""" <style> diff --git a/tests/wpt/web-platform-tests/webdriver/tests/element_click/scroll_into_view.py b/tests/wpt/web-platform-tests/webdriver/tests/element_click/scroll_into_view.py index dde83a4244c..5891be572fe 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/element_click/scroll_into_view.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/element_click/scroll_into_view.py @@ -1,6 +1,7 @@ import pytest from tests.support.asserts import assert_error, assert_success +from tests.support.helpers import center_point from tests.support.inline import inline def element_click(session, element): @@ -10,6 +11,13 @@ def element_click(session, element): element_id=element.id)) +def assert_one_click(session): + """Asserts there has only been one click, and returns that.""" + clicks = session.execute_script("return window.clicks") + assert len(clicks) == 1 + return tuple(clicks[0]) + + def test_scroll_into_view(session): session.url = inline(""" <input type=text value=Federer @@ -27,3 +35,39 @@ def test_scroll_into_view(session): (rect["top"] + rect["height"]) <= window.innerHeight && (rect["left"] + rect["width"]) <= window.innerWidth; """, args=(element,)) is True + + +@pytest.mark.parametrize("offset", range(9, 0, -1)) +def test_partially_visible_does_not_scroll(session, offset): + session.url = inline(""" + <style> + body {{ + margin: 0; + padding: 0; + }} + + div {{ + background: blue; + height: 200px; + + /* make N pixels visible in the viewport */ + margin-top: calc(100vh - {offset}px); + }} + </style> + + <div></div> + + <script> + window.clicks = []; + let target = document.querySelector("div"); + target.addEventListener("click", ({{clientX, clientY}}) => window.clicks.push([clientX, clientY])); + </script> + """.format(offset=offset)) + target = session.find.css("div", all=False) + assert session.execute_script("return window.scrollY") == 0 + + response = element_click(session, target) + assert_success(response) + assert session.execute_script("return window.scrollY") == 0 + click_point = assert_one_click(session) + assert click_point == center_point(target) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/fullscreen_window/stress.py b/tests/wpt/web-platform-tests/webdriver/tests/fullscreen_window/stress.py new file mode 100644 index 00000000000..b907a31f17e --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/fullscreen_window/stress.py @@ -0,0 +1,19 @@ +# META: timeout=long + +import pytest + +from tests.support.asserts import assert_success +from tests.support.helpers import is_fullscreen + + +def fullscreen_window(session): + return session.transport.send( + "POST", "session/{session_id}/window/fullscreen".format(**vars(session))) + + +@pytest.mark.parametrize("i", range(5)) +def test_stress(session, i): + assert not is_fullscreen(session) + response = fullscreen_window(session) + assert_success(response) + assert is_fullscreen(session) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/maximize_window/stress.py b/tests/wpt/web-platform-tests/webdriver/tests/maximize_window/stress.py new file mode 100644 index 00000000000..daa8a911928 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/maximize_window/stress.py @@ -0,0 +1,42 @@ +# META: timeout=long + +import time + +import pytest + +from tests.support.asserts import assert_success +from tests.support.helpers import document_hidden + + +def maximize_window(session): + response = session.transport.send( + "POST", "session/{session_id}/window/maximize".format(**vars(session))) + rect = assert_success(response) + return (rect["width"], rect["height"]) + + +@pytest.mark.parametrize("i", range(5)) +def test_stress(session, i): + """ + Without defining the heuristics of each platform WebDriver runs on, + the best we can do is to test that maximization occurs synchronously. + + Not all systems and window managers support maximizing the window, + but they are expected to do their best. The minimum requirement + is that the maximized window is larger than its original size. + + To ensure the maximization happened synchronously, we test + that the size hasn't changed after a short amount of time, + using a thread suspend. This is not ideal, but the best we + can do given the level of platform ambiguity implied by WebDriver. + """ + session.window.size = (100, 100) + session.window.position = (0, 0) + original_size = session.window.size + + size_after_maximize = maximize_window(session) + assert size_after_maximize > original_size + + t_end = time.time() + 3 + while time.time() < t_end: + assert session.window.size == size_after_maximize diff --git a/tests/wpt/web-platform-tests/webdriver/tests/minimize_window/stress.py b/tests/wpt/web-platform-tests/webdriver/tests/minimize_window/stress.py new file mode 100644 index 00000000000..8990f12669d --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/minimize_window/stress.py @@ -0,0 +1,19 @@ +# META: timeout=long + +import pytest + +from tests.support.asserts import assert_success +from tests.support.helpers import document_hidden + + +def minimize_window(session): + return session.transport.send( + "POST", "session/{session_id}/window/minimize".format(**vars(session))) + + +@pytest.mark.parametrize("i", range(5)) +def test_stress(session, i): + assert not document_hidden(session) + response = minimize_window(session) + assert_success(response) + assert document_hidden(session) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/set_window_rect/set.py b/tests/wpt/web-platform-tests/webdriver/tests/set_window_rect/set.py index c6eae2886e9..4017bc198e4 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/set_window_rect/set.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/set_window_rect/set.py @@ -5,7 +5,8 @@ import pytest from webdriver.transport import Response from tests.support.asserts import assert_error, assert_success -from tests.support.helpers import document_hidden, is_fullscreen +from tests.support.helpers import (available_screen_size, document_hidden, + is_fullscreen, screen_size) def set_window_rect(session, rect): @@ -172,38 +173,31 @@ def test_height_width(session): session.window.position = (50, 50) original = session.window.rect - max = session.execute_script(""" - return { - width: window.screen.availWidth, - height: window.screen.availHeight, - }""") + screen_width, screen_height = screen_size(session) response = set_window_rect(session, { - "width": max["width"] - 100, - "height": max["height"] - 100 + "width": screen_width - 100, + "height": screen_height - 100 }) assert_success(response, { "x": original["x"], "y": original["y"], - "width": max["width"] - 100, - "height": max["height"] - 100 + "width": screen_width - 100, + "height": screen_height - 100, }) def test_height_width_larger_than_max(session): - max = session.execute_script(""" - return { - width: window.screen.availWidth, - height: window.screen.availHeight, - }""") + screen_width, screen_height = screen_size(session) + avail_width, avail_height = available_screen_size(session) response = set_window_rect(session, { - "width": max["width"] + 100, - "height": max["height"] + 100 + "width": screen_width + 100, + "height": screen_height + 100 }) rect = assert_success(response) - assert rect["width"] >= max["width"] - assert rect["height"] >= max["height"] + assert rect["width"] >= avail_width + assert rect["height"] >= avail_height def test_height_width_as_current(session): diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py b/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py index 6c62d756259..c955135f814 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py @@ -1,5 +1,6 @@ from __future__ import print_function +import math import sys import webdriver @@ -107,11 +108,33 @@ def clear_all_cookies(session): def document_dimensions(session): return tuple(session.execute_script(""" - let {width, height} = document.documentElement.getBoundingClientRect(); - return [width, height]; + let rect = document.documentElement.getBoundingClientRect(); + return [rect.width, rect.height]; """)) +def center_point(element): + """Calculates the in-view center point of a web element.""" + inner_width, inner_height = element.session.execute_script( + "return [window.innerWidth, window.innerHeight]") + rect = element.rect + + # calculate the intersection of the rect that is inside the viewport + visible = { + "left": max(0, min(rect["x"], rect["x"] + rect["width"])), + "right": min(inner_width, max(rect["x"], rect["x"] + rect["width"])), + "top": max(0, min(rect["y"], rect["y"] + rect["height"])), + "bottom": min(inner_height, max(rect["y"], rect["y"] + rect["height"])), + } + + # arrive at the centre point of the visible rectangle + x = (visible["left"] + visible["right"]) / 2.0 + y = (visible["top"] + visible["bottom"]) / 2.0 + + # convert to CSS pixels, as centre point can be float + return (math.floor(x), math.floor(y)) + + def document_hidden(session): """Polls for the document to become hidden.""" def hidden(session): @@ -122,13 +145,13 @@ def document_hidden(session): def element_rect(session, element): return session.execute_script(""" let element = arguments[0]; - let {height, left, top, width} = element.getBoundingClientRect(); + let rect = element.getBoundingClientRect(); return { - x: left + window.pageXOffset, - y: top + window.pageYOffset, - width: width, - height: height, + x: rect.left + window.pageXOffset, + y: rect.top + window.pageYOffset, + width: rect.width, + height: rect.height, }; """, args=(element,)) @@ -158,3 +181,34 @@ def is_fullscreen(session): return session.execute_script(""" return !!(window.fullScreen || document.webkitIsFullScreen) """) + + +def document_dimensions(session): + return tuple(session.execute_script(""" + let {devicePixelRatio} = window; + let {width, height} = document.documentElement.getBoundingClientRect(); + return [width * devicePixelRatio, height * devicePixelRatio]; + """)) + + +def screen_size(session): + """Returns the available width/height size of the screen.""" + return tuple(session.execute_script(""" + return [ + screen.availWidth, + screen.availHeight, + ]; + """)) + + +def available_screen_size(session): + """ + Returns the effective available screen width/height size, + excluding any fixed window manager elements. + """ + return tuple(session.execute_script(""" + return [ + screen.availWidth - screen.availLeft, + screen.availHeight - screen.availTop, + ]; + """)) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/take_element_screenshot/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/take_element_screenshot/__init__.py index d289ee3b912..cf3b21905b7 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/take_element_screenshot/__init__.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/take_element_screenshot/__init__.py @@ -1,6 +1,6 @@ def element_rect(session, element): return session.execute_script(""" - let {devicePixelRatio} = window; + let devicePixelRatio = window.devicePixelRatio; let rect = arguments[0].getBoundingClientRect(); return { diff --git a/tests/wpt/web-platform-tests/webdriver/tests/take_screenshot/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/take_screenshot/__init__.py index d38c8a0f79f..13d7a623eda 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/take_screenshot/__init__.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/take_screenshot/__init__.py @@ -1,6 +1,6 @@ def document_dimensions(session): return tuple(session.execute_script(""" - let {devicePixelRatio} = window; - let {width, height} = document.documentElement.getBoundingClientRect(); - return [Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio)]; + let devicePixelRatio = window.devicePixelRatio; + let rect = document.documentElement.getBoundingClientRect(); + return [Math.floor(rect.width * devicePixelRatio), Math.floor(rect.height * devicePixelRatio)]; """)) diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js index 8529fb4ef3c..df277ff6d35 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js @@ -249,6 +249,19 @@ function createDataChannelPair( }); } +// Wait for RTP and RTCP stats to arrive +async function waitForRtpAndRtcpStats(pc) { + while (true) { + const report = await pc.getStats(); + const stats = [...report.values()].filter(({type}) => type.endsWith("bound-rtp")); + // Each RTP and RTCP stat has a reference + // to the matching stat in the other direction + if (stats.length && stats.every(({localId, remoteId}) => localId || remoteId)) { + break; + } + } +} + // Wait for a single message event and return // a promise that resolve when the event fires function awaitMessage(channel) { diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html index 49eb522881a..41662f3158f 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html @@ -146,7 +146,7 @@ generateVideoReceiveOnlyOffer(pc) .then(offer2 => pc.setLocalDescription(offer2) - .then(offer2 => { + .then(() => { assert_session_desc_not_similar(offer1, offer2); assert_equals(pc.signalingState, 'have-local-offer'); assert_session_desc_similar(pc.localDescription, offer2); diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html index 682e7e57e46..3809530b74c 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html @@ -1,5 +1,6 @@ <!doctype html> <meta charset=utf-8> +<meta name="timeout" content="long"> <title>RTCPeerConnection.prototype.getStats</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -12,6 +13,7 @@ // The following helper functions are called from RTCPeerConnection-helper.js: // doSignalingHandshake // getUserMediaTracksAndStreams + // waitForRtpAndRtcpStats // The following helper functions are called from RTCStats-helper.js // (depends on dictionary-helper.js): @@ -504,6 +506,10 @@ await doSignalingHandshake(caller, callee); await onIceConnectionStateCompleted(caller); + // Wait until RTCP has arrived so that it can not arrive between + // the two get stats calls. + await waitForRtpAndRtcpStats(caller); + let senderReport = await sender.getStats(); let trackReport = await caller.getStats(sender.track); @@ -532,6 +538,10 @@ await onIceConnectionStateCompleted(caller); let receiver = caller.getReceivers()[0]; + // Wait until RTCP has arrived so that it can not arrive between + // the two get stats calls. + await waitForRtpAndRtcpStats(caller); + let receiverReport = await receiver.getStats(); let trackReport = await caller.getStats(receiver.track); diff --git a/tests/wpt/web-platform-tests/webrtc/RTCQuicStream-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCQuicStream-helper.js new file mode 100644 index 00000000000..a87668f5a21 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/RTCQuicStream-helper.js @@ -0,0 +1,62 @@ +'use strict'; + +// This file depends on RTCQuicTransport-helper.js which should be loaded from +// the main HTML file. +// The following helper methods are called from RTCQuicTransport-helper.js: +// makeTwoConnectedQuicTransports + +// Run a test function for as many ways as an RTCQuicStream can transition to +// the 'closed' state. +// |test_func| will be called with the test as the first argument and the closed +// RTCQuicStream as the second argument. +function closed_stream_test(test_func, description) { + promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.reset(); + assert_equals(localStream.state, 'closed'); + return test_func(t, localStream); + }, 'Stream closed by local reset(): ' + description); + + promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(1)); + const remoteWatcher = + new EventWatcher(t, remoteQuicTransport, 'quicstream'); + const { stream: remoteStream } = await remoteWatcher.wait_for('quicstream'); + localStream.reset(); + const remoteStreamWatcher = + new EventWatcher(t, remoteStream, 'statechange'); + await remoteStreamWatcher.wait_for('statechange'); + assert_equals(remoteStream.state, 'closed'); + return test_func(t, remoteStream); + }, 'Stream closed by remote reset(): ' + description); + + promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localQuicTransport.stop(); + assert_equals(localStream.state, 'closed'); + return test_func(t, localStream); + }, 'Stream closed by local RTCQuicTransport stop(): ' + description); + + promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(1)); + const remoteWatcher = + new EventWatcher(t, remoteQuicTransport, + [ 'quicstream', 'statechange' ]); + const { stream: remoteStream } = await remoteWatcher.wait_for('quicstream'); + localQuicTransport.stop(); + await remoteWatcher.wait_for('statechange'); + assert_equals(localStream.state, 'closed'); + return test_func(t, localStream); + }, 'Stream closed by remote RTCQuicTransport stop(): ' + description); +} + diff --git a/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html b/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html index 68c88e2757c..b147414794e 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCQuicStream.https.html @@ -5,6 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="RTCIceTransport-extension-helper.js"></script> <script src="RTCQuicTransport-helper.js"></script> +<script src="RTCQuicStream-helper.js"></script> <script> 'use strict'; @@ -14,6 +15,8 @@ // The following helper functions are called from RTCQuicTransport-helper.js: // makeStandaloneQuicTransport // makeTwoConnectedQuicTransports +// The following helper functions are called from RTCQuicStream-helper.js: +// closed_stream_test promise_test(async t => { const [ quicTransport, ] = await makeTwoConnectedQuicTransports(t); @@ -25,6 +28,8 @@ promise_test(async t => { 'Expect read buffered amount to be 0.'); assert_equals(quicStream.writeBufferedAmount, 0, 'Expect write buffered amount to be 0.'); + assert_greater_than(quicStream.maxWriteBufferedAmount, 0, + 'Expect max write buffered amount to be greater than 0.'); }, 'createStream() returns an RTCQuicStream with initial properties set.'); promise_test(async t => { @@ -155,4 +160,97 @@ promise_test(async t => { assert_equals(remoteStream.state, 'closed'); }, 'finish() then reset() fires two statechange events on the remote side.'); +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(0)); + assert_equals(localStream.writeBufferedAmount, 0); +}, 'write() with an empty array does nothing.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array([65])); + assert_equals(localStream.writeBufferedAmount, 1); + localStream.write(new Uint8Array([66, 67])); + assert_equals(localStream.writeBufferedAmount, 3); + localStream.write(new Uint8Array([68, 69, 70])); + assert_equals(localStream.writeBufferedAmount, 6); +}, 'write() adds to writeBufferedAmount each call.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(localStream.maxWriteBufferedAmount)); + assert_equals(localStream.writeBufferedAmount, + localStream.maxWriteBufferedAmount); +}, 'write() can write exactly maxWriteBufferedAmount.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + assert_throws('OperationError', + () => + localStream.write( + new Uint8Array(localStream.maxWriteBufferedAmount + 1))); + assert_equals(localStream.writeBufferedAmount, 0); +}, 'write() throws if data longer than maxWriteBufferedAmount.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(10)); + assert_throws('OperationError', + () => + localStream.write( + new Uint8Array(localStream.maxWriteBufferedAmount))); + assert_equals(localStream.writeBufferedAmount, 10); +}, 'write() throws if total write buffered amount would be greater than ' + + 'maxWriteBufferedAmount.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.finish(); + assert_throws('InvalidStateError', + () => localStream.write(new Uint8Array())); +}, 'write() throws InvalidStateError if finish() has been called.'); + +closed_stream_test(async (t, stream) => { + assert_throws('InvalidStateError', () => stream.write(new Uint8Array())); +}, 'write() throws InvalidStateError.'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(10)); + localStream.reset(); + assert_equals(localStream.writeBufferedAmount, 0); +}, 'writeBufferedAmount set to 0 after local reset().'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(10)); + localQuicTransport.stop(); + assert_equals(localStream.writeBufferedAmount, 0); +}, 'writeBufferedAmount set to 0 after local RTCQuicTransport stop().'); + +promise_test(async t => { + const [ localQuicTransport, remoteQuicTransport ] = + await makeTwoConnectedQuicTransports(t); + const localStream = localQuicTransport.createStream(); + localStream.write(new Uint8Array(10)); + localStream.finish(); + assert_equals(localStream.writeBufferedAmount, 10); +}, 'writeBufferedAmount maintained after finish() has been called.'); + </script> diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html index 7d16deaa8c7..1614a11c1a1 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html @@ -2129,6 +2129,7 @@ const tests = [ checkAddTransceiverWithTrack, checkAddTransceiverWithAddTrack, checkAddTransceiverWithDirection, + checkMsidNoTrackId, checkAddTransceiverWithSetRemoteOfferSending, checkAddTransceiverWithSetRemoteOfferNoSend, checkAddTransceiverBadKind, diff --git a/tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js b/tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js index 161a7d270bb..0abca1691a3 100644 --- a/tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js +++ b/tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js @@ -14,8 +14,9 @@ if ('MojoInterfaceInterceptor' in self) { let prefix = '/resources/chromium'; if ('window' in self) { - if (window.location.pathname.includes('/LayoutTests/')) { - let root = window.location.pathname.match(/.*LayoutTests/); + const pathname = window.location.pathname; + if (pathname.includes('/LayoutTests/') || pathname.includes('/web_tests/')) { + let root = pathname.match(/.*(?:LayoutTests|web_tests)/); prefix = `${root}/external/wpt/resources/chromium`; } } diff --git a/tests/wpt/web-platform-tests/worklets/resources/csp-tests.js b/tests/wpt/web-platform-tests/worklets/resources/csp-tests.js index 0de1daae228..d2ca05f3998 100644 --- a/tests/wpt/web-platform-tests/worklets/resources/csp-tests.js +++ b/tests/wpt/web-platform-tests/worklets/resources/csp-tests.js @@ -22,109 +22,165 @@ function openWindowAndExpectResult(windowURL, scriptURL, type, expectation) { // Usage: // runContentSecurityPolicyTests("paint"); function runContentSecurityPolicyTests(workletType) { - promise_test(t => { - const kWindowURL = - 'resources/addmodule-window.html?pipe=header(' + - 'Content-Security-Policy, script-src \'self\' \'unsafe-inline\')'; - const kScriptURL = - get_host_info().HTTPS_REMOTE_ORIGIN + - '/worklets/resources/import-empty-worklet-script-with-cors-header.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'REJECTED'); - }, 'Importing a remote-origin worklet script should be blocked by the ' + - 'script-src \'self\' directive.'); + runSrcTests(workletType); + runMixedContentTests(workletType); + runUpgradeInsecureRequestsTests(workletType); +} - promise_test(t => { - const kWindowURL = +// script-src and worker-src tests. +function runSrcTests(workletType) { + const kWindowConfigs = [ + { + 'windowURL': 'resources/addmodule-window.html?pipe=header(' + - 'Content-Security-Policy, script-src \'self\' \'unsafe-inline\')'; - const kScriptURL = 'import-remote-origin-empty-worklet-script.sub.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'REJECTED'); - }, 'Importing a remote-origin script from a same-origin worklet script ' + - 'should be blocked by the script-src \'self\' directive.'); - - promise_test(t => { - const kWindowURL = + 'Content-Security-Policy, script-src \'self\' \'unsafe-inline\')', + 'crossOriginExpectation': 'REJECTED', + 'message': 'should be blocked by the script-src \'self\' directive.' + }, + { + 'windowURL': 'resources/addmodule-window.html?pipe=header(' + - 'Content-Security-Policy, script-src * \'unsafe-inline\')'; - const kScriptURL = - get_host_info().HTTPS_REMOTE_ORIGIN + - '/worklets/resources/empty-worklet-script-with-cors-header.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'RESOLVED'); - }, 'Importing a remote-origin worklet script should not be blocked ' + - 'because the script-src * directive allows it.'); - - promise_test(t => { - const kWindowURL = + 'Content-Security-Policy, script-src ' + location.origin + ' ' + + get_host_info().HTTPS_REMOTE_ORIGIN + ' \'unsafe-inline\')', + 'crossOriginExpectation': 'RESOLVED', + 'message': + 'should not be blocked because the script-src directive ' + + 'specifying the origin allows it.' + }, + { + 'windowURL': 'resources/addmodule-window.html?pipe=header(' + - 'Content-Security-Policy, script-src * \'unsafe-inline\')'; - // A worklet on HTTPS_REMOTE_ORIGIN will import a child script on - // HTTPS_REMOTE_ORIGIN. - const kScriptURL = - get_host_info().HTTPS_REMOTE_ORIGIN + - '/worklets/resources/import-empty-worklet-script-with-cors-header.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'RESOLVED'); - }, 'Importing a remote-origin script from a remote-origin worklet script '+ - 'should not be blocked because the script-src * directive allows it.'); - - promise_test(t => { - const kWindowURL = + 'Content-Security-Policy, script-src * \'unsafe-inline\')', + 'crossOriginExpectation': 'RESOLVED', + 'message': + 'should not be blocked because the script-src * directive allows it.' + }, + { + 'windowURL': 'resources/addmodule-window.html?pipe=header(' + - 'Content-Security-Policy, worker-src \'self\' \'unsafe-inline\')'; - const kScriptURL = - get_host_info().HTTPS_REMOTE_ORIGIN + - '/worklets/resources/empty-worklet-script-with-cors-header.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'RESOLVED'); - }, 'Importing a remote-origin worklet script should not be blocked by ' + - 'the worker-src directive because worklets obey the script-src ' + - 'directive.'); + 'Content-Security-Policy, worker-src \'self\' \'unsafe-inline\')', + 'crossOriginExpectation': 'RESOLVED', + 'message': + 'should not be blocked by the worker-src directive ' + + 'because worklets obey the script-src directive.' + } + ]; + for (const windowConfig of kWindowConfigs) { + promise_test(t => { + const kScriptURL = + get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/empty-worklet-script-with-cors-header.js'; + return openWindowAndExpectResult( + windowConfig.windowURL, kScriptURL, workletType, + windowConfig.crossOriginExpectation); + }, + 'A remote-origin worklet ' + windowConfig.message); - promise_test(t => { - const kWindowURL = 'resources/addmodule-window.html'; - const kScriptURL = - get_host_info().HTTP_ORIGIN + - '/worklets/resources/empty-worklet-script.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'REJECTED'); - }, 'Importing an insecure-origin worklet script should be blocked because ' + - 'of mixed contents.'); + promise_test(t => { + const kScriptURL = 'import-remote-origin-empty-worklet-script.sub.js'; + return openWindowAndExpectResult( + windowConfig.windowURL, kScriptURL, workletType, + windowConfig.crossOriginExpectation); + }, + 'A same-origin worklet importing a remote-origin script ' + + windowConfig.message); - promise_test(t => { - const kWindowURL = 'resources/addmodule-window.html?pipe=header(' + - 'Content-Security-Policy, upgrade-insecure-requests)'; - // This test relies on some unintuitive cleverness due to WPT's test setup: - // 'Upgrade-Insecure-Requests' does not upgrade the port number, so we use - // URLs in the form `http://[host]:[https-port]`. If the upgrade fails, the - // load will fail, as we don't serve HTTP over the secure port. - const kHost = get_host_info().ORIGINAL_HOST; - const kPort = get_host_info().HTTPS_PORT; - const kScriptURL = - `http://${kHost}:${kPort}/worklets/resources/empty-worklet-script.js`; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'RESOLVED'); - }, 'Importing an insecure-origin worklet script should not be blocked ' + - 'because the upgrade-insecure-requests directive translates it as the ' + - 'secure origin.'); + promise_test(t => { + // A worklet on HTTPS_REMOTE_ORIGIN will import a child script on + // HTTPS_REMOTE_ORIGIN. + const kScriptURL = + get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/import-empty-worklet-script-with-cors-header.js'; + return openWindowAndExpectResult( + windowConfig.windowURL, kScriptURL, workletType, + windowConfig.crossOriginExpectation); + }, + 'A remote-origin worklet importing a remote-origin script ' + + windowConfig.message); + + promise_test(t => { + const kScriptURL = + '/common/redirect.py?location=' + encodeURIComponent( + get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/empty-worklet-script-with-cors-header.js'); + return openWindowAndExpectResult( + windowConfig.windowURL, kScriptURL, workletType, + windowConfig.crossOriginExpectation); + }, + 'A remote-origin-redirected worklet ' + windowConfig.message); + + promise_test(t => { + const kScriptURL = + 'import-remote-origin-redirected-empty-worklet-script.sub.js'; + return openWindowAndExpectResult( + windowConfig.windowURL, kScriptURL, workletType, + windowConfig.crossOriginExpectation); + }, + 'A same-origin worklet importing a remote-origin-redirected script ' + + windowConfig.message); + } +} + +// Mixed content tests. +function runMixedContentTests(workletType) { + const kInsecureURL = + get_host_info().HTTP_ORIGIN + + '/worklets/resources/empty-worklet-script-with-cors-header.js'; + const kScriptConfigs = [ + {URL: kInsecureURL, + message: 'An insecure-origin worklet'}, + {URL: '/common/redirect.py?location=' + encodeURIComponent(kInsecureURL), + message: 'An insecure-origin-redirected worklet'}, + {URL: 'import-insecure-origin-empty-worklet-script.sub.js', + message: 'A same-origin worklet importing an insecure-origin script'}, + {URL: 'import-insecure-origin-redirected-empty-worklet-script.sub.js', + message: 'A same-origin worklet ' + + 'importing an insecure-origin-redirected script'} + ]; + for (const scriptConfig of kScriptConfigs) { + promise_test(t => { + const kWindowURL = 'resources/addmodule-window.html'; + return openWindowAndExpectResult( + kWindowURL, scriptConfig.URL, workletType, 'REJECTED'); + }, + scriptConfig.message + ' should be blocked because of mixed contents.'); + } +} - promise_test(t => { - const kWindowURL = 'resources/addmodule-window.html'; - const kScriptURL = 'import-insecure-origin-empty-worklet-script.sub.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'REJECTED'); - }, 'Importing an insecure-origin script from a secure-origin worklet ' + - 'script should be blocked because of mixed contents.'); +// upgrade-insecure-requests tests. +function runUpgradeInsecureRequestsTests(workletType) { + // |kToBeUpgradedURL| is expected to upgraded/loaded successfully with + // upgrade-insecure-requests is specified. + // This relies on some unintuitive cleverness due to WPT's test setup: + // 'Upgrade-Insecure-Requests' does not upgrade the port number, so we use + // URLs in the form `http://[host]:[https-port]`. If the upgrade fails, the + // load will fail, as we don't serve HTTP over the secure port. + const kHost = get_host_info().ORIGINAL_HOST; + const kPort = get_host_info().HTTPS_PORT; + const kToBeUpgradedURL = + `http://${kHost}:${kPort}/worklets/resources/empty-worklet-script-with-cors-header.js`; - promise_test(t => { - const kWindowURL = 'resources/addmodule-window.html?pipe=header(' + - 'Content-Security-Policy, upgrade-insecure-requests)'; - const kScriptURL = 'import-insecure-origin-empty-worklet-script.sub.js'; - return openWindowAndExpectResult( - kWindowURL, kScriptURL, workletType, 'RESOLVED'); - }, 'Importing an insecure-origin script from a secure-origin worklet ' + - 'script should not be blocked because the upgrade-insecure-requests ' + - 'directive translates it as the secure origin.'); + const kScriptConfigs = [ + {URL: kToBeUpgradedURL, + message: 'An insecure-origin worklet'}, + {URL: '/common/redirect.py?location=' + + encodeURIComponent(kToBeUpgradedURL), + message: 'An insecure-origin-redirected worklet'}, + {URL: 'import-insecure-origin-empty-worklet-script.sub.js', + message: 'A same-origin worklet importing an insecure-origin script'}, + {URL: 'import-insecure-origin-redirected-empty-worklet-script.sub.js', + message: 'A same-origin worklet ' + + 'importing an insecure-origin-redirected script'} + ]; + for (const scriptConfig of kScriptConfigs) { + promise_test(t => { + const kWindowURL = + 'resources/addmodule-window.html?pipe=header(' + + 'Content-Security-Policy, upgrade-insecure-requests)'; + return openWindowAndExpectResult( + kWindowURL, scriptConfig.URL, workletType, 'RESOLVED'); + }, + scriptConfig.message + + ' should not be blocked because of upgrade-insecure-requests.'); + } } diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-insecure-origin-empty-worklet-script.sub.js b/tests/wpt/web-platform-tests/worklets/resources/import-insecure-origin-empty-worklet-script.sub.js index cc7f5f348a1..a04a2edf812 100644 --- a/tests/wpt/web-platform-tests/worklets/resources/import-insecure-origin-empty-worklet-script.sub.js +++ b/tests/wpt/web-platform-tests/worklets/resources/import-insecure-origin-empty-worklet-script.sub.js @@ -2,4 +2,4 @@ // 'Upgrade-Insecure-Requests' does not upgrade the port number, so we use URLs // in the form `http://[host]:[https-port]`. If the upgrade fails, the load will // fail, as we don't serve HTTP over the secure port. -import 'http://{{host}}:{{ports[https][0]}}/worklets/resources/empty-worklet-script.js'; +import 'http://{{host}}:{{ports[https][0]}}/worklets/resources/empty-worklet-script-with-cors-header.js'; diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-insecure-origin-redirected-empty-worklet-script.sub.js b/tests/wpt/web-platform-tests/worklets/resources/import-insecure-origin-redirected-empty-worklet-script.sub.js new file mode 100644 index 00000000000..888d876bff9 --- /dev/null +++ b/tests/wpt/web-platform-tests/worklets/resources/import-insecure-origin-redirected-empty-worklet-script.sub.js @@ -0,0 +1,5 @@ +// Some tests rely on some unintuitive cleverness due to WPT's test setup: +// 'Upgrade-Insecure-Requests' does not upgrade the port number, so we use URLs +// in the form `http://[host]:[https-port]`. If the upgrade fails, the load will +// fail, as we don't serve HTTP over the secure port. +import '/common/redirect.py?location=http://{{host}}:{{ports[https][0]}}/worklets/resources/empty-worklet-script-with-cors-header.js'; diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-remote-origin-empty-worklet-script.sub.js b/tests/wpt/web-platform-tests/worklets/resources/import-remote-origin-empty-worklet-script.sub.js index c3088987339..06c1f87618c 100644 --- a/tests/wpt/web-platform-tests/worklets/resources/import-remote-origin-empty-worklet-script.sub.js +++ b/tests/wpt/web-platform-tests/worklets/resources/import-remote-origin-empty-worklet-script.sub.js @@ -1 +1 @@ -import 'https://{{domains[www1]}}:{{ports[https][0]}}/worklets/resources/empty-worklet-script.js'; +import 'https://{{domains[www1]}}:{{ports[https][0]}}/worklets/resources/empty-worklet-script-with-cors-header.js'; diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-remote-origin-redirected-empty-worklet-script.sub.js b/tests/wpt/web-platform-tests/worklets/resources/import-remote-origin-redirected-empty-worklet-script.sub.js new file mode 100644 index 00000000000..7afa3523b9f --- /dev/null +++ b/tests/wpt/web-platform-tests/worklets/resources/import-remote-origin-redirected-empty-worklet-script.sub.js @@ -0,0 +1 @@ +import '/common/redirect.py?location=https://{{domains[www1]}}:{{ports[https][0]}}/worklets/resources/empty-worklet-script-with-cors-header.js'; diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-tests.js b/tests/wpt/web-platform-tests/worklets/resources/import-tests.js index 5ab841cd4a6..f504588cdb0 100644 --- a/tests/wpt/web-platform-tests/worklets/resources/import-tests.js +++ b/tests/wpt/web-platform-tests/worklets/resources/import-tests.js @@ -114,6 +114,29 @@ function runImportTests(worklet_type) { }, 'Importing a cross origin resource without the ' + 'Access-Control-Allow-Origin header should reject the given promise'); + promise_test(() => { + const kScriptURL = get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/empty-worklet-script.js' + + '?pipe=header(Access-Control-Allow-Origin, ' + + location.origin + ')'; + return worklet.addModule('/common/redirect.py?location=' + + encodeURIComponent(kScriptURL)) + .then(undefined_arg => { + assert_equals(undefined_arg, undefined); + }); + }, 'Importing a cross-origin-redirected resource with the ' + + 'Access-Control-Allow-Origin header should resolve the given promise'); + + promise_test(t => { + const kScriptURL = get_host_info().HTTPS_REMOTE_ORIGIN + + '/worklets/resources/empty-worklet-script.js'; + return promise_rejects(t, new DOMException('', 'AbortError'), + worklet.addModule( + '/common/redirect.py?location=' + + encodeURIComponent(kScriptURL))); + }, 'Importing a cross-origin-redirected resource without the ' + + 'Access-Control-Allow-Origin header should reject the given promise'); + promise_test(t => { const kScriptURL = 'resources/syntax-error-worklet-script.js'; return promise_rejects(t, new DOMException('', 'AbortError'), diff --git a/tests/wpt/web-platform-tests/worklets/resources/service-worker-interception-tests.js b/tests/wpt/web-platform-tests/worklets/resources/service-worker-interception-tests.js index 16d29873777..1298a626e4e 100644 --- a/tests/wpt/web-platform-tests/worklets/resources/service-worker-interception-tests.js +++ b/tests/wpt/web-platform-tests/worklets/resources/service-worker-interception-tests.js @@ -1,12 +1,12 @@ -function openWindow(url) { +function openWindow(t, url) { return new Promise(resolve => { - let win = window.open(url, '_blank'); - add_result_callback(() => win.close()); - window.onmessage = e => { - assert_equals(e.data, 'LOADED'); - resolve(win); - }; - }); + const win = window.open(url, '_blank'); + t.add_cleanup(() => win.close()); + window.onmessage = e => { + assert_equals(e.data, 'LOADED'); + resolve(win); + }; + }); } // Runs a series of tests related to service worker interception for a worklet. @@ -14,110 +14,95 @@ function openWindow(url) { // Usage: // runServiceWorkerInterceptionTests("paint"); function runServiceWorkerInterceptionTests(worklet_type) { - const worklet = get_worklet(worklet_type); + const worklet = get_worklet(worklet_type); - // Tests that a worklet should be served by the owner document's service - // worker. - // - // [Current document] registers a service worker for Window's URL. - // --(open)--> [Window] should be controlled by the service worker. - // --(addModule)--> [Worklet] should be served by the service worker. - promise_test(t => { - const kWindowURL = 'resources/addmodule-window.html'; - const kServiceWorkerScriptURL = 'resources/service-worker.js'; - // This doesn't contain the 'resources/' prefix because this will be - // imported from a html file under resources/. - const kWorkletScriptURL = 'non-existent-worklet-script.js'; + // Tests that a worklet should be served by the owner document's service + // worker. + // + // [Current document] registers a service worker for Window's URL. + // --(open)--> [Window] should be controlled by the service worker. + // --(addModule)--> [Worklet] should be served by the service worker. + promise_test(async t => { + const kWindowURL = 'resources/addmodule-window.html'; + const kServiceWorkerScriptURL = 'resources/service-worker.js'; + // This doesn't contain the 'resources/' prefix because this will be + // imported from a html file under resources/. + const kWorkletScriptURL = 'non-existent-worklet-script.js'; - return service_worker_unregister_and_register( - t, kServiceWorkerScriptURL, kWindowURL) - .then(r => { - add_result_callback(() => r.unregister()); - return wait_for_state(t, r.installing, 'activated'); - }) - .then(() => openWindow(kWindowURL)) - .then(win => { - assert_not_equals(win.navigator.serviceWorker.controller, null, - 'The document should be controlled.'); - const promise = new Promise(r => window.onmessage = r); - // The worklet script on kWorkletScriptURL doesn't exist but the - // service worker serves it, so the addModule() should succeed. - win.postMessage({ type: worklet_type, - script_url: kWorkletScriptURL }, '*'); - return promise; - }) - .then(msg_event => assert_equals(msg_event.data, 'RESOLVED')); - }, 'addModule() on a controlled document should be intercepted by a ' + - 'service worker.'); + const registration = await service_worker_unregister_and_register( + t, kServiceWorkerScriptURL, kWindowURL); + t.add_cleanup(() => registration.unregister()); + await wait_for_state(t, registration.installing, 'activated'); - // Tests that a worklet should not be served by a service worker other than - // the owner document's service worker. - // - // [Current document] registers a service worker for Worklet's URL. - // --(open)--> [Window] should not be controlled by the service worker. - // --(addModule)--> [Worklet] should not be served by the service worker. - promise_test(t => { - const kWindowURL = 'resources/addmodule-window.html'; - const kServiceWorkerScriptURL = 'resources/service-worker.js'; - // This doesn't contain the 'resources/' prefix because this will be - // imported from a html file under resources/. - const kWorkletScriptURL = 'non-existent-worklet-script.js'; + const win = await openWindow(t, kWindowURL); + assert_not_equals(win.navigator.serviceWorker.controller, null, + 'The document should be controlled.'); - return service_worker_unregister_and_register( - t, kServiceWorkerScriptURL, 'resources/' + kWorkletScriptURL) - .then(r => { - add_result_callback(() => r.unregister()); - return wait_for_state(t, r.installing, 'activated'); - }) - .then(() => openWindow(kWindowURL)) - .then(win => { - assert_equals(win.navigator.serviceWorker.controller, null, - 'The document should not be controlled.'); - const promise = new Promise(r => window.onmessage = r); - // The worklet script on kWorkletScriptURL doesn't exist and the - // service worker doesn't serve it, so the addModule() should - // fail. - win.postMessage({ type: worklet_type, - script_url: kWorkletScriptURL }, '*'); - return promise; - }) - .then(msg_event => assert_equals(msg_event.data, 'REJECTED')); - }, 'addModule() on a non-controlled document should not be intercepted ' + - 'by a service worker even if the script is under the service worker ' + - 'scope.'); + // The worklet script on kWorkletScriptURL doesn't exist but the service + // worker serves it, so the addModule() should succeed. + win.postMessage({ type: worklet_type, script_url: kWorkletScriptURL }, '*'); + const msgEvent = await new Promise(resolve => window.onmessage = resolve); + assert_equals(msgEvent.data, 'RESOLVED'); + }, 'addModule() on a controlled document should be intercepted by a ' + + 'service worker.'); - // Tests that static import should be served by the owner document's service - // worker. - // - // [Current document] registers a service worker for Window's URL. - // --(open)--> [Window] should be controlled by the service worker. - // --(addModule)--> [Worklet] should be served by the service worker. - // --(static import)--> [Script] should be served by the service worker. - promise_test(t => { - const kWindowURL = 'resources/addmodule-window.html'; - const kServiceWorkerScriptURL = 'resources/service-worker.js'; - // This doesn't contain the 'resources/' prefix because this will be - // imported from a html file under resources/. - const kWorkletScriptURL = 'import-non-existent-worklet-script.js'; + // Tests that a worklet should not be served by a service worker other than + // the owner document's service worker. + // + // [Current document] registers a service worker for Worklet's URL. + // --(open)--> [Window] should not be controlled by the service worker. + // --(addModule)--> [Worklet] should not be served by the service worker. + promise_test(async t => { + const kWindowURL = 'resources/addmodule-window.html'; + const kServiceWorkerScriptURL = 'resources/service-worker.js'; + // This doesn't contain the 'resources/' prefix because this will be + // imported from a html file under resources/. + const kWorkletScriptURL = 'non-existent-worklet-script.js'; - return service_worker_unregister_and_register( - t, kServiceWorkerScriptURL, kWindowURL) - .then(r => { - add_result_callback(() => r.unregister()); - return wait_for_state(t, r.installing, 'activated'); - }) - .then(() => openWindow(kWindowURL)) - .then(win => { - assert_not_equals(win.navigator.serviceWorker.controller, null, - 'The document should be controlled.'); - const promise = new Promise(r => window.onmessage = r); - // A script statically imported by the worklet doesn't exist but - // the service worker serves it, so the addModule() should - // succeed. - win.postMessage({ type: worklet_type, - script_url: kWorkletScriptURL }, '*'); - return promise; - }) - .then(msg_event => assert_equals(msg_event.data, 'RESOLVED')); - }, 'Static import should be intercepted by a service worker.'); + const registration = await service_worker_unregister_and_register( + t, kServiceWorkerScriptURL, 'resources/' + kWorkletScriptURL); + t.add_cleanup(() => registration.unregister()); + await wait_for_state(t, registration.installing, 'activated'); + + const win = await openWindow(t, kWindowURL); + assert_equals(win.navigator.serviceWorker.controller, null, + 'The document should not be controlled.'); + + // The worklet script on kWorkletScriptURL doesn't exist and the service + // worker doesn't serve it, so the addModule() should fail. + win.postMessage({ type: worklet_type, script_url: kWorkletScriptURL }, '*'); + const msgEvent = await new Promise(resolve => window.onmessage = resolve); + assert_equals(msgEvent.data, 'REJECTED'); + }, 'addModule() on a non-controlled document should not be intercepted by ' + + 'a service worker even if the script is under the service worker scope.'); + + // Tests that static import should be served by the owner document's service + // worker. + // + // [Current document] registers a service worker for Window's URL. + // --(open)--> [Window] should be controlled by the service worker. + // --(addModule)--> [Worklet] should be served by the service worker. + // --(static import)--> [Script] should be served by the service worker. + promise_test(async t => { + const kWindowURL = 'resources/addmodule-window.html'; + const kServiceWorkerScriptURL = 'resources/service-worker.js'; + // This doesn't contain the 'resources/' prefix because this will be + // imported from a html file under resources/. + const kWorkletScriptURL = 'import-non-existent-worklet-script.js'; + + const registration = await service_worker_unregister_and_register( + t, kServiceWorkerScriptURL, kWindowURL); + t.add_cleanup(() => registration.unregister()); + await wait_for_state(t, registration.installing, 'activated'); + + const win = await openWindow(t, kWindowURL); + assert_not_equals(win.navigator.serviceWorker.controller, null, + 'The document should be controlled.'); + + // A script statically imported by the worklet doesn't exist but the service + // worker serves it, so the addModule() should succeed. + win.postMessage({ type: worklet_type, script_url: kWorkletScriptURL }, '*'); + const msgEvent = await new Promise(resolve => window.onmessage = resolve); + assert_equals(msgEvent.data, 'RESOLVED'); + }, 'Static import should be intercepted by a service worker.'); } |