From dc71e058599ea530737ce069f2b8779af0633829 Mon Sep 17 00:00:00 2001 From: WPT Sync Bot Date: Sat, 30 Nov 2019 08:24:23 +0000 Subject: [PATCH] Update web-platform-tests to revision 3503c50a6452e153bde906a9c6644cb6237224fc --- .../url/url-in-tags-revoke.window.js.ini | 4 - .../FileAPI/url/url-with-fetch.any.js.ini | 3 + tests/wpt/metadata/MANIFEST.json | 2356 ++++++++--------- .../floats-in-table-caption-001.html.ini | 2 + .../line-height-interpolation.html.ini | 841 +++++- .../visibility-interpolation.html.ini | 244 +- .../column-gap-interpolation.html.ini | 469 +++- .../animation/row-gap-interpolation.html.ini | 469 +++- .../background-color-interpolation.html.ini | 397 ++- .../background-image-interpolation.html.ini | 556 +++- ...background-position-interpolation.html.ini | 148 +- ...und-position-origin-interpolation.html.ini | 211 +- ...ckground-position-x-interpolation.html.ini | 286 +- ...ckground-position-y-interpolation.html.ini | 286 +- .../background-size-interpolation.html.ini | 733 ++++- .../border-color-interpolation.html.ini | 346 ++- ...border-image-outset-interpolation.html.ini | 394 ++- ...age-slice-interpolation-stability.html.ini | 4 + .../border-image-slice-interpolation.html.ini | 778 +++++- ...border-image-source-interpolation.html.ini | 547 +++- .../border-image-width-interpolation.html.ini | 949 ++++++- .../border-radius-interpolation.html.ini | 487 +++- .../border-width-interpolation.html.ini | 643 ++++- .../box-shadow-interpolation.html.ini | 634 ++++- .../animation/color-interpolation.html.ini | 265 +- .../animation/opacity-interpolation.html.ini | 280 +- .../flex-basis-interpolation.html.ini | 310 ++- .../flex-grow-interpolation.html.ini | 352 ++- .../flex-shrink-interpolation.html.ini | 364 ++- .../animation/order-interpolation.html.ini | 427 ++- .../font-size-adjust-interpolation.html.ini | 589 ++++- .../font-size-interpolation-001.html.ini | 355 ++- .../font-size-interpolation-002.html.ini | 70 +- .../font-size-interpolation-003.html.ini | 70 +- ...-variation-settings-interpolation.html.ini | 865 +++++- .../standard-font-family-19.html.ini | 2 + .../standard-font-family-20.html.ini | 2 + .../object-position-interpolation.html.ini | 637 ++++- .../letter-spacing-interpolation.html.ini | 355 ++- .../text-indent-interpolation.html.ini | 610 ++++- .../word-spacing-interpolation.html.ini | 355 ++- .../line-break/line-break-normal-018.xht.ini | 2 + .../line-break/line-break-strict-018.xht.ini | 2 + .../trailing-ideographic-space-004.html.ini | 2 + .../animation/list-interpolation.html.ini | 220 +- .../animation/matrix-interpolation.html.ini | 13 +- .../perspective-interpolation.html.ini | 2 +- .../perspective-origin-interpolation.html.ini | 322 ++- .../animation/rotate-interpolation.html.ini | 886 ++++++- .../animation/scale-interpolation.html.ini | 952 ++++++- .../transform-interpolation-001.html.ini | 1081 +++++++- .../transform-interpolation-002.html.ini | 553 +++- .../transform-interpolation-003.html.ini | 439 ++- .../transform-interpolation-004.html.ini | 781 +++++- .../transform-interpolation-005.html.ini | 901 ++++++- .../transform-interpolation-006.html.ini | 235 +- .../transform-origin-interpolation.html.ini | 466 +++- .../translate-interpolation.html.ini | 1048 +++++++- .../text-shadow-interpolation.html.ini | 352 ++- .../vertical-align-interpolation.html.ini | 349 ++- .../animations/z-index-interpolation.html.ini | 421 ++- .../caret-color-interpolation.html.ini | 529 +++- .../outline-color-interpolation.html.ini | 265 +- .../outline-offset-interpolation.html.ini | 295 ++- .../outline-width-interpolation.html.ini | 361 ++- .../animations/calc-interpolation.html.ini | 298 +++ .../matchMedia-display-none-iframe.html.ini | 2 + ...backdrop-filter-interpolation-001.html.ini | 781 +++++- ...backdrop-filter-interpolation-002.html.ini | 205 +- ...backdrop-filter-interpolation-003.html.ini | 565 +++- ...backdrop-filter-interpolation-004.html.ini | 601 ++++- .../filter-interpolation-001.html.ini | 358 ++- .../filter-interpolation-002.html.ini | 355 ++- .../filter-interpolation-003.html.ini | 655 ++++- .../filter-interpolation-004.html.ini | 445 +++- .../cors/cors-preflight-redirect.any.js.ini | 60 - .../fetch/content-type/response.window.js.ini | 20 +- .../fetch/content-type/script.window.js.ini | 3 - .../metadata/navigation.https.sub.html.ini | 2 - .../navigation.tentative.https.sub.html.ini | 2 + ...e-prefetch.optional.tentative.sub.html.ini | 5 + ...e-prefetch.optional.tentative.sub.html.ini | 5 + ...e-prefetch.optional.tentative.sub.html.ini | 5 + .../nosniff/parsing-nosniff.window.js.ini | 3 + .../traverse_the_history_1.html.ini | 4 + .../traverse_the_history_4.html.ini | 4 - ...creating_browsing_context_test_01.html.ini | 3 +- .../embedded-opener-remove-frame.html.ini | 1 - .../iframe_sandbox_popups_escaping-1.html.ini | 3 +- .../iframe_sandbox_popups_escaping-3.html.ini | 3 +- ...rame_sandbox_popups_nonescaping-1.html.ini | 3 +- .../non-active-document.html.ini | 4 + .../infinite_backtracking.html.ini | 4 + .../form-double-submit-3.html.ini | 2 +- .../form-double-submit.html.ini | 2 +- .../parsing/DOMContentLoaded-defer.html.ini | 4 + .../the-offscreen-canvas/size.large.html.ini | 2 + .../webmessaging/with-ports/017.html.ini | 5 - .../webmessaging/without-ports/017.html.ini | 5 - .../webmessaging/without-ports/018.html.ini | 5 + .../Worker/Worker-constructor.html.ini | 2 - .../web-platform-tests/.azure-pipelines.yml | 9 +- .../.github/workflows/manifest.yml | 2 + tests/wpt/web-platform-tests/.taskcluster.yml | 411 +-- .../accept_ch.tentative.https.html | 22 +- .../http_equiv_accept_ch.tentative.https.html | 17 +- ...ompression-corrupt-input.tentative.any.js} | 0 .../conformance-checkers/messages.json | 2 +- .../image-pseudo-element-content-dpr-ref.html | 12 + .../image-pseudo-element-content-dpr.html | 17 + ...ntent-dpr-and-explicit-dimensions-ref.html | 10 + ...h-content-dpr-and-explicit-dimensions.html | 12 + .../image-with-dpr-header.html | 0 .../content-dpr/resources/background.png | Bin 0 -> 86 bytes .../resources/dpr.py | 0 .../content-dpr/resources/square.png | Bin 0 -> 18299 bytes ...background-image-with-content-dpr-ref.html | 29 + ...led-background-image-with-content-dpr.html | 27 + ...scriptions_empty.tentative.https.window.js | 13 + .../resources/always_changing_sw.sub.js | 6 + ...serviceworker_cookieStore_subscriptions.js | 65 +- ...eworker_cookieStore_subscriptions_basic.js | 45 +- ...eworker_cookieStore_subscriptions_empty.js | 16 +- ...re_subscriptions_eventhandler_attribute.js | 20 +- ...rker_cookieStore_subscriptions_mismatch.js | 20 +- ...ker_cookieStore_subscriptions_reset.sub.js | 24 - ...e_subscriptions_reset.tentative.https.html | 42 +- ...line-negative-margin-minmax-crash-001.html | 19 + .../background-image-interpolation.html | 99 +- ...r-image-slice-interpolation-stability.html | 24 + .../css/css-break/fieldset-001-ref.html | 55 + .../css/css-break/fieldset-001.html | 46 + .../tall-break-inside-avoid-at-start.html | 10 + .../animations/display-interpolation.html | 47 + .../standard-font-family-17-notref.html | 11 + .../css-fonts/standard-font-family-17.html | 14 + .../standard-font-family-18-notref.html | 17 + .../css-fonts/standard-font-family-18.html | 20 + .../standard-font-family-19-notref.html | 11 + .../css-fonts/standard-font-family-19.html | 14 + .../css-fonts/standard-font-family-2-ref.html | 1 + .../css/css-fonts/standard-font-family-2.html | 1 + .../standard-font-family-20-notref.html | 11 + .../css-fonts/standard-font-family-20.html | 20 + .../css-fonts/standard-font-family-6-ref.html | 1 + .../css/css-fonts/standard-font-family-6.html | 5 + .../css-fonts/standard-font-family-7-ref.html | 10 + .../css/css-fonts/standard-font-family-7.html | 10 + .../css-fonts/standard-font-family-ref.html | 1 + .../css/css-fonts/standard-font-family.html | 1 + .../list-style-image-interpolation.html | 147 + .../css/css-lists/resources/blue-20.png | Bin 0 -> 126 bytes .../css/css-lists/resources/green-20.png | Bin 0 -> 137 bytes .../css/css-lists/resources/stripes-20.png | Bin 0 -> 156 bytes .../animations/mask-image-interpolation.html | 180 ++ .../css/css-masking/resources/blue-20.png | Bin 0 -> 126 bytes .../css/css-masking/resources/green-20.png | Bin 0 -> 137 bytes .../css/css-masking/resources/stripes-20.png | Bin 0 -> 156 bytes .../css/css-multicol/equal-gap-and-rule.html | 8 + .../css-pseudo/first-line-and-marker-ref.html | 28 + .../css/css-pseudo/first-line-and-marker.html | 32 + .../parsing/marker-supported-properties.html | 2 +- .../scroll-snap-stop-change.html | 21 +- .../direction-rtl.html | 49 + .../snap-after-initial-layout-ref.html | 20 + .../writing-mode-horizontal-tb.html | 50 + .../writing-mode-vertical-lr.html | 50 + .../writing-mode-vertical-rl.html | 53 + .../adding-only-snap-area.html | 55 + .../adding-snap-area-while-snapped.html | 66 + .../move-current-target.html | 118 + .../remove-current-target.html | 65 + .../snap-to-different-targets.html | 92 + ...-area-capturing-add-scroll-container.html} | 12 +- ...rea-capturing-remove-scroll-container.html | 12 +- .../intrinsic-size-001-ref.html | 14 - .../intrinsic-size/intrinsic-size-001.html | 16 - .../intrinsic-size-002-ref.html | 21 - .../intrinsic-size/intrinsic-size-002.html | 22 - .../intrinsic-size-003-ref.html | 15 - .../intrinsic-size/intrinsic-size-003.html | 17 - .../intrinsic-size-004-ref.html | 15 - .../intrinsic-size/intrinsic-size-004.html | 17 - .../intrinsic-size-005-ref.html | 15 - .../intrinsic-size/intrinsic-size-005.html | 17 - .../intrinsic-size-006-ref.html | 16 - .../intrinsic-size/intrinsic-size-006.html | 16 - .../intrinsic-size-007-ref.html | 27 - .../intrinsic-size/intrinsic-size-007.html | 26 - .../intrinsic-size-008-ref.html | 37 - .../intrinsic-size/intrinsic-size-008.html | 37 - .../intrinsic-size-009-ref.html | 23 - .../intrinsic-size/intrinsic-size-009.html | 23 - .../intrinsic-size-010-ref.html | 39 - .../intrinsic-size/intrinsic-size-010.html | 40 - .../intrinsic-size-011-ref.html | 39 - .../intrinsic-size/intrinsic-size-011.html | 40 - .../intrinsic-size-012-ref.html | 14 - .../intrinsic-size/intrinsic-size-012.html | 15 - .../intrinsic-size-013-ref.html | 18 - .../intrinsic-size/intrinsic-size-013.html | 32 - .../intrinsic-size-014-ref.html | 18 - .../intrinsic-size/intrinsic-size-014.html | 19 - .../intrinsic-size-015-ref.html | 16 - .../intrinsic-size/intrinsic-size-015.html | 17 - .../intrinsic-size-016-ref.html | 39 - .../intrinsic-size/intrinsic-size-016.html | 41 - .../intrinsic-size-017-ref.html | 17 - .../intrinsic-size/intrinsic-size-017.html | 20 - .../intrinsic-size-018-ref.html | 15 - .../intrinsic-size/intrinsic-size-018.html | 18 - .../intrinsic-size-019-ref.html | 15 - .../intrinsic-size/intrinsic-size-019.html | 17 - .../intrinsic-size-020-ref.html | 14 - .../intrinsic-size/intrinsic-size-020.html | 17 - .../intrinsic-size-021-ref.html | 41 - .../intrinsic-size/intrinsic-size-021.html | 39 - .../intrinsic-size-022-ref.html | 30 - .../intrinsic-size/intrinsic-size-022.html | 31 - .../intrinsic-size-023-ref.html | 29 - .../intrinsic-size/intrinsic-size-023.html | 30 - .../intrinsic-size-024-ref.html | 30 - .../intrinsic-size/intrinsic-size-024.html | 31 - .../intrinsic-size-025-ref.html | 56 - .../intrinsic-size/intrinsic-size-025.html | 57 - .../intrinsic-size-026-ref.html | 53 - .../intrinsic-size/intrinsic-size-026.html | 61 - .../intrinsic-size-with-auto-001-ref.html | 37 - .../intrinsic-size-with-auto-001.html | 34 - .../intrinsic-size-with-auto-002-ref.html | 30 - .../intrinsic-size-with-auto-002.html | 34 - .../intrinsic-size-with-auto-003-ref.html | 37 - .../intrinsic-size-with-auto-003.html | 32 - .../intrinsic-size-with-legacy-001-ref.html | 15 - .../intrinsic-size-with-legacy-001.html | 17 - .../intrinsic-size-with-legacy-002-ref.html | 41 - .../intrinsic-size-with-legacy-002.html | 39 - .../intrinsic-size-with-legacy-003-ref.html | 20 - .../intrinsic-size-with-legacy-003.html | 20 - .../intrinsic-size-with-legacy-004-ref.html | 25 - .../intrinsic-size-with-legacy-004.html | 22 - .../intrinsic-size-with-legacy-005-ref.html | 36 - .../intrinsic-size-with-legacy-005.html | 44 - .../intrinsic-size-with-legacy-006-ref.html | 35 - .../intrinsic-size-with-legacy-006.html | 43 - .../intrinsic-size-with-legacy-007-ref.html | 35 - .../intrinsic-size-with-legacy-007.html | 43 - .../intrinsic-size-with-legacy-008-ref.html | 80 - .../intrinsic-size-with-legacy-008.html | 87 - .../intrinsic-block-size-computed.html | 30 - .../parsing/intrinsic-block-size-invalid.html | 21 - .../parsing/intrinsic-block-size-valid.html | 22 - .../parsing/intrinsic-height-computed.html | 30 - .../parsing/intrinsic-height-invalid.html | 21 - .../parsing/intrinsic-height-valid.html | 22 - .../intrinsic-inline-size-computed.html | 30 - .../intrinsic-inline-size-invalid.html | 21 - .../parsing/intrinsic-inline-size-valid.html | 22 - .../parsing/intrinsic-size-computed.html | 38 - .../parsing/intrinsic-size-invalid.html | 24 - ...trinsic-size-sets-computed-dimensions.html | 61 - .../parsing/intrinsic-size-valid.html | 26 - .../parsing/intrinsic-width-computed.html | 30 - .../parsing/intrinsic-width-invalid.html | 21 - .../parsing/intrinsic-width-valid.html | 22 - .../intrinsic-size/resources/dice.png | Bin 58618 -> 0 bytes .../percentage-resolution-001-ref.html | 16 - .../css-sizing/percentage-resolution-001.html | 26 - .../hyphens/hyphens-overflow-001.html | 4 - .../reference/hyphens-overflow-001-ref.html | 5 - .../animations/calc-interpolation.html | 97 + .../css/support/interpolation-testcommon.js | 10 + .../docs/writing-tests/reftests.md | 35 +- .../document-policy/echo-policy-nested.html | 32 + .../echo-policy-nested.html.headers | 1 + .../document-policy/echo-policy.py | 28 + .../required-policy/document-policy.html | 54 + .../document-policy.html.headers | 1 + .../required-policy/no-document-policy.html | 44 + .../required-document-policy-nested.html | 65 + .../required-document-policy.html | 65 + .../required-document-policy.html.headers | 1 + .../dom/events/Event-dispatch-redispatch.html | 138 +- .../api/cors/cors-preflight-redirect.any.js | 2 +- .../fetch/api/idlharness.any.js | 1 + .../appcache.tentative.https.sub.html | 35 +- ...ml => navigation.tentative.https.sub.html} | 0 ...grade-prefetch.optional.tentative.sub.html | 15 + ...grade-prefetch.optional.tentative.sub.html | 15 + ...grade-prefetch.optional.tentative.sub.html | 15 + .../fetch/metadata/resources/helper.js | 4 - .../fetch/metadata/resources/record-header.py | 15 +- .../resources/redirectTestHelper.sub.js | 49 +- .../fetch/stale-while-revalidate/fetch.html | 2 +- .../opener-closed.html | 2 +- .../opener-multiple.html | 2 +- .../opener-noopener.html | 2 +- .../opener-noreferrer.html | 2 +- .../opener-setter.html | 2 +- .../auxiliary-browsing-contexts/opener.html | 2 +- .../resize-during-playback.html | 39 + .../constraints/infinite_backtracking.html | 12 + .../actions/multiTouchPoints.html.ini | 2 +- .../reftest/reftest_wait_TestRendered.html | 14 + .../interfaces/cookie-store.idl | 26 +- .../interfaces/resize-observer.idl | 2 +- .../interfaces/wasm-js-api.idl | 15 +- .../web-platform-tests/interfaces/web-nfc.idl | 4 +- .../pointerdown-becomes-scroll.html | 62 + .../pointerdown-becomes-tap.html | 60 + .../layout-instability/resources/util.js | 3 + tests/wpt/web-platform-tests/lint.whitelist | 1 + .../400x300-red-resize-200x150-green.mp4 | Bin 0 -> 17425 bytes .../400x300-red-resize-200x150-green.webm | Bin 0 -> 11901 bytes .../portals/portals-adopt-predecessor.html | 10 + .../portals-adopt-predecessor-portal.html | 9 + ...t-worker-timing-frame.tentative.https.html | 225 ++ .../resources/fetch-event-worker-timing.js | 39 + .../storage-access-api/META.yml | 3 + tests/wpt/web-platform-tests/svg/META.yml | 1 + .../svg/painting/marker-009-ref.svg | 19 + .../svg/painting/marker-009.svg | 23 + .../svg/painting/marker-orient-001-ref.svg | 31 + .../svg/painting/marker-orient-001.svg | 16 + ...ject-in-non-rendered-getComputedStyle.html | 20 + .../tools/ci/azure/install_safari.yml | 2 +- .../ci/azure/safari-technology-preview.rb | 33 + .../web-platform-tests/tools/ci/commands.json | 24 +- .../wpt/web-platform-tests/tools/ci/run_tc.py | 109 +- .../web-platform-tests/tools/ci/tc/README.md | 235 ++ .../tools/{taskcluster => ci/tc}/__init__.py | 0 .../tools/ci/tc/decision.py | 323 +++ .../ci/{tcdownload.py => tc/download.py} | 1 + .../tools/ci/tc/taskgraph.py | 170 ++ .../tools/ci/tc/tasks/test.yml | 370 +++ .../tc}/testdata/master_push_event.json | 0 .../tc}/testdata/pr_event.json | 0 .../tc/testdata/pr_event_tests_affected.json | 505 ++++ .../tools/ci/tc/tests/test_decision.py | 54 + .../tools/ci/tc/tests/test_taskgraph.py | 146 + .../tools/ci/tc/tests/test_valid.py | 152 ++ .../tools/ci/tests/test_run_tc.py | 33 - .../tools/docker/frontend.py | 2 + .../tools/docker/seccomp.json | 798 ++++++ .../wpt/web-platform-tests/tools/lint/lint.py | 12 +- .../tools/lint/tests/test_lint.py | 30 +- .../tools/taskcluster/commands.json | 4 - .../tools/taskcluster/verify.py | 37 - tests/wpt/web-platform-tests/tools/tox.ini | 5 +- .../web-platform-tests/tools/wpt/browser.py | 107 +- .../web-platform-tests/tools/wpt/install.py | 17 +- tests/wpt/web-platform-tests/tools/wpt/paths | 1 - .../tools/wptrunner/docs/expectation.rst | 2 +- .../tools/wptrunner/requirements_firefox.txt | 2 +- .../wptrunner/wptrunner/executors/base.py | 66 +- .../wptrunner/executors/executormarionette.py | 65 +- .../wptrunner/executors/executorselenium.py | 44 +- .../wptrunner/executors/executorservo.py | 1 - .../executors/executorservodriver.py | 57 +- .../wptrunner/executors/executorwebdriver.py | 59 +- .../executors/reftest-wait_marionette.js | 19 - .../executors/reftest-wait_webdriver.js | 48 +- .../tools/wptrunner/wptrunner/testrunner.py | 18 + .../reverse-running-animation-ref.html | 17 + .../animations/reverse-running-animation.html | 41 + .../animations/sync-start-times-ref.html | 20 + .../animations/sync-start-times.html | 68 + .../update-playback-rate-fast-ref.html | 20 + .../animations/update-playback-rate-fast.html | 62 + .../update-playback-rate-slow-ref.html | 18 + .../animations/update-playback-rate-slow.html | 62 + .../update-playback-rate-zero-ref.html | 17 + .../animations/update-playback-rate-zero.html | 61 + ...html => NDEFReader_scan_filter.https.html} | 62 +- .../NDEFReadingEvent_constructor.https.html | 20 + .../web-nfc/resources/nfc-helpers.js | 5 +- .../tests/find_element_from_element/find.py | 1 - ...nection-setRemoteDescription-rollback.html | 38 +- .../web-platform-tests/xhr/idlharness.any.js | 1 + 379 files changed, 37923 insertions(+), 5120 deletions(-) create mode 100644 tests/wpt/metadata/css/CSS2/floats/floats-in-table-caption-001.html.ini create mode 100644 tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-interpolation-stability.html.ini create mode 100644 tests/wpt/metadata/css/css-fonts/standard-font-family-19.html.ini create mode 100644 tests/wpt/metadata/css/css-fonts/standard-font-family-20.html.ini create mode 100644 tests/wpt/metadata/css/css-text/line-break/line-break-normal-018.xht.ini create mode 100644 tests/wpt/metadata/css/css-text/line-break/line-break-strict-018.xht.ini create mode 100644 tests/wpt/metadata/css/css-text/white-space/trailing-ideographic-space-004.html.ini create mode 100644 tests/wpt/metadata/css/css-values/animations/calc-interpolation.html.ini create mode 100644 tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini delete mode 100644 tests/wpt/metadata/fetch/metadata/navigation.https.sub.html.ini create mode 100644 tests/wpt/metadata/fetch/metadata/navigation.tentative.https.sub.html.ini create mode 100644 tests/wpt/metadata/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade-prefetch.optional.tentative.sub.html.ini create mode 100644 tests/wpt/metadata/fetch/metadata/redirect/redirect-http-upgrade-prefetch.optional.tentative.sub.html.ini create mode 100644 tests/wpt/metadata/fetch/metadata/redirect/redirect-https-downgrade-prefetch.optional.tentative.sub.html.ini create mode 100644 tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini delete mode 100644 tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini create mode 100644 tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini create mode 100644 tests/wpt/metadata/html/semantics/forms/constraints/infinite_backtracking.html.ini create mode 100644 tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini create mode 100644 tests/wpt/metadata/offscreen-canvas/the-offscreen-canvas/size.large.html.ini delete mode 100644 tests/wpt/metadata/webmessaging/with-ports/017.html.ini delete mode 100644 tests/wpt/metadata/webmessaging/without-ports/017.html.ini create mode 100644 tests/wpt/metadata/webmessaging/without-ports/018.html.ini delete mode 100644 tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini rename tests/wpt/web-platform-tests/compression/{decompression-corrupt-input.any.js => decompression-corrupt-input.tentative.any.js} (100%) create mode 100644 tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr-ref.html create mode 100644 tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr.html create mode 100644 tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions-ref.html create mode 100644 tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions.html rename tests/wpt/web-platform-tests/{client-hints => content-dpr}/image-with-dpr-header.html (100%) create mode 100644 tests/wpt/web-platform-tests/content-dpr/resources/background.png rename tests/wpt/web-platform-tests/{client-hints => content-dpr}/resources/dpr.py (100%) create mode 100644 tests/wpt/web-platform-tests/content-dpr/resources/square.png create mode 100644 tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr-ref.html create mode 100644 tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr.html create mode 100644 tests/wpt/web-platform-tests/cookie-store/cookieStore_subscriptions_empty.tentative.https.window.js create mode 100644 tests/wpt/web-platform-tests/cookie-store/resources/always_changing_sw.sub.js delete mode 100644 tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.sub.js create mode 100644 tests/wpt/web-platform-tests/css/CSS2/linebox/inline-negative-margin-minmax-crash-001.html create mode 100644 tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-interpolation-stability.html create mode 100644 tests/wpt/web-platform-tests/css/css-break/fieldset-001-ref.html create mode 100644 tests/wpt/web-platform-tests/css/css-break/fieldset-001.html create mode 100644 tests/wpt/web-platform-tests/css/css-break/tall-break-inside-avoid-at-start.html create mode 100644 tests/wpt/web-platform-tests/css/css-display/animations/display-interpolation.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17-notref.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18-notref.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19-notref.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20-notref.html create mode 100644 tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20.html create mode 100644 tests/wpt/web-platform-tests/css/css-lists/animations/list-style-image-interpolation.html create mode 100644 tests/wpt/web-platform-tests/css/css-lists/resources/blue-20.png create mode 100644 tests/wpt/web-platform-tests/css/css-lists/resources/green-20.png create mode 100644 tests/wpt/web-platform-tests/css/css-lists/resources/stripes-20.png create mode 100644 tests/wpt/web-platform-tests/css/css-masking/animations/mask-image-interpolation.html create mode 100644 tests/wpt/web-platform-tests/css/css-masking/resources/blue-20.png create mode 100644 tests/wpt/web-platform-tests/css/css-masking/resources/green-20.png create mode 100644 tests/wpt/web-platform-tests/css/css-masking/resources/stripes-20.png create mode 100644 tests/wpt/web-platform-tests/css/css-multicol/equal-gap-and-rule.html create mode 100644 tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker-ref.html create mode 100644 tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/direction-rtl.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/snap-after-initial-layout-ref.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-horizontal-tb.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-lr.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-rl.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-only-snap-area.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-snap-area-while-snapped.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/move-current-target.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/remove-current-target.html create mode 100644 tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/snap-to-different-targets.html rename tests/wpt/web-platform-tests/css/css-scroll-snap/{snap-area-caputring-add-scroll-container.html => snap-area-capturing-add-scroll-container.html} (92%) delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-computed.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-invalid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-valid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-computed.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-invalid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-valid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-computed.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-invalid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-valid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-computed.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-invalid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-sets-computed-dimensions.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-valid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-computed.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-invalid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-valid.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/resources/dice.png delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/percentage-resolution-001-ref.html delete mode 100644 tests/wpt/web-platform-tests/css/css-sizing/percentage-resolution-001.html create mode 100644 tests/wpt/web-platform-tests/css/css-values/animations/calc-interpolation.html create mode 100644 tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html create mode 100644 tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers create mode 100644 tests/wpt/web-platform-tests/document-policy/echo-policy.py create mode 100644 tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html create mode 100644 tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers create mode 100644 tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html create mode 100644 tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html create mode 100644 tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html create mode 100644 tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers rename tests/wpt/web-platform-tests/fetch/metadata/{navigation.https.sub.html => navigation.tentative.https.sub.html} (100%) create mode 100644 tests/wpt/web-platform-tests/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade-prefetch.optional.tentative.sub.html create mode 100644 tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-http-upgrade-prefetch.optional.tentative.sub.html create mode 100644 tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-https-downgrade-prefetch.optional.tentative.sub.html create mode 100644 tests/wpt/web-platform-tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html create mode 100644 tests/wpt/web-platform-tests/html/semantics/forms/constraints/infinite_backtracking.html create mode 100644 tests/wpt/web-platform-tests/infrastructure/reftest/reftest_wait_TestRendered.html create mode 100644 tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-scroll.html create mode 100644 tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-tap.html create mode 100644 tests/wpt/web-platform-tests/media/400x300-red-resize-200x150-green.mp4 create mode 100644 tests/wpt/web-platform-tests/media/400x300-red-resize-200x150-green.webm create mode 100644 tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-worker-timing-frame.tentative.https.html create mode 100644 tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-worker-timing.js create mode 100644 tests/wpt/web-platform-tests/svg/painting/marker-009-ref.svg create mode 100644 tests/wpt/web-platform-tests/svg/painting/marker-009.svg create mode 100644 tests/wpt/web-platform-tests/svg/painting/marker-orient-001-ref.svg create mode 100644 tests/wpt/web-platform-tests/svg/painting/marker-orient-001.svg create mode 100644 tests/wpt/web-platform-tests/svg/render/foreignObject-in-non-rendered-getComputedStyle.html create mode 100644 tests/wpt/web-platform-tests/tools/ci/azure/safari-technology-preview.rb create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/README.md rename tests/wpt/web-platform-tests/tools/{taskcluster => ci/tc}/__init__.py (100%) create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/decision.py rename tests/wpt/web-platform-tests/tools/ci/{tcdownload.py => tc/download.py} (99%) create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml rename tests/wpt/web-platform-tests/tools/{taskcluster => ci/tc}/testdata/master_push_event.json (100%) rename tests/wpt/web-platform-tests/tools/{taskcluster => ci/tc}/testdata/pr_event.json (100%) create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/testdata/pr_event_tests_affected.json create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/tests/test_decision.py create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/tests/test_taskgraph.py create mode 100644 tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py delete mode 100644 tests/wpt/web-platform-tests/tools/ci/tests/test_run_tc.py create mode 100644 tests/wpt/web-platform-tests/tools/docker/seccomp.json delete mode 100644 tests/wpt/web-platform-tests/tools/taskcluster/commands.json delete mode 100644 tests/wpt/web-platform-tests/tools/taskcluster/verify.py delete mode 100644 tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation-ref.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times-ref.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast-ref.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow-ref.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero-ref.html create mode 100644 tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero.html rename tests/wpt/web-platform-tests/web-nfc/{NDEFReader_options.https.html => NDEFReader_scan_filter.https.html} (78%) diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index 76b398963ae..dd4ffcf4345 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -1,5 +1,4 @@ [url-in-tags-revoke.window.html] - expected: TIMEOUT [Fetching a blob URL immediately before revoking it works in an iframe.] expected: FAIL @@ -15,6 +14,3 @@ [Opening a blob URL in a new window by clicking an tag works immediately before revoking the URL.] expected: FAIL - [Fetching a blob URL immediately before revoking it works in diff --git a/tests/wpt/web-platform-tests/compression/decompression-corrupt-input.any.js b/tests/wpt/web-platform-tests/compression/decompression-corrupt-input.tentative.any.js similarity index 100% rename from tests/wpt/web-platform-tests/compression/decompression-corrupt-input.any.js rename to tests/wpt/web-platform-tests/compression/decompression-corrupt-input.tentative.any.js diff --git a/tests/wpt/web-platform-tests/conformance-checkers/messages.json b/tests/wpt/web-platform-tests/conformance-checkers/messages.json index 94d3bc461f5..2dcd3830d72 100644 --- a/tests/wpt/web-platform-tests/conformance-checkers/messages.json +++ b/tests/wpt/web-platform-tests/conformance-checkers/messages.json @@ -2187,7 +2187,7 @@ "html/media-queries/011-novalid.html": "Bad value \u201cscreen and (min-width: 400dpi)\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: \u201c400dpi\u201d is not a \u201cwidth\u201d value", "html/media-queries/013-novalid.html": "Bad value \u201cscreen and (min-width:\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: Parse Error.", "html/media-queries/014-novalid.html": "Bad value \u201cscreen and (min-width: 400px) and\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: Parse Error.", - "html/media-queries/019-novalid.html": "Bad value \u201cscreen and (color: 1em)\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: Too many values or values are not recognized", + "html/media-queries/019-novalid.html": "Bad value \u201cscreen and (color: 1em)\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: \u201c1em\u201d is not a \u201ccolor\u201d value", "html/media-queries/020-novalid.html": "Bad value \u201c,\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: Parse Error.", "html/media-queries/021-novalid.html": "Bad value \u201cscreen,,print\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: Parse Error.", "html/media-queries/022-novalid.html": "Bad value \u201cscreen,\u201d for attribute \u201cmedia\u201d on element \u201clink\u201d: Bad media query: Parse Error.", diff --git a/tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr-ref.html b/tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr-ref.html new file mode 100644 index 00000000000..baa25ac87c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr-ref.html @@ -0,0 +1,12 @@ + + + Content-DPR: pseudo elements + + + + + The following squares should be identical
+ + + + diff --git a/tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr.html b/tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr.html new file mode 100644 index 00000000000..7770df39997 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-dpr/image-pseudo-element-content-dpr.html @@ -0,0 +1,17 @@ + + + Content-DPR: pseudo elements + + + + + + + The following squares should be identical
+ + + diff --git a/tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions-ref.html b/tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions-ref.html new file mode 100644 index 00000000000..27ce1be8b0d --- /dev/null +++ b/tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions-ref.html @@ -0,0 +1,10 @@ + + + Content-DPR: render natural size + + + + + + + diff --git a/tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions.html b/tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions.html new file mode 100644 index 00000000000..783fb03a3b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-dpr/image-with-content-dpr-and-explicit-dimensions.html @@ -0,0 +1,12 @@ + + + Content-DPR: with size attributes + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/client-hints/image-with-dpr-header.html b/tests/wpt/web-platform-tests/content-dpr/image-with-dpr-header.html similarity index 100% rename from tests/wpt/web-platform-tests/client-hints/image-with-dpr-header.html rename to tests/wpt/web-platform-tests/content-dpr/image-with-dpr-header.html diff --git a/tests/wpt/web-platform-tests/content-dpr/resources/background.png b/tests/wpt/web-platform-tests/content-dpr/resources/background.png new file mode 100644 index 0000000000000000000000000000000000000000..6db6c6b1b9d851c7a85b93ddc9e5ddf368ac0a7e GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*Q=tfz}(h{fq-iw3rTiy7MjS(UvQ dcQNdOFc<=K>hx~uHmid)c)I$ztaD0e0sy7L60!gQ literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/client-hints/resources/dpr.py b/tests/wpt/web-platform-tests/content-dpr/resources/dpr.py similarity index 100% rename from tests/wpt/web-platform-tests/client-hints/resources/dpr.py rename to tests/wpt/web-platform-tests/content-dpr/resources/dpr.py diff --git a/tests/wpt/web-platform-tests/content-dpr/resources/square.png b/tests/wpt/web-platform-tests/content-dpr/resources/square.png new file mode 100644 index 0000000000000000000000000000000000000000..01c9666a8de9d5535615aff830810e5df4b2156f GIT binary patch literal 18299 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 bDgs((CoOJ&@$4~l+kmsZyIqm(x-I_(KvUo& literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr-ref.html b/tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr-ref.html new file mode 100644 index 00000000000..58cbeb436fc --- /dev/null +++ b/tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr-ref.html @@ -0,0 +1,29 @@ + + + Content-DPR: css tiled background + + + + + + The next div should have 16 boxes +
+
+ The next div should have 64 boxes +
+
+ + diff --git a/tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr.html b/tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr.html new file mode 100644 index 00000000000..94f2f72d401 --- /dev/null +++ b/tests/wpt/web-platform-tests/content-dpr/tiled-background-image-with-content-dpr.html @@ -0,0 +1,27 @@ + + + Content-DPR: css tiled background + + + + + + + The next div should have 16 boxes +
+
+ The next div should have 64 boxes +
+
+ + diff --git a/tests/wpt/web-platform-tests/cookie-store/cookieStore_subscriptions_empty.tentative.https.window.js b/tests/wpt/web-platform-tests/cookie-store/cookieStore_subscriptions_empty.tentative.https.window.js new file mode 100644 index 00000000000..907a34b4de6 --- /dev/null +++ b/tests/wpt/web-platform-tests/cookie-store/cookieStore_subscriptions_empty.tentative.https.window.js @@ -0,0 +1,13 @@ +// META: script=/service-workers/service-worker/resources/test-helpers.sub.js + +'use strict'; + +promise_test(async testCase => { + const registration = await service_worker_unregister_and_register( + testCase, 'resources/empty_sw.js', 'resources/does/not/exist'); + testCase.add_cleanup(() => registration.unregister()); + await wait_for_state(testCase, registration.installing, 'activated'); + + const subscriptions = await registration.cookies.getSubscriptions(); + assert_equals(0, subscriptions.length); +}, 'Newly registered and activated service worker has no subscriptions'); diff --git a/tests/wpt/web-platform-tests/cookie-store/resources/always_changing_sw.sub.js b/tests/wpt/web-platform-tests/cookie-store/resources/always_changing_sw.sub.js new file mode 100644 index 00000000000..9fdf99848fa --- /dev/null +++ b/tests/wpt/web-platform-tests/cookie-store/resources/always_changing_sw.sub.js @@ -0,0 +1,6 @@ +// This script changes every time it is fetched. + +// When used as a service worker script, this causes the Service Worker to be +// updated on every ServiceWorkerRegistration.update() call. + +// The following bytes change on every fetch: {{uuid()}} diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js index 41cbed01a5b..107bb957612 100644 --- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js +++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions.js @@ -4,26 +4,6 @@ self.GLOBAL = { }; importScripts("/resources/testharness.js"); -self.addEventListener('install', (event) => { - event.waitUntil((async () => { - // The subscribeToChanges calls are not done in parallel on purpose. Having - // multiple in-flight requests introduces failure modes aside from the - // cookie change logic that this test aims to cover. - try { - await cookieStore.subscribeToChanges([ - { name: 'cookie-name1', matchType: 'equals', url: '/cookie-store/path1' }]); - await cookieStore.subscribeToChanges([ - { }, // Test the default values for subscription properties. - { name: 'cookie-prefix', matchType: 'starts-with' }, - ]); - - // If the worker enters the "redundant" state, the UA may terminate it - // before all tests have been reported to the client. Stifle errors in - // order to avoid this and ensure all tests are consistently reported. - } catch (err) {} - })()); -}); - // Resolves when the service worker receives the 'activate' event. const kServiceWorkerActivatedPromise = new Promise(resolve => { self.addEventListener('activate', event => { resolve(); }); @@ -41,7 +21,23 @@ function CompareStrings(a, b) { promise_test(async testCase => { await kServiceWorkerActivatedPromise; - const subscriptions = await cookieStore.getChangeSubscriptions(); + { + const subscriptions = [ + { name: 'cookie-name1', matchType: 'equals', url: '/cookie-store/path1' }, + ]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); + } + { + const subscriptions = [ + { }, // Test the default values for subscription properties. + { name: 'cookie-prefix', matchType: 'starts-with' }, + ]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); + } + + const subscriptions = await registration.cookies.getSubscriptions(); assert_equals(subscriptions.length, 3); subscriptions.sort((a, b) => CompareStrings(`${a.name}`, `${b.name}`)); @@ -54,20 +50,13 @@ promise_test(async testCase => { assert_false('name' in subscriptions[2]); assert_equals('starts-with', subscriptions[2].matchType); -}, 'getChangeSubscriptions returns subscriptions passed to subscribeToChanges'); - -promise_test(async testCase => { - promise_rejects( - testCase, new TypeError(), - cookieStore.subscribeToChanges([{ name: 'cookie-name2' }])); -}, 'subscribeToChanges rejects when called outside the install handler'); - +}, 'getSubscriptions returns subscriptions passed to subscribe'); // Accumulates cookiechange events dispatched to the service worker. let g_cookie_changes = []; // Resolved when a cookiechange event is received. Rearmed by -// ResetCookieChangeReceivedPromise(). +// RearmCookieChangeReceivedPromise(). let g_cookie_change_received_promise = null; let g_cookie_change_received_promise_resolver = null; self.addEventListener('cookiechange', (event) => { @@ -85,6 +74,22 @@ RearmCookieChangeReceivedPromise(); promise_test(async testCase => { await kServiceWorkerActivatedPromise; + { + const subscriptions = [ + { name: 'cookie-name1', matchType: 'equals', url: '/cookie-store/path1' }, + ]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); + } + { + const subscriptions = [ + { }, // Test the default values for subscription properties. + { name: 'cookie-prefix', matchType: 'starts-with' }, + ]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); + } + await cookieStore.set('cookie-name', 'cookie-value'); testCase.add_cleanup(async () => { await cookieStore.delete('cookie-name'); diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js index 293969e5b8f..a96eeeb116d 100644 --- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js +++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_basic.js @@ -4,20 +4,6 @@ self.GLOBAL = { }; importScripts("/resources/testharness.js"); -self.addEventListener('install', (event) => { - event.waitUntil((async () => { - try { - await cookieStore.subscribeToChanges([ - { name: 'cookie-name', matchType: 'equals', - url: '/cookie-store/scope/path' }]); - - // If the worker enters the "redundant" state, the UA may terminate it - // before all tests have been reported to the client. Stifle errors in - // order to avoid this and ensure all tests are consistently reported. - } catch (err) {} - })()); -}); - // Resolves when the service worker receives the 'activate' event. const kServiceWorkerActivatedPromise = new Promise(resolve => { self.addEventListener('activate', event => { resolve(); }); @@ -26,29 +12,42 @@ const kServiceWorkerActivatedPromise = new Promise(resolve => { promise_test(async testCase => { await kServiceWorkerActivatedPromise; - const subscriptions = await cookieStore.getChangeSubscriptions(); + { + const subscriptions = [ + { name: 'cookie-name', matchType: 'equals', + url: '/cookie-store/scope/path' }]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); + } + + const subscriptions = await registration.cookies.getSubscriptions(); assert_equals(subscriptions.length, 1); assert_equals(subscriptions[0].name, 'cookie-name'); - assert_equals('equals', subscriptions[0].matchType); -}, 'getChangeSubscriptions returns a subscription passed to subscribeToChanges'); + assert_equals(subscriptions[0].matchType, 'equals'); + assert_equals(subscriptions[0].url, + (new URL("/cookie-store/scope/path", self.location.href)).href); +}, 'getSubscriptions returns a subscription passed to subscribe'); +const kCookieChangeReceivedPromise = new Promise((resolve) => { + self.addEventListener('cookiechange', event => { resolve(event); }); +}); promise_test(async testCase => { await kServiceWorkerActivatedPromise; - const cookie_change_received_promise = new Promise((resolve) => { - self.addEventListener('cookiechange', (event) => { - resolve(event); - }); - }); + const subscriptions = [ + { name: 'cookie-name', matchType: 'equals', + url: '/cookie-store/scope/path' }]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); await cookieStore.set('cookie-name', 'cookie-value'); testCase.add_cleanup(async () => { await cookieStore.delete('cookie-name'); }); - const event = await cookie_change_received_promise; + const event = await kCookieChangeReceivedPromise; assert_equals(event.type, 'cookiechange'); assert_equals(event.changed.length, 1); assert_equals(event.changed[0].name, 'cookie-name'); diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js index b6231869974..7df77730553 100644 --- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js +++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_empty.js @@ -4,18 +4,6 @@ self.GLOBAL = { }; importScripts("/resources/testharness.js"); -self.addEventListener('install', (event) => { - event.waitUntil((async () => { - try { - await cookieStore.subscribeToChanges([]); - - // If the worker enters the "redundant" state, the UA may terminate it - // before all tests have been reported to the client. Stifle errors in - // order to avoid this and ensure all tests are consistently reported. - } catch (err) {} - })()); -}); - // Resolves when the service worker receives the 'activate' event. const kServiceWorkerActivatedPromise = new Promise(resolve => { self.addEventListener('activate', event => { resolve(); }); @@ -24,9 +12,9 @@ const kServiceWorkerActivatedPromise = new Promise(resolve => { promise_test(async testCase => { await kServiceWorkerActivatedPromise; - const subscriptions = await cookieStore.getChangeSubscriptions(); + const subscriptions = await registration.cookies.getSubscriptions(); assert_equals(subscriptions.length, 0); -}, 'getChangeSubscriptions returns an empty array when there are no subscriptions'); +}, 'getSubscriptions returns an empty array when there are no subscriptions'); done(); diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js index 258441921bf..ed0cdcfcfca 100644 --- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js +++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_eventhandler_attribute.js @@ -4,20 +4,6 @@ self.GLOBAL = { }; importScripts("/resources/testharness.js"); -self.addEventListener('install', (event) => { - event.waitUntil((async () => { - try { - await cookieStore.subscribeToChanges([ - { name: 'cookie-name', matchType: 'equals', - url: '/cookie-store/scope/path' }]); - - // If the worker enters the "redundant" state, the UA may terminate it - // before all tests have been reported to the client. Stifle errors in - // order to avoid this and ensure all tests are consistently reported. - } catch (err) {} - })()); -}); - // Resolves when the service worker receives the 'activate' event. const kServiceWorkerActivatedPromise = new Promise((resolve) => { self.addEventListener('activate', event => { resolve(); }); @@ -32,6 +18,12 @@ const kCookieChangeReceivedPromise = new Promise((resolve) => { promise_test(async testCase => { await kServiceWorkerActivatedPromise; + const subscriptions = [ + { name: 'cookie-name', matchType: 'equals', + url: '/cookie-store/scope/path' }]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); + await cookieStore.set('cookie-name', 'cookie-value'); testCase.add_cleanup(async () => { await cookieStore.delete('cookie-name'); diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js index bd37b9be1ee..5414a664db6 100644 --- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js +++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_mismatch.js @@ -4,20 +4,6 @@ self.GLOBAL = { }; importScripts("/resources/testharness.js"); -self.addEventListener('install', (event) => { - event.waitUntil((async () => { - try { - await cookieStore.subscribeToChanges([ - { name: 'cookie-name', matchType: 'equals', - url: '/cookie-store/scope/path' }]); - - // If the worker enters the "redundant" state, the UA may terminate it - // before all tests have been reported to the client. Stifle errors in - // order to avoid this and ensure all tests are consistently reported. - } catch (err) {} - })()); -}); - // Resolves when the service worker receives the 'activate' event. const kServiceWorkerActivatedPromise = new Promise((resolve) => { self.addEventListener('activate', event => { resolve(); }); @@ -32,6 +18,12 @@ const kCookieChangeReceivedPromise = new Promise((resolve) => { promise_test(async testCase => { await kServiceWorkerActivatedPromise; + const subscriptions = [ + { name: 'cookie-name', matchType: 'equals', + url: '/cookie-store/scope/path' }]; + await registration.cookies.subscribe(subscriptions); + testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions)); + await cookieStore.set('another-cookie-name', 'cookie-value'); testCase.add_cleanup(async () => { await cookieStore.delete('another-cookie-name'); diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.sub.js b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.sub.js deleted file mode 100644 index 7fc8eabc570..00000000000 --- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.sub.js +++ /dev/null @@ -1,24 +0,0 @@ -self.GLOBAL = { - isWindow: function() { return false; }, - isWorker: function() { return true; }, -}; -importScripts("/resources/testharness.js"); - -self.addEventListener('install', event => { - event.waitUntil((async () => { - try { - await cookieStore.subscribeToChanges([ - { name: 'cookie-name', matchType: 'equals', - url: '/cookie-store/scope/path' }]); - - // If the worker enters the "redundant" state, the UA may terminate it - // before all tests have been reported to the client. Stifle errors in - // order to avoid this and ensure all tests are consistently reported. - } catch (err) {} - })()); -}); - -self.addEventListener('message', async event => { - const subscriptions = await cookieStore.getChangeSubscriptions(); - event.ports[0].postMessage(subscriptions.length); -}); \ No newline at end of file diff --git a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.tentative.https.html b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.tentative.https.html index a0923548c78..4e157840e98 100644 --- a/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.tentative.https.html +++ b/tests/wpt/web-platform-tests/cookie-store/serviceworker_cookieStore_subscriptions_reset.tentative.https.html @@ -8,30 +8,48 @@ diff --git a/tests/wpt/web-platform-tests/css/CSS2/linebox/inline-negative-margin-minmax-crash-001.html b/tests/wpt/web-platform-tests/css/CSS2/linebox/inline-negative-margin-minmax-crash-001.html new file mode 100644 index 00000000000..d6480edd621 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/linebox/inline-negative-margin-minmax-crash-001.html @@ -0,0 +1,19 @@ + +CSS Test: Check inline negative margin with fit-content should not cause hang + + + + + + + +
| Operation
+ + diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation.html index b442c4e9120..feda6afebed 100644 --- a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation.html +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-image-interpolation.html @@ -38,19 +38,26 @@ test_interpolation({ }, [ {at: -0.3, expect: from}, {at: 0, expect: from}, - {at: 0.3, expect: 'cross-fade(' + from + ', ' + to + ', 0.3)'}, - {at: 0.6, expect: 'cross-fade(' + from + ', ' + to + ', 0.6)'}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, {at: 1, expect: to}, {at: 1.5, expect: to}, ]); // initial to image to = 'url(../resources/green-100.png)'; -test_no_interpolation({ +test_interpolation({ property: 'background-image', from: 'initial', to: to, -}); +}, [ + {at: -0.3, expect: 'none'}, + {at: 0, expect: 'none'}, + {at: 0.3, expect: 'none'}, + {at: 0.6, expect: to}, + {at: 1, expect: to}, + {at: 1.5, expect: to}, +]); // inherit to image from = 'url(../resources/blue-100.png)'; @@ -62,18 +69,25 @@ test_interpolation({ }, [ {at: -0.3, expect: from}, {at: 0, expect: from}, - {at: 0.3, expect: 'cross-fade(' + from + ', ' + to + ', 0.3)'}, - {at: 0.6, expect: 'cross-fade(' + from + ', ' + to + ', 0.6)'}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, {at: 1, expect: to}, {at: 1.5, expect: to}, ]); // unset to image -test_no_interpolation({ +test_interpolation({ property: 'background-image', from: 'unset', to: to, -}); +}, [ + {at: -0.3, expect: 'none'}, + {at: 0, expect: 'none'}, + {at: 0.3, expect: 'none'}, + {at: 0.6, expect: to}, + {at: 1, expect: to}, + {at: 1.5, expect: to}, +]); // Image to image from = 'url(../resources/blue-100.png)'; @@ -85,8 +99,8 @@ test_interpolation({ }, [ {at: -0.3, expect: from}, {at: 0, expect: from}, - {at: 0.3, expect: 'cross-fade(' + from + ', ' + to + ', 0.3)'}, - {at: 0.6, expect: 'cross-fade(' + from + ', ' + to + ', 0.6)'}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, {at: 1, expect: to}, {at: 1.5, expect: to}, ]); @@ -94,38 +108,66 @@ test_interpolation({ // Image to gradient from = 'url(../resources/blue-100.png)'; to = 'linear-gradient(45deg, blue, orange)'; -test_no_interpolation({ +test_interpolation({ property: 'background-image', from: from, to: to, -}); +}, [ + {at: -0.3, expect: from}, + {at: 0, expect: from}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, + {at: 1, expect: to}, + {at: 1.5, expect: to}, +]); // Image to crossfade from = 'url(../resources/blue-100.png)'; to = 'cross-fade(url(../resources/green-100.png), url(../resources/stripes-100.png), 0.5)'; -test_no_interpolation({ +test_interpolation({ property: 'background-image', from: from, to: to, -}); +}, [ + {at: -0.3, expect: from}, + {at: 0, expect: from}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, + {at: 1, expect: to}, + {at: 1.5, expect: to}, +]); // Gradient to gradient from = 'linear-gradient(-45deg, red, yellow)'; to = 'linear-gradient(45deg, blue, orange)'; -test_no_interpolation({ +test_interpolation({ property: 'background-image', from: from, to: to, -}); +}, [ + {at: -0.3, expect: from}, + {at: 0, expect: from}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, + {at: 1, expect: to}, + {at: 1.5, expect: to}, +]); // Keyword to image from = 'none'; to = 'url(../resources/green-100.png)'; -test_no_interpolation({ +test_interpolation({ property: 'background-image', from: from, to: to, -}); +}, [ + {at: -0.3, expect: from}, + {at: 0, expect: from}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, + {at: 1, expect: to}, + {at: 1.5, expect: to}, +]); // Multiple to multiple var fromA = 'url(../resources/stripes-100.png)'; @@ -141,8 +183,8 @@ test_interpolation({ }, [ {at: -0.3, expect: from}, {at: 0, expect: from}, - {at: 0.3, expect: 'cross-fade(' + fromA + ', ' + toA + ', 0.3), cross-fade(' + fromB + ', ' + toB + ', 0.3)'}, - {at: 0.6, expect: 'cross-fade(' + fromA + ', ' + toA + ', 0.6), cross-fade(' + fromB + ', ' + toB + ', 0.6)'}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, {at: 1, expect: to}, {at: 1.5, expect: to}, ]); @@ -161,10 +203,10 @@ test_interpolation({ // Animating background-image is not specified to be possible however we do it for backwards compatibility. // With this in mind we kept the implementation simple at the expense of this corner case because there is // no official specification to support. - {at: -0.3, expect: from + ', ' + from}, + {at: -0.3, expect: from}, {at: 0, expect: from}, - {at: 0.3, expect: 'cross-fade(' + from + ', ' + toA + ', 0.3), cross-fade(' + from + ', ' + toB + ', 0.3)'}, - {at: 0.6, expect: 'cross-fade(' + from + ', ' + toA + ', 0.6), cross-fade(' + from + ', ' + toB + ', 0.6)'}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, {at: 1, expect: to}, {at: 1.5, expect: to}, ]); @@ -172,10 +214,17 @@ test_interpolation({ // Multiple mismatched types from = 'url(../resources/blue-100.png), none'; to = 'url(../resources/stripes-100.png), url(../resources/green-100.png)'; -test_no_interpolation({ +test_interpolation({ property: 'background-image', from: from, to: to, -}); +}, [ + {at: -0.3, expect: from}, + {at: 0, expect: from}, + {at: 0.3, expect: from}, + {at: 0.6, expect: to}, + {at: 1, expect: to}, + {at: 1.5, expect: to}, +]); diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-interpolation-stability.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-interpolation-stability.html new file mode 100644 index 00000000000..26431334e4a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-interpolation-stability.html @@ -0,0 +1,24 @@ + + +border-image-slice interpolation stability + + + + + +
+ diff --git a/tests/wpt/web-platform-tests/css/css-break/fieldset-001-ref.html b/tests/wpt/web-platform-tests/css/css-break/fieldset-001-ref.html new file mode 100644 index 00000000000..1422086da71 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-break/fieldset-001-ref.html @@ -0,0 +1,55 @@ + + +Reference: fragmenting a fieldset in multicol layout + + + + +
+

+
+
+

+
+
+

+
+
+

+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-break/fieldset-001.html b/tests/wpt/web-platform-tests/css/css-break/fieldset-001.html new file mode 100644 index 00000000000..d320fe15beb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-break/fieldset-001.html @@ -0,0 +1,46 @@ + + +CSS Test: fragmenting a fieldset in multicol layout + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-break/tall-break-inside-avoid-at-start.html b/tests/wpt/web-platform-tests/css/css-break/tall-break-inside-avoid-at-start.html new file mode 100644 index 00000000000..6e9ab8bd9f5 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-break/tall-break-inside-avoid-at-start.html @@ -0,0 +1,10 @@ + + + + + +

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

+
+
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-display/animations/display-interpolation.html b/tests/wpt/web-platform-tests/css/css-display/animations/display-interpolation.html new file mode 100644 index 00000000000..d0b1d9573b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-display/animations/display-interpolation.html @@ -0,0 +1,47 @@ + + +display interpolation + + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17-notref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17-notref.html new file mode 100644 index 00000000000..3d01985ed6b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17-notref.html @@ -0,0 +1,11 @@ + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17.html new file mode 100644 index 00000000000..9ce56ed8fa6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-17.html @@ -0,0 +1,14 @@ + + + + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18-notref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18-notref.html new file mode 100644 index 00000000000..7829a0c5e19 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18-notref.html @@ -0,0 +1,17 @@ + + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18.html new file mode 100644 index 00000000000..69e5cabd6ec --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-18.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19-notref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19-notref.html new file mode 100644 index 00000000000..7e876ced313 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19-notref.html @@ -0,0 +1,11 @@ + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19.html new file mode 100644 index 00000000000..43dc24b1675 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-19.html @@ -0,0 +1,14 @@ + + + + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2-ref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2-ref.html index e19801ba770..a2fe8646e13 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2-ref.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2-ref.html @@ -13,6 +13,7 @@ This test makes sure that the bold versions of the design system UI fonts work.
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2.html index 4fbca52b659..2827c6c2cb8 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-2.html @@ -16,6 +16,7 @@ This test makes sure that the bold versions of the design system UI fonts work.
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20-notref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20-notref.html new file mode 100644 index 00000000000..7e876ced313 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20-notref.html @@ -0,0 +1,11 @@ + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20.html new file mode 100644 index 00000000000..7d0335e0616 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-20.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+
HeJllo
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6-ref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6-ref.html index e9e24dfc62c..3c26321fffc 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6-ref.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6-ref.html @@ -10,6 +10,7 @@ This test makes sure that the design system UI fonts don't work unless they are
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6.html index 9a5fd418bda..f6a0f158b94 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-6.html @@ -22,6 +22,10 @@ font-family: "DotAppleSystemUIFontRounded"; src: local(".AppleSystemUIFontRounded"); } +@font-face { + font-family: "DotAppleSystemUIFont"; + src: local(".AppleSystemUIFont"); +} @@ -31,6 +35,7 @@ This test makes sure that the design system UI fonts don't work unless they are
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7-ref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7-ref.html index 4dad37fed3d..0e2df68c1e2 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7-ref.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7-ref.html @@ -15,6 +15,10 @@ font-family: "AppleSystemUIRounded"; src: local("ui-rounded"); } +@font-face { + font-family: "AppleSystemUISansSerif"; + src: local("ui-sans-serif"); +} @font-face { font-family: "DotAppleSystemUIFontSerif"; src: local(".AppleSystemUIFontSerif"); @@ -31,6 +35,10 @@ font-family: "DotAppleSystemUIFontRounded"; src: local(".AppleSystemUIFontRounded"); } +@font-face { + font-family: "DotAppleSystemUIFont"; + src: local(".AppleSystemUIFont"); +} @@ -39,10 +47,12 @@ This test makes sure that the bold versions of the design system UI fonts work i
HeJllo
HeJllo
HeJllo
+
HeJllo
HeJllo
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7.html index 68ebe0e04e6..11af83fc9e6 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-7.html @@ -18,6 +18,10 @@ font-family: "AppleSystemUIRounded"; src: local("ui-rounded"); } +@font-face { + font-family: "AppleSystemUISansSerif"; + src: local("ui-sans-serif"); +} @font-face { font-family: "DotAppleSystemUIFontSerif"; src: local(".AppleSystemUIFontSerif"); @@ -34,6 +38,10 @@ font-family: "DotAppleSystemUIFontRounded"; src: local(".AppleSystemUIFontRounded"); } +@font-face { + font-family: "DotAppleSystemUIFont"; + src: local(".AppleSystemUIFont"); +} @@ -42,10 +50,12 @@ This test makes sure that the bold versions of the design system UI fonts work i
HeJllo
HeJllo
HeJllo
+
HeJllo
HeJllo
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-ref.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-ref.html index e9e24dfc62c..3c26321fffc 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-ref.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family-ref.html @@ -10,6 +10,7 @@ This test makes sure that the design system UI fonts don't work unless they are
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family.html b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family.html index 907a437207c..b093ad442e1 100644 --- a/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family.html +++ b/tests/wpt/web-platform-tests/css/css-fonts/standard-font-family.html @@ -13,6 +13,7 @@ This test makes sure that the design system UI fonts don't work unless they are
HeJllo
HeJllo
HeJllo
+
HeJllo
diff --git a/tests/wpt/web-platform-tests/css/css-lists/animations/list-style-image-interpolation.html b/tests/wpt/web-platform-tests/css/css-lists/animations/list-style-image-interpolation.html new file mode 100644 index 00000000000..b953d8c2215 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-lists/animations/list-style-image-interpolation.html @@ -0,0 +1,147 @@ + + +list-style-image interpolation + + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/css/css-lists/resources/blue-20.png b/tests/wpt/web-platform-tests/css/css-lists/resources/blue-20.png new file mode 100644 index 0000000000000000000000000000000000000000..c464c75eeca3ead65c00e7c26150d97ad58da5c3 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy&H|6fVg?3oVGw3ym^DWND9B#o z>FdgVpIw?!M=?)M5-7(Y>*?YcVsSb-CE>?;2fc)(1q?k|a#w9uRfZTpoyDjyk5S#Q S;>b>*LIzJ)KbLh*2~7ac`5meN literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/css/css-lists/resources/green-20.png b/tests/wpt/web-platform-tests/css/css-lists/resources/green-20.png new file mode 100644 index 0000000000000000000000000000000000000000..738d1db8469e370fece1c7ce553ee0ec43986404 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAj3?#R^_xk}U#^NA%Cx&(BWL^R}%mF?jt_=Sf zOyUl#0CG7CJR*x37`TN&n2}-D90{Nxdx@v7EBjq8E^!%#9qC(bfI>W;E{-7_*OL<# Z=mB{F42(*`FG_(d22WQ%mvv4FO#moe9RdIV literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/css/css-lists/resources/stripes-20.png b/tests/wpt/web-platform-tests/css/css-lists/resources/stripes-20.png new file mode 100644 index 0000000000000000000000000000000000000000..de30887ea358ece8e0c1cd593d3d7c66bc744bd4 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAj3?#R^_xk}U#^NA%Cx&(BWL^R}YymzYu0T5e zM!04lw$C7^>bP0l+XkK9`Pi~ literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/css/css-masking/animations/mask-image-interpolation.html b/tests/wpt/web-platform-tests/css/css-masking/animations/mask-image-interpolation.html new file mode 100644 index 00000000000..beb9c9eaab0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-masking/animations/mask-image-interpolation.html @@ -0,0 +1,180 @@ + + +mask-image-interpolation + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/css/css-masking/resources/blue-20.png b/tests/wpt/web-platform-tests/css/css-masking/resources/blue-20.png new file mode 100644 index 0000000000000000000000000000000000000000..c464c75eeca3ead65c00e7c26150d97ad58da5c3 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy&H|6fVg?3oVGw3ym^DWND9B#o z>FdgVpIw?!M=?)M5-7(Y>*?YcVsSb-CE>?;2fc)(1q?k|a#w9uRfZTpoyDjyk5S#Q S;>b>*LIzJ)KbLh*2~7ac`5meN literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/css/css-masking/resources/green-20.png b/tests/wpt/web-platform-tests/css/css-masking/resources/green-20.png new file mode 100644 index 0000000000000000000000000000000000000000..738d1db8469e370fece1c7ce553ee0ec43986404 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAj3?#R^_xk}U#^NA%Cx&(BWL^R}%mF?jt_=Sf zOyUl#0CG7CJR*x37`TN&n2}-D90{Nxdx@v7EBjq8E^!%#9qC(bfI>W;E{-7_*OL<# Z=mB{F42(*`FG_(d22WQ%mvv4FO#moe9RdIV literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/css/css-masking/resources/stripes-20.png b/tests/wpt/web-platform-tests/css/css-masking/resources/stripes-20.png new file mode 100644 index 0000000000000000000000000000000000000000..de30887ea358ece8e0c1cd593d3d7c66bc744bd4 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAj3?#R^_xk}U#^NA%Cx&(BWL^R}YymzYu0T5e zM!04lw$C7^>bP0l+XkK9`Pi~ literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/css/css-multicol/equal-gap-and-rule.html b/tests/wpt/web-platform-tests/css/css-multicol/equal-gap-and-rule.html new file mode 100644 index 00000000000..bf6d6b9cefa --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/equal-gap-and-rule.html @@ -0,0 +1,8 @@ + + + + +

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

+
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker-ref.html new file mode 100644 index 00000000000..8095d5ca015 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker-ref.html @@ -0,0 +1,28 @@ + + +CSS Reftest Reference + + +
    +
  1. 1. inside decimal
  2. +
  3. 2. inside string
  4. +
  5. 3. inside content
  6. +
+
    +
  1. outside decimal
  2. +
  3. outside string
  4. +
  5. outside content
  6. +
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker.html b/tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker.html new file mode 100644 index 00000000000..f0a994438f1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-pseudo/first-line-and-marker.html @@ -0,0 +1,32 @@ + + +Interaction of ::first-line and ::marker + + + + + + +
    +
  1. inside decimal
  2. +
  3. inside string
  4. +
  5. inside content
  6. +
+
    +
  1. outside decimal
  2. +
  3. outside string
  4. +
  5. outside content
  6. +
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/parsing/marker-supported-properties.html b/tests/wpt/web-platform-tests/css/css-pseudo/parsing/marker-supported-properties.html index 451aac149db..a34fd76fea4 100644 --- a/tests/wpt/web-platform-tests/css/css-pseudo/parsing/marker-supported-properties.html +++ b/tests/wpt/web-platform-tests/css/css-pseudo/parsing/marker-supported-properties.html @@ -35,7 +35,7 @@ test_pseudo_computed_value("::marker", "font-weight", "900"); test_pseudo_computed_value("::marker", "color", "rgb(0, 100, 200)"); // ::marker supports `text-combine-upright`, `unicode-bidi` and `direction` -test_pseudo_computed_value("::marker", "text-combine-upright", "none"); +test_pseudo_computed_value("::marker", "text-combine-upright", "all"); test_pseudo_computed_value("::marker", "unicode-bidi", "plaintext"); test_pseudo_computed_value("::marker", "direction", "rtl"); diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-change.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-change.html index 0a73ff1206d..10e90d3cff4 100644 --- a/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-change.html +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/scroll-snap-stop-change.html @@ -8,20 +8,24 @@ div, html, body { margin: 0; padding: 0; } + html { scroll-snap-type: x mandatory; overflow: scroll; } + #scroller { scroll-snap-type: x mandatory; overflow: scroll; - height: 300px; - width: 300px; + height: 400px; + width: 400px; } + .large_space { width: 2000px; height: 2000px; } + .snap_area { scroll-snap-align: none start; width: 100px; @@ -29,13 +33,20 @@ html { background-color: blue; } + .snap_area:nth-child(1) { + margin-left: 0; +} + +.snap_area:nth-child(2) { margin-left: 100px; } -.snap_area:nth-child(2) { + +.snap_area:nth-child(3) { margin-left: 300px; } -.snap_area:nth-child(3) { + +.snap_area:nth-child(4) { margin-left: 500px; } @@ -44,11 +55,13 @@ html {
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/direction-rtl.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/direction-rtl.html new file mode 100644 index 00000000000..d10c013e1ee --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/direction-rtl.html @@ -0,0 +1,49 @@ + + + Scrollers should snap to the closest snap point on initial layout (using 'direction: rtl') + + + + + +
+
+
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/snap-after-initial-layout-ref.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/snap-after-initial-layout-ref.html new file mode 100644 index 00000000000..c8009b626cb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/snap-after-initial-layout-ref.html @@ -0,0 +1,20 @@ + +Reference + + +
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-horizontal-tb.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-horizontal-tb.html new file mode 100644 index 00000000000..aa65dde1810 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-horizontal-tb.html @@ -0,0 +1,50 @@ + + + Scrollers should snap to the closest snap point on initial layout + (using 'writing-mode: horizontal-tb') + + + + + +
+
+
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-lr.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-lr.html new file mode 100644 index 00000000000..898e64be619 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-lr.html @@ -0,0 +1,50 @@ + + + Scrollers should snap to the closest snap point on initial layout + (using 'writing-mode: vertical-lr') + + + + + +
+
+
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-rl.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-rl.html new file mode 100644 index 00000000000..b3141f03f3c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-initial-layout/writing-mode-vertical-rl.html @@ -0,0 +1,53 @@ + + + Scrollers should snap to the closest snap point on initial layout + (using 'writing-mode: vertical-rl') + + + + + +
+
+
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-only-snap-area.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-only-snap-area.html new file mode 100644 index 00000000000..53141707bb3 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-only-snap-area.html @@ -0,0 +1,55 @@ + + + Adding a new snap area when there are none should make the scroller snap to it. + + + + + + +
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-snap-area-while-snapped.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-snap-area-while-snapped.html new file mode 100644 index 00000000000..d26359658f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/adding-snap-area-while-snapped.html @@ -0,0 +1,66 @@ + + + Adding a new snap area while already snapped should not make the scroller snap to it. + + + + + + +
+
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/move-current-target.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/move-current-target.html new file mode 100644 index 00000000000..83c2c478bf5 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/move-current-target.html @@ -0,0 +1,118 @@ + + + Moving the current snap target should make the scroller resnap to it. + + + + + + +
+
+
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/remove-current-target.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/remove-current-target.html new file mode 100644 index 00000000000..82bddf80748 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/remove-current-target.html @@ -0,0 +1,65 @@ + + + Removing the current snap target should make the scroller snap to a new target. + + + + + + +
+
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/snap-to-different-targets.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/snap-to-different-targets.html new file mode 100644 index 00000000000..6ceab295e4c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-after-relayout/snap-to-different-targets.html @@ -0,0 +1,92 @@ + + + The scroller should try to resnap to targets for both axes if possible. + + + + + + +
+
+
+
+
+
+
+ + diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-caputring-add-scroll-container.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-capturing-add-scroll-container.html similarity index 92% rename from tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-caputring-add-scroll-container.html rename to tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-capturing-add-scroll-container.html index d0453676392..15f44ed8b7b 100644 --- a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-caputring-add-scroll-container.html +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-capturing-add-scroll-container.html @@ -89,7 +89,7 @@ const document_scroller = document.scrollingElement; test(() => { // Confirm that the document-level scroller is the snap container for all of // the snap areas. - document_scroller.scrollBy(0, 10); + document_scroller.scrollTo(0, 10); assert_equals(document_scroller.scrollTop, 500); // Snaps to the inner snap area. document_scroller.scrollBy(0, 75); @@ -121,9 +121,13 @@ test(() => { // Test that attaching a new snap container also properly assigns snap areas. test(() => { + // All containers should capture snap areas. + middle_scroller.style.setProperty("overflow", "scroll"); + inner_scroller.style.setProperty("overflow", "scroll"); + // Sanity check that the scrollers still snap to the snap areas. - document_scroller.scrollBy(0, 10); - inner_scroller.scrollBy(0,10); + document_scroller.scrollTo(0, 10); + inner_scroller.scrollTo(0,10); assert_equals(inner_scroller.scrollTop, 300); assert_equals(document_scroller.scrollTop, 500); @@ -142,7 +146,7 @@ test(() => { assert_equals(document_scroller.scrollTop, 400); // Inserted scroller snaps. - inserted_scroller.scrollBy(0, 10); + inserted_scroller.scrollTo(0, 10); assert_equals(inserted_scroller.scrollTop, 500); }, "Attaching a new element that is scrollable should assign the correct snap\ areas to it."); diff --git a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-capturing-remove-scroll-container.html b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-capturing-remove-scroll-container.html index 9b824071599..d3750abdd7e 100644 --- a/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-capturing-remove-scroll-container.html +++ b/tests/wpt/web-platform-tests/css/css-scroll-snap/snap-area-capturing-remove-scroll-container.html @@ -80,16 +80,14 @@ test(() => { const middle_scroller = document.getElementById("middle-scroller"); const document_scroller = document.scrollingElement; + // Inner scroller should snap to its captured area. // Middle scroller doesn't snap. // Document scroller should snap to its only captured area. - document_scroller.scrollBy(0, 100); + inner_scroller.scrollBy(0,10); middle_scroller.scrollBy(0, 10); - assert_equals(inner_scroller.scrollTop, 0); - assert_equals(middle_scroller.scrollTop, 10); - assert_equals(document_scroller.scrollTop, 500); - - // Inner scroller snaps. - inner_scroller.scrollBy(0, 10); + // Scroll to (0,600), where we would expect the inner snap area to be relative + // to the document scroller. + document_scroller.scrollTo(0, 600); assert_equals(inner_scroller.scrollTop, 300); assert_equals(middle_scroller.scrollTop, 10); assert_equals(document_scroller.scrollTop, 500); diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001-ref.html deleted file mode 100644 index d4f0281ae48..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001-ref.html +++ /dev/null @@ -1,14 +0,0 @@ - - -CSS intrinsic-size: unsized div - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001.html deleted file mode 100644 index 4d17602a95f..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-001.html +++ /dev/null @@ -1,16 +0,0 @@ - - -CSS intrinsic-size: unsized div - - - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002-ref.html deleted file mode 100644 index ab847fc36e5..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002-ref.html +++ /dev/null @@ -1,21 +0,0 @@ - - -CSS intrinsic-size: div with max-content parent - - - - - -
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002.html deleted file mode 100644 index 55f20949412..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-002.html +++ /dev/null @@ -1,22 +0,0 @@ - - -CSS intrinsic-size: div with max-content parent - - - - - - - -
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003-ref.html deleted file mode 100644 index 6a2d0514989..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003-ref.html +++ /dev/null @@ -1,15 +0,0 @@ - - -CSS intrinsic-size: width specified - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003.html deleted file mode 100644 index 3dd41ba1d2c..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-003.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: width specified - - - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004-ref.html deleted file mode 100644 index 6e710943de9..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004-ref.html +++ /dev/null @@ -1,15 +0,0 @@ - - -CSS intrinsic-size: width is min-content - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004.html deleted file mode 100644 index 9cce7ae25fc..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-004.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: width is min-content - - - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005-ref.html deleted file mode 100644 index 950f7190cac..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005-ref.html +++ /dev/null @@ -1,15 +0,0 @@ - - -CSS intrinsic-size: width is max-content - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005.html deleted file mode 100644 index 92b777d22e0..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-005.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: width is max-content - - - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006-ref.html deleted file mode 100644 index d545093e2db..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006-ref.html +++ /dev/null @@ -1,16 +0,0 @@ - - -CSS intrinsic-size: unsized div, intrinsic-size is small - - - - - -
Lorem ipsum
- diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006.html deleted file mode 100644 index 82c6e8eef85..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-006.html +++ /dev/null @@ -1,16 +0,0 @@ - - -CSS intrinsic-size: unsized div, intrinsic-size is small - - - - - - - -
Lorem ipsum
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007-ref.html deleted file mode 100644 index 6b3f63685ac..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007-ref.html +++ /dev/null @@ -1,27 +0,0 @@ - - -CSS intrinsic-size: div with border - - - - - -
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007.html deleted file mode 100644 index 85fcae6cd91..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-007.html +++ /dev/null @@ -1,26 +0,0 @@ - - -CSS intrinsic-size: div with border - - - - - - - -
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008-ref.html deleted file mode 100644 index 5c6186fd48c..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008-ref.html +++ /dev/null @@ -1,37 +0,0 @@ - - -CSS intrinsic-size: writing modes - - - - - -
Lorem
-
Ipsum
-
Dolor
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008.html deleted file mode 100644 index f3b344f6b0a..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-008.html +++ /dev/null @@ -1,37 +0,0 @@ - - -CSS intrinsic-size: writing modes - - - - - - - -
Lorem
-
Ipsum
-
Dolor
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009-ref.html deleted file mode 100644 index 223e0c8a33a..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009-ref.html +++ /dev/null @@ -1,23 +0,0 @@ - - -CSS intrinsic-size: select multiple - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009.html deleted file mode 100644 index 06a02fe78bd..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-009.html +++ /dev/null @@ -1,23 +0,0 @@ - - -CSS intrinsic-size: select multiple - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010-ref.html deleted file mode 100644 index eaaa0977f13..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010-ref.html +++ /dev/null @@ -1,39 +0,0 @@ - - -CSS intrinsic-size: flex row - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010.html deleted file mode 100644 index eea76ffb073..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-010.html +++ /dev/null @@ -1,40 +0,0 @@ - - -CSS intrinsic-size: flex row - - - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011-ref.html deleted file mode 100644 index 29d1f4e2d1a..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011-ref.html +++ /dev/null @@ -1,39 +0,0 @@ - - -CSS intrinsic-size: flex column - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011.html deleted file mode 100644 index c7888f906f8..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-011.html +++ /dev/null @@ -1,40 +0,0 @@ - - -CSS intrinsic-size: flex column - - - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012-ref.html deleted file mode 100644 index ed9857aa256..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012-ref.html +++ /dev/null @@ -1,14 +0,0 @@ - - -CSS intrinsic-size: replaced content - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012.html deleted file mode 100644 index 889b07ace92..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-012.html +++ /dev/null @@ -1,15 +0,0 @@ - - -CSS intrinsic-size: replaced content - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013-ref.html deleted file mode 100644 index 9f8334c03d5..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013-ref.html +++ /dev/null @@ -1,18 +0,0 @@ - - -CSS intrinsic-size: intrinsic-size changes - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013.html deleted file mode 100644 index 1082100012f..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-013.html +++ /dev/null @@ -1,32 +0,0 @@ - - - -CSS intrinsic-size: intrinsic-size changes. - - - - - - - - -
- - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014-ref.html deleted file mode 100644 index 66c10824893..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014-ref.html +++ /dev/null @@ -1,18 +0,0 @@ - - -CSS intrinsic-size: fieldset - - - - - -
- This is a legend - This is some content. -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014.html deleted file mode 100644 index 4dd45a2da40..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-014.html +++ /dev/null @@ -1,19 +0,0 @@ - - -CSS intrinsic-size: fieldset - - - - - - - -
- This is a legend - This is some content. -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015-ref.html deleted file mode 100644 index ae65a3b5ca5..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015-ref.html +++ /dev/null @@ -1,16 +0,0 @@ - - -CSS intrinsic-size: inline flex - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015.html deleted file mode 100644 index 5ca5e49992e..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-015.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: inline flex - - - - - - -
test
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016-ref.html deleted file mode 100644 index f80510f6306..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016-ref.html +++ /dev/null @@ -1,39 +0,0 @@ - - -CSS intrinsic-size: flex row, items with size containment (ref) - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016.html deleted file mode 100644 index ce6ac5c56e4..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-016.html +++ /dev/null @@ -1,41 +0,0 @@ - - -CSS intrinsic-size: flex row, items with size containment - - - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017-ref.html deleted file mode 100644 index 553451a7075..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017-ref.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: replaced content (vertical-lr) - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017.html deleted file mode 100644 index 5e2122f34ec..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-017.html +++ /dev/null @@ -1,20 +0,0 @@ - - -CSS intrinsic-size: replaced content (vertical-lr) - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018-ref.html deleted file mode 100644 index 17261caa8af..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018-ref.html +++ /dev/null @@ -1,15 +0,0 @@ - - -CSS intrinsic-size: sized div - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018.html deleted file mode 100644 index 68931834d63..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-018.html +++ /dev/null @@ -1,18 +0,0 @@ - - -CSS intrinsic-size: sized div - - - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019-ref.html deleted file mode 100644 index 8e55d7b02f9..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019-ref.html +++ /dev/null @@ -1,15 +0,0 @@ - - -CSS intrinsic-size: div with fit-content width - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019.html deleted file mode 100644 index cae8e0739fe..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-019.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: div with fit-content width - - - - - - - -
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020-ref.html deleted file mode 100644 index 1ee5ba8376d..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020-ref.html +++ /dev/null @@ -1,14 +0,0 @@ - - -CSS intrinsic-size: replaced content (min-content) - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020.html deleted file mode 100644 index a7286ce1054..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-020.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: replaced content (min-content) - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021-ref.html deleted file mode 100644 index 35db43fcf44..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021-ref.html +++ /dev/null @@ -1,41 +0,0 @@ - - -CSS intrinsic-size: flex row, flex height based on children - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021.html deleted file mode 100644 index 04591924f65..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-021.html +++ /dev/null @@ -1,39 +0,0 @@ - - -CSS intrinsic-size: flex row, flex height based on children - - - - - - - -
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022-ref.html deleted file mode 100644 index b0df1992834..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022-ref.html +++ /dev/null @@ -1,30 +0,0 @@ - - -CSS intrinsic-size: grid definite size - - - - - -
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022.html deleted file mode 100644 index 3593b9cce38..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-022.html +++ /dev/null @@ -1,31 +0,0 @@ - - -CSS intrinsic-size: grid definite size - - - - - - - -
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023-ref.html deleted file mode 100644 index 800e4ae7064..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023-ref.html +++ /dev/null @@ -1,29 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size - - - - - -
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023.html deleted file mode 100644 index c64ef66a03f..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-023.html +++ /dev/null @@ -1,30 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size - - - - - - - -
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024-ref.html deleted file mode 100644 index 02ec85a0084..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024-ref.html +++ /dev/null @@ -1,30 +0,0 @@ - - -CSS intrinsic-size: grid definite size, large size - - - - - -
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024.html deleted file mode 100644 index b11317d96b0..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-024.html +++ /dev/null @@ -1,31 +0,0 @@ - - -CSS intrinsic-size: grid definite size, large size - - - - - - - -
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025-ref.html deleted file mode 100644 index 60d5cc9cd9a..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025-ref.html +++ /dev/null @@ -1,56 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size, auto-fit - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025.html deleted file mode 100644 index ab9c56fc528..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-025.html +++ /dev/null @@ -1,57 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size, auto-fit - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026-ref.html deleted file mode 100644 index 2e456b43422..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026-ref.html +++ /dev/null @@ -1,53 +0,0 @@ - - -CSS intrinsic-size: grid auto-fit, min- max- size interactions - - - - - -

min-width larger than intrinsic-width: -

-
one
-
two
-
- -

min-width smaller than intrinsic-width: -

-
one
-
two
-
- -

max-width ignored since min-width is larger: -

-
one
-
two
-
- -

min-width shrinks grid since it overrides intrinsic-width: -

-
one
-
two
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026.html deleted file mode 100644 index 100f542b783..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-026.html +++ /dev/null @@ -1,61 +0,0 @@ - - -CSS intrinsic-size: grid auto-fit, min- max- size interactions - - - - - - - -

min-width larger than intrinsic-width: -

-
one
-
two
-
- -

min-width smaller than intrinsic-width: -

-
one
-
two
-
- -

max-width ignored since min-width is larger: -

-
one
-
two
-
- -

min-width shrinks grid since it overrides intrinsic-width: -

-
one
-
two
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001-ref.html deleted file mode 100644 index 99e86d0c38f..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001-ref.html +++ /dev/null @@ -1,37 +0,0 @@ - - -CSS intrinsic-size: intrinsic-width auto - - - - - -
-
-
-
-
Lorem ipsum
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001.html deleted file mode 100644 index 9c2dac07da2..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-001.html +++ /dev/null @@ -1,34 +0,0 @@ - - -CSS intrinsic-size: intrinsic-width auto - - - - - - - -
Lorem ipsum
-
-
Lorem ipsum
-
-
Lorem ipsum
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002-ref.html deleted file mode 100644 index 70a245469b7..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002-ref.html +++ /dev/null @@ -1,30 +0,0 @@ - - -CSS intrinsic-size: intrinsic-width auto - - - - - -
-
-
-
-
Lorem ipsum
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002.html deleted file mode 100644 index 5b3902455bd..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-002.html +++ /dev/null @@ -1,34 +0,0 @@ - - -CSS intrinsic-size: intrinsic-width auto - - - - - - - -
Lorem ipsum
-
-
Lorem ipsum
-
-
Lorem ipsum
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003-ref.html deleted file mode 100644 index 246a5bad51e..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003-ref.html +++ /dev/null @@ -1,37 +0,0 @@ - - -CSS intrinsic-size: replaced content with auto - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003.html deleted file mode 100644 index 07ec0326787..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-auto-003.html +++ /dev/null @@ -1,32 +0,0 @@ - - -CSS intrinsic-size: replaced content with auto - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001-ref.html deleted file mode 100644 index 39c6abdcf8e..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001-ref.html +++ /dev/null @@ -1,15 +0,0 @@ - - -CSS intrinsic-size: intrinsic-width legacy - - - - - -
Lorem ipsum
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001.html deleted file mode 100644 index df662e5c7f1..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-001.html +++ /dev/null @@ -1,17 +0,0 @@ - - -CSS intrinsic-size: intrinsic-width legacy - - - - - - - -
Lorem ipsum
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002-ref.html deleted file mode 100644 index 535915a7a7b..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002-ref.html +++ /dev/null @@ -1,41 +0,0 @@ - - -CSS intrinsic-size: flex with legacy intrinsic dimensions - - - - - -
-
Lorem ipsum
-
dolor sit amet
-
consectetur adipiscing elit
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002.html deleted file mode 100644 index 66d008ce6ce..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-002.html +++ /dev/null @@ -1,39 +0,0 @@ - - -CSS intrinsic-size: flex with legacy intrinsic dimensions - - - - - - - -
-
Lorem ipsum
-
dolor sit amet
-
consectetur adipiscing elit
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003-ref.html deleted file mode 100644 index eb6394fe284..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003-ref.html +++ /dev/null @@ -1,20 +0,0 @@ - - -CSS intrinsic-size: select multiple with legacy sizing - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003.html deleted file mode 100644 index 90e4f53bf64..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-003.html +++ /dev/null @@ -1,20 +0,0 @@ - - -CSS intrinsic-size: select multiple with legacy sizing - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004-ref.html deleted file mode 100644 index d5e7c9ff9bb..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004-ref.html +++ /dev/null @@ -1,25 +0,0 @@ - - -CSS intrinsic-size: replaced content with legacy - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004.html deleted file mode 100644 index dfeed45d73b..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-004.html +++ /dev/null @@ -1,22 +0,0 @@ - - -CSS intrinsic-size: replaced content with legacy - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005-ref.html deleted file mode 100644 index c23984f5f1a..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005-ref.html +++ /dev/null @@ -1,36 +0,0 @@ - - -CSS intrinsic-size: grid definite size with legacy - - - - - -
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005.html deleted file mode 100644 index baf9bef3aca..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-005.html +++ /dev/null @@ -1,44 +0,0 @@ - - -CSS intrinsic-size: grid definite size with legacy - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006-ref.html deleted file mode 100644 index 9b9e25d3c8d..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006-ref.html +++ /dev/null @@ -1,35 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size with legacy - - - - - -
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006.html deleted file mode 100644 index 41ef1fddc19..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-006.html +++ /dev/null @@ -1,43 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size with legacy - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007-ref.html deleted file mode 100644 index 6894b4643ad..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007-ref.html +++ /dev/null @@ -1,35 +0,0 @@ - - -CSS intrinsic-size: grid definite size, large size with legacy - - - - - -
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007.html deleted file mode 100644 index df2c57b5d8a..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-007.html +++ /dev/null @@ -1,43 +0,0 @@ - - -CSS intrinsic-size: grid definite size, large size with legacy - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008-ref.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008-ref.html deleted file mode 100644 index 5cce1902759..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008-ref.html +++ /dev/null @@ -1,80 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size, auto-fit with legacy - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008.html deleted file mode 100644 index 45b8fbdd244..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/intrinsic-size-with-legacy-008.html +++ /dev/null @@ -1,87 +0,0 @@ - - -CSS intrinsic-size: grid indefinite size, auto-fit with legacy - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-computed.html deleted file mode 100644 index e9a073ca2aa..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-computed.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-block-size with computed values - - - - - - - - -
-
- - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-invalid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-invalid.html deleted file mode 100644 index 1b6cba20f88..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-invalid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-block-size with invalid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-valid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-valid.html deleted file mode 100644 index b34c73b230f..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-block-size-valid.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-block-size with valid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-computed.html deleted file mode 100644 index 6f95274c637..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-computed.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-height with computed values - - - - - - - - -
-
- - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-invalid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-invalid.html deleted file mode 100644 index 1f801124a2b..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-invalid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-height with invalid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-valid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-valid.html deleted file mode 100644 index e4614762118..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-height-valid.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-height with valid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-computed.html deleted file mode 100644 index c53a77e5631..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-computed.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-inline-size with computed values - - - - - - - - -
-
- - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-invalid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-invalid.html deleted file mode 100644 index 6ad224d11d3..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-invalid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-inline-size with invalid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-valid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-valid.html deleted file mode 100644 index ad5aef95dca..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-inline-size-valid.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-inline-size with valid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-computed.html deleted file mode 100644 index 29be33d4a3d..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-computed.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-size with computed values - - - - - - - - -
-
- - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-invalid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-invalid.html deleted file mode 100644 index b4cb2dbffd2..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-invalid.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-size with invalid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-sets-computed-dimensions.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-sets-computed-dimensions.html deleted file mode 100644 index e70c3179223..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-sets-computed-dimensions.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-size sets component dimensions. - - - - - - - - - -
-
- - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-valid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-valid.html deleted file mode 100644 index 7ab13c7d798..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-size-valid.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-size with valid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-computed.html deleted file mode 100644 index 08602e5347f..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-computed.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-width with computed values - - - - - - - - -
-
- - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-invalid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-invalid.html deleted file mode 100644 index b89f6567ae2..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-invalid.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-width with invalid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-valid.html b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-valid.html deleted file mode 100644 index e2d23eabe5d..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/parsing/intrinsic-width-valid.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - -CSS Intrinsic Size Test: intrinsic-width with valid values - - - - - - - - - - - - diff --git a/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/resources/dice.png b/tests/wpt/web-platform-tests/css/css-sizing/intrinsic-size/resources/dice.png deleted file mode 100644 index c82d01517cd056fe1b63266b00fb9a96ce6251a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58618 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,Mr5l8% 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 - -CSS Sizing: Test that percentages don't resolve against min-content - - - - - -
-
This should be a single-line green background with no red visible.
-
- diff --git a/tests/wpt/web-platform-tests/css/css-sizing/percentage-resolution-001.html b/tests/wpt/web-platform-tests/css/css-sizing/percentage-resolution-001.html deleted file mode 100644 index b2cc727ca7a..00000000000 --- a/tests/wpt/web-platform-tests/css/css-sizing/percentage-resolution-001.html +++ /dev/null @@ -1,26 +0,0 @@ - - -CSS Sizing: Test that percentages don't resolve against min-content - - - - - - - -
-
This should be a single-line green background with no red visible.
-
- diff --git a/tests/wpt/web-platform-tests/css/css-text/hyphens/hyphens-overflow-001.html b/tests/wpt/web-platform-tests/css/css-text/hyphens/hyphens-overflow-001.html index 4154e5e1181..948b728254a 100644 --- a/tests/wpt/web-platform-tests/css/css-text/hyphens/hyphens-overflow-001.html +++ b/tests/wpt/web-platform-tests/css/css-text/hyphens/hyphens-overflow-001.html @@ -9,7 +9,6 @@ div { font-size: 10px; font-family: Ahem; width: 5.1ch; - border: 1px solid blue; } @@ -19,7 +18,4 @@ div {
1234­xx
12345­xx
123456­xx
- -
ren­for­cer99999
-
00­1222
diff --git a/tests/wpt/web-platform-tests/css/css-text/hyphens/reference/hyphens-overflow-001-ref.html b/tests/wpt/web-platform-tests/css/css-text/hyphens/reference/hyphens-overflow-001-ref.html index db002ce45d8..08d521d3396 100644 --- a/tests/wpt/web-platform-tests/css/css-text/hyphens/reference/hyphens-overflow-001-ref.html +++ b/tests/wpt/web-platform-tests/css/css-text/hyphens/reference/hyphens-overflow-001-ref.html @@ -4,8 +4,6 @@ div { font-size: 10px; font-family: Ahem; - width: 5.1ch; - border: 1px solid blue; } @@ -15,7 +13,4 @@ div {
1234-
xx
12345-
xx
123456-
xx
- -
renfor-
cer99999
-
00-
1222
diff --git a/tests/wpt/web-platform-tests/css/css-values/animations/calc-interpolation.html b/tests/wpt/web-platform-tests/css/css-values/animations/calc-interpolation.html new file mode 100644 index 00000000000..de76386e0da --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/animations/calc-interpolation.html @@ -0,0 +1,97 @@ + + +calc interpolation + + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/css/support/interpolation-testcommon.js b/tests/wpt/web-platform-tests/css/support/interpolation-testcommon.js index 3c9754c6941..d1cb7cfbeb0 100644 --- a/tests/wpt/web-platform-tests/css/support/interpolation-testcommon.js +++ b/tests/wpt/web-platform-tests/css/support/interpolation-testcommon.js @@ -18,6 +18,7 @@ var cssAnimationsInterpolation = { name: 'CSS Animations', + isSupported: function() {return true;}, supportsProperty: function() {return true;}, supportsValue: function() {return true;}, setup: function() {}, @@ -43,6 +44,7 @@ var cssTransitionsInterpolation = { name: 'CSS Transitions', + isSupported: function() {return true;}, supportsProperty: function() {return true;}, supportsValue: function() {return true;}, setup: function(property, from, target) { @@ -64,6 +66,7 @@ var cssTransitionAllInterpolation = { name: 'CSS Transitions with transition: all', + isSupported: function() {return true;}, // The 'all' value doesn't cover custom properties. supportsProperty: function(property) {return property.indexOf('--') !== 0;}, supportsValue: function() {return true;}, @@ -86,6 +89,7 @@ var webAnimationsInterpolation = { name: 'Web Animations', + isSupported: function() {return 'animate' in Element.prototype;}, supportsProperty: function(property) {return true;}, supportsValue: function(value) {return value !== '';}, setup: function() {}, @@ -96,6 +100,10 @@ this.interpolateComposite(property, from, 'replace', to, 'replace', at, target); }, interpolateComposite: function(property, from, fromComposite, to, toComposite, at, target) { + // This case turns into a test error later on. + if (!this.isSupported()) + return; + // Convert standard properties to camelCase. if (!property.startsWith('--')) { for (var i = property.length - 2; i > 0; --i) { @@ -272,6 +280,8 @@ target.measure = function() { var expectedValue = getComputedStyle(expectedTargetContainer.target).getPropertyValue(property); test(function() { + assert_true(interpolationMethod.isSupported(), `${interpolationMethod.name} should be supported`); + if (from && from !== neutralKeyframe) { assert_true(CSS.supports(property, from), '\'from\' value should be supported'); } diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md b/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md index 845d6f8dc4f..6dbe3a1aa9d 100644 --- a/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md +++ b/tests/wpt/web-platform-tests/docs/writing-tests/reftests.md @@ -96,16 +96,31 @@ leaf nodes.) ## Controlling When Comparison Occurs -By default reftest screenshots are taken after the `load` event has -fired, and web fonts (if any) are loaded. In some cases it is -necessary to delay the screenshot later than this, for example because -some DOM manipulation is required to set up the desired test -conditions. To enable this, the test may have a `class="reftest-wait"` -attribute specified on the root element. This will cause the -screenshot to be delayed until the `load` event has fired and the -`reftest-wait` class has been removed from the root element. Note that -in neither case is exact timing of the screenshot guaranteed: it is -only guaranteed to be after those events. +By default, reftest screenshots are taken after the following +conditions are met: + +* The `load` event has fired +* Web fonts (if any) are loaded +* Pending paints have completed + +In some cases it is necessary to delay the screenshot later than this, +for example because some DOM manipulation is required to set up the +desired test conditions. To enable this, the test may have a +`class="reftest-wait"` attribute specified on the root element. In +this case the harness will run the following sequence of steps: + +* Wait for the `load` event to fire and fonts to load. +* Wait for pending paints to complete. +* Fire an event named `TestRendered` at the root element, with the + `bubbles` attribute set to true. +* Wait for the `reftest-wait` class to be removed from the root + element. +* Wait for pending paints to complete. +* Screenshot the viewport. + +The `TestRendered` event provides a hook for tests to make +modifications to the test document that are not batched into the +initial layout/paint. ## Fuzzy Matching diff --git a/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html b/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html new file mode 100644 index 00000000000..d572dcb0465 --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html @@ -0,0 +1,32 @@ + + + diff --git a/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers b/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers new file mode 100644 index 00000000000..fe839ef5bb6 --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers @@ -0,0 +1 @@ +Document-Policy: unoptimized-lossless-images;bpp=0.0 diff --git a/tests/wpt/web-platform-tests/document-policy/echo-policy.py b/tests/wpt/web-platform-tests/document-policy/echo-policy.py new file mode 100644 index 00000000000..52a2bf97124 --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/echo-policy.py @@ -0,0 +1,28 @@ +# This will echo the 'Sec-Required-Document-Policy' request header in the body +# of the response, as well as in the 'Document-Policy' response header (to +# ensure the response is loaded by a user agent which is implementing document +# policy.) +import json + +def main(request, response): + msg = {} + headers = [('Content-Type', 'text/html')] + + srdp = request.headers.get('Sec-Required-Document-Policy') + if srdp: + msg['requiredPolicy'] = srdp + headers.append(('Document-Policy', srdp)) + + frameId = request.GET.first('id',None) + if frameId: + msg['id'] = frameId + + content = """ + +%s +""" % (json.dumps(msg), srdp) + + return (200, 'OK'), headers, content + diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html new file mode 100644 index 00000000000..d6bf3e9a6d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html @@ -0,0 +1,54 @@ + + + + Test advertised required document policy + + + +

Test advertised required document policy

+ + + diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers new file mode 100644 index 00000000000..d321c265d15 --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers @@ -0,0 +1 @@ +Document-Policy: unoptimized-lossless-images;bpp=1.1 diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html b/tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html new file mode 100644 index 00000000000..9af2e51c2ac --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html @@ -0,0 +1,44 @@ + + + + Test advertised required document policy + + + +

Test advertised required document policy

+ + + diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html new file mode 100644 index 00000000000..39e2a92f773 --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html @@ -0,0 +1,65 @@ + + + + Test advertised required document policy + + + +

Test advertised required document policy

+ + + diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html new file mode 100644 index 00000000000..12cebdd292a --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html @@ -0,0 +1,65 @@ + + + + Test advertised required document policy + + + +

Test advertised required document policy

+ + + diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers new file mode 100644 index 00000000000..066c0f8339e --- /dev/null +++ b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers @@ -0,0 +1 @@ +Required-Document-Policy: unoptimized-lossless-images;bpp=1.1 diff --git a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html index 4027587bff4..dc180c61567 100644 --- a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html +++ b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html @@ -3,26 +3,128 @@ EventTarget#dispatchEvent(): redispatching a native event + + + +
diff --git a/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-redirect.any.js b/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-redirect.any.js index 5d4de7ebaad..ade38e9ac7b 100644 --- a/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-redirect.any.js +++ b/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-redirect.any.js @@ -18,7 +18,7 @@ function corsPreflightRedirect(desc, redirectUrl, redirectLocation, redirectStat urlParameters += "&allow_headers=x-force-preflight"; promise_test(function(test) { - fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { + return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) { assert_equals(resp.status, 200, "Clean stash response's status is 200"); return promise_rejects(test, new TypeError(), fetch(url + urlParameters, requestInit)); }); diff --git a/tests/wpt/web-platform-tests/fetch/api/idlharness.any.js b/tests/wpt/web-platform-tests/fetch/api/idlharness.any.js index ccd4d2c0b46..7b3c694e16a 100644 --- a/tests/wpt/web-platform-tests/fetch/api/idlharness.any.js +++ b/tests/wpt/web-platform-tests/fetch/api/idlharness.any.js @@ -1,6 +1,7 @@ // META: global=window,worker // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long idl_test( ['fetch'], diff --git a/tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html b/tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html index 8912548ab1c..5e35472fcfd 100644 --- a/tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html +++ b/tests/wpt/web-platform-tests/fetch/metadata/appcache.tentative.https.sub.html @@ -8,16 +8,27 @@ diff --git a/tests/wpt/web-platform-tests/fetch/metadata/navigation.https.sub.html b/tests/wpt/web-platform-tests/fetch/metadata/navigation.tentative.https.sub.html similarity index 100% rename from tests/wpt/web-platform-tests/fetch/metadata/navigation.https.sub.html rename to tests/wpt/web-platform-tests/fetch/metadata/navigation.tentative.https.sub.html diff --git a/tests/wpt/web-platform-tests/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade-prefetch.optional.tentative.sub.html b/tests/wpt/web-platform-tests/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade-prefetch.optional.tentative.sub.html new file mode 100644 index 00000000000..e2715a65854 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade-prefetch.optional.tentative.sub.html @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-http-upgrade-prefetch.optional.tentative.sub.html b/tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-http-upgrade-prefetch.optional.tentative.sub.html new file mode 100644 index 00000000000..45fd4efaace --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-http-upgrade-prefetch.optional.tentative.sub.html @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-https-downgrade-prefetch.optional.tentative.sub.html b/tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-https-downgrade-prefetch.optional.tentative.sub.html new file mode 100644 index 00000000000..a446cbad840 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/metadata/redirect/redirect-https-downgrade-prefetch.optional.tentative.sub.html @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/helper.js b/tests/wpt/web-platform-tests/fetch/metadata/resources/helper.js index a344c94106a..608a5297881 100644 --- a/tests/wpt/web-platform-tests/fetch/metadata/resources/helper.js +++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/helper.js @@ -1,7 +1,3 @@ -function wrap_by_tag(tag, text) { - return tag ? `${tag}: ${text}`: text; -} - function validate_expectations(key, expected, tag) { return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py b/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py index 99115475683..3bfb1fcdfaa 100644 --- a/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py +++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py @@ -117,6 +117,20 @@ def main(request, response): response.headers.set("Content-Type", "application/javascript") return "self.postMessage('loaded');" + ## Return an appcache manifest + if key.startswith("appcache-manifest"): + response.headers.set("Content-Type", "text/cache-manifest") + return """CACHE MANIFEST +/fetch/metadata/resources/record-header.py?file=appcache-resource%s + +NETWORK: +*""" % key[17:] + + ## Return an appcache resource + if key.startswith("appcache-resource"): + response.headers.set("Content-Type", "text/html") + return "Appcache!" + ## Return a valid XSLT if key.startswith("xslt"): response.headers.set("Content-Type", "text/xsl") @@ -128,4 +142,3 @@ def main(request, response): """ - diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/redirectTestHelper.sub.js b/tests/wpt/web-platform-tests/fetch/metadata/resources/redirectTestHelper.sub.js index c40b5a5e17e..e5547e7ac79 100644 --- a/tests/wpt/web-platform-tests/fetch/metadata/resources/redirectTestHelper.sub.js +++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/redirectTestHelper.sub.js @@ -38,6 +38,34 @@ function downgradeRedirectTo(partialPath) { return secureRedirectURL + encodeURIComponent(insecureTestURL + partialPath); } +// Helper to test the behavior of the `prefetch` Link type [1]. Because the the +// behavior under test is optional [2], this function should only be used in +// tests which have been denoted as "optional" [3]. +// +// [1] https://html.spec.whatwg.org/#link-type-prefetch +// [2] https://w3c.github.io/resource-hints/#load-and-error-events +// [3] https://web-platform-tests.org/writing-tests/file-names.html +function testPrefetch(nonce, testNamePrefix, urlHelperMethod, expectedResults) { + async_test(t => { + let key = 'prefetch' + nonce; + let e = document.createElement('link'); + e.rel = 'prefetch'; + e.crossOrigin = 'anonymous'; + e.href = urlHelperMethod('resources/record-header.py?file=' + key) + '&simple=true'; + e.onload = t.step_func(e => { + let expectation = { ...expectedResults }; + if (expectation['mode'] != '') + expectation['mode'] = 'cors'; + fetch('/fetch/metadata/resources/record-header.py?retrieve=true&file=' + key) + .then(t.step_func(response => response.text())) + .then(t.step_func_done(text => assert_header_equals(text, expectation, testNamePrefix + ' prefetch => No headers'))) + .catch(t.unreached_func('Fetching and verifying the results should succeed.')); + }); + e.onerror = t.unreached_func(); + document.head.appendChild(e); + }, testNamePrefix + ' prefetch => No headers'); +} + // Helper to run common redirect test cases that don't require special setup on // the test page itself. function RunCommonRedirectTests(testNamePrefix, urlHelperMethod, expectedResults) { @@ -124,27 +152,6 @@ function RunCommonRedirectTests(testNamePrefix, urlHelperMethod, expectedResults }); }, testNamePrefix + ' object'); - if (document.createElement('link').relList.supports('prefetch')) { - async_test(t => { - let key = 'prefetch' + nonce; - let e = document.createElement('link'); - e.rel = 'prefetch'; - e.crossOrigin = 'anonymous'; - e.href = urlHelperMethod('resources/record-header.py?file=' + key) + '&simple=true'; - e.onload = t.step_func(e => { - let expectation = { ...expectedResults }; - if (expectation['mode'] != '') - expectation['mode'] = 'cors'; - fetch('/fetch/metadata/resources/record-header.py?retrieve=true&file=' + key) - .then(t.step_func(response => response.text())) - .then(t.step_func_done(text => assert_header_equals(text, expectation, testNamePrefix + ' prefetch => No headers'))) - .catch(t.unreached_func('Fetching and verifying the results should succeed.')); - }); - e.onerror = t.unreached_func(); - document.head.appendChild(e); - }, testNamePrefix + ' prefetch => No headers'); - } - if (document.createElement('link').relList.supports('preload')) { async_test(t => { let key = 'preload' + nonce; diff --git a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html index 73390c7ad59..41ece6826ed 100644 --- a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html +++ b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.html @@ -1,6 +1,6 @@ -Tests Stale While Revalidate is not executed for fetch API +Tests Stale While Revalidate is executed for fetch API diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-closed.html b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-closed.html index 7c939bc7746..106c3f97cb2 100644 --- a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-closed.html +++ b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-closed.html @@ -2,7 +2,7 @@ - Auxiliary Browing Contexts: window.opener when Opener Removed/Closed + Auxiliary Browsing Contexts: window.opener when Opener Removed/Closed diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-multiple.html b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-multiple.html index eb356c55972..e71d4dc8687 100644 --- a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-multiple.html +++ b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-multiple.html @@ -1,7 +1,7 @@ - Auxiliary Browing Contexts: window.opener, multiple + Auxiliary Browsing Contexts: window.opener, multiple diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noopener.html b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noopener.html index fff10248fed..086a96442dd 100644 --- a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noopener.html +++ b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noopener.html @@ -1,7 +1,7 @@ - Auxiliary Browing Contexts: window.opener noopener + Auxiliary Browsing Contexts: window.opener noopener diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noreferrer.html b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noreferrer.html index f82aa6f0abe..b8226bd2b93 100644 --- a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noreferrer.html +++ b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-noreferrer.html @@ -1,7 +1,7 @@ - Auxiliary Browing Contexts: window.opener noreferrer + Auxiliary Browsing Contexts: window.opener noreferrer diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.html b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.html index e6ff4a19d0d..ac6e47b846b 100644 --- a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.html +++ b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.html @@ -1,7 +1,7 @@ - Auxiliary Browing Contexts: window.opener setter + Auxiliary Browsing Contexts: window.opener setter diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener.html b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener.html index 5bbaee6a378..c43d3bd3bfb 100644 --- a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener.html +++ b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener.html @@ -1,7 +1,7 @@ - Auxiliary Browing Contexts: window.opener + Auxiliary Browsing Contexts: window.opener diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html new file mode 100644 index 00000000000..3ade1effc4b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-video-element/resize-during-playback.html @@ -0,0 +1,39 @@ + + + +video element resizing during playback + + + + + +
+ + + diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/infinite_backtracking.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/infinite_backtracking.html new file mode 100644 index 00000000000..52f6e316b1f --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/infinite_backtracking.html @@ -0,0 +1,12 @@ + + +The infinite pattern validation test + + + + diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini index 4a4f5946fad..1d63261c554 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini @@ -3,4 +3,4 @@ if product == "firefox" or product == "safari" or product == "epiphany" or product == "webkit": ERROR [TestDriver actions: two touch points with one moving one pause] expected: - if product == "chrome": FAIL + if product == "chrome" and os != "mac": FAIL diff --git a/tests/wpt/web-platform-tests/infrastructure/reftest/reftest_wait_TestRendered.html b/tests/wpt/web-platform-tests/infrastructure/reftest/reftest_wait_TestRendered.html new file mode 100644 index 00000000000..4316d338b5c --- /dev/null +++ b/tests/wpt/web-platform-tests/infrastructure/reftest/reftest_wait_TestRendered.html @@ -0,0 +1,14 @@ + +Test with reftest-wait + + + + diff --git a/tests/wpt/web-platform-tests/interfaces/cookie-store.idl b/tests/wpt/web-platform-tests/interfaces/cookie-store.idl index 3e1a90ab63f..f6a413e54a2 100644 --- a/tests/wpt/web-platform-tests/interfaces/cookie-store.idl +++ b/tests/wpt/web-platform-tests/interfaces/cookie-store.idl @@ -19,12 +19,6 @@ interface CookieStore : EventTarget { Promise delete(USVString name); Promise delete(CookieStoreDeleteOptions options); - [Exposed=ServiceWorker] - Promise subscribeToChanges(sequence subscriptions); - - [Exposed=ServiceWorker] - Promise> getChangeSubscriptions(); - [Exposed=Window] attribute EventHandler onchange; }; @@ -77,8 +71,7 @@ dictionary CookieListItem { typedef sequence CookieList; -[Exposed=Window, - SecureContext] +[Exposed=Window, SecureContext] interface CookieChangeEvent : Event { constructor(DOMString type, optional CookieChangeEventInit eventInitDict = {}); readonly attribute CookieList changed; @@ -90,8 +83,8 @@ dictionary CookieChangeEventInit : EventInit { CookieList deleted; }; -[Exposed=ServiceWorker -] interface ExtendableCookieChangeEvent : ExtendableEvent { +[Exposed=ServiceWorker] +interface ExtendableCookieChangeEvent : ExtendableEvent { constructor(DOMString type, optional ExtendableCookieChangeEventInit eventInitDict = {}); readonly attribute CookieList changed; readonly attribute CookieList deleted; @@ -102,6 +95,13 @@ dictionary ExtendableCookieChangeEventInit : ExtendableEventInit { CookieList deleted; }; +[Exposed=(ServiceWorker,Window), SecureContext] +interface CookieStoreManager { + Promise subscribe(sequence subscriptions); + Promise> getSubscriptions(); + Promise unsubscribe(sequence subscriptions); +}; + [SecureContext] partial interface Window { [Replaceable, SameObject] readonly attribute CookieStore cookieStore; @@ -109,6 +109,10 @@ partial interface Window { partial interface ServiceWorkerGlobalScope { [Replaceable, SameObject] readonly attribute CookieStore cookieStore; - attribute EventHandler oncookiechange; }; + +[Exposed=(ServiceWorker,Window), SecureContext] +partial interface ServiceWorkerRegistration { + readonly attribute CookieStoreManager cookies; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/resize-observer.idl b/tests/wpt/web-platform-tests/interfaces/resize-observer.idl index 9ac157a6328..d53e9da55ee 100644 --- a/tests/wpt/web-platform-tests/interfaces/resize-observer.idl +++ b/tests/wpt/web-platform-tests/interfaces/resize-observer.idl @@ -21,7 +21,7 @@ interface ResizeObserver { callback ResizeObserverCallback = void (sequence entries, ResizeObserver observer); -[Exposed=Window, Constructor(Element target)] +[Exposed=Window] interface ResizeObserverEntry { readonly attribute Element target; readonly attribute DOMRectReadOnly contentRect; diff --git a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl index 828729071e4..cc943610145 100644 --- a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl @@ -39,15 +39,17 @@ dictionary ModuleImportDescriptor { required ImportExportKind kind; }; -[LegacyNamespace=WebAssembly, Constructor(BufferSource bytes), Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] interface Module { + constructor(BufferSource bytes); static sequence exports(Module moduleObject); static sequence imports(Module moduleObject); static sequence customSections(Module moduleObject, DOMString sectionName); }; -[LegacyNamespace=WebAssembly, Constructor(Module module, optional object importObject), Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] interface Instance { + constructor(Module module, optional object importObject); readonly attribute object exports; }; @@ -56,8 +58,9 @@ dictionary MemoryDescriptor { [EnforceRange] unsigned long maximum; }; -[LegacyNamespace=WebAssembly, Constructor(MemoryDescriptor descriptor), Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] interface Memory { + constructor(MemoryDescriptor descriptor); unsigned long grow([EnforceRange] unsigned long delta); readonly attribute ArrayBuffer buffer; }; @@ -74,8 +77,9 @@ dictionary TableDescriptor { [EnforceRange] unsigned long maximum; }; -[LegacyNamespace=WebAssembly, Constructor(TableDescriptor descriptor), Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] interface Table { + constructor(TableDescriptor descriptor); unsigned long grow([EnforceRange] unsigned long delta); Function? get([EnforceRange] unsigned long index); void set([EnforceRange] unsigned long index, Function? value); @@ -94,8 +98,9 @@ dictionary GlobalDescriptor { boolean mutable = false; }; -[LegacyNamespace=WebAssembly, Constructor(GlobalDescriptor descriptor, optional any v), Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] interface Global { + constructor(GlobalDescriptor descriptor, optional any v); any valueOf(); attribute any value; }; diff --git a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl index 455720c641e..de23fac0c11 100644 --- a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl +++ b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl @@ -13,6 +13,8 @@ dictionary NDEFMessageInit { required sequence records; }; +typedef (DOMString or BufferSource or NDEFMessageInit) NDEFRecordDataSource; + [Exposed=Window] interface NDEFRecord { constructor(NDEFRecordInit recordInit); @@ -36,7 +38,7 @@ dictionary NDEFRecordInit { USVString encoding; USVString lang; - any data; + NDEFRecordDataSource data; }; typedef (DOMString or BufferSource or NDEFMessageInit) NDEFMessageSource; diff --git a/tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-scroll.html b/tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-scroll.html new file mode 100644 index 00000000000..4fe5c6b7e7c --- /dev/null +++ b/tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-scroll.html @@ -0,0 +1,62 @@ + +Layout Instability: shift in pointerdown becoming scroll + + +
+ + + + + + + diff --git a/tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-tap.html b/tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-tap.html new file mode 100644 index 00000000000..e2e7a911dc0 --- /dev/null +++ b/tests/wpt/web-platform-tests/layout-instability/pointerdown-becomes-tap.html @@ -0,0 +1,60 @@ + +Layout Instability: shift in pointerdown becoming tap + + +
+ + + + + + + diff --git a/tests/wpt/web-platform-tests/layout-instability/resources/util.js b/tests/wpt/web-platform-tests/layout-instability/resources/util.js index ca430d0a9e2..515914e11fa 100644 --- a/tests/wpt/web-platform-tests/layout-instability/resources/util.js +++ b/tests/wpt/web-platform-tests/layout-instability/resources/util.js @@ -47,6 +47,7 @@ ScoreWatcher = function() { if (PerformanceObserver.supportedEntryTypes.indexOf("layout-shift") == -1) throw new Error("Layout Instability API not supported"); this.score = 0; + this.scoreWithInputExclusion = 0; const resetPromise = () => { this.promise = new Promise(resolve => { this.resolve = () => { @@ -59,6 +60,8 @@ ScoreWatcher = function() { const observer = new PerformanceObserver(list => { list.getEntries().forEach(entry => { this.score += entry.value; + if (!entry.hadRecentInput) + this.scoreWithInputExclusion += entry.value; this.resolve(); }); }); diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist index 48d7e9d6a74..4f2ef9c005b 100644 --- a/tests/wpt/web-platform-tests/lint.whitelist +++ b/tests/wpt/web-platform-tests/lint.whitelist @@ -201,6 +201,7 @@ SET TIMEOUT: shadow-dom/slotchange-event.html SET TIMEOUT: trusted-types/block-string-assignment-to-DOMWindowTimers-setTimeout-setInterval.tentative.html SET TIMEOUT: trusted-types/DOMWindowTimers-setTimeout-setInterval.tentative.html SET TIMEOUT: user-timing/* +SET TIMEOUT: web-animations/timing-model/animations/* SET TIMEOUT: webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html SET TIMEOUT: webauthn/*timeout.https.html SET TIMEOUT: webdriver/* diff --git a/tests/wpt/web-platform-tests/media/400x300-red-resize-200x150-green.mp4 b/tests/wpt/web-platform-tests/media/400x300-red-resize-200x150-green.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1058c1bf26a0ae080e199886908ea2572c865f00 GIT binary patch literal 17425 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 K0Q4qRH11!AOCOv7 literal 0 HcmV?d00001 diff --git a/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html b/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html index 70545458b46..96d0be9a401 100644 --- a/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html +++ b/tests/wpt/web-platform-tests/portals/portals-adopt-predecessor.html @@ -62,4 +62,14 @@ }); window.open(`resources/portals-adopt-predecessor.html?test=${test}`); }, "Tests that the adopted predecessor is destroyed if it isn't inserted"); + + async_test(t => { + var test = "adopt-to-disconnected-node"; + var bc = new BroadcastChannel(`test-${test}`); + bc.onmessage = t.step_func_done(function(e) { + assert_equals(e.data, "passed"); + bc.close(); + }); + window.open(`resources/portals-adopt-predecessor.html?test=${test}`); + }, "Tests that an adopted portal can be inserted into a disconnected node."); diff --git a/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html b/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html index b7eb3b96779..48e162b9714 100644 --- a/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html +++ b/tests/wpt/web-platform-tests/portals/resources/portals-adopt-predecessor-portal.html @@ -64,5 +64,14 @@ }); }); } + if (test == "adopt-to-disconnected-node") { + var portal = e.adoptPredecessor(); + document.body.appendChild(portal); + var node = document.createElement("div"); + node.appendChild(portal); + var bc_test = new BroadcastChannel(`test-${test}`); + bc_test.postMessage("passed"); + bc_test.close(); + } } diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-worker-timing-frame.tentative.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-worker-timing-frame.tentative.https.html new file mode 100644 index 00000000000..6ca92476195 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-worker-timing-frame.tentative.https.html @@ -0,0 +1,225 @@ + + + + + + diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-worker-timing.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-worker-timing.js new file mode 100644 index 00000000000..7f3b201ef76 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-worker-timing.js @@ -0,0 +1,39 @@ +importScripts("/resources/testharness.js"); + +self.addEventListener('fetch', event => { + if (event.request.url.indexOf('fallback') >= 0) { + event.addPerformanceEntry( + performance.mark("network-fallback mark 1", + { detail: { foo: 'foo' } })); + event.addPerformanceEntry( + performance.mark("network-fallback mark 2", + { detail: { bar: 'bar' } })); + event.addPerformanceEntry(performance.measure("network-fallback measure", + { + start: "network-fallback mark 1", end: "network-fallback mark 2", + detail: { baz: 'baz' } + })); + return; + } else if (event.request.url.indexOf('fetch-event') >= 0) { + event.respondWith((async () => { + event.addPerformanceEntry(performance.mark("fetch-event mark 1", + { detail: { foo: 'foo' } })); + const response = await fetch(event.request); + + event.waitUntil(new Promise((resolve) => { + // Add performance entries after settling a promise for respondWith(). + step_timeout(() => { + event.addPerformanceEntry(performance.mark("fetch-event mark 2", + { detail: { bar: 'bar' } })); + event.addPerformanceEntry(performance.measure("fetch-event measure", + { + start: "fetch-event mark 1", end: "fetch-event mark 2", + detail: { baz: 'baz' } + })); + resolve(); + }, 100); + })); + return response; + })()); + } +}); diff --git a/tests/wpt/web-platform-tests/storage-access-api/META.yml b/tests/wpt/web-platform-tests/storage-access-api/META.yml index cb059fe6bb1..83f07857538 100644 --- a/tests/wpt/web-platform-tests/storage-access-api/META.yml +++ b/tests/wpt/web-platform-tests/storage-access-api/META.yml @@ -1,2 +1,5 @@ +spec: https://github.com/whatwg/html/issues/3338 suggested_reviewers: - Brandr0id + - ehsan + - johnwilander diff --git a/tests/wpt/web-platform-tests/svg/META.yml b/tests/wpt/web-platform-tests/svg/META.yml index 0836892864f..ee0fff087c4 100644 --- a/tests/wpt/web-platform-tests/svg/META.yml +++ b/tests/wpt/web-platform-tests/svg/META.yml @@ -6,3 +6,4 @@ suggested_reviewers: - AmeliaBR - svgeesus - dirkschulze + - fsoder diff --git a/tests/wpt/web-platform-tests/svg/painting/marker-009-ref.svg b/tests/wpt/web-platform-tests/svg/painting/marker-009-ref.svg new file mode 100644 index 00000000000..968eba091c5 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/painting/marker-009-ref.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/svg/painting/marker-009.svg b/tests/wpt/web-platform-tests/svg/painting/marker-009.svg new file mode 100644 index 00000000000..9e6fe21d917 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/painting/marker-009.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/svg/painting/marker-orient-001-ref.svg b/tests/wpt/web-platform-tests/svg/painting/marker-orient-001-ref.svg new file mode 100644 index 00000000000..e328aa05462 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/painting/marker-orient-001-ref.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/svg/painting/marker-orient-001.svg b/tests/wpt/web-platform-tests/svg/painting/marker-orient-001.svg new file mode 100644 index 00000000000..eefb1068391 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/painting/marker-orient-001.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/svg/render/foreignObject-in-non-rendered-getComputedStyle.html b/tests/wpt/web-platform-tests/svg/render/foreignObject-in-non-rendered-getComputedStyle.html new file mode 100644 index 00000000000..409f1044a33 --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/render/foreignObject-in-non-rendered-getComputedStyle.html @@ -0,0 +1,20 @@ + +SVG Test: Resolved width inside non-rendered foreignObject + + + + + + + +
+
+
+
+
+ diff --git a/tests/wpt/web-platform-tests/tools/ci/azure/install_safari.yml b/tests/wpt/web-platform-tests/tools/ci/azure/install_safari.yml index 10466e3278f..a8641465ac8 100644 --- a/tests/wpt/web-platform-tests/tools/ci/azure/install_safari.yml +++ b/tests/wpt/web-platform-tests/tools/ci/azure/install_safari.yml @@ -5,7 +5,7 @@ parameters: steps: - ${{ if eq(parameters.channel, 'preview') }}: - script: | - HOMEBREW_NO_AUTO_UPDATE=1 brew cask install https://raw.githubusercontent.com/Homebrew/homebrew-cask-versions/master/Casks/safari-technology-preview.rb + HOMEBREW_NO_AUTO_UPDATE=1 brew cask install tools/ci/azure/safari-technology-preview.rb sudo "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver" --enable defaults write com.apple.SafariTechnologyPreview WebKitJavaScriptCanOpenWindowsAutomatically 1 defaults write com.apple.SafariTechnologyPreview ExperimentalServerTimingEnabled 1 diff --git a/tests/wpt/web-platform-tests/tools/ci/azure/safari-technology-preview.rb b/tests/wpt/web-platform-tests/tools/ci/azure/safari-technology-preview.rb new file mode 100644 index 00000000000..b32739be58a --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/azure/safari-technology-preview.rb @@ -0,0 +1,33 @@ +cask 'safari-technology-preview' do + if MacOS.version <= :mojave + version '96,061-44056-20191120-ac7bb196-2724-4840-bce9-6c83ecdbfb2c' + sha256 'e80ceacdff7e75218365993e5af1c81c9bcc4785291ae00abba3d14ac5614317' + else + version '96,061-47718-20191120-02bc7569-ee6b-4c28-9ec4-0ceeda3c3c3a' + sha256 'bbfcdc36bf9b55aec5838d66e34c41dd3f6a64091406bc38f45c888360f191fe' + end + + url "https://secure-appldnld.apple.com/STP/#{version.after_comma}/SafariTechnologyPreview.dmg" + appcast 'https://developer.apple.com/safari/download/' + name 'Safari Technology Preview' + homepage 'https://developer.apple.com/safari/download/' + + auto_updates true + depends_on macos: '>= :mojave' + + pkg 'Safari Technology Preview.pkg' + + uninstall delete: '/Applications/Safari Technology Preview.app' + + zap trash: [ + '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.safaritechnologypreview.sfl*', + '~/Library/Caches/com.apple.SafariTechnologyPreview', + '~/Library/Preferences/com.apple.SafariTechnologyPreview.plist', + '~/Library/SafariTechnologyPreview', + '~/Library/Saved Application State/com.apple.SafariTechnologyPreview.savedState', + '~/Library/SyncedPreferences/com.apple.SafariTechnologyPreview-com.apple.Safari.UserRequests.plist', + '~/Library/SyncedPreferences/com.apple.SafariTechnologyPreview-com.apple.Safari.WebFeedSubscriptions.plist', + '~/Library/SyncedPreferences/com.apple.SafariTechnologyPreview.plist', + '~/Library/WebKit/com.apple.SafariTechnologyPreview', + ] +end diff --git a/tests/wpt/web-platform-tests/tools/ci/commands.json b/tests/wpt/web-platform-tests/tools/ci/commands.json index 841fd855c80..c9cd7c45898 100644 --- a/tests/wpt/web-platform-tests/tools/ci/commands.json +++ b/tests/wpt/web-platform-tests/tools/ci/commands.json @@ -14,7 +14,7 @@ "virtualenv": false }, "tc-download": { - "path": "tcdownload.py", + "path": "tc/download.py", "script": "run", "parser": "get_parser", "parse_known": true, @@ -24,5 +24,27 @@ "requests", "pygithub" ] + }, + "tc-taskgraph": { + "path": "tc/taskgraph.py", + "script": "run", + "help": "Build the taskgraph", + "virtualenv": true, + "install": [ + "requests", + "pyyaml" + ] + }, + "tc-decision": { + "path": "tc/decision.py", + "parser": "get_parser", + "script": "run", + "help": "Run the decision task", + "virtualenv": true, + "install": [ + "requests", + "pyyaml", + "taskcluster" + ] } } diff --git a/tests/wpt/web-platform-tests/tools/ci/run_tc.py b/tests/wpt/web-platform-tests/tools/ci/run_tc.py index be7dbe082a1..b4cb2b01b97 100755 --- a/tests/wpt/web-platform-tests/tools/ci/run_tc.py +++ b/tests/wpt/web-platform-tests/tools/ci/run_tc.py @@ -38,7 +38,6 @@ the serialization of a GitHub event payload. import argparse import json import os -import re import subprocess import sys import tempfile @@ -99,8 +98,12 @@ def get_parser(): help="Start xvfb") p.add_argument("--checkout", help="Revision to checkout before starting job") - p.add_argument("job", - help="Name of the job associated with the current event") + p.add_argument("--install-certificates", action="store_true", default=None, + help="Install web-platform.test certificates to UA store") + p.add_argument("--no-install-certificates", action="store_false", default=None, + help="Don't install web-platform.test certificates to UA store") + p.add_argument("--rev", + help="Revision that the task_head ref is expected to point to") p.add_argument("script", help="Script to run for the job") p.add_argument("script_args", @@ -116,11 +119,17 @@ def start_userspace_oom_killer(): def make_hosts_file(): - subprocess.check_call(["sudo", "sh", "-c", "./wpt make-hosts-file >> /etc/hosts"]) + run(["sudo", "sh", "-c", "./wpt make-hosts-file >> /etc/hosts"]) def checkout_revision(rev): - subprocess.check_call(["git", "checkout", "--quiet", rev]) + run(["git", "checkout", "--quiet", rev]) + + +def install_certificates(): + run(["sudo", "cp", "tools/certs/cacert.pem", + "/usr/local/share/ca-certificates/cacert.crt"]) + run(["sudo", "update-ca-certificates"]) def install_chrome(channel): @@ -213,29 +222,6 @@ def start_xvfb(): start(["sudo", "fluxbox", "-display", os.environ["DISPLAY"]]) -def get_extra_jobs(event): - body = None - jobs = set() - if "commits" in event and event["commits"]: - body = event["commits"][0]["message"] - elif "pull_request" in event: - body = event["pull_request"]["body"] - - if not body: - return jobs - - regexp = re.compile(r"\s*tc-jobs:(.*)$") - - for line in body.splitlines(): - m = regexp.match(line) - if m: - items = m.group(1) - for item in items.split(","): - jobs.add(item.strip()) - break - return jobs - - def set_variables(event): # Set some variables that we use to get the commits on the current branch ref_prefix = "refs/heads/" @@ -256,23 +242,13 @@ def set_variables(event): os.environ["GITHUB_BRANCH"] = branch -def include_job(job): - # Special case things that unconditionally run on pushes, - # assuming a higher layer is filtering the required list of branches - if (os.environ["GITHUB_PULL_REQUEST"] == "false" and - job == "run-all"): - return True - - jobs_str = run([os.path.join(root, "wpt"), - "test-jobs"], return_stdout=True) - print(jobs_str) - return job in set(jobs_str.splitlines()) - - def setup_environment(args): if args.hosts_file: make_hosts_file() + if args.install_certificates: + install_certificates() + if "chrome" in args.browser: assert args.channel is not None install_chrome(args.channel) @@ -337,9 +313,33 @@ def fetch_event_data(): return json.loads(event_data) +def include_job(job): + # Only for supporting pre decision-task PRs + # Special case things that unconditionally run on pushes, + # assuming a higher layer is filtering the required list of branches + if "GITHUB_PULL_REQUEST" not in os.environ: + return True + + if (os.environ["GITHUB_PULL_REQUEST"] == "false" and + job == "run-all"): + return True + + jobs_str = run([os.path.join(root, "wpt"), + "test-jobs"], return_stdout=True) + print(jobs_str) + return job in set(jobs_str.splitlines()) + + def main(): args = get_parser().parse_args() + if args.rev is not None: + task_head = run(["git", "rev-parse", "task_head"], return_stdout=True).strip() + if task_head != args.rev: + print("CRITICAL: task_head points at %s, expected %s. " + "This may be because the branch was updated" % (task_head, args.rev)) + sys.exit(1) + if "TASK_EVENT" in os.environ: event = json.loads(os.environ["TASK_EVENT"]) else: @@ -350,24 +350,15 @@ def main(): setup_repository() - extra_jobs = get_extra_jobs(event) - - job = args.job - - print("Job %s" % job) - - run_if = [(lambda: job == "all", "job set to 'all'"), - (lambda:"all" in extra_jobs, "Manually specified jobs includes 'all'"), - (lambda:job in extra_jobs, "Manually specified jobs includes '%s'" % job), - (lambda:include_job(job), "CI required jobs includes '%s'" % job)] - - for fn, msg in run_if: - if fn(): - print(msg) - break - else: - print("Job not scheduled for this push") - return + # Hack for backwards compatibility + if args.script in ["run-all", "lint", "update_built", "tools_unittest", + "wpt_integration", "resources_unittest", + "wptrunner_infrastructure", "stability", "affected_tests"]: + job = args.script + if not include_job(job): + return + args.script = args.script_args[0] + args.script_args = args.script_args[1:] # Run the job setup_environment(args) diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/README.md b/tests/wpt/web-platform-tests/tools/ci/tc/README.md new file mode 100644 index 00000000000..11f367f986f --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tc/README.md @@ -0,0 +1,235 @@ +# Taskgraph Setup + +The taskgraph is built from a YAML file. This file has two top-level +properties: `components` and `tasks`. The full list of tasks is +defined by the `tasks` object; each task is an object with a single +property representing the task with the corresponding value an object +representing the task properties. Each task requires the following +top-level properties: + +* `provisionerId`: String. Name of Taskcluster provisioner +* `schedulerId`: String. Name of Taskcluster scheduler +* `deadline`: String. Time until the task expires +* `image`: String. Name of docker image to use for task +* `maxRunTime`: Number. Maximum time in seconds for which the task can + run. +* `artifacts`: Object. List of artifacts and directories to upload; see + Taskcluster documentation. +* `command`: String. Command to run. This is automatically wrapped in a + run_tc command +* `options`: Optional Object. Options to pass into run_tc + - xvfb: Boolean. Enable Xvfb for run + - oom-killer: Boolean. Enable xvfb for run + - hosts: Boolean. Update hosts file with wpt hosts before run + - install-certificates: Boolean. Install wpt certs into OS + certificate store for run + - browser: List. List of browser names for run + - channel: String. Browser channel for run +* `trigger`: Object. Conditions on which to consider task. One or more + of following properties: + - branch: List. List of branch names on which to trigger. + - pull-request: No value. Trigger for pull request actions +* `schedule-if`: Optional Object. Conditions on which task should be + scheduled given it meets the trigger conditions. + - `run-job`: List. Job names for which this task should be considered, + matching the output from `./wpt test-jobs` +* `env`: Optional Object. Environment variables to set when running task. +* `depends-on`: Optional list. List of task names that must be complete + before the current task is scheduled. +* `description`: String. Task description. +* `name`: Optional String. Name to use for the task overriding the + property name. This is useful in combination with substitutions + described below. + +## Task Expansions + +Using the above syntax it's possble to describe each task +directly. But typically in a taskgraph there are many common +properties between tasks so it's tedious and error prone to repeat +information that's common to multiple tasks. Therefore the taskgraph +format provides several mechanisms to reuse partial task definitions +across multiple tasks. + +### Components + +The other top-level property in the taskgraph format is +`components`. The value of this property is an object containing named +partial task definitions. Each task definition may contain a property called +`use` which is a list of components to use as the basis for the task +definition. The components list is evaluated in order. If a property +is not previously defined in the output it is added to the output. If +it was previously defined, the value is updated according to the type: + * Strings and numbers are replaced with a new value + * Lists are extended with the additional values + * Objects are updated recursively following the above rules +This means that types must always match between components and the +final value. + +For example +``` +components: + example-1: + list_prop: + - first + - second + object_prop: + key1: value1 + key2: base_value + example-2: + list_prop: + - third + - fourth + object_prop: + key3: + - value3-1 + +tasks: + - example-task: + use: + - example-1 + - example-2 + object_prop: + key2: value2 + key3: + - value3-2 +``` + +will evaluate to the following task: + +``` +example-task: + list_prop: + - first + - second + - third + - fourth + object_prop: + key1: value1 + key2: value2 + key3: + - value3-1 + - value3-2 +``` + +Note that components cannot currently define `use` properties of their own. + +## Substitutions + +Components and tasks can define a property `vars` that holds variables +which are later substituted into the task definition using the syntax +`${vars.property-name}`. For example: + +``` +components: + generic-component: + prop: ${vars.value} + +tasks: + - first: + use: + - generic-component + vars: + value: value1 + - second: + use: + - generic-component + vars: + value: value2 +``` + +Results in the following tasks: + +``` +first: + prop: value1 +second: + prop: value2 +``` + +## Maps + +Instead of defining a task directly, an item in the tasks property may +be an object with a single property `$map`. This object itself has two +child properties; `for` and `do`. The value of `for` is a list of +objects, and the value of `do` is either an object or a list of +objects. For each object in the `for` property, a set of tasks is +created by taking a copy of that object for each task in the `do` +property, updating the object with the properties from the +corresponding `do` object, using the same rules as for components +above, and then processing as for a normal task. `$map` rules can also +be nested. + +Note: Although `$map` shares a name with the `$map` used in json-e +(used. in `.taskcluster.yml`), the semantics are different. + +For example + +``` +components: {} +tasks: + $map: + for: + - vars: + example: value1 + - vars: + example: value2 + do: + example-${vars.example} + prop: ${vars.example} +``` + +Results in the tasks + +``` +example-value1: + prop: value1 +example-value2: + prop: value2 +``` + +Note that in combination with `$map`, variable substitutions are +applied *twice*; once after the `$map` is evaluated and once after the +`use` statements are evaluated. + +## Chunks + +A common requirements for tasks is that they are "chunked" into N +partial tasks. This is handled specially in the syntax. A top level +property `chunks` can be used to define the number of individual +chunks to create for a specific task. Each chunked task is created +with a `chunks` property set to an object containing an `id` property +containing the one-based index of the chunk an a `total` property +containing the total number of chunks. These can be substituted into +the task definition using the same syntax as for `vars` above +e.g. `${chunks.id}`. Note that because task names must be unique, it's +common to specify a `name` property on the task that will override the +property name e.g. + +``` +components: {} +tasks: + - chunked-task: + chunks:2 + command: "task-run --chunk=${chunks.id} --totalChunks=${chunks.total}" + name: task-chunk-${chunks.id} +``` + +creates tasks: + +``` +task-chunk-1: + command: "task-run --chunk=1 --totalChunks=2" +task-chunk-2: + command: "task-run --chunk=2 --totalChunks=2" +``` + +# Overall processing model + +The overall processing model for tasks is as follows: + * Evaluate maps + * Perform subsitutions + * Evaluate use statements + * Expand chunks + * Perform subsitutions + +At each point after maps are evaluated tasks must have a unique name. diff --git a/tests/wpt/web-platform-tests/tools/taskcluster/__init__.py b/tests/wpt/web-platform-tests/tools/ci/tc/__init__.py similarity index 100% rename from tests/wpt/web-platform-tests/tools/taskcluster/__init__.py rename to tests/wpt/web-platform-tests/tools/ci/tc/__init__.py diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/decision.py b/tests/wpt/web-platform-tests/tools/ci/tc/decision.py new file mode 100644 index 00000000000..a3c47aa4049 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tc/decision.py @@ -0,0 +1,323 @@ +import argparse +import json +import logging +import os +import re +import subprocess +from collections import OrderedDict + +import taskcluster +from six import iteritems, itervalues + +from . import taskgraph + + +here = os.path.abspath(os.path.dirname(__file__)) + + +logging.basicConfig() +logger = logging.getLogger() + + +def get_triggers(event): + # Set some variables that we use to get the commits on the current branch + ref_prefix = "refs/heads/" + is_pr = "pull_request" in event + branch = None + if not is_pr and "ref" in event: + branch = event["ref"] + if branch.startswith(ref_prefix): + branch = branch[len(ref_prefix):] + + return is_pr, branch + + +def fetch_event_data(queue): + try: + task_id = os.environ["TASK_ID"] + except KeyError: + logger.warning("Missing TASK_ID environment variable") + # For example under local testing + return None + + task_data = queue.task(task_id) + + return task_data.get("extra", {}).get("github_event") + + +def filter_triggers(event, all_tasks): + is_pr, branch = get_triggers(event) + triggered = {} + for name, task in iteritems(all_tasks): + if "trigger" in task: + if is_pr and "pull-request" in task["trigger"]: + triggered[name] = task + elif branch is not None and "branch" in task["trigger"]: + for trigger_branch in task["trigger"]["branch"]: + if (trigger_branch == branch or + trigger_branch.endswith("*") and branch.startswith(trigger_branch[:-1])): + triggered[name] = task + logger.info("Triggers match tasks:\n * %s" % "\n * ".join(triggered.keys())) + return triggered + + +def get_run_jobs(event): + from tools.ci import jobs + revish = "%s..%s" % (event["pull_request"]["base"]["sha"] + if "pull_request" in event + else event["before"], + event["pull_request"]["head"]["sha"] + if "pull_request" in event + else event["after"]) + logger.info("Looking for changes in range %s" % revish) + paths = jobs.get_paths(revish=revish) + logger.info("Found changes in paths:%s" % "\n".join(paths)) + path_jobs = jobs.get_jobs(paths) + all_jobs = path_jobs | get_extra_jobs(event) + logger.info("Including jobs:\n * %s" % "\n * ".join(all_jobs)) + return all_jobs + + +def get_extra_jobs(event): + body = None + jobs = set() + if "commits" in event and event["commits"]: + body = event["commits"][0]["message"] + elif "pull_request" in event: + body = event["pull_request"]["body"] + + if not body: + return jobs + + regexp = re.compile(r"\s*tc-jobs:(.*)$") + + for line in body.splitlines(): + m = regexp.match(line) + if m: + items = m.group(1) + for item in items.split(","): + jobs.add(item.strip()) + break + return jobs + + +def filter_schedule_if(event, tasks): + scheduled = {} + run_jobs = None + for name, task in iteritems(tasks): + if "schedule-if" in task: + if "run-job" in task["schedule-if"]: + if run_jobs is None: + run_jobs = get_run_jobs(event) + if "all" in run_jobs or any(item in run_jobs for item in task["schedule-if"]["run-job"]): + scheduled[name] = task + else: + scheduled[name] = task + logger.info("Scheduling rules match tasks:\n * %s" % "\n * ".join(scheduled.keys())) + return scheduled + + +def get_fetch_rev(event): + is_pr, _ = get_triggers(event) + if is_pr: + # Try to get the actual rev so that all non-decision tasks are pinned to that + ref = "refs/pull/%s/merge" % event["pull_request"]["number"] + try: + output = subprocess.check_output(["git", "ls-remote", "origin", ref]) + except subprocess.CalledProcessError: + import traceback + logger.error(traceback.format_exc()) + logger.error("Failed to get merge commit sha1") + return ref, None + if not output: + logger.error("Failed to get merge commit") + return ref, None + return ref, output.split()[0] + else: + return event["ref"], event["after"] + + +def build_full_command(event, task): + fetch_ref, fetch_sha = get_fetch_rev(event) + cmd_args = { + "task_name": task["name"], + "repo_url": event["repository"]["clone_url"], + "fetch_ref": fetch_ref, + "task_cmd": task["command"], + "install_str": "", + } + + options = task.get("options", {}) + options_args = [] + if fetch_sha is not None: + options_args.append("--rev=%s" % fetch_sha) + if options.get("oom-killer"): + options_args.append("--oom-killer") + if options.get("xvfb"): + options_args.append("--xvfb") + if not options.get("hosts"): + options_args.append("--no-hosts") + else: + options_args.append("--hosts") + # Check out the expected SHA unless it is overridden (e.g. to base_head). + if options.get("checkout"): + options_args.append("--checkout=%s" % options["checkout"]) + else: + options_args.append("--checkout=%s" % fetch_sha) + for browser in options.get("browser", []): + options_args.append("--browser=%s" % browser) + if options.get("channel"): + options_args.append("--channel=%s" % options["channel"]) + if options.get("install-certificates"): + options_args.append("--install-certificates") + + cmd_args["options_str"] = " ".join(str(item) for item in options_args) + + install_packages = task.get("install") + if install_packages: + install_items = ["apt update -qqy"] + install_items.extend("apt install -qqy %s" % item + for item in install_packages) + cmd_args["install_str"] = "\n".join("sudo %s;" % item for item in install_items) + + return ["/bin/bash", + "--login", + "-c", + """ +~/start.sh \ + %(repo_url)s \ + %(fetch_ref)s; +%(install_str)s +cd web-platform-tests; +./tools/ci/run_tc.py %(options_str)s -- %(task_cmd)s; +""" % cmd_args] + + +def get_owner(event): + pusher = event.get("pusher", {}).get("email", "") + if "@" in pusher: + return pusher + return "web-platform-tests@users.noreply.github.com" + + +def create_tc_task(event, task, taskgroup_id, depends_on_ids): + command = build_full_command(event, task) + task_id = taskcluster.slugId() + task_data = { + "taskGroupId": taskgroup_id, + "created": taskcluster.fromNowJSON(""), + "deadline": taskcluster.fromNowJSON(task["deadline"]), + "provisionerId": task["provisionerId"], + "schedulerId": task["schedulerId"], + "workerType": task["workerType"], + "metadata": { + "name": task["name"], + "description": task.get("description", ""), + "owner": get_owner(event), + "source": event["repository"]["clone_url"] + }, + "payload": { + "artifacts": task.get("artifacts"), + "command": command, + "image": task.get("image"), + "maxRunTime": task.get("maxRunTime"), + "env": task.get("env", {}), + }, + "extra": { + "github_event": json.dumps(event) + } + } + if depends_on_ids: + task_data["dependencies"] = depends_on_ids + task_data["requires"] = "all-completed" + return task_id, task_data + + +def build_task_graph(event, all_tasks, tasks): + task_id_map = OrderedDict() + taskgroup_id = os.environ.get("TASK_ID", taskcluster.slugId()) + + def add_task(task_name, task): + depends_on_ids = [] + if "depends-on" in task: + for depends_name in task["depends-on"]: + if depends_name not in task_id_map: + add_task(depends_name, + all_tasks[depends_name]) + depends_on_ids.append(task_id_map[depends_name][0]) + task_id, task_data = create_tc_task(event, task, taskgroup_id, depends_on_ids) + task_id_map[task_name] = (task_id, task_data) + + for task_name, task in iteritems(tasks): + add_task(task_name, task) + + return task_id_map + + +def create_tasks(queue, task_id_map): + for (task_id, task_data) in itervalues(task_id_map): + queue.createTask(task_id, task_data) + + +def get_event(queue, event_path): + if event_path is not None: + try: + with open(event_path) as f: + event_str = f.read() + except IOError: + logger.error("Missing event file at path %s" % event_path) + raise + elif "TASK_EVENT" in os.environ: + event_str = os.environ["TASK_EVENT"] + else: + event_str = fetch_event_data(queue) + if not event_str: + raise ValueError("Can't find GitHub event definition; for local testing pass --event-path") + try: + return json.loads(event_str) + except ValueError: + logger.error("Event was not valid JSON") + raise + + +def decide(event): + all_tasks = taskgraph.load_tasks_from_path(os.path.join(here, "tasks", "test.yml")) + + triggered_tasks = filter_triggers(event, all_tasks) + scheduled_tasks = filter_schedule_if(event, triggered_tasks) + + logger.info("UNSCHEDULED TASKS:\n %s" % "\n ".join(sorted(set(all_tasks.keys()) - + set(scheduled_tasks.keys())))) + logger.info("SCHEDULED TASKS:\n %s" % "\n ".join(sorted(scheduled_tasks.keys()))) + + task_id_map = build_task_graph(event, all_tasks, scheduled_tasks) + return task_id_map + + +def get_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("--event-path", + help="Path to file containing serialized GitHub event") + parser.add_argument("--dry-run", action="store_true", + help="Don't actually create the tasks, just output the tasks that " + "would be created") + parser.add_argument("--tasks-path", + help="Path to file in which to write payload for all scheduled tasks") + return parser + + +def run(venv, **kwargs): + queue = taskcluster.Queue({'rootUrl': os.environ['TASKCLUSTER_PROXY_URL']}) + event = get_event(queue, event_path=kwargs["event_path"]) + + task_id_map = decide(event) + + try: + if not kwargs["dry_run"]: + create_tasks(queue, task_id_map) + else: + print(json.dumps(task_id_map, indent=2)) + finally: + if kwargs["tasks_path"]: + with open(kwargs["tasks_path"], "w") as f: + json.dump(task_id_map, f, indent=2) diff --git a/tests/wpt/web-platform-tests/tools/ci/tcdownload.py b/tests/wpt/web-platform-tests/tools/ci/tc/download.py similarity index 99% rename from tests/wpt/web-platform-tests/tools/ci/tcdownload.py rename to tests/wpt/web-platform-tests/tools/ci/tc/download.py index 256726da7b5..359ec334050 100644 --- a/tests/wpt/web-platform-tests/tools/ci/tcdownload.py +++ b/tests/wpt/web-platform-tests/tools/ci/tc/download.py @@ -15,6 +15,7 @@ logger = logging.getLogger("tc-download") # be https://community-tc.services.mozilla.com) TASKCLUSTER_ROOT_URL = 'https://taskcluster.net' + def get_parser(): parser = argparse.ArgumentParser() parser.add_argument("--ref", action="store", default="master", diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py b/tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py new file mode 100644 index 00000000000..6a6cb497f2d --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py @@ -0,0 +1,170 @@ +import json +import os +import re +from copy import deepcopy + +import six +import yaml +from six import iteritems + +here = os.path.dirname(__file__) + + +def first(iterable): + # First item from a list or iterator + if not hasattr(iterable, "next"): + if hasattr(iterable, "__iter__"): + iterable = iter(iterable) + else: + raise ValueError("Object isn't iterable") + return next(iterable) + + +def load_task_file(path): + with open(path) as f: + return yaml.safe_load(f) + + +def update_recursive(data, update_data): + for key, value in iteritems(update_data): + if key not in data: + data[key] = value + else: + initial_value = data[key] + if isinstance(value, dict): + if not isinstance(initial_value, dict): + raise ValueError("Variable %s has inconsistent types " + "(expected object)" % key) + update_recursive(initial_value, value) + elif isinstance(value, list): + if not isinstance(initial_value, list): + raise ValueError("Variable %s has inconsistent types " + "(expected list)" % key) + initial_value.extend(value) + else: + data[key] = value + + +def resolve_use(task_data, templates): + rv = {} + if "use" in task_data: + for template_name in task_data["use"]: + update_recursive(rv, deepcopy(templates[template_name])) + update_recursive(rv, task_data) + rv.pop("use", None) + return rv + + +def resolve_name(task_data, default_name): + if "name" not in task_data: + task_data["name"] = default_name + return task_data + + +def resolve_chunks(task_data): + if "chunks" not in task_data: + return [task_data] + rv = [] + total_chunks = task_data["chunks"] + for i in range(1, total_chunks + 1): + chunk_data = deepcopy(task_data) + chunk_data["chunks"] = {"id": i, + "total": total_chunks} + rv.append(chunk_data) + return rv + + +def replace_vars(input_string, variables): + # TODO: support replacing as a non-string type? + variable_re = re.compile(r"(?- + ./tools/ci/taskcluster-run.py + ${vars.browser} + -- + --channel=${vars.channel} + --log-wptreport=../artifacts/wpt_report.json + --log-wptscreenshot=../artifacts/wpt_screenshot.txt + --no-fail-on-unexpected + --this-chunk=${chunks.id} + --total-chunks=${chunks.total} + --test-type=${vars.suite} + trigger-master: + trigger: + branch: + - master + + trigger-push: + trigger: + branch: + - triggers/${vars.browser}_${vars.channel} + + trigger-daily: + trigger: + branch: + - epochs/daily + + trigger-weekly: + trigger: + branch: + - epochs/weekly + + trigger-pr: + trigger: + pull-request: + + browser-firefox: + depends-on: + - download-firefox-${vars.channel} + + browser-webkitgtk_minibrowser: {} + + browser-chrome: {} + + tox-python2: + env: + TOXENV: py27 + PY_COLORS: 0 + + tox-python3: + env: + TOXENV: py36 + PY_COLORS: 0 + install: + - python3-pip + + tests-affected: + options: + browser: + - ${vars.browser} + channel: ${vars.channel} + schedule-if: + run-job: + - affected_tests + +tasks: + # Run full suites on push + - $map: + for: + - vars: + suite: testharness + - vars: + suite: reftest + - vars: + suite: wdspec + do: + $map: + for: + - vars: + browser: firefox + channel: nightly + use: + - trigger-master + - trigger-push + - vars: + browser: firefox + channel: beta + use: + - trigger-weekly + - trigger-push + - vars: + browser: firefox + channel: stable + use: + - trigger-daily + - trigger-push + - vars: + browser: chrome + channel: dev + use: + - trigger-master + - trigger-push + - vars: + browser: chrome + channel: beta + use: + - trigger-weekly + - trigger-push + - vars: + browser: chrome + channel: stable + use: + - trigger-daily + - trigger-push + - vars: + browser: webkitgtk_minibrowser + channel: nightly + use: + - trigger-daily + - trigger-push + - vars: + browser: webkitgtk_minibrowser + channel: stable + use: + - trigger-weekly + - trigger-push + + do: + - ${vars.browser}-${vars.channel}-${vars.suite}: + use: + - wpt-base + - run-options + - wpt-run + - browser-${vars.browser} + - wpt-${vars.suite} + description: >- + A subset of WPT's "${vars.suite}" tests (chunk number ${chunks.id} + of ${chunks.total}), run in the ${vars.channel} release of + ${vars.browser}. + + - $map: + for: + - vars: + browser: firefox + channel: nightly + - vars: + browser: chrome + channel: dev + do: + - wpt-${vars.browser}-${vars.channel}-stability: + use: + - wpt-base + - run-options + - browser-${vars.browser} + - trigger-pr + - tests-affected + description: >- + Verify that all tests affected by a pull request are stable + when executed in ${vars.browser}. + command: >- + ./tools/ci/taskcluster-run.py + --commit-range base_head + ${vars.browser} + -- + --channel=${vars.channel} + --verify + + - wpt-${vars.browser}-${vars.channel}-results: + use: + - wpt-base + - run-options + - browser-${vars.browser} + - trigger-pr + - tests-affected + description: >- + Collect results for all tests affected by a pull request in + ${vars.browser}. + command: >- + ./tools/ci/taskcluster-run.py + --commit-range base_head + ${vars.browser} + -- + --channel=${vars.channel} + --no-fail-on-unexpected + --log-wptreport=../artifacts/wpt_report.json + --log-wptscreenshot=../artifacts/wpt_screenshot.txt + + - wpt-${vars.browser}-${vars.channel}-results-without-changes: + use: + - wpt-base + - run-options + - browser-${vars.browser} + - trigger-pr + - tests-affected + options: + checkout: base_head + description: >- + Collect results for all tests affected by a pull request in + ${vars.browser} but without the changes in the PR. + command: >- + ./tools/ci/taskcluster-run.py + --commit-range task_head + ${vars.browser} + -- + --channel=${vars.channel} + --no-fail-on-unexpected + --log-wptreport=../artifacts/wpt_report.json + --log-wptscreenshot=../artifacts/wpt_screenshot.txt + - $map: + for: + - vars: + channel: nightly + - vars: + channel: beta + - vars: + channel: stable + do: + download-firefox-${vars.channel}: + use: + - wpt-base + command: "./wpt install --download-only --destination /home/test/artifacts/ --channel=${vars.channel} firefox browser" + + - lint: + use: + - wpt-base + - trigger-master + - trigger-pr + description: >- + Lint for wpt-specific requirements + command: "./wpt lint --all" + + - update-built: + use: + - wpt-base + - trigger-pr + schedule-if: + run-job: + - update_built + command: "./tools/ci/ci_built_diff.sh" + + - tools/ unittests (Python 2): + use: + - wpt-base + - trigger-pr + - tox-python2 + description: >- + Unit tests for tools running under Python 2.7, excluding wptrunner + command: ./tools/ci/ci_tools_unittest.sh + env: + HYPOTHESIS_PROFILE: ci + schedule-if: + run-job: + - tools_unittest + + - tools/ unittests (Python 3): + description: >- + Unit tests for tools running under Python 3, excluding wptrunner + use: + - wpt-base + - trigger-pr + - tox-python3 + command: ./tools/ci/ci_tools_unittest.sh + env: + HYPOTHESIS_PROFILE: ci + schedule-if: + run-job: + - tools_unittest + + - tools/wpt/ tests: + description: >- + Integration tests for wpt commands + use: + - wpt-base + - trigger-pr + - tox-python2 + command: ./tools/ci/ci_wpt.sh + install: + - libnss3-tools + options: + oom-killer: true + browser: + - firefox + - chrome + channel: experimental + xvfb: true + hosts: true + schedule-if: + run-job: + - wpt_integration + + - resources/ tests: + description: >- + Tests for testharness.js and other files in resources/ + use: + - wpt-base + - trigger-pr + - tox-python2 + command: ./tools/ci/ci_resources_unittest.sh + options: + browser: + - firefox + xvfb: true + hosts: true + schedule-if: + run-job: + - resources_unittest + + - infrastructure/ tests: + description: >- + Smoketests for wptrunner + use: + - wpt-base + - trigger-pr + - tox-python2 + command: ./tools/ci/ci_wptrunner_infrastructure.sh + install: + - libnss3-tools + - libappindicator1 + - fonts-liberation + options: + oom-killer: true + browser: + - firefox + - chrome + channel: experimental + xvfb: true + hosts: false + schedule-if: + run-job: + - wptrunner_infrastructure diff --git a/tests/wpt/web-platform-tests/tools/taskcluster/testdata/master_push_event.json b/tests/wpt/web-platform-tests/tools/ci/tc/testdata/master_push_event.json similarity index 100% rename from tests/wpt/web-platform-tests/tools/taskcluster/testdata/master_push_event.json rename to tests/wpt/web-platform-tests/tools/ci/tc/testdata/master_push_event.json diff --git a/tests/wpt/web-platform-tests/tools/taskcluster/testdata/pr_event.json b/tests/wpt/web-platform-tests/tools/ci/tc/testdata/pr_event.json similarity index 100% rename from tests/wpt/web-platform-tests/tools/taskcluster/testdata/pr_event.json rename to tests/wpt/web-platform-tests/tools/ci/tc/testdata/pr_event.json diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/testdata/pr_event_tests_affected.json b/tests/wpt/web-platform-tests/tools/ci/tc/testdata/pr_event_tests_affected.json new file mode 100644 index 00000000000..792ea1bccce --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tc/testdata/pr_event_tests_affected.json @@ -0,0 +1,505 @@ +{ + "action": "synchronize", + "number": 20378, + "pull_request": { + "url": "https://api.github.com/repos/web-platform-tests/wpt/pulls/20378", + "id": 344287920, + "node_id": "MDExOlB1bGxSZXF1ZXN0MzQ0Mjg3OTIw", + "html_url": "https://github.com/web-platform-tests/wpt/pull/20378", + "diff_url": "https://github.com/web-platform-tests/wpt/pull/20378.diff", + "patch_url": "https://github.com/web-platform-tests/wpt/pull/20378.patch", + "issue_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/20378", + "number": 20378, + "state": "open", + "locked": false, + "title": "Migrate more layout instability tests to WPT.", + "user": { + "login": "chromium-wpt-export-bot", + "id": 25752892, + "node_id": "MDQ6VXNlcjI1NzUyODky", + "avatar_url": "https://avatars1.githubusercontent.com/u/25752892?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/chromium-wpt-export-bot", + "html_url": "https://github.com/chromium-wpt-export-bot", + "followers_url": "https://api.github.com/users/chromium-wpt-export-bot/followers", + "following_url": "https://api.github.com/users/chromium-wpt-export-bot/following{/other_user}", + "gists_url": "https://api.github.com/users/chromium-wpt-export-bot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/chromium-wpt-export-bot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/chromium-wpt-export-bot/subscriptions", + "organizations_url": "https://api.github.com/users/chromium-wpt-export-bot/orgs", + "repos_url": "https://api.github.com/users/chromium-wpt-export-bot/repos", + "events_url": "https://api.github.com/users/chromium-wpt-export-bot/events{/privacy}", + "received_events_url": "https://api.github.com/users/chromium-wpt-export-bot/received_events", + "type": "User", + "site_admin": false + }, + "body": "Bug: 984109\nChange-Id: Ie31c63995f63f8acbfa26d97966ffe30016edd3c\nReviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1925447\nCommit-Queue: Steve Kobes \\\nReviewed-by: Nicolás Peña Moreno \\\nCr-Commit-Position: refs/heads/master@{#718648}\n\n", + "created_at": "2019-11-21T23:53:58Z", + "updated_at": "2019-11-25T15:54:19Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": "36726e3e992a83e80608acf47c886fc440390691", + "assignee": null, + "assignees": [ + + ], + "requested_reviewers": [ + + ], + "requested_teams": [ + + ], + "labels": [ + { + "id": 490891502, + "node_id": "MDU6TGFiZWw0OTA4OTE1MDI=", + "url": "https://api.github.com/repos/web-platform-tests/wpt/labels/chromium-export", + "name": "chromium-export", + "color": "4788f4", + "default": false, + "description": null + }, + { + "id": 1363199651, + "node_id": "MDU6TGFiZWwxMzYzMTk5NjUx", + "url": "https://api.github.com/repos/web-platform-tests/wpt/labels/layout-instability", + "name": "layout-instability", + "color": "ededed", + "default": false, + "description": null + } + ], + "milestone": null, + "commits_url": "https://api.github.com/repos/web-platform-tests/wpt/pulls/20378/commits", + "review_comments_url": "https://api.github.com/repos/web-platform-tests/wpt/pulls/20378/comments", + "review_comment_url": "https://api.github.com/repos/web-platform-tests/wpt/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/20378/comments", + "statuses_url": "https://api.github.com/repos/web-platform-tests/wpt/statuses/7df84e3f87f05860a2b86d0b80dc3eb06d8e7103", + "head": { + "label": "web-platform-tests:chromium-export-cl-1925447", + "ref": "chromium-export-cl-1925447", + "sha": "7df84e3f87f05860a2b86d0b80dc3eb06d8e7103", + "user": { + "login": "web-platform-tests", + "id": 37226233, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM3MjI2MjMz", + "avatar_url": "https://avatars0.githubusercontent.com/u/37226233?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/web-platform-tests", + "html_url": "https://github.com/web-platform-tests", + "followers_url": "https://api.github.com/users/web-platform-tests/followers", + "following_url": "https://api.github.com/users/web-platform-tests/following{/other_user}", + "gists_url": "https://api.github.com/users/web-platform-tests/gists{/gist_id}", + "starred_url": "https://api.github.com/users/web-platform-tests/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/web-platform-tests/subscriptions", + "organizations_url": "https://api.github.com/users/web-platform-tests/orgs", + "repos_url": "https://api.github.com/users/web-platform-tests/repos", + "events_url": "https://api.github.com/users/web-platform-tests/events{/privacy}", + "received_events_url": "https://api.github.com/users/web-platform-tests/received_events", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 3618133, + "node_id": "MDEwOlJlcG9zaXRvcnkzNjE4MTMz", + "name": "wpt", + "full_name": "web-platform-tests/wpt", + "private": false, + "owner": { + "login": "web-platform-tests", + "id": 37226233, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM3MjI2MjMz", + "avatar_url": "https://avatars0.githubusercontent.com/u/37226233?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/web-platform-tests", + "html_url": "https://github.com/web-platform-tests", + "followers_url": "https://api.github.com/users/web-platform-tests/followers", + "following_url": "https://api.github.com/users/web-platform-tests/following{/other_user}", + "gists_url": "https://api.github.com/users/web-platform-tests/gists{/gist_id}", + "starred_url": "https://api.github.com/users/web-platform-tests/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/web-platform-tests/subscriptions", + "organizations_url": "https://api.github.com/users/web-platform-tests/orgs", + "repos_url": "https://api.github.com/users/web-platform-tests/repos", + "events_url": "https://api.github.com/users/web-platform-tests/events{/privacy}", + "received_events_url": "https://api.github.com/users/web-platform-tests/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/web-platform-tests/wpt", + "description": "Test suites for Web platform specs — including WHATWG, W3C, and others", + "fork": false, + "url": "https://api.github.com/repos/web-platform-tests/wpt", + "forks_url": "https://api.github.com/repos/web-platform-tests/wpt/forks", + "keys_url": "https://api.github.com/repos/web-platform-tests/wpt/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/web-platform-tests/wpt/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/web-platform-tests/wpt/teams", + "hooks_url": "https://api.github.com/repos/web-platform-tests/wpt/hooks", + "issue_events_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/events{/number}", + "events_url": "https://api.github.com/repos/web-platform-tests/wpt/events", + "assignees_url": "https://api.github.com/repos/web-platform-tests/wpt/assignees{/user}", + "branches_url": "https://api.github.com/repos/web-platform-tests/wpt/branches{/branch}", + "tags_url": "https://api.github.com/repos/web-platform-tests/wpt/tags", + "blobs_url": "https://api.github.com/repos/web-platform-tests/wpt/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/web-platform-tests/wpt/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/web-platform-tests/wpt/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/web-platform-tests/wpt/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/web-platform-tests/wpt/statuses/{sha}", + "languages_url": "https://api.github.com/repos/web-platform-tests/wpt/languages", + "stargazers_url": "https://api.github.com/repos/web-platform-tests/wpt/stargazers", + "contributors_url": "https://api.github.com/repos/web-platform-tests/wpt/contributors", + "subscribers_url": "https://api.github.com/repos/web-platform-tests/wpt/subscribers", + "subscription_url": "https://api.github.com/repos/web-platform-tests/wpt/subscription", + "commits_url": "https://api.github.com/repos/web-platform-tests/wpt/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/web-platform-tests/wpt/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/web-platform-tests/wpt/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/web-platform-tests/wpt/contents/{+path}", + "compare_url": "https://api.github.com/repos/web-platform-tests/wpt/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/web-platform-tests/wpt/merges", + "archive_url": "https://api.github.com/repos/web-platform-tests/wpt/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/web-platform-tests/wpt/downloads", + "issues_url": "https://api.github.com/repos/web-platform-tests/wpt/issues{/number}", + "pulls_url": "https://api.github.com/repos/web-platform-tests/wpt/pulls{/number}", + "milestones_url": "https://api.github.com/repos/web-platform-tests/wpt/milestones{/number}", + "notifications_url": "https://api.github.com/repos/web-platform-tests/wpt/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/web-platform-tests/wpt/labels{/name}", + "releases_url": "https://api.github.com/repos/web-platform-tests/wpt/releases{/id}", + "deployments_url": "https://api.github.com/repos/web-platform-tests/wpt/deployments", + "created_at": "2012-03-04T12:58:11Z", + "updated_at": "2019-11-25T15:40:59Z", + "pushed_at": "2019-11-25T15:54:18Z", + "git_url": "git://github.com/web-platform-tests/wpt.git", + "ssh_url": "git@github.com:web-platform-tests/wpt.git", + "clone_url": "https://github.com/web-platform-tests/wpt.git", + "svn_url": "https://github.com/web-platform-tests/wpt", + "homepage": "https://web-platform-tests.org/", + "size": 329278, + "stargazers_count": 2536, + "watchers_count": 2536, + "language": "HTML", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 1837, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 1576, + "license": { + "key": "other", + "name": "Other", + "spdx_id": "NOASSERTION", + "url": null, + "node_id": "MDc6TGljZW5zZTA=" + }, + "forks": 1837, + "open_issues": 1576, + "watchers": 2536, + "default_branch": "master" + } + }, + "base": { + "label": "web-platform-tests:master", + "ref": "master", + "sha": "90ebe5c33c44090271759f8e9dc43d0b5bd0f8f7", + "user": { + "login": "web-platform-tests", + "id": 37226233, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM3MjI2MjMz", + "avatar_url": "https://avatars0.githubusercontent.com/u/37226233?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/web-platform-tests", + "html_url": "https://github.com/web-platform-tests", + "followers_url": "https://api.github.com/users/web-platform-tests/followers", + "following_url": "https://api.github.com/users/web-platform-tests/following{/other_user}", + "gists_url": "https://api.github.com/users/web-platform-tests/gists{/gist_id}", + "starred_url": "https://api.github.com/users/web-platform-tests/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/web-platform-tests/subscriptions", + "organizations_url": "https://api.github.com/users/web-platform-tests/orgs", + "repos_url": "https://api.github.com/users/web-platform-tests/repos", + "events_url": "https://api.github.com/users/web-platform-tests/events{/privacy}", + "received_events_url": "https://api.github.com/users/web-platform-tests/received_events", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 3618133, + "node_id": "MDEwOlJlcG9zaXRvcnkzNjE4MTMz", + "name": "wpt", + "full_name": "web-platform-tests/wpt", + "private": false, + "owner": { + "login": "web-platform-tests", + "id": 37226233, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM3MjI2MjMz", + "avatar_url": "https://avatars0.githubusercontent.com/u/37226233?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/web-platform-tests", + "html_url": "https://github.com/web-platform-tests", + "followers_url": "https://api.github.com/users/web-platform-tests/followers", + "following_url": "https://api.github.com/users/web-platform-tests/following{/other_user}", + "gists_url": "https://api.github.com/users/web-platform-tests/gists{/gist_id}", + "starred_url": "https://api.github.com/users/web-platform-tests/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/web-platform-tests/subscriptions", + "organizations_url": "https://api.github.com/users/web-platform-tests/orgs", + "repos_url": "https://api.github.com/users/web-platform-tests/repos", + "events_url": "https://api.github.com/users/web-platform-tests/events{/privacy}", + "received_events_url": "https://api.github.com/users/web-platform-tests/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/web-platform-tests/wpt", + "description": "Test suites for Web platform specs — including WHATWG, W3C, and others", + "fork": false, + "url": "https://api.github.com/repos/web-platform-tests/wpt", + "forks_url": "https://api.github.com/repos/web-platform-tests/wpt/forks", + "keys_url": "https://api.github.com/repos/web-platform-tests/wpt/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/web-platform-tests/wpt/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/web-platform-tests/wpt/teams", + "hooks_url": "https://api.github.com/repos/web-platform-tests/wpt/hooks", + "issue_events_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/events{/number}", + "events_url": "https://api.github.com/repos/web-platform-tests/wpt/events", + "assignees_url": "https://api.github.com/repos/web-platform-tests/wpt/assignees{/user}", + "branches_url": "https://api.github.com/repos/web-platform-tests/wpt/branches{/branch}", + "tags_url": "https://api.github.com/repos/web-platform-tests/wpt/tags", + "blobs_url": "https://api.github.com/repos/web-platform-tests/wpt/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/web-platform-tests/wpt/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/web-platform-tests/wpt/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/web-platform-tests/wpt/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/web-platform-tests/wpt/statuses/{sha}", + "languages_url": "https://api.github.com/repos/web-platform-tests/wpt/languages", + "stargazers_url": "https://api.github.com/repos/web-platform-tests/wpt/stargazers", + "contributors_url": "https://api.github.com/repos/web-platform-tests/wpt/contributors", + "subscribers_url": "https://api.github.com/repos/web-platform-tests/wpt/subscribers", + "subscription_url": "https://api.github.com/repos/web-platform-tests/wpt/subscription", + "commits_url": "https://api.github.com/repos/web-platform-tests/wpt/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/web-platform-tests/wpt/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/web-platform-tests/wpt/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/web-platform-tests/wpt/contents/{+path}", + "compare_url": "https://api.github.com/repos/web-platform-tests/wpt/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/web-platform-tests/wpt/merges", + "archive_url": "https://api.github.com/repos/web-platform-tests/wpt/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/web-platform-tests/wpt/downloads", + "issues_url": "https://api.github.com/repos/web-platform-tests/wpt/issues{/number}", + "pulls_url": "https://api.github.com/repos/web-platform-tests/wpt/pulls{/number}", + "milestones_url": "https://api.github.com/repos/web-platform-tests/wpt/milestones{/number}", + "notifications_url": "https://api.github.com/repos/web-platform-tests/wpt/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/web-platform-tests/wpt/labels{/name}", + "releases_url": "https://api.github.com/repos/web-platform-tests/wpt/releases{/id}", + "deployments_url": "https://api.github.com/repos/web-platform-tests/wpt/deployments", + "created_at": "2012-03-04T12:58:11Z", + "updated_at": "2019-11-25T15:40:59Z", + "pushed_at": "2019-11-25T15:54:18Z", + "git_url": "git://github.com/web-platform-tests/wpt.git", + "ssh_url": "git@github.com:web-platform-tests/wpt.git", + "clone_url": "https://github.com/web-platform-tests/wpt.git", + "svn_url": "https://github.com/web-platform-tests/wpt", + "homepage": "https://web-platform-tests.org/", + "size": 329278, + "stargazers_count": 2536, + "watchers_count": 2536, + "language": "HTML", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 1837, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 1576, + "license": { + "key": "other", + "name": "Other", + "spdx_id": "NOASSERTION", + "url": null, + "node_id": "MDc6TGljZW5zZTA=" + }, + "forks": 1837, + "open_issues": 1576, + "watchers": 2536, + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/web-platform-tests/wpt/pulls/20378" + }, + "html": { + "href": "https://github.com/web-platform-tests/wpt/pull/20378" + }, + "issue": { + "href": "https://api.github.com/repos/web-platform-tests/wpt/issues/20378" + }, + "comments": { + "href": "https://api.github.com/repos/web-platform-tests/wpt/issues/20378/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/web-platform-tests/wpt/pulls/20378/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/web-platform-tests/wpt/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/web-platform-tests/wpt/pulls/20378/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/web-platform-tests/wpt/statuses/7df84e3f87f05860a2b86d0b80dc3eb06d8e7103" + } + }, + "author_association": "COLLABORATOR", + "draft": false, + "merged": false, + "mergeable": null, + "rebaseable": null, + "mergeable_state": "unknown", + "merged_by": null, + "comments": 0, + "review_comments": 0, + "maintainer_can_modify": false, + "commits": 1, + "additions": 431, + "deletions": 0, + "changed_files": 11 + }, + "before": "86742511fa37e1e2c1635b77431bd46958ecfb92", + "after": "7df84e3f87f05860a2b86d0b80dc3eb06d8e7103", + "repository": { + "id": 3618133, + "node_id": "MDEwOlJlcG9zaXRvcnkzNjE4MTMz", + "name": "wpt", + "full_name": "web-platform-tests/wpt", + "private": false, + "owner": { + "login": "web-platform-tests", + "id": 37226233, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM3MjI2MjMz", + "avatar_url": "https://avatars0.githubusercontent.com/u/37226233?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/web-platform-tests", + "html_url": "https://github.com/web-platform-tests", + "followers_url": "https://api.github.com/users/web-platform-tests/followers", + "following_url": "https://api.github.com/users/web-platform-tests/following{/other_user}", + "gists_url": "https://api.github.com/users/web-platform-tests/gists{/gist_id}", + "starred_url": "https://api.github.com/users/web-platform-tests/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/web-platform-tests/subscriptions", + "organizations_url": "https://api.github.com/users/web-platform-tests/orgs", + "repos_url": "https://api.github.com/users/web-platform-tests/repos", + "events_url": "https://api.github.com/users/web-platform-tests/events{/privacy}", + "received_events_url": "https://api.github.com/users/web-platform-tests/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/web-platform-tests/wpt", + "description": "Test suites for Web platform specs — including WHATWG, W3C, and others", + "fork": false, + "url": "https://api.github.com/repos/web-platform-tests/wpt", + "forks_url": "https://api.github.com/repos/web-platform-tests/wpt/forks", + "keys_url": "https://api.github.com/repos/web-platform-tests/wpt/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/web-platform-tests/wpt/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/web-platform-tests/wpt/teams", + "hooks_url": "https://api.github.com/repos/web-platform-tests/wpt/hooks", + "issue_events_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/events{/number}", + "events_url": "https://api.github.com/repos/web-platform-tests/wpt/events", + "assignees_url": "https://api.github.com/repos/web-platform-tests/wpt/assignees{/user}", + "branches_url": "https://api.github.com/repos/web-platform-tests/wpt/branches{/branch}", + "tags_url": "https://api.github.com/repos/web-platform-tests/wpt/tags", + "blobs_url": "https://api.github.com/repos/web-platform-tests/wpt/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/web-platform-tests/wpt/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/web-platform-tests/wpt/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/web-platform-tests/wpt/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/web-platform-tests/wpt/statuses/{sha}", + "languages_url": "https://api.github.com/repos/web-platform-tests/wpt/languages", + "stargazers_url": "https://api.github.com/repos/web-platform-tests/wpt/stargazers", + "contributors_url": "https://api.github.com/repos/web-platform-tests/wpt/contributors", + "subscribers_url": "https://api.github.com/repos/web-platform-tests/wpt/subscribers", + "subscription_url": "https://api.github.com/repos/web-platform-tests/wpt/subscription", + "commits_url": "https://api.github.com/repos/web-platform-tests/wpt/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/web-platform-tests/wpt/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/web-platform-tests/wpt/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/web-platform-tests/wpt/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/web-platform-tests/wpt/contents/{+path}", + "compare_url": "https://api.github.com/repos/web-platform-tests/wpt/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/web-platform-tests/wpt/merges", + "archive_url": "https://api.github.com/repos/web-platform-tests/wpt/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/web-platform-tests/wpt/downloads", + "issues_url": "https://api.github.com/repos/web-platform-tests/wpt/issues{/number}", + "pulls_url": "https://api.github.com/repos/web-platform-tests/wpt/pulls{/number}", + "milestones_url": "https://api.github.com/repos/web-platform-tests/wpt/milestones{/number}", + "notifications_url": "https://api.github.com/repos/web-platform-tests/wpt/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/web-platform-tests/wpt/labels{/name}", + "releases_url": "https://api.github.com/repos/web-platform-tests/wpt/releases{/id}", + "deployments_url": "https://api.github.com/repos/web-platform-tests/wpt/deployments", + "created_at": "2012-03-04T12:58:11Z", + "updated_at": "2019-11-25T15:40:59Z", + "pushed_at": "2019-11-25T15:54:18Z", + "git_url": "git://github.com/web-platform-tests/wpt.git", + "ssh_url": "git@github.com:web-platform-tests/wpt.git", + "clone_url": "https://github.com/web-platform-tests/wpt.git", + "svn_url": "https://github.com/web-platform-tests/wpt", + "homepage": "https://web-platform-tests.org/", + "size": 329278, + "stargazers_count": 2536, + "watchers_count": 2536, + "language": "HTML", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 1837, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 1576, + "license": { + "key": "other", + "name": "Other", + "spdx_id": "NOASSERTION", + "url": null, + "node_id": "MDc6TGljZW5zZTA=" + }, + "forks": 1837, + "open_issues": 1576, + "watchers": 2536, + "default_branch": "master" + }, + "organization": { + "login": "web-platform-tests", + "id": 37226233, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM3MjI2MjMz", + "url": "https://api.github.com/orgs/web-platform-tests", + "repos_url": "https://api.github.com/orgs/web-platform-tests/repos", + "events_url": "https://api.github.com/orgs/web-platform-tests/events", + "hooks_url": "https://api.github.com/orgs/web-platform-tests/hooks", + "issues_url": "https://api.github.com/orgs/web-platform-tests/issues", + "members_url": "https://api.github.com/orgs/web-platform-tests/members{/member}", + "public_members_url": "https://api.github.com/orgs/web-platform-tests/public_members{/member}", + "avatar_url": "https://avatars0.githubusercontent.com/u/37226233?v=4", + "description": "" + }, + "sender": { + "login": "chromium-wpt-export-bot", + "id": 25752892, + "node_id": "MDQ6VXNlcjI1NzUyODky", + "avatar_url": "https://avatars1.githubusercontent.com/u/25752892?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/chromium-wpt-export-bot", + "html_url": "https://github.com/chromium-wpt-export-bot", + "followers_url": "https://api.github.com/users/chromium-wpt-export-bot/followers", + "following_url": "https://api.github.com/users/chromium-wpt-export-bot/following{/other_user}", + "gists_url": "https://api.github.com/users/chromium-wpt-export-bot/gists{/gist_id}", + "starred_url": "https://api.github.com/users/chromium-wpt-export-bot/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/chromium-wpt-export-bot/subscriptions", + "organizations_url": "https://api.github.com/users/chromium-wpt-export-bot/orgs", + "repos_url": "https://api.github.com/users/chromium-wpt-export-bot/repos", + "events_url": "https://api.github.com/users/chromium-wpt-export-bot/events{/privacy}", + "received_events_url": "https://api.github.com/users/chromium-wpt-export-bot/received_events", + "type": "User", + "site_admin": false + } +} diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_decision.py b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_decision.py new file mode 100644 index 00000000000..425b5829edd --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_decision.py @@ -0,0 +1,54 @@ +import mock +import pytest + +from tools.ci.tc import decision +from six import iteritems + + +@pytest.mark.parametrize("run_jobs,tasks,expected", [ + ([], {"task-no-schedule-if": {}}, ["task-no-schedule-if"]), + ([], {"task-schedule-if-no-run-job": {"schedule-if": {}}}, []), + (["job"], + {"job-present": {"schedule-if": {"run-job": ["other-job", "job"]}}}, + ["job-present"]), + (["job"], {"job-missing": {"schedule-if": {"run-job": ["other-job"]}}}, []), + (["all"], {"job-all": {"schedule-if": {"run-job": ["other-job"]}}}, ["job-all"]), + (["job"], + {"job-1": {"schedule-if": {"run-job": ["job"]}}, + "job-2": {"schedule-if": {"run-job": ["other-job"]}}}, + ["job-1"]), +]) +def test_filter_schedule_if(run_jobs, tasks, expected): + with mock.patch("tools.ci.tc.decision.get_run_jobs", + return_value=run_jobs) as get_run_jobs: + assert (decision.filter_schedule_if({}, tasks) == + {name: tasks[name] for name in expected}) + get_run_jobs.call_count in (0, 1) + + +@pytest.mark.parametrize("msg,expected", [ + ("Some initial line\n\ntc-jobs:foo,bar", {"foo", "bar"}), + ("Some initial line\n\ntc-jobs:foo, bar", {"foo", "bar"}), + ("tc-jobs:foo, bar \nbaz", {"foo", "bar"}), + ("tc-jobs:all", {"all"}), + ("", set()), + ("tc-jobs:foo\ntc-jobs:bar", {"foo"})]) +@pytest.mark.parametrize("event", [ + {"commits": [{"message": ""}]}, + {"pull_request": {"body": ""}} +]) +def test_extra_jobs_pr(msg, expected, event): + def sub(obj): + """Copy obj, except if it's a string with the value + replace it with the value of the msg argument""" + if isinstance(obj, dict): + return {key: sub(value) for (key, value) in iteritems(obj)} + elif isinstance(obj, list): + return [sub(value) for value in obj] + elif obj == "": + return msg + return obj + + event = sub(event) + + assert decision.get_extra_jobs(event) == expected diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_taskgraph.py b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_taskgraph.py new file mode 100644 index 00000000000..dd8535bb647 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_taskgraph.py @@ -0,0 +1,146 @@ +import pytest +import yaml + +from tools.ci.tc import taskgraph + +@pytest.mark.parametrize("data, update_data, expected", [ + ({"a": 1}, {"b": 2}, {"a": 1, "b": 2}), + ({"a": 1}, {"a": 2}, {"a": 2}), + ({"a": [1]}, {"a": [2]}, {"a": [1, 2]}), + ({"a": {"b": 1, "c": 2}}, {"a": {"b": 2, "d": 3}}, {"a": {"b": 2, "c": 2, "d": 3}}), + ({"a": {"b": [1]}}, {"a": {"b": [2]}}, {"a": {"b": [1, 2]}}), +] +) +def test_update_recursive(data, update_data, expected): + taskgraph.update_recursive(data, update_data) + assert data == expected + + +def test_use(): + data = """ +components: + component1: + a: 1 + b: [1] + c: "c" + component2: + a: 2 + b: [2] + d: "d" +tasks: + - task1: + use: + - component1 + - component2 + b: [3] + c: "e" +""" + tasks_data = yaml.safe_load(data) + assert taskgraph.load_tasks(tasks_data) == { + "task1": { + "a": 2, + "b": [1,2,3], + "c": "e", + "d": "d", + "name": "task1" + } + } + + +def test_var(): + data = """ +components: + component1: + a: ${vars.value} +tasks: + - task1: + use: + - component1 + vars: + value: 1 +""" + tasks_data = yaml.safe_load(data) + assert taskgraph.load_tasks(tasks_data) == { + "task1": { + "a": "1", + "vars": {"value": 1}, + "name": "task1" + } + } + + +def test_map(): + data = """ +components: {} +tasks: + - $map: + for: + - vars: + a: 1 + b: [1] + - vars: + a: 2 + b: [2] + do: + - task1-${vars.a}: + a: ${vars.a} + b: [3] + - task2-${vars.a}: + a: ${vars.a} + b: [4] +""" + tasks_data = yaml.safe_load(data) + assert taskgraph.load_tasks(tasks_data) == { + "task1-1": { + "a": "1", + "b": [1, 3], + "vars": {"a": 1}, + "name": "task1-1" + }, + "task1-2": { + "a": "2", + "b": [2, 3], + "vars": {"a": 2}, + "name": "task1-2" + }, + "task2-1": { + "a": "1", + "b": [1, 4], + "vars": {"a": 1}, + "name": "task2-1" + }, + "task2-2": { + "a": "2", + "b": [2, 4], + "vars": {"a": 2}, + "name": "task2-2" + }, + + } + + +def test_chunks(): + data = """ +components: {} +tasks: + - task1: + name: task1-${chunks.id} + chunks: 2 +""" + tasks_data = yaml.safe_load(data) + assert taskgraph.load_tasks(tasks_data) == { + "task1-1": { + "name": "task1-1", + "chunks": { + "id": 1, + "total": 2 + } + }, + "task1-2": { + "name": "task1-2", + "chunks": { + "id": 2, + "total": 2 + } + } + } diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py new file mode 100644 index 00000000000..9480178206d --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py @@ -0,0 +1,152 @@ +import json +import os + +import jsone +import mock +import pytest +import requests +import sys +import yaml +from jsonschema import validate + +from tools.ci.tc import decision + +here = os.path.dirname(__file__) +root = os.path.abspath(os.path.join(here, "..", "..", "..", "..")) + + +def data_path(filename): + return os.path.join(here, "..", "testdata", filename) + + +@pytest.mark.xfail(sys.version_info.major == 2, + reason="taskcluster library has an encoding bug " + "https://github.com/taskcluster/json-e/issues/338") +def test_verify_taskcluster_yml(): + """Verify that the json-e in the .taskcluster.yml is valid""" + with open(os.path.join(root, ".taskcluster.yml")) as f: + template = yaml.safe_load(f) + + events = [("pr_event.json", "github-pull-request", "Pull Request"), + ("master_push_event.json", "github-push", "Push to master")] + + for filename, tasks_for, title in events: + with open(data_path(filename)) as f: + event = json.load(f) + + context = {"tasks_for": tasks_for, + "event": event, + "as_slugid": lambda x: x} + + jsone.render(template, context) + + +def test_verify_payload(): + """Verify that the decision task produces tasks with a valid payload""" + from tools.ci.tc.decision import decide + + create_task_schema = requests.get( + "https://raw.githubusercontent.com/taskcluster/taskcluster/blob/master/services/queue/schemas/v1/create-task-request.yml") + create_task_schema = yaml.safe_load(create_task_schema.content) + + payload_schema = requests.get("https://raw.githubusercontent.com/taskcluster/docker-worker/master/schemas/v1/payload.json").json() + + jobs = ["lint", + "manifest_upload", + "resources_unittest", + "tools_unittest", + "wpt_integration", + "wptrunner_infrastructure", + "wptrunner_unittest"] + + for filename in ["pr_event.json", "master_push_event.json"]: + with open(data_path(filename)) as f: + event = json.load(f) + + with mock.patch("tools.ci.tc.decision.get_fetch_rev", return_value=(event["after"], None)): + with mock.patch("tools.ci.tc.decision.get_run_jobs", return_value=set(jobs)): + task_id_map = decide(event) + for name, (task_id, task_data) in task_id_map.items(): + try: + validate(instance=task_data, schema=create_task_schema) + validate(instance=task_data["payload"], schema=payload_schema) + except Exception as e: + print("Validation failed for task '%s':\n%s" % (name, json.dumps(task_data, indent=2))) + raise e + + +@pytest.mark.parametrize("event_path,is_pr,files_changed,expected", [ + ("master_push_event.json", False, None, + {'download-firefox-nightly', + 'wpt-firefox-nightly-testharness-1', + 'wpt-firefox-nightly-testharness-2', + 'wpt-firefox-nightly-testharness-3', + 'wpt-firefox-nightly-testharness-4', + 'wpt-firefox-nightly-testharness-5', + 'wpt-firefox-nightly-testharness-6', + 'wpt-firefox-nightly-testharness-7', + 'wpt-firefox-nightly-testharness-8', + 'wpt-firefox-nightly-testharness-9', + 'wpt-firefox-nightly-testharness-10', + 'wpt-firefox-nightly-testharness-11', + 'wpt-firefox-nightly-testharness-12', + 'wpt-firefox-nightly-testharness-13', + 'wpt-firefox-nightly-testharness-14', + 'wpt-firefox-nightly-testharness-15', + 'wpt-firefox-nightly-testharness-16', + 'wpt-chrome-dev-testharness-1', + 'wpt-chrome-dev-testharness-2', + 'wpt-chrome-dev-testharness-3', + 'wpt-chrome-dev-testharness-4', + 'wpt-chrome-dev-testharness-5', + 'wpt-chrome-dev-testharness-6', + 'wpt-chrome-dev-testharness-7', + 'wpt-chrome-dev-testharness-8', + 'wpt-chrome-dev-testharness-9', + 'wpt-chrome-dev-testharness-10', + 'wpt-chrome-dev-testharness-11', + 'wpt-chrome-dev-testharness-12', + 'wpt-chrome-dev-testharness-13', + 'wpt-chrome-dev-testharness-14', + 'wpt-chrome-dev-testharness-15', + 'wpt-chrome-dev-testharness-16', + 'wpt-firefox-nightly-reftest-1', + 'wpt-firefox-nightly-reftest-2', + 'wpt-firefox-nightly-reftest-3', + 'wpt-firefox-nightly-reftest-4', + 'wpt-firefox-nightly-reftest-5', + 'wpt-chrome-dev-reftest-1', + 'wpt-chrome-dev-reftest-2', + 'wpt-chrome-dev-reftest-3', + 'wpt-chrome-dev-reftest-4', + 'wpt-chrome-dev-reftest-5', + 'wpt-firefox-nightly-wdspec-1', + 'wpt-chrome-dev-wdspec-1', + 'lint'}), + ("pr_event.json", True, {".taskcluster.yml",".travis.yml","tools/ci/start.sh"}, + {'lint', + 'tools/ unittests (Python 2)', + 'tools/ unittests (Python 3)', + 'tools/wpt/ tests', + 'resources/ tests', + 'infrastructure/ tests'}), + # More tests are affected in the actual PR but it shouldn't affect the scheduled tasks + ("pr_event_tests_affected.json", True, {"layout-instability/clip-negative-bottom-margin.html", + "layout-instability/composited-element-movement.html"}, + {'download-firefox-nightly', + 'wpt-firefox-nightly-stability', + 'wpt-firefox-nightly-results', + 'wpt-firefox-nightly-results-without-changes', + 'wpt-chrome-dev-stability', + 'wpt-chrome-dev-results', + 'wpt-chrome-dev-results-without-changes', + 'lint'}), +]) +def test_schedule_tasks(event_path, is_pr, files_changed, expected): + with mock.patch("tools.ci.tc.decision.get_fetch_rev", return_value=(is_pr, None)): + with mock.patch("tools.wpt.testfiles.repo_files_changed", + return_value=files_changed): + with open(data_path(event_path)) as event_file: + event = json.load(event_file) + scheduled = decision.decide(event) + assert set(scheduled.keys()) == expected diff --git a/tests/wpt/web-platform-tests/tools/ci/tests/test_run_tc.py b/tests/wpt/web-platform-tests/tools/ci/tests/test_run_tc.py deleted file mode 100644 index a72dcfe5cfd..00000000000 --- a/tests/wpt/web-platform-tests/tools/ci/tests/test_run_tc.py +++ /dev/null @@ -1,33 +0,0 @@ -import pytest - -from six import iteritems - -from tools.ci import run_tc - - -@pytest.mark.parametrize("msg,expected", [ - ("Some initial line\n\ntc-jobs:foo,bar", {"foo", "bar"}), - ("Some initial line\n\ntc-jobs:foo, bar", {"foo", "bar"}), - ("tc-jobs:foo, bar \nbaz", {"foo", "bar"}), - ("tc-jobs:all", {"all"}), - ("", set()), - ("tc-jobs:foo\ntc-jobs:bar", {"foo"})]) -@pytest.mark.parametrize("event", [ - {"commits": [{"message": ""}]}, - {"pull_request": {"body": ""}} -]) -def test_extra_jobs_pr(msg, expected, event): - def sub(obj): - """Copy obj, except if it's a string with the value - replace it with the value of the msg argument""" - if isinstance(obj, dict): - return {key: sub(value) for (key, value) in iteritems(obj)} - elif isinstance(obj, list): - return [sub(value) for value in obj] - elif obj == "": - return msg - return obj - - event = sub(event) - - assert run_tc.get_extra_jobs(event) == expected diff --git a/tests/wpt/web-platform-tests/tools/docker/frontend.py b/tests/wpt/web-platform-tests/tools/docker/frontend.py index c4a20734582..976156cf65a 100644 --- a/tests/wpt/web-platform-tests/tools/docker/frontend.py +++ b/tests/wpt/web-platform-tests/tools/docker/frontend.py @@ -29,6 +29,8 @@ def run(*args, **kwargs): build() args = ["docker", "run"] + args.extend(["--security-opt", "seccomp:%s" % + os.path.join(wpt_root, "tools", "docker", "seccomp.json")]) if kwargs["privileged"]: args.append("--privileged") if kwargs["checkout"]: diff --git a/tests/wpt/web-platform-tests/tools/docker/seccomp.json b/tests/wpt/web-platform-tests/tools/docker/seccomp.json new file mode 100644 index 00000000000..8e8274ce328 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/docker/seccomp.json @@ -0,0 +1,798 @@ +{ + "defaultAction": "SCMP_ACT_ERRNO", + "archMap": [ + { + "architecture": "SCMP_ARCH_X86_64", + "subArchitectures": [ + "SCMP_ARCH_X86", + "SCMP_ARCH_X32" + ] + }, + { + "architecture": "SCMP_ARCH_AARCH64", + "subArchitectures": [ + "SCMP_ARCH_ARM" + ] + }, + { + "architecture": "SCMP_ARCH_MIPS64", + "subArchitectures": [ + "SCMP_ARCH_MIPS", + "SCMP_ARCH_MIPS64N32" + ] + }, + { + "architecture": "SCMP_ARCH_MIPS64N32", + "subArchitectures": [ + "SCMP_ARCH_MIPS", + "SCMP_ARCH_MIPS64" + ] + }, + { + "architecture": "SCMP_ARCH_MIPSEL64", + "subArchitectures": [ + "SCMP_ARCH_MIPSEL", + "SCMP_ARCH_MIPSEL64N32" + ] + }, + { + "architecture": "SCMP_ARCH_MIPSEL64N32", + "subArchitectures": [ + "SCMP_ARCH_MIPSEL", + "SCMP_ARCH_MIPSEL64" + ] + }, + { + "architecture": "SCMP_ARCH_S390X", + "subArchitectures": [ + "SCMP_ARCH_S390" + ] + } + ], + "syscalls": [ + { + "names": [ + "accept", + "accept4", + "access", + "adjtimex", + "alarm", + "bind", + "brk", + "capget", + "capset", + "chdir", + "chmod", + "chown", + "chown32", + "clock_getres", + "clock_gettime", + "clock_nanosleep", + "clone", + "close", + "connect", + "copy_file_range", + "creat", + "dup", + "dup2", + "dup3", + "epoll_create", + "epoll_create1", + "epoll_ctl", + "epoll_ctl_old", + "epoll_pwait", + "epoll_wait", + "epoll_wait_old", + "eventfd", + "eventfd2", + "execve", + "execveat", + "exit", + "exit_group", + "faccessat", + "fadvise64", + "fadvise64_64", + "fallocate", + "fanotify_mark", + "fchdir", + "fchmod", + "fchmodat", + "fchown", + "fchown32", + "fchownat", + "fcntl", + "fcntl64", + "fdatasync", + "fgetxattr", + "flistxattr", + "flock", + "fork", + "fremovexattr", + "fsetxattr", + "fstat", + "fstat64", + "fstatat64", + "fstatfs", + "fstatfs64", + "fsync", + "ftruncate", + "ftruncate64", + "futex", + "futimesat", + "getcpu", + "getcwd", + "getdents", + "getdents64", + "getegid", + "getegid32", + "geteuid", + "geteuid32", + "getgid", + "getgid32", + "getgroups", + "getgroups32", + "getitimer", + "getpeername", + "getpgid", + "getpgrp", + "getpid", + "getppid", + "getpriority", + "getrandom", + "getresgid", + "getresgid32", + "getresuid", + "getresuid32", + "getrlimit", + "get_robust_list", + "getrusage", + "getsid", + "getsockname", + "getsockopt", + "get_thread_area", + "gettid", + "gettimeofday", + "getuid", + "getuid32", + "getxattr", + "inotify_add_watch", + "inotify_init", + "inotify_init1", + "inotify_rm_watch", + "io_cancel", + "ioctl", + "io_destroy", + "io_getevents", + "io_pgetevents", + "ioprio_get", + "ioprio_set", + "io_setup", + "io_submit", + "io_uring_enter", + "io_uring_register", + "io_uring_setup", + "ipc", + "kill", + "lchown", + "lchown32", + "lgetxattr", + "link", + "linkat", + "listen", + "listxattr", + "llistxattr", + "_llseek", + "lremovexattr", + "lseek", + "lsetxattr", + "lstat", + "lstat64", + "madvise", + "memfd_create", + "mincore", + "mkdir", + "mkdirat", + "mknod", + "mknodat", + "mlock", + "mlock2", + "mlockall", + "mmap", + "mmap2", + "mprotect", + "mq_getsetattr", + "mq_notify", + "mq_open", + "mq_timedreceive", + "mq_timedsend", + "mq_unlink", + "mremap", + "msgctl", + "msgget", + "msgrcv", + "msgsnd", + "msync", + "munlock", + "munlockall", + "munmap", + "nanosleep", + "newfstatat", + "_newselect", + "open", + "openat", + "pause", + "pipe", + "pipe2", + "poll", + "ppoll", + "prctl", + "pread64", + "preadv", + "preadv2", + "prlimit64", + "pselect6", + "pwrite64", + "pwritev", + "pwritev2", + "read", + "readahead", + "readlink", + "readlinkat", + "readv", + "recv", + "recvfrom", + "recvmmsg", + "recvmsg", + "remap_file_pages", + "removexattr", + "rename", + "renameat", + "renameat2", + "restart_syscall", + "rmdir", + "rt_sigaction", + "rt_sigpending", + "rt_sigprocmask", + "rt_sigqueueinfo", + "rt_sigreturn", + "rt_sigsuspend", + "rt_sigtimedwait", + "rt_tgsigqueueinfo", + "sched_getaffinity", + "sched_getattr", + "sched_getparam", + "sched_get_priority_max", + "sched_get_priority_min", + "sched_getscheduler", + "sched_rr_get_interval", + "sched_setaffinity", + "sched_setattr", + "sched_setparam", + "sched_setscheduler", + "sched_yield", + "seccomp", + "select", + "semctl", + "semget", + "semop", + "semtimedop", + "send", + "sendfile", + "sendfile64", + "sendmmsg", + "sendmsg", + "sendto", + "setfsgid", + "setfsgid32", + "setfsuid", + "setfsuid32", + "setgid", + "setgid32", + "setgroups", + "setgroups32", + "setitimer", + "setpgid", + "setpriority", + "setregid", + "setregid32", + "setresgid", + "setresgid32", + "setresuid", + "setresuid32", + "setreuid", + "setreuid32", + "setrlimit", + "set_robust_list", + "setsid", + "setsockopt", + "set_thread_area", + "set_tid_address", + "setuid", + "setuid32", + "setxattr", + "shmat", + "shmctl", + "shmdt", + "shmget", + "shutdown", + "sigaltstack", + "signalfd", + "signalfd4", + "sigprocmask", + "sigreturn", + "socket", + "socketcall", + "socketpair", + "splice", + "stat", + "stat64", + "statfs", + "statfs64", + "statx", + "symlink", + "symlinkat", + "sync", + "sync_file_range", + "syncfs", + "sysinfo", + "tee", + "tgkill", + "time", + "timer_create", + "timer_delete", + "timerfd_create", + "timerfd_gettime", + "timerfd_settime", + "timer_getoverrun", + "timer_gettime", + "timer_settime", + "times", + "tkill", + "truncate", + "truncate64", + "ugetrlimit", + "umask", + "uname", + "unlink", + "unlinkat", + "unshare", + "utime", + "utimensat", + "utimes", + "vfork", + "vmsplice", + "wait4", + "waitid", + "waitpid", + "write", + "writev" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": null, + "excludes": null + }, + { + "names": [ + "ptrace" + ], + "action": "SCMP_ACT_ALLOW", + "args": null, + "comment": "", + "includes": { + "minKernel": "4.8" + }, + "excludes": null + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 0, + "valueTwo": 0, + "op": "SCMP_CMP_EQ" + } + ], + "comment": "", + "includes": null, + "excludes": null + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 8, + "valueTwo": 0, + "op": "SCMP_CMP_EQ" + } + ], + "comment": "", + "includes": null, + "excludes": null + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 131072, + "valueTwo": 0, + "op": "SCMP_CMP_EQ" + } + ], + "comment": "", + "includes": null, + "excludes": null + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 131080, + "valueTwo": 0, + "op": "SCMP_CMP_EQ" + } + ], + "comment": "", + "includes": null, + "excludes": null + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 4294967295, + "valueTwo": 0, + "op": "SCMP_CMP_EQ" + } + ], + "comment": "", + "includes": null, + "excludes": null + }, + { + "names": [ + "sync_file_range2" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "arches": [ + "ppc64le" + ] + }, + "excludes": null + }, + { + "names": [ + "arm_fadvise64_64", + "arm_sync_file_range", + "sync_file_range2", + "breakpoint", + "cacheflush", + "set_tls" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "arches": [ + "arm", + "arm64" + ] + }, + "excludes": null + }, + { + "names": [ + "arch_prctl" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "arches": [ + "amd64", + "x32" + ] + }, + "excludes": null + }, + { + "names": [ + "modify_ldt" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "arches": [ + "amd64", + "x32", + "x86" + ] + }, + "excludes": null + }, + { + "names": [ + "s390_pci_mmio_read", + "s390_pci_mmio_write", + "s390_runtime_instr" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "arches": [ + "s390", + "s390x" + ] + }, + "excludes": null + }, + { + "names": [ + "open_by_handle_at" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_DAC_READ_SEARCH" + ] + }, + "excludes": null + }, + { + "names": [ + "bpf", + "fanotify_init", + "lookup_dcookie", + "mount", + "name_to_handle_at", + "perf_event_open", + "quotactl", + "setdomainname", + "sethostname", + "setns", + "syslog", + "umount", + "umount2" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_ADMIN" + ] + }, + "excludes": null + }, + { + "names": [ + "clone" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 2114060288, + "valueTwo": 0, + "op": "SCMP_CMP_MASKED_EQ" + } + ], + "comment": "", + "includes": null, + "excludes": { + "caps": [ + "CAP_SYS_ADMIN" + ], + "arches": [ + "s390", + "s390x" + ] + } + }, + { + "names": [ + "clone" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 1, + "value": 2114060288, + "valueTwo": 0, + "op": "SCMP_CMP_MASKED_EQ" + } + ], + "comment": "s390 parameter ordering for clone is different", + "includes": { + "arches": [ + "s390", + "s390x" + ] + }, + "excludes": { + "caps": [ + "CAP_SYS_ADMIN" + ] + } + }, + { + "names": [ + "reboot" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_BOOT" + ] + }, + "excludes": null + }, + { + "names": [ + "chroot" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_CHROOT" + ] + }, + "excludes": null + }, + { + "names": [ + "delete_module", + "init_module", + "finit_module", + "query_module" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_MODULE" + ] + }, + "excludes": null + }, + { + "names": [ + "acct" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_PACCT" + ] + }, + "excludes": null + }, + { + "names": [ + "kcmp", + "process_vm_readv", + "process_vm_writev", + "ptrace" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_PTRACE" + ] + }, + "excludes": null + }, + { + "names": [ + "iopl", + "ioperm" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_RAWIO" + ] + }, + "excludes": null + }, + { + "names": [ + "settimeofday", + "stime", + "clock_settime" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_TIME" + ] + }, + "excludes": null + }, + { + "names": [ + "vhangup" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_TTY_CONFIG" + ] + }, + "excludes": null + }, + { + "names": [ + "get_mempolicy", + "mbind", + "set_mempolicy" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYS_NICE" + ] + }, + "excludes": null + }, + { + "names": [ + "syslog" + ], + "action": "SCMP_ACT_ALLOW", + "args": [], + "comment": "", + "includes": { + "caps": [ + "CAP_SYSLOG" + ] + }, + "excludes": null + } + ] +} diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py index 7689c359928..c7c0197213c 100644 --- a/tests/wpt/web-platform-tests/tools/lint/lint.py +++ b/tests/wpt/web-platform-tests/tools/lint/lint.py @@ -844,6 +844,7 @@ def create_parser(): help="Output markdown") parser.add_argument("--repo-root", help="The WPT directory. Use this" "option if the lint script exists outside the repository") + parser.add_argument("--ignore-glob", help="Additional file glob to ignore.") parser.add_argument("--all", action="store_true", help="If no paths are passed, try to lint the whole " "working directory, not just files that changed") return parser @@ -867,17 +868,22 @@ def main(**kwargs): paths = lint_paths(kwargs, repo_root) - return lint(repo_root, paths, output_format) + ignore_glob = kwargs.get(str("ignore_glob")) or str() + + return lint(repo_root, paths, output_format, str(ignore_glob)) -def lint(repo_root, paths, output_format): - # type: (str, List[str], str) -> int +def lint(repo_root, paths, output_format, ignore_glob=str()): + # type: (str, List[str], str, str) -> int error_count = defaultdict(int) # type: Dict[Text, int] last = None with open(os.path.join(repo_root, "lint.whitelist")) as f: whitelist, ignored_files = parse_whitelist(f) + if ignore_glob: + ignored_files.add(ignore_glob) + output_errors = {"json": output_errors_json, "markdown": output_errors_markdown, "normal": output_errors_text}[output_format] diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py b/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py index dbd4708cdc9..af2b7d3d4aa 100644 --- a/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py +++ b/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py @@ -398,6 +398,29 @@ def test_check_css_globally_unique_ignored_dir(caplog): assert caplog.text == "" +def test_ignore_glob(caplog): + # Lint two files in the ref/ directory, and pass in ignore_glob to omit one + # of them. + # When we omit absolute.html, no lint errors appear since the other file is + # clean. + with _mock_lint("check_path") as mocked_check_path: + with _mock_lint("check_file_contents") as mocked_check_file_contents: + rv = lint(_dummy_repo, ["ref/absolute.html", "ref/existent_relative.html"], "normal", "*solu*") + assert rv == 0 + # Also confirm that only one file is checked + assert mocked_check_path.call_count == 1 + assert mocked_check_file_contents.call_count == 1 + assert caplog.text == "" + # However, linting the same two files without ignore_glob yields lint errors. + with _mock_lint("check_path") as mocked_check_path: + with _mock_lint("check_file_contents") as mocked_check_file_contents: + rv = lint(_dummy_repo, ["ref/absolute.html", "ref/existent_relative.html"], "normal") + assert rv == 1 + assert mocked_check_path.call_count == 2 + assert mocked_check_file_contents.call_count == 2 + assert "ABSOLUTE-URL-REF" in caplog.text + + def test_all_filesystem_paths(): with mock.patch( 'tools.lint.lint.walk', @@ -443,7 +466,8 @@ def test_main_with_args(): m.assert_called_once_with(repo_root, [os.path.relpath(os.path.join(os.getcwd(), x), repo_root) for x in ['a', 'b', 'c']], - "normal") + "normal", + str()) finally: sys.argv = orig_argv @@ -455,7 +479,7 @@ def test_main_no_args(): with _mock_lint('lint', return_value=True) as m: with _mock_lint('changed_files', return_value=['foo', 'bar']): lint_mod.main(**vars(create_parser().parse_args())) - m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal") + m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", str()) finally: sys.argv = orig_argv @@ -467,6 +491,6 @@ def test_main_all(): with _mock_lint('lint', return_value=True) as m: with _mock_lint('all_filesystem_paths', return_value=['foo', 'bar']): lint_mod.main(**vars(create_parser().parse_args())) - m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal") + m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", str()) finally: sys.argv = orig_argv diff --git a/tests/wpt/web-platform-tests/tools/taskcluster/commands.json b/tests/wpt/web-platform-tests/tools/taskcluster/commands.json deleted file mode 100644 index dcbd8961fc2..00000000000 --- a/tests/wpt/web-platform-tests/tools/taskcluster/commands.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "tc-verify": {"path": "verify.py", "script": "run", "parser": "create_parser", "help": "Verify .taskcluster.yml file is parsable", - "virtualenv": true, "install": ["json-e", "pyyaml"]} -} diff --git a/tests/wpt/web-platform-tests/tools/taskcluster/verify.py b/tests/wpt/web-platform-tests/tools/taskcluster/verify.py deleted file mode 100644 index b37e45ec74c..00000000000 --- a/tests/wpt/web-platform-tests/tools/taskcluster/verify.py +++ /dev/null @@ -1,37 +0,0 @@ -import argparse -import json -import os - -import jsone -import yaml - -here = os.path.dirname(__file__) -root = os.path.abspath(os.path.join(here, "..", "..")) - - -def create_parser(): - return argparse.ArgumentParser() - - -def run(venv, **kwargs): - with open(os.path.join(root, ".taskcluster.yml")) as f: - template = yaml.safe_load(f) - - events = [("pr_event.json", "github-pull-request", "Pull Request"), - ("master_push_event.json", "github-push", "Push to master")] - - for filename, tasks_for, title in events: - with open(os.path.join(here, "testdata", filename)) as f: - event = json.load(f) - - context = {"tasks_for": tasks_for, - "event": event, - "as_slugid": lambda x: x} - - data = jsone.render(template, context) - heading = "Got %s tasks for %s" % (len(data["tasks"]), title) - print(heading) - print("=" * len(heading)) - for item in data["tasks"]: - print(json.dumps(item, indent=2)) - print("") diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini index 7a5c1eb648a..e8673db0a69 100644 --- a/tests/wpt/web-platform-tests/tools/tox.ini +++ b/tests/wpt/web-platform-tests/tools/tox.ini @@ -8,8 +8,11 @@ deps = pytest-cov mock hypothesis - # `requests` is required by `pr_preview.py` requests + taskcluster + pyyaml + json-e + jsonschema commands = pytest {posargs} diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py index e7d57d8638c..a94d5509cc8 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py @@ -47,6 +47,11 @@ class Browser(object): def __init__(self, logger): self.logger = logger + @abstractmethod + def download(self, dest=None, channel=None): + """Download a package or installer for the browser""" + return NotImplemented + @abstractmethod def install(self, dest=None): """Install the browser.""" @@ -116,11 +121,19 @@ class Firefox(Browser): return "%s%s" % (self.platform, bits) - def install(self, dest=None, channel="nightly"): - """Install Firefox.""" + def _get_dest(self, dest, channel): + if dest is None: + # os.getcwd() doesn't include the venv path + dest = os.path.join(os.getcwd(), "_venv") - import mozinstall + dest = os.path.join(dest, "browsers", channel) + if not os.path.exists(dest): + os.makedirs(dest) + + return dest + + def download(self, dest=None, channel="nightly"): product = { "nightly": "firefox-nightly-latest-ssl", "beta": "firefox-beta-latest-ssl", @@ -136,21 +149,15 @@ class Firefox(Browser): } os_key = (self.platform, uname[4]) + if dest is None: + dest = self._get_dest(None, channel) + if channel not in product: raise ValueError("Unrecognised release channel: %s" % channel) if os_key not in os_builds: raise ValueError("Unsupported platform: %s %s" % os_key) - if dest is None: - # os.getcwd() doesn't include the venv path - dest = os.path.join(os.getcwd(), "_venv") - - dest = os.path.join(dest, "browsers", channel) - - if not os.path.exists(dest): - os.makedirs(dest) - url = "https://download.mozilla.org/?product=%s&os=%s&lang=en-US" % (product[channel], os_builds[os_key]) self.logger.info("Downloading Firefox from %s" % url) @@ -175,6 +182,18 @@ class Firefox(Browser): with open(installer_path, "wb") as f: f.write(resp.content) + return installer_path + + def install(self, dest=None, channel="nightly"): + """Install Firefox.""" + import mozinstall + + dest = self._get_dest(dest, channel) + + filename = os.path.basename(dest) + + installer_path = self.download(dest, channel) + try: mozinstall.install(installer_path, dest) except mozinstall.mozinstall.InstallError: @@ -422,7 +441,7 @@ class FirefoxAndroid(Browser): product = "firefox_android" requirements = "requirements_firefox.txt" - def install(self, dest=None, channel=None): + def download(self, dest=None, channel=None): if dest is None: dest = os.pwd @@ -452,6 +471,9 @@ class FirefoxAndroid(Browser): return apk_path + def install(self, dest=None, channel=None): + return self.download(dest, channel) + def install_prefs(self, binary, dest=None, channel=None): fx_browser = Firefox(self.logger) return fx_browser.install_prefs(binary, dest, channel) @@ -478,6 +500,9 @@ class Chrome(Browser): product = "chrome" requirements = "requirements_chrome.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -633,6 +658,9 @@ class ChromeAndroidBase(Browser): super(ChromeAndroidBase, self).__init__(logger) self.device_serial = None + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -724,6 +752,9 @@ class ChromeiOS(Browser): product = "chrome_ios" requirements = "requirements_chrome_ios.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -757,6 +788,9 @@ class Opera(Browser): self.logger.warning("Unable to find the browser binary.") return None + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -826,6 +860,9 @@ class EdgeChromium(Browser): edgedriver_name = "msedgedriver" requirements = "requirements_edge_chromium.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -922,6 +959,9 @@ class Edge(Browser): product = "edge" requirements = "requirements_edge.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -953,6 +993,9 @@ class InternetExplorer(Browser): product = "ie" requirements = "requirements_ie.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -978,6 +1021,9 @@ class Safari(Browser): product = "safari" requirements = "requirements_safari.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -1037,17 +1083,33 @@ class Servo(Browser): return (platform, extension, decompress) - def install(self, dest=None, channel="nightly"): - """Install latest Browser Engine.""" + def _get(self, channel="nightly"): if channel != "nightly": raise ValueError("Only nightly versions of Servo are available") + + platform, extension, _ = self.platform_components() + url = "https://download.servo.org/nightly/%s/servo-latest%s" % (platform, extension) + return get(url) + + def download(self, dest=None, channel="nightly"): if dest is None: dest = os.pwd - platform, extension, decompress = self.platform_components() - url = "https://download.servo.org/nightly/%s/servo-latest%s" % (platform, extension) + resp = self._get(dest, channel) + _, extension, _ = self.platform_components() - decompress(get(url).raw, dest=dest) + with open(os.path.join(dest, "servo-latest%s" % (extension,)), "w") as f: + f.write(resp.content) + + def install(self, dest=None, channel="nightly"): + """Install latest Browser Engine.""" + if dest is None: + dest = os.pwd + + _, _, decompress = self.platform_components() + + resp = self._get(dest, channel) + decompress(resp.raw, dest=dest) path = find_executable("servo", os.path.join(dest, "servo")) st = os.stat(path) os.chmod(path, st.st_mode | stat.S_IEXEC) @@ -1083,6 +1145,9 @@ class Sauce(Browser): product = "sauce" requirements = "requirements_sauce.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -1105,6 +1170,9 @@ class WebKit(Browser): product = "webkit" requirements = "requirements_webkit.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError @@ -1168,6 +1236,9 @@ class Epiphany(Browser): product = "epiphany" requirements = "requirements_epiphany.txt" + def download(self, dest=None, channel=None): + raise NotImplementedError + def install(self, dest=None, channel=None): raise NotImplementedError diff --git a/tests/wpt/web-platform-tests/tools/wpt/install.py b/tests/wpt/web-platform-tests/tools/wpt/install.py index 8215dfe0916..24915f0c98d 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/install.py +++ b/tests/wpt/web-platform-tests/tools/wpt/install.py @@ -42,6 +42,8 @@ def get_parser(): 'the latest available development release. For WebDriver installs, ' 'we attempt to select an appropriate, compatible, version for the ' 'latest browser release on the selected channel.') + parser.add_argument('--download-only', action="store_true", + help="Download the selected component but don't install it") parser.add_argument('-d', '--destination', help='filesystem directory to place the component') return parser @@ -73,21 +75,22 @@ def run(venv, **kwargs): raise argparse.ArgumentError(None, "No --destination argument, and no default for the environment") - install(browser, kwargs["component"], destination, channel) + install(browser, kwargs["component"], destination, channel, + download_only=kwargs["download_only"]) -def install(name, component, destination, channel="nightly", logger=None): +def install(name, component, destination, channel="nightly", logger=None, download_only=False): if logger is None: import logging logger = logging.getLogger("install") - if component == 'webdriver': - method = 'install_webdriver' - else: - method = 'install' + prefix = "download" if download_only else "install" + suffix = "_webdriver" if component == 'webdriver' else "" + + method = prefix + suffix subclass = getattr(browser, name.title()) sys.stdout.write('Now installing %s %s...\n' % (name, component)) path = getattr(subclass(logger), method)(dest=destination, channel=channel) if path: - sys.stdout.write('Binary installed as %s\n' % (path,)) + sys.stdout.write('Binary %s as %s\n' % ("downloaded" if download_only else "installed", path,)) diff --git a/tests/wpt/web-platform-tests/tools/wpt/paths b/tests/wpt/web-platform-tests/tools/wpt/paths index 093a7156892..35867c4ccbf 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/paths +++ b/tests/wpt/web-platform-tests/tools/wpt/paths @@ -3,5 +3,4 @@ tools/docker/ tools/lint/ tools/manifest/ tools/serve/ -tools/taskcluster/ tools/wpt/ diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/docs/expectation.rst b/tests/wpt/web-platform-tests/tools/wptrunner/docs/expectation.rst index 2f7467c0912..77938abe03d 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/docs/expectation.rst +++ b/tests/wpt/web-platform-tests/tools/wptrunner/docs/expectation.rst @@ -287,7 +287,7 @@ A more complex manifest with conditional properties might be:: [canvas_test.html] expected: - if os == "osx": FAIL + if os == "mac": FAIL if os == "windows" and version == "XP": FAIL PASS diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt index f49102b8a89..4cbb7a5ec02 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt +++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt @@ -8,4 +8,4 @@ mozprocess==1.0.0 mozprofile==2.4.0 mozrunner==7.7.0 mozversion==2.2.0 -psutil==5.6.5 +psutil==5.6.7 diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py index f20f735528c..713d8500113 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py @@ -7,6 +7,7 @@ import os import threading import traceback import socket +import sys from six.moves.urllib.parse import urljoin, urlsplit, urlunsplit from abc import ABCMeta, abstractmethod @@ -15,10 +16,6 @@ from .protocol import Protocol, BaseProtocolPart here = os.path.split(__file__)[0] -# Extra timeout to use after internal test timeout at which the harness -# should force a timeout -extra_timeout = 5 # seconds - def executor_kwargs(test_type, server_config, cache_manager, run_info_data, **kwargs): @@ -130,6 +127,61 @@ class ExecutorException(Exception): self.message = message +class TimedRunner(object): + def __init__(self, logger, func, protocol, url, timeout, extra_timeout): + self.func = func + self.result = None + self.protocol = protocol + self.url = url + self.timeout = timeout + self.extra_timeout = extra_timeout + self.result_flag = threading.Event() + + def run(self): + if self.set_timeout() is Stop: + return Stop + + if self.before_run() is Stop: + return Stop + + executor = threading.Thread(target=self.run_func) + executor.start() + + # Add twice the timeout multiplier since the called function is expected to + # wait at least self.timeout + self.extra_timeout and this gives some leeway + finished = self.result_flag.wait(self.timeout + 2 * self.extra_timeout) + if self.result is None: + if finished: + # flag is True unless we timeout; this *shouldn't* happen, but + # it can if self.run_func fails to set self.result due to raising + self.result = False, ("INTERNAL-ERROR", "%s.run_func didn't set a result" % + self.__class__.__name__) + else: + message = "Executor hit external timeout (this may indicate a hang)\n" + # get a traceback for the current stack of the executor thread + message += "".join(traceback.format_stack(sys._current_frames()[executor.ident])) + self.result = False, ("EXTERNAL-TIMEOUT", message) + elif self.result[1] is None: + # We didn't get any data back from the test, so check if the + # browser is still responsive + if self.protocol.is_alive: + self.result = False, ("INTERNAL-ERROR", None) + else: + self.logger.info("Browser not responding, setting status to CRASH") + self.result = False, ("CRASH", None) + + return self.result + + def set_timeout(self): + raise NotImplementedError + + def before_run(self): + pass + + def run_func(self): + raise NotImplementedError + + class TestExecutor(object): """Abstract Base class for object that actually executes the tests in a specific browser. Typically there will be a different TestExecutor @@ -148,6 +200,10 @@ class TestExecutor(object): convert_result = None supports_testdriver = False supports_jsshell = False + # Extra timeout to use after internal test timeout at which the harness + # should force a timeout + extra_timeout = 5 # seconds + def __init__(self, browser, server_config, timeout_multiplier=1, debug_info=None, **kwargs): @@ -441,7 +497,7 @@ class WdspecExecutor(TestExecutor): pass def do_test(self, test): - timeout = test.timeout * self.timeout_multiplier + extra_timeout + timeout = test.timeout * self.timeout_multiplier + self.extra_timeout success, data = WdspecRun(self.do_wdspec, self.protocol.session_config, diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py index 7a936592f88..b165e8cd93d 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -16,9 +16,9 @@ from .base import (CallbackHandler, RefTestExecutor, RefTestImplementation, TestharnessExecutor, + TimedRunner, WdspecExecutor, WebDriverProtocol, - extra_timeout, strip_server) from .protocol import (ActionSequenceProtocolPart, AssertsProtocolPart, @@ -566,27 +566,14 @@ class MarionetteProtocol(Protocol): self.prefs.set(name, value) -class ExecuteAsyncScriptRun(object): - def __init__(self, logger, func, protocol, url, timeout): - self.logger = logger - self.result = (None, None) - self.protocol = protocol - self.func = func - self.url = url - self.timeout = timeout - self.result_flag = threading.Event() - - def run(self): - index = self.url.rfind("/storage/") - if index != -1: - # Clear storage - self.protocol.storage.clear_origin(self.url) +class ExecuteAsyncScriptRun(TimedRunner): + def set_timeout(self): timeout = self.timeout try: if timeout is not None: - self.protocol.base.set_timeout(timeout + extra_timeout) + self.protocol.base.set_timeout(timeout + self.extra_timeout) else: # We just want it to never time out, really, but marionette doesn't # make that possible. It also seems to time out immediately if the @@ -596,33 +583,13 @@ class ExecuteAsyncScriptRun(object): self.logger.error("Lost marionette connection before starting test") return Stop - if timeout is not None: - wait_timeout = timeout + 2 * extra_timeout - else: - wait_timeout = None + def before_run(self): + index = self.url.rfind("/storage/") + if index != -1: + # Clear storage + self.protocol.storage.clear_origin(self.url) - timer = threading.Timer(wait_timeout, self._timeout) - timer.start() - - self._run() - - self.result_flag.wait() - timer.cancel() - - if self.result == (None, None): - self.logger.debug("Timed out waiting for a result") - self.result = False, ("EXTERNAL-TIMEOUT", None) - elif self.result[1] is None: - # We didn't get any data back from the test, so check if the - # browser is still responsive - if self.protocol.is_alive: - self.result = False, ("INTERNAL-ERROR", None) - else: - self.logger.info("Browser not responding, setting status to CRASH") - self.result = False, ("CRASH", None) - return self.result - - def _run(self): + def run_func(self): try: self.result = True, self.func(self.protocol, self.url, self.timeout) except errors.ScriptTimeoutException: @@ -650,10 +617,6 @@ class ExecuteAsyncScriptRun(object): finally: self.result_flag.set() - def _timeout(self): - self.result = False, ("EXTERNAL-TIMEOUT", None) - self.result_flag.set() - class MarionetteTestharnessExecutor(TestharnessExecutor): supports_testdriver = True @@ -703,7 +666,8 @@ class MarionetteTestharnessExecutor(TestharnessExecutor): self.do_testharness, self.protocol, self.test_url(test), - timeout).run() + timeout, + self.extra_timeout).run() # The format of data depends on whether the test ran to completion or not # For asserts we only care about the fact that if it didn't complete, the # status is in the first field. @@ -782,7 +746,7 @@ class MarionetteRefTestExecutor(RefTestExecutor): with open(os.path.join(here, "reftest.js")) as f: self.script = f.read() - with open(os.path.join(here, "reftest-wait_marionette.js")) as f: + with open(os.path.join(here, "reftest-wait_webdriver.js")) as f: self.wait_script = f.read() def setup(self, runner): @@ -853,7 +817,8 @@ class MarionetteRefTestExecutor(RefTestExecutor): self._screenshot, self.protocol, test_url, - timeout).run() + timeout, + self.extra_timeout).run() def _screenshot(self, protocol, url, timeout): protocol.marionette.navigate(url) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py index 913a5e6d542..d6745018279 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py @@ -11,7 +11,7 @@ from .base import (CallbackHandler, RefTestExecutor, RefTestImplementation, TestharnessExecutor, - extra_timeout, + TimedRunner, strip_server) from .protocol import (BaseProtocolPart, TestharnessProtocolPart, @@ -237,39 +237,17 @@ class SeleniumProtocol(Protocol): self.testharness.load_runner(self.executor.last_environment["protocol"]) -class SeleniumRun(object): - def __init__(self, func, protocol, url, timeout): - self.func = func - self.result = None - self.protocol = protocol - self.url = url - self.timeout = timeout - self.result_flag = threading.Event() - - def run(self): +class SeleniumRun(TimedRunner): + def set_timeout(self): timeout = self.timeout try: - self.protocol.base.set_timeout(timeout + extra_timeout) + self.protocol.base.set_timeout(timeout + self.extra_timeout) except exceptions.ErrorInResponseException: self.logger.error("Lost WebDriver connection") return Stop - executor = threading.Thread(target=self._run) - executor.start() - - flag = self.result_flag.wait(timeout + 2 * extra_timeout) - if self.result is None: - if flag: - # flag is True unless we timeout; this *shouldn't* happen, but - # it can if self._run fails to set self.result due to raising - self.result = False, ("INTERNAL-ERROR", "self._run didn't set a result") - else: - self.result = False, ("EXTERNAL-TIMEOUT", None) - - return self.result - - def _run(self): + def run_func(self): try: self.result = True, self.func(self.protocol, self.url, self.timeout) except exceptions.TimeoutException: @@ -312,10 +290,12 @@ class SeleniumTestharnessExecutor(TestharnessExecutor): def do_test(self, test): url = self.test_url(test) - success, data = SeleniumRun(self.do_testharness, + success, data = SeleniumRun(self.logger, + self.do_testharness, self.protocol, url, - test.timeout * self.timeout_multiplier).run() + test.timeout * self.timeout_multiplier, + self.extra_timeout).run() if success: return self.convert_result(test, data) @@ -387,10 +367,12 @@ class SeleniumRefTestExecutor(RefTestExecutor): assert viewport_size is None assert dpi is None - return SeleniumRun(self._screenshot, + return SeleniumRun(self.logger, + self._screenshot, self.protocol, self.test_url(test), - test.timeout).run() + test.timeout, + self.extra_timeout).run() def _screenshot(self, protocol, url, timeout): webdriver = protocol.webdriver diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py index eaea0981632..365a1a08653 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py @@ -24,7 +24,6 @@ from ..webdriver_server import ServoDriverServer pytestrunner = None webdriver = None -extra_timeout = 5 # seconds def write_hosts_file(config): hosts_fd, hosts_path = tempfile.mkstemp() diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py index 67a433d9a58..bd377d0d595 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py @@ -1,8 +1,6 @@ import json import os import socket -import threading -import time import traceback from .base import (Protocol, @@ -10,6 +8,7 @@ from .base import (Protocol, RefTestExecutor, RefTestImplementation, TestharnessExecutor, + TimedRunner, strip_server) from ..testrunner import Stop from ..webdriver_server import wait_for_service @@ -19,8 +18,6 @@ ServoCommandExtensions = None here = os.path.join(os.path.split(__file__)[0]) -extra_timeout = 5 - def do_delayed_imports(): global webdriver @@ -131,29 +128,13 @@ class ServoWebDriverProtocol(Protocol): break -class ServoWebDriverRun(object): - def __init__(self, func, session, url, timeout, current_timeout=None): - self.func = func - self.result = None - self.session = session - self.url = url - self.timeout = timeout - self.result_flag = threading.Event() +class ServoWebDriverRun(TimedRunner): + def set_timeout(self): + pass - def run(self): - executor = threading.Thread(target=self._run) - executor.start() - - flag = self.result_flag.wait(self.timeout + extra_timeout) - if self.result is None: - assert not flag - self.result = False, ("EXTERNAL-TIMEOUT", None) - - return self.result - - def _run(self): + def run_func(self): try: - self.result = True, self.func(self.session, self.url, self.timeout) + self.result = True, self.func(self.protocol.session, self.url, self.timeout) except webdriver.TimeoutException: self.result = False, ("EXTERNAL-TIMEOUT", None) except (socket.timeout, IOError): @@ -168,14 +149,6 @@ class ServoWebDriverRun(object): self.result_flag.set() -def timeout_func(timeout): - if timeout: - t0 = time.time() - return lambda: time.time() - t0 > timeout + extra_timeout - else: - return lambda: False - - class ServoWebDriverTestharnessExecutor(TestharnessExecutor): supports_testdriver = True @@ -198,7 +171,7 @@ class ServoWebDriverTestharnessExecutor(TestharnessExecutor): def do_test(self, test): url = self.test_url(test) - timeout = test.timeout * self.timeout_multiplier + extra_timeout + timeout = test.timeout * self.timeout_multiplier + self.extra_timeout if timeout != self.timeout: try: @@ -208,10 +181,12 @@ class ServoWebDriverTestharnessExecutor(TestharnessExecutor): self.logger.error("Lost webdriver connection") return Stop - success, data = ServoWebDriverRun(self.do_testharness, - self.protocol.session, + success, data = ServoWebDriverRun(self.logger, + self.do_testharness, + self.protocol, url, - timeout).run() + timeout, + self.extra_timeout).run() if success: return self.convert_result(test, data) @@ -286,7 +261,7 @@ class ServoWebDriverRefTestExecutor(RefTestExecutor): assert viewport_size is None assert dpi is None - timeout = (test.timeout * self.timeout_multiplier + extra_timeout + timeout = (test.timeout * self.timeout_multiplier + self.extra_timeout if self.debug_info is None else None) if self.timeout != timeout: @@ -297,10 +272,12 @@ class ServoWebDriverRefTestExecutor(RefTestExecutor): self.logger.error("Lost webdriver connection") return Stop - return ServoWebDriverRun(self._screenshot, + return ServoWebDriverRun(self.logger, + self._screenshot, self.protocol.session, self.test_url(test), - timeout).run() + timeout, + self.extra_timeout).run() def _screenshot(self, session, url, timeout): session.url = url diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py index 344debf8aa6..39346e805d7 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py @@ -1,7 +1,6 @@ import json import os import socket -import sys import threading import time import traceback @@ -12,7 +11,7 @@ from .base import (CallbackHandler, RefTestExecutor, RefTestImplementation, TestharnessExecutor, - extra_timeout, + TimedRunner, strip_server) from .protocol import (BaseProtocolPart, TestharnessProtocolPart, @@ -256,7 +255,6 @@ class WebDriverProtocol(Protocol): self.webdriver = client.Session(host, port, capabilities=capabilities) self.webdriver.start() - def teardown(self): self.logger.debug("Hanging up on WebDriver session") try: @@ -281,42 +279,15 @@ class WebDriverProtocol(Protocol): self.testharness.load_runner(self.executor.last_environment["protocol"]) -class WebDriverRun(object): - def __init__(self, func, protocol, url, timeout): - self.func = func - self.result = None - self.protocol = protocol - self.url = url - self.timeout = timeout - self.result_flag = threading.Event() - - def run(self): - timeout = self.timeout - +class WebDriverRun(TimedRunner): + def set_timeout(self): try: - self.protocol.base.set_timeout(timeout + extra_timeout) + self.protocol.base.set_timeout(self.timeout + self.extra_timeout) except client.UnknownErrorException: self.logger.error("Lost WebDriver connection") return Stop - executor = threading.Thread(target=self._run) - executor.start() - - flag = self.result_flag.wait(timeout + 2 * extra_timeout) - if self.result is None: - if flag: - # flag is True unless we timeout; this *shouldn't* happen, but - # it can if self._run fails to set self.result due to raising - self.result = False, ("INTERNAL-ERROR", "self._run didn't set a result") - else: - message = "Waiting on browser:\n" - # get a traceback for the current stack of the executor thread - message += "".join(traceback.format_stack(sys._current_frames()[executor.ident])) - self.result = False, ("EXTERNAL-TIMEOUT", message) - - return self.result - - def _run(self): + def run_func(self): try: self.result = True, self.func(self.protocol, self.url, self.timeout) except (client.TimeoutException, client.ScriptTimeoutException): @@ -366,10 +337,12 @@ class WebDriverTestharnessExecutor(TestharnessExecutor): def do_test(self, test): url = self.test_url(test) - success, data = WebDriverRun(self.do_testharness, - self.protocol, - url, - test.timeout * self.timeout_multiplier).run() + success, data = WebDriverRun(self.logger, + self.do_testharness, + self.protocol, + url, + test.timeout * self.timeout_multiplier, + self.extra_timeout).run() if success: return self.convert_result(test, data) @@ -485,10 +458,12 @@ class WebDriverRefTestExecutor(RefTestExecutor): assert viewport_size is None assert dpi is None - return WebDriverRun(self._screenshot, - self.protocol, - self.test_url(test), - test.timeout).run() + return WebDriverRun(self.logger, + self._screenshot, + self.protocol, + self.test_url(test), + test.timeout, + self.extra_timeout).run() def _screenshot(self, protocol, url, timeout): webdriver = protocol.webdriver diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js deleted file mode 100644 index 194e192c2f4..00000000000 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js +++ /dev/null @@ -1,19 +0,0 @@ -var callback = arguments[arguments.length - 1]; - -function test(x) { - if (!root.classList.contains("reftest-wait")) { - observer.disconnect(); - callback(); - } -} - -var root = document.documentElement; -var observer = new MutationObserver(test); - -observer.observe(root, {attributes: true}); - -if (document.readyState != "complete") { - addEventListener('load', test); -} else { - test(); -} diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js index a7486b6594d..f86edacdef2 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js @@ -1,21 +1,20 @@ var callback = arguments[arguments.length - 1]; +var observer = null; +var root = document.documentElement; -function root_wait() { - if (!root.classList.contains("reftest-wait")) { - observer.disconnect(); - - if (Document.prototype.hasOwnProperty("fonts")) { - document.fonts.ready.then(ready_for_screenshot); - } else { - // This might take the screenshot too early, depending on whether the - // load event is blocked on fonts being loaded. See: - // https://github.com/w3c/csswg-drafts/issues/1088 - ready_for_screenshot(); - } +function wait_load() { + if (Document.prototype.hasOwnProperty("fonts")) { + document.fonts.ready.then(wait_paints); + } else { + // This might take the screenshot too early, depending on whether the + // load event is blocked on fonts being loaded. See: + // https://github.com/w3c/csswg-drafts/issues/1088 + wait_paints(); } } -function ready_for_screenshot() { + +function wait_paints() { // As of 2017-04-05, the Chromium web browser exhibits a rendering bug // (https://bugs.chromium.org/p/chromium/issues/detail?id=708757) that // produces instability during screen capture. The following use of @@ -27,18 +26,29 @@ function ready_for_screenshot() { requestAnimationFrame(function() { requestAnimationFrame(function() { - callback(); + screenshot_if_ready(); }); }); } -var root = document.documentElement; -var observer = new MutationObserver(root_wait); +function screenshot_if_ready() { + if (root.classList.contains("reftest-wait") && + observer === null) { + observer = new MutationObserver(wait_paints); + observer.observe(root, {attributes: true}); + var event = new Event("TestRendered", {bubbles: true}); + root.dispatchEvent(event); + return; + } + if (observer !== null) { + observer.disconnect(); + } + callback(); +} -observer.observe(root, {attributes: true}); if (document.readyState != "complete") { - addEventListener('load', root_wait); + addEventListener('load', wait_load); } else { - root_wait(); + wait_load(); } diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py index 1b02fc622be..8dece20a8e9 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py @@ -334,6 +334,8 @@ class TestRunnerManager(threading.Thread): # This may not really be what we want self.daemon = True + self.timer = None + self.max_restarts = 5 self.browser = None @@ -559,7 +561,22 @@ class TestRunnerManager(threading.Thread): self.logger.info("Run %d/%d" % (self.run_count, self.rerun)) self.send_message("reset") self.run_count += 1 + # Factor of 3 on the extra timeout here is based on allowing the executor + # at least test.timeout + 2 * extra_timeout to complete, + # which in turn is based on having several layers of timeout inside the executor + wait_timeout = (self.state.test.timeout * self.executor_kwargs['timeout_multiplier'] + + 3 * self.executor_cls.extra_timeout) + self.timer = threading.Timer(wait_timeout, self._timeout) self.send_message("run_test", self.state.test) + self.timer.start() + + def _timeout(self): + self.logger.info("Got timeout in harness") + test = self.state.test + self.test_ended(test, + (test.result_cls("EXTERNAL-TIMEOUT", + "TestRunner hit external timeout " + "(this may indicate a hang)"), [])) def test_ended(self, test, results): """Handle the end of a test. @@ -569,6 +586,7 @@ class TestRunnerManager(threading.Thread): """ assert isinstance(self.state, RunnerManagerState.running) assert test == self.state.test + self.timer.cancel() # Write the result of each subtest file_result, test_results = results subtest_unexpected = False diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation-ref.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation-ref.html new file mode 100644 index 00000000000..0aaa0443649 --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation-ref.html @@ -0,0 +1,17 @@ + +Reference for reverse running animation + + +
+

This test reverses the animation shortly after the box starts moving. If + the box doesn't move back to its original position, the test has failed. +

+ diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html new file mode 100644 index 00000000000..584aa0029ea --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html @@ -0,0 +1,41 @@ + + + + +reverse running animation + + + + + +
+

This test reverses the animation shortly after the box starts moving. If + the box doesn't move back to its original position, the test has failed. +

+ + diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times-ref.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times-ref.html new file mode 100644 index 00000000000..fc843a132f2 --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times-ref.html @@ -0,0 +1,20 @@ + + + +Reference for sync start times + + + +

+ This test creates a pair of animations, starts the first animation and then + syncs the second animation to align with the first. The test passes if the + box associated with the first animation is completely occluded by the + second. +

+ diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times.html new file mode 100644 index 00000000000..06dcf030563 --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/sync-start-times.html @@ -0,0 +1,68 @@ + + + + +sync start times + + + + + +
+
+

+ This test creates a pair of animations, starts the first animation and then + syncs the second animation to align with the first. The test passes if the + box associated with the first animation is completely occluded by the + second. +

+ + diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast-ref.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast-ref.html new file mode 100644 index 00000000000..af69b26100a --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast-ref.html @@ -0,0 +1,20 @@ + +Reference for update playback rate zero + + +
+

+ This test creates a running animation and changes its playback rate + part way through. The animation finishes ahead of the screenshot. + If any blue pixels appear in the screenshot, the test fails. +

+ diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast.html new file mode 100644 index 00000000000..63a76ba84a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-fast.html @@ -0,0 +1,62 @@ + + + + +Update playback rate zero + + + + + +
+
+

+ This test creates a running animation and changes its playback rate + part way through. The animation finishes ahead of the screenshot. + If any blue pixels appear in the screenshot, the test fails. +

+ + diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow-ref.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow-ref.html new file mode 100644 index 00000000000..11b87deecca --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow-ref.html @@ -0,0 +1,18 @@ + +Reference for update playback rate zero + + +
+

+ This test creates a running animation and changes its playback rate + part way through. The animation slows down so that it does not finish + before the screenshot. If any blue pixels appear in the screenshot, + the test fails. +

+ diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow.html new file mode 100644 index 00000000000..db449f2ca59 --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-slow.html @@ -0,0 +1,62 @@ + + + + +Update playback rate zero + + + + + +
+
+

+ This test creates a running animation and changes its playback rate + part way through. The animation slows down so that it does not finish + before the screenshot. If any blue pixels appear in the screenshot, + the test fails. +

+ + diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero-ref.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero-ref.html new file mode 100644 index 00000000000..26293a3aebb --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero-ref.html @@ -0,0 +1,17 @@ + +Reference for update playback rate zero + + +
+

+ This test creates a running animation and changes its playback rate + part way through. The animation should stop behind an occluding rectangle. + If not fully occluded, the test fails. +

+ diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero.html new file mode 100644 index 00000000000..bed08d630ca --- /dev/null +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/update-playback-rate-zero.html @@ -0,0 +1,61 @@ + + + + +Update playback rate zero + + + + + +
+
+

+ This test creates a running animation and changes its playback rate + part way through. The animation should stop behind an occluding rectangle. + If not fully occluded, the test fails. +

+ + diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_options.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan_filter.https.html similarity index 78% rename from tests/wpt/web-platform-tests/web-nfc/NDEFReader_options.https.html rename to tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan_filter.https.html index 6901e5cdcb2..4c1e7de4400 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_options.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan_filter.https.html @@ -1,6 +1,6 @@ -Web NFC: NDEFReader option tests +Web NFC: NDEFReader.scan() filter tests @@ -10,7 +10,7 @@ 'use strict'; -const NDEFReaderOptionTests = +const multiScanOptionsTests = [ { desc: "Test that reading data succeed when NDEFScanOptions'" + @@ -78,7 +78,7 @@ const NDEFReaderOptionTests = } ]; -const ReadMultiMessagesTests = +const multiMessagesTests = [ { desc: "Test that filtering 'empty' record from different messages" + @@ -147,21 +147,53 @@ const ReadMultiMessagesTests = } ]; -for (let NDEFReaderOptionTest of NDEFReaderOptionTests) { - testNDEFScanOptions( - NDEFReaderOptionTest.message, - NDEFReaderOptionTest.scanOptions, - NDEFReaderOptionTest.unmatchedScanOptions, - NDEFReaderOptionTest.desc +for (let multiScanOptionsTest of multiScanOptionsTests) { + testMultiScanOptions( + multiScanOptionsTest.message, + multiScanOptionsTest.scanOptions, + multiScanOptionsTest.unmatchedScanOptions, + multiScanOptionsTest.desc ); } -for (let readMultiMessagesTest of ReadMultiMessagesTests) { - testReadingMultiMessages( - readMultiMessagesTest.message, - readMultiMessagesTest.scanOptions, - readMultiMessagesTest.unmatchedMessage, - readMultiMessagesTest.desc +for (let multiMessagesTest of multiMessagesTests) { + testMultiMessages( + multiMessagesTest.message, + multiMessagesTest.scanOptions, + multiMessagesTest.unmatchedMessage, + multiMessagesTest.desc ); } + +nfc_test(async (t, mockNFC) => { + const reader = new NDEFReader(); + const controller = new AbortController(); + const signal = controller.signal; + const textMsg = createMessage([createTextRecord(test_text_data)]); + const urlMsg = createMessage([createUrlRecord(test_url_data)]); + const mimeMsg = createMessage([createMimeRecord(test_buffer_data)]); + + const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]); + const promise = readerWatcher.wait_for("reading").then(event => { + controller.abort(); + assertWebNDEFMessagesEqual(event.message, new NDEFMessage(mimeMsg)); + }); + + const scanOptions1 = { recordType: "text", signal: signal }; + const scanOptions2 = {recordType: "url", signal: signal }; + const scanOptions3 = {recordType: "mime", signal: signal }; + + await reader.scan(scanOptions1); + await reader.scan(scanOptions2); + // There is maximum one filter for an NDEFReader object, + // last filter will replace all previous ones. + await reader.scan(scanOptions3); + + mockNFC.setReadingMessage(textMsg); + mockNFC.setReadingMessage(urlMsg); + mockNFC.setReadingMessage(mimeMsg); + await promise; +}, "Multiple scan() from the same NDEFReader object with new options should \ +replace existing filters."); + diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html index 15ef6e466aa..3d734105e9c 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html @@ -37,4 +37,24 @@ assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message)); }, 'NDEFReadingEvent constructor with valid parameters'); + test(() => { + const record_init = createTextRecord(test_text_data); + const event = new NDEFReadingEvent('type', + {serialNumber: '', message: createMessage([record_init])}); + assert_equals(event.type, 'type', 'type'); + assert_equals(event.serialNumber, '', 'serialNumber'); + assert_equals(1, event.message.records.length, 'only 1 record'); + + const record = new NDEFRecord(record_init); + assert_equals(record.recordType, 'text', 'recordType'); + assert_equals(record.mediaType, null, 'mediaType'); + assert_equals(record.encoding, 'utf-8', 'encoding'); + assert_equals(record.lang, 'en', 'lang'); + + assert_equals(event.message.records[0].recordType, 'text', 'recordType'); + assert_equals(event.message.records[0].mediaType, null, 'mediaType'); + assert_equals(event.message.records[0].encoding, 'utf-8', 'encoding'); + assert_equals(event.message.records[0].lang, null, 'lang is not set'); + }, 'NDEFReadingEvent constructor does not set NDEFRecord#lang for any text records it embeds'); + diff --git a/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js b/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js index eb3006114c7..0fe6fe80cb1 100644 --- a/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js +++ b/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js @@ -168,7 +168,7 @@ function assertWebNDEFMessagesEqual(message, expectedMessage) { } } -function testNDEFScanOptions(message, scanOptions, unmatchedScanOptions, desc) { +function testMultiScanOptions(message, scanOptions, unmatchedScanOptions, desc) { nfc_test(async (t, mockNFC) => { const reader1 = new NDEFReader(); const reader2 = new NDEFReader(); @@ -192,8 +192,7 @@ function testNDEFScanOptions(message, scanOptions, unmatchedScanOptions, desc) { }, desc); } -function testReadingMultiMessages( - message, scanOptions, unmatchedMessage, desc) { +function testMultiMessages(message, scanOptions, unmatchedMessage, desc) { nfc_test(async (t, mockNFC) => { const reader = new NDEFReader(); const controller = new AbortController(); diff --git a/tests/wpt/web-platform-tests/webdriver/tests/find_element_from_element/find.py b/tests/wpt/web-platform-tests/webdriver/tests/find_element_from_element/find.py index b107a8957e0..56e216bb646 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/find_element_from_element/find.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/find_element_from_element/find.py @@ -1,4 +1,3 @@ -# META: timeout=long import pytest from webdriver.transport import Response diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html index 73a0fe1e5a1..342e325dad2 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html @@ -216,9 +216,33 @@ await pc2.setRemoteDescription({type: "rollback"}); assert_equals(pc2.getTransceivers().length, 1); - assert_equals(pc2.getTransceivers()[0].mid, null) + assert_equals(pc2.getTransceivers()[0].mid, null); + assert_equals(pc2.getTransceivers()[0].receiver.transport, null); }, "rollback of a remote offer should keep a transceiver"); + promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + const stream = await getNoiseStream({video: true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + pc1.addTrack(stream.getTracks()[0], stream); + + const stream2 = await getNoiseStream({video: true}); + t.add_cleanup(() => stream2.getTracks().forEach(track => track.stop())); + pc2.addTrack(stream2.getTracks()[0], stream2); + + await pc2.setRemoteDescription(await pc1.createOffer()); + assert_equals(pc2.getTransceivers().length, 1); + + await pc2.setRemoteDescription({type: "rollback"}); + assert_equals(pc2.getTransceivers().length, 1); + assert_equals(pc2.getTransceivers()[0].mid, null); + assert_equals(pc2.getTransceivers()[0].receiver.transport, null); + }, "rollback of a remote offer should keep a transceiver created by addtrack"); + promise_test(async t => { const pc1 = new RTCPeerConnection(); t.add_cleanup(() => pc1.close()); @@ -257,14 +281,16 @@ const offer = await pc.createOffer(); await pc.setLocalDescription(offer); + assert_not_equals(pc.getTransceivers()[0].sender.transport, null); await pc.setRemoteDescription({type: "rollback"}); assert_equals(pc.getTransceivers().length, 1); assert_equals(pc.getTransceivers()[0].mid, null) + assert_equals(pc.getTransceivers()[0].sender.transport, null); await pc.setLocalDescription(offer); assert_equals(pc.getTransceivers().length, 1); await signalingstatechangeResolver.promise; assert_array_equals(states, ['have-local-offer', 'stable', 'have-local-offer']); - }, "rollback local offer explicitly"); + }, "explicit rollback of local offer should remove transceivers and transport"); promise_test(async t => { const pc1 = new RTCPeerConnection(); @@ -486,7 +512,6 @@ await pc1.setLocalDescription(offer1); await pc2.setRemoteDescription(pc1.pendingLocalDescription); - await pc2.setLocalDescription(await pc2.createAnswer()); await pc1.setRemoteDescription(pc2.localDescription); @@ -505,8 +530,11 @@ assert_equals(remoteStreams[0].getTracks().length, 0); assert_equals(remoteStreams[1].getTracks()[0].id, track.id); await pc2.setRemoteDescription({type: "rollback"}); - assert_equals(remoteStreams[0].getTracks().length, 1); - assert_equals(remoteStreams[0].getTracks()[0].id, track.id); + assert_equals(remoteStreams.length, 3); + assert_equals(remoteStreams[0].id, remoteStreams[2].id); + assert_equals(remoteStreams[1].getTracks().length, 0); + assert_equals(remoteStreams[2].getTracks().length, 1); + assert_equals(remoteStreams[2].getTracks()[0].id, track.id); }, "rollback of a remote offer with stream changes"); diff --git a/tests/wpt/web-platform-tests/xhr/idlharness.any.js b/tests/wpt/web-platform-tests/xhr/idlharness.any.js index f36f0ce0296..d45e52e2341 100644 --- a/tests/wpt/web-platform-tests/xhr/idlharness.any.js +++ b/tests/wpt/web-platform-tests/xhr/idlharness.any.js @@ -1,6 +1,7 @@ // META: global=sharedworker // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js +// META: timeout=long idl_test( ['xhr'],