Backed out 28 changesets (bug 1436506, bug 1436451, bug 1436996, bug 1436991, bug 1436558, bug 1436398, bug 1443501, bug 1437067, bug 1436436, bug 1436497, bug 1441364, bug 1436405, bug 1441367, bug 1436440, bug 1436416, bug 1436522, bug 1443192) for mass wpt failures after backout for bug 1443558. a=backout
authorCosmin Sabou <csabou@mozilla.com>
Thu, 08 Mar 2018 08:12:16 +0200
changeset 462142 a6a32fb286fa9e5d5f6d5b3b77423ab6b96c9502
parent 462137 65275829cf8e0f7b4f3c2a9c54dc149aaad18c30
child 462143 34950f11eab5980a2f4de82149e3129b5a339d88
child 462175 2bb1de78b01f01896fd5498ff9a3b62de634c8a2
child 462211 0e28b41ea4c825e8f1a17011f12d3e2d945189f8
push id1683
push usersfraser@mozilla.com
push dateThu, 26 Apr 2018 16:43:40 +0000
treeherdermozilla-release@5af6cb21869d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbackout
bugs1436506, 1436451, 1436996, 1436991, 1436558, 1436398, 1443501, 1437067, 1436436, 1436497, 1441364, 1436405, 1441367, 1436440, 1436416, 1436522, 1443192, 1443558
milestone60.0a1
backs out09992ffb6a0deaf34ee542a196dc814b08b622ed
340be2f71abf82d0de28870cdfa987e0e309e267
fd8dcd647f0e5ae4746b9667517293a0a0115d02
15ff3b2ed2024595fc1eb2daca5c62f4fcbcefe1
bb0cf2a57f10aa07a33a75986065e31bdec9562d
9a8713e25d0e3ccfa9ea66057733cfe369b7ab36
c5e6aba659272ff1e6ce9d02bf4d4f0e2323bb98
9673a31cbd06714dcb78996cf4187bf8ab9ddb45
260c6ce91561b06c01293209e1a911193dc2a081
aae516e4f97310f8ddbf2e82934950c4c6882089
ce2b417e92616a18f269e6279b6fa3e1ab2f871a
8daa68e631dbd28e59b7bab3cda7b5328737aa02
6015bfa88dd2ab74d0ab0a1dd4194613bb4dd198
176a3931afef88d97233b075382418ca344fea8c
ed58e17e8abee6bda37be176905b6356bf634efc
40628dced2b8ace969394e1ea2fb18ed48e23acb
0901be04972f6c80c79c264d1581c43f41db9c34
3f1f453a3cdd9e2eeb9145a0b5333591e9a4a120
fef37d4246d40e4089fabaf920758338ef64ab96
99fd7a7dcbca064525104d30c249da69ec7376e2
0ee34461750836f57dee0390e847ddfeb28ae42a
b84b7682d105a0803fd5606c38bc22f4f6589263
1f8ba818cab97fd92cfb5fc6cd9f771a96ced8a5
010c0213dab34c3b180b1c21e1faa4579acc209f
3a2ddfdae7d9041f6368a2eefdc863d7859ab4a3
68ef54b2b9e0ec9a40b8c25f11eebd57814ab410
1ce98b09f4387740be07801c89e3067a1f98bcb0
7b7d1504387a8f66fa1b854e0052873f6fa05623
first release with
nightly linux32
a6a32fb286fa / 60.0a1 / 20180308100121 / files
nightly linux64
a6a32fb286fa / 60.0a1 / 20180308100121 / files
nightly mac
a6a32fb286fa / 60.0a1 / 20180308100121 / files
nightly win32
a6a32fb286fa / 60.0a1 / 20180308100121 / files
nightly win64
a6a32fb286fa / 60.0a1 / 20180308100121 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 28 changesets (bug 1436506, bug 1436451, bug 1436996, bug 1436991, bug 1436558, bug 1436398, bug 1443501, bug 1437067, bug 1436436, bug 1436497, bug 1441364, bug 1436405, bug 1441367, bug 1436440, bug 1436416, bug 1436522, bug 1443192) for mass wpt failures after backout for bug 1443558. a=backout Backed out changeset 09992ffb6a0d (bug 1437067) Backed out changeset 340be2f71abf (bug 1437067) Backed out changeset fd8dcd647f0e (bug 1436996) Backed out changeset 15ff3b2ed202 (bug 1441367) Backed out changeset bb0cf2a57f10 (bug 1441367) Backed out changeset 9a8713e25d0e (bug 1436522) Backed out changeset c5e6aba65927 (bug 1436522) Backed out changeset 9673a31cbd06 (bug 1436991) Backed out changeset 260c6ce91561 (bug 1436558) Backed out changeset aae516e4f973 (bug 1443501) Backed out changeset ce2b417e9261 (bug 1443501) Backed out changeset 8daa68e631db (bug 1441364) Backed out changeset 6015bfa88dd2 (bug 1441364) Backed out changeset 176a3931afef (bug 1436497) Backed out changeset ed58e17e8abe (bug 1436497) Backed out changeset 40628dced2b8 (bug 1436506) Backed out changeset 0901be04972f (bug 1443192) Backed out changeset 3f1f453a3cdd (bug 1443192) Backed out changeset fef37d4246d4 (bug 1436451) Backed out changeset 99fd7a7dcbca (bug 1436405) Backed out changeset 0ee344617508 (bug 1436405) Backed out changeset b84b7682d105 (bug 1436440) Backed out changeset 1f8ba818cab9 (bug 1436436) Backed out changeset 010c0213dab3 (bug 1436436) Backed out changeset 3a2ddfdae7d9 (bug 1436398) Backed out changeset 68ef54b2b9e0 (bug 1436398) Backed out changeset 1ce98b09f438 (bug 1436416) Backed out changeset 7b7d1504387a (bug 1436416)
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/cors/304.htm.ini
testing/web-platform/meta/css/css-align/default-alignment/parse-justify-items-002.html.ini
testing/web-platform/meta/css/css-align/default-alignment/place-items-shorthand-004.html.ini
testing/web-platform/meta/css/css-color/color-function-parsing.html.ini
testing/web-platform/meta/css/css-pseudo/first-letter-property-whitelist.html.ini
testing/web-platform/meta/css/css-writing-modes/available-size-011.html.ini
testing/web-platform/meta/css/css-writing-modes/available-size-012.html.ini
testing/web-platform/meta/css/css-writing-modes/available-size-013.html.ini
testing/web-platform/meta/css/css-writing-modes/available-size-014.html.ini
testing/web-platform/meta/css/css-writing-modes/available-size-015.html.ini
testing/web-platform/meta/css/css-writing-modes/available-size-016.html.ini
testing/web-platform/meta/css/css-writing-modes/available-size-018.html.ini
testing/web-platform/meta/css/selectors/matches-nested.html.ini
testing/web-platform/meta/css/selectors/matches-specificity.html.ini
testing/web-platform/meta/fetch/api/basic/conditional-get.html.ini
testing/web-platform/meta/fetch/api/request/request-cache-default.html.ini
testing/web-platform/meta/fetch/api/request/request-cache-force-cache.html.ini
testing/web-platform/meta/fetch/api/request/request-cache-reload.html.ini
testing/web-platform/meta/html/editing/editing-0/contenteditable/contentEditable-slotted-inherit.html.ini
testing/web-platform/meta/html/semantics/scripting-1/the-script-element/muted-errors.sub.html.ini
testing/web-platform/meta/html/syntax/parsing/html5lib_tests15.html.ini
testing/web-platform/meta/intersection-observer/timestamp.html.ini
testing/web-platform/meta/navigation-timing/nav2_test_redirect_server.html.ini
testing/web-platform/meta/preload/link-header-preload-delay-onload.html.ini
testing/web-platform/meta/requestidlecallback/basic.html.ini
testing/web-platform/meta/service-workers/service-worker/extendable-event-async-waituntil.https.html.ini
testing/web-platform/meta/service-workers/service-worker/resource-timing.https.html.ini
testing/web-platform/meta/url/interfaces.any.js.ini
testing/web-platform/meta/webauthn/createcredential-badargs-authnrselection.https.html.ini
testing/web-platform/meta/webauthn/createcredential-badargs-challenge.https.html.ini
testing/web-platform/meta/webauthn/createcredential-badargs-rp.https.html.ini
testing/web-platform/meta/webauthn/createcredential-badargs-user.https.html.ini
testing/web-platform/meta/webauthn/createcredential-excludecredentials.https.html.ini
testing/web-platform/meta/webauthn/createcredential-extensions.https.html.ini
testing/web-platform/meta/webauthn/createcredential-passing.https.html.ini
testing/web-platform/meta/webauthn/createcredential-timeout.https.html.ini
testing/web-platform/meta/webauthn/getcredential-badargs-rpid.https.html.ini
testing/web-platform/meta/webauthn/getcredential-badargs-userverification.https.html.ini
testing/web-platform/meta/webauthn/getcredential-extensions.https.html.ini
testing/web-platform/meta/webauthn/getcredential-passing.https.html.ini
testing/web-platform/meta/webauthn/getcredential-timeout.https.html.ini
testing/web-platform/meta/webdriver/tests/navigation/current_url.py.ini
testing/web-platform/meta/websockets/constructor/014.html.ini
testing/web-platform/meta/websockets/cookies/006.html.ini
testing/web-platform/meta/workers/WorkerPerformanceNow.html.ini
testing/web-platform/meta/workers/semantics/navigation/002.html.ini
testing/web-platform/tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html
testing/web-platform/tests/2dcontext/tools/spec.yaml
testing/web-platform/tests/2dcontext/tools/tests2d.yaml
testing/web-platform/tests/IndexedDB/interleaved-cursors-common.js
testing/web-platform/tests/IndexedDB/interleaved-cursors-large.html
testing/web-platform/tests/IndexedDB/interleaved-cursors-small.html
testing/web-platform/tests/IndexedDB/interleaved-cursors.html
testing/web-platform/tests/common/css-paint-tests.js
testing/web-platform/tests/common/worklet-reftest.js
testing/web-platform/tests/compat/webkit-appearance.tentative.html
testing/web-platform/tests/css/CSS2/normal-flow/margin-collapse-through-zero-height-block.html
testing/web-platform/tests/css/css-align/content-distribution/place-content-shorthand-004.html
testing/web-platform/tests/css/css-align/default-alignment/parse-justify-items-002.html
testing/web-platform/tests/css/css-align/default-alignment/place-items-shorthand-004.html
testing/web-platform/tests/css/css-color/color-function-parsing.html
testing/web-platform/tests/css/css-paint-api/background-image-alpha.https.html
testing/web-platform/tests/css/css-paint-api/background-image-multiple.https.html
testing/web-platform/tests/css/css-paint-api/background-image-tiled.https.html
testing/web-platform/tests/css/css-paint-api/geometry-background-image-001.https.html
testing/web-platform/tests/css/css-paint-api/geometry-background-image-002.https.html
testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-001.https.html
testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-002.https.html
testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-003.https.html
testing/web-platform/tests/css/css-paint-api/geometry-border-image-001.https.html
testing/web-platform/tests/css/css-paint-api/geometry-border-image-002.https.html
testing/web-platform/tests/css/css-paint-api/geometry-border-image-003.https.html
testing/web-platform/tests/css/css-paint-api/geometry-border-image-004.https.html
testing/web-platform/tests/css/css-paint-api/geometry-with-float-size.https.html
testing/web-platform/tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html
testing/web-platform/tests/css/css-paint-api/invalid-image-constructor-error.https.html
testing/web-platform/tests/css/css-paint-api/invalid-image-paint-error.https.html
testing/web-platform/tests/css/css-paint-api/invalid-image-pending-script.https.html
testing/web-platform/tests/css/css-paint-api/overdraw.https.html
testing/web-platform/tests/css/css-paint-api/paint-arguments.https.html
testing/web-platform/tests/css/css-paint-api/paint-function-arguments.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-composite.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-filter.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-gradient.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-image.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-paths.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-rects.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-shadows.https.html
testing/web-platform/tests/css/css-paint-api/paint2d-transform.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-001.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-002.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-003.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-004.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-005.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-006.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-007.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-008.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-009.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-010.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-011.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-012.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-013.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-014.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-015.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-016.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-017.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-018.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-019.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-020.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-021.https.html
testing/web-platform/tests/css/css-paint-api/parse-input-arguments-022.https.html
testing/web-platform/tests/css/css-paint-api/registered-properties-in-custom-paint.https.html
testing/web-platform/tests/css/css-paint-api/style-background-image.https.html
testing/web-platform/tests/css/css-paint-api/style-before-pseudo.https.html
testing/web-platform/tests/css/css-paint-api/style-first-letter-pseudo.https.html
testing/web-platform/tests/css/css-paint-api/valid-image-after-load.https.html
testing/web-platform/tests/css/css-paint-api/valid-image-before-load.https.html
testing/web-platform/tests/css/css-pseudo/first-letter-property-whitelist.html
testing/web-platform/tests/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html
testing/web-platform/tests/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html
testing/web-platform/tests/css/css-typed-om/stylevalue-subclasses/cssUnparsedValue.html
testing/web-platform/tests/css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/get.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/get.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/get.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html
testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html
testing/web-platform/tests/css/css-writing-modes/available-size-011.html
testing/web-platform/tests/css/css-writing-modes/available-size-012.html
testing/web-platform/tests/css/css-writing-modes/available-size-013.html
testing/web-platform/tests/css/css-writing-modes/available-size-014.html
testing/web-platform/tests/css/css-writing-modes/available-size-015.html
testing/web-platform/tests/css/css-writing-modes/available-size-016.html
testing/web-platform/tests/css/css-writing-modes/available-size-017.html
testing/web-platform/tests/css/css-writing-modes/available-size-018.html
testing/web-platform/tests/css/css-writing-modes/reference/available-size-011-ref.html
testing/web-platform/tests/css/selectors/matches-nested.html
testing/web-platform/tests/css/selectors/matches-specificity.html
testing/web-platform/tests/custom-elements/Document-createElementNS.html
testing/web-platform/tests/html/editing/editing-0/contenteditable/contentEditable-slotted-inherit.html
testing/web-platform/tests/html/semantics/forms/textfieldselection/setSelectionRange.html
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/cacheable-script-throw.py
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/muted-errors-iframe.html
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/muted-errors.sub.html
testing/web-platform/tests/interfaces/accelerometer.idl
testing/web-platform/tests/lint.whitelist
testing/web-platform/tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html
testing/web-platform/tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js
testing/web-platform/tests/offscreen-canvas/tools/tests2d.yaml
testing/web-platform/tests/payment-request/interfaces.https.html
testing/web-platform/tests/resources/idlharness.js
testing/web-platform/tests/webauthn/createcredential-badargs-attestation.https.html
testing/web-platform/tests/webauthn/createcredential-badargs-authnrselection.https.html
testing/web-platform/tests/webauthn/createcredential-badargs-challenge.https.html
testing/web-platform/tests/webauthn/createcredential-badargs-rp.https.html
testing/web-platform/tests/webauthn/createcredential-badargs-user.https.html
testing/web-platform/tests/webauthn/createcredential-excludecredentials.https.html
testing/web-platform/tests/webauthn/createcredential-extensions.https.html
testing/web-platform/tests/webauthn/createcredential-passing.https.html
testing/web-platform/tests/webauthn/createcredential-pubkeycredparams.https.html
testing/web-platform/tests/webauthn/createcredential-timeout.https.html
testing/web-platform/tests/webauthn/getcredential-badargs-rpid.https.html
testing/web-platform/tests/webauthn/getcredential-badargs-userverification.https.html
testing/web-platform/tests/webauthn/getcredential-extensions.https.html
testing/web-platform/tests/webauthn/getcredential-passing.https.html
testing/web-platform/tests/webauthn/getcredential-timeout.https.html
testing/web-platform/tests/webauthn/helpers.js
testing/web-platform/tests/webauthn/securecontext.http.html
testing/web-platform/tests/webauthn/securecontext.https.html
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -68188,28 +68188,16 @@
       [
        "/css/CSS2/normal-flow/inlines-020-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
-   "css/CSS2/normal-flow/margin-collapse-through-zero-height-block.html": [
-    [
-     "/css/CSS2/normal-flow/margin-collapse-through-zero-height-block.html",
-     [
-      [
-       "/css/reference/ref-filled-green-200px-square.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
    "css/CSS2/normal-flow/max-height-001.xht": [
     [
      "/css/CSS2/normal-flow/max-height-001.xht",
      [
       [
        "/css/CSS2/reference/ref-filled-black-96px-square.xht",
        "=="
       ]
@@ -151244,112 +151232,16 @@
       [
        "/css/css-writing-modes/reference/available-size-002-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
-   "css/css-writing-modes/available-size-011.html": [
-    [
-     "/css/css-writing-modes/available-size-011.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-011-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
-   "css/css-writing-modes/available-size-012.html": [
-    [
-     "/css/css-writing-modes/available-size-012.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-001-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
-   "css/css-writing-modes/available-size-013.html": [
-    [
-     "/css/css-writing-modes/available-size-013.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-001-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
-   "css/css-writing-modes/available-size-014.html": [
-    [
-     "/css/css-writing-modes/available-size-014.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-001-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
-   "css/css-writing-modes/available-size-015.html": [
-    [
-     "/css/css-writing-modes/available-size-015.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-002-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
-   "css/css-writing-modes/available-size-016.html": [
-    [
-     "/css/css-writing-modes/available-size-016.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-002-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
-   "css/css-writing-modes/available-size-017.html": [
-    [
-     "/css/css-writing-modes/available-size-017.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-002-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
-   "css/css-writing-modes/available-size-018.html": [
-    [
-     "/css/css-writing-modes/available-size-018.html",
-     [
-      [
-       "/css/css-writing-modes/reference/available-size-002-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
    "css/css-writing-modes/background-position-vrl-018.xht": [
     [
      "/css/css-writing-modes/background-position-vrl-018.xht",
      [
       [
        "/css/css-writing-modes/background-position-vrl-018-ref.xht",
        "=="
       ]
@@ -184785,21 +184677,16 @@
      {}
     ]
    ],
    "IndexedDB/interfaces.idl": [
     [
      {}
     ]
    ],
-   "IndexedDB/interleaved-cursors-common.js": [
-    [
-     {}
-    ]
-   ],
    "IndexedDB/nested-cloning-common.js": [
     [
      {}
     ]
    ],
    "IndexedDB/support-promises.js": [
     [
      {}
@@ -188450,16 +188337,21 @@
      {}
     ]
    ],
    "common/canvas-tests.js.headers": [
     [
      {}
     ]
    ],
+   "common/css-paint-tests.js": [
+    [
+     {}
+    ]
+   ],
    "common/css-paint-tests.js.headers": [
     [
      {}
     ]
    ],
    "common/css-red.txt": [
     [
      {}
@@ -188590,21 +188482,16 @@
      {}
     ]
    ],
    "common/utils.js.headers": [
     [
      {}
     ]
    ],
-   "common/worklet-reftest.js": [
-    [
-     {}
-    ]
-   ],
    "compat/OWNERS": [
     [
      {}
     ]
    ],
    "compat/green-ref.html": [
     [
      {}
@@ -256710,21 +256597,16 @@
      {}
     ]
    ],
    "css/css-writing-modes/reference/available-size-002-ref.html": [
     [
      {}
     ]
    ],
-   "css/css-writing-modes/reference/available-size-011-ref.html": [
-    [
-     {}
-    ]
-   ],
    "css/css-writing-modes/reference/bidi-embed-001.html": [
     [
      {}
     ]
    ],
    "css/css-writing-modes/reference/bidi-embed-002.html": [
     [
      {}
@@ -280060,21 +279942,16 @@
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/.gitkeep": [
     [
      {}
     ]
    ],
-   "html/semantics/scripting-1/the-script-element/cacheable-script-throw.py": [
-    [
-     {}
-    ]
-   ],
    "html/semantics/scripting-1/the-script-element/contains.json": [
     [
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/defer.js": [
     [
      {}
@@ -280810,21 +280687,16 @@
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/module/throw2.js": [
     [
      {}
     ]
    ],
-   "html/semantics/scripting-1/the-script-element/muted-errors-iframe.html": [
-    [
-     {}
-    ]
-   ],
    "html/semantics/scripting-1/the-script-element/resources/bom-utf-16be.js": [
     [
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/resources/bom-utf-16le.js": [
     [
      {}
@@ -302310,27 +302182,19 @@
     ]
    ],
    "IndexedDB/interfaces.worker.js": [
     [
      "/IndexedDB/interfaces.worker.html",
      {}
     ]
    ],
-   "IndexedDB/interleaved-cursors-large.html": [
-    [
-     "/IndexedDB/interleaved-cursors-large.html",
-     {
-      "timeout": "long"
-     }
-    ]
-   ],
-   "IndexedDB/interleaved-cursors-small.html": [
-    [
-     "/IndexedDB/interleaved-cursors-small.html",
+   "IndexedDB/interleaved-cursors.html": [
+    [
+     "/IndexedDB/interleaved-cursors.html",
      {
       "timeout": "long"
      }
     ]
    ],
    "IndexedDB/key-conversion-exceptions.htm": [
     [
      "/IndexedDB/key-conversion-exceptions.htm",
@@ -304858,22 +304722,16 @@
     ]
    ],
    "compat/historical.html": [
     [
      "/compat/historical.html",
      {}
     ]
    ],
-   "compat/webkit-appearance.tentative.html": [
-    [
-     "/compat/webkit-appearance.tentative.html",
-     {}
-    ]
-   ],
    "compat/webkit-text-fill-color-currentColor.html": [
     [
      "/compat/webkit-text-fill-color-currentColor.html",
      {}
     ]
    ],
    "console/console-count-label-conversion.any.js": [
     [
@@ -308186,22 +308044,16 @@
     ]
    ],
    "css/css-cascade/inherit-initial.html": [
     [
      "/css/css-cascade/inherit-initial.html",
      {}
     ]
    ],
-   "css/css-color/color-function-parsing.html": [
-    [
-     "/css/css-color/color-function-parsing.html",
-     {}
-    ]
-   ],
    "css/css-color/color-resolving-hsl.html": [
     [
      "/css/css-color/color-resolving-hsl.html",
      {
       "timeout": "long"
      }
     ]
    ],
@@ -310222,22 +310074,16 @@
     ]
    ],
    "css/css-position/position-sticky-top.html": [
     [
      "/css/css-position/position-sticky-top.html",
      {}
     ]
    ],
-   "css/css-pseudo/first-letter-property-whitelist.html": [
-    [
-     "/css/css-pseudo/first-letter-property-whitelist.html",
-     {}
-    ]
-   ],
    "css/css-regions/cssomview-apis-no-region-chain-001.html": [
     [
      "/css/css-regions/cssomview-apis-no-region-chain-001.html",
      {}
     ]
    ],
    "css/css-regions/flow-into-parsing-001.html": [
     [
@@ -315160,28 +315006,16 @@
     ]
    ],
    "css/selectors/invalidation/sheet-going-away-001.html": [
     [
      "/css/selectors/invalidation/sheet-going-away-001.html",
      {}
     ]
    ],
-   "css/selectors/matches-nested.html": [
-    [
-     "/css/selectors/matches-nested.html",
-     {}
-    ]
-   ],
-   "css/selectors/matches-specificity.html": [
-    [
-     "/css/selectors/matches-specificity.html",
-     {}
-    ]
-   ],
    "css/selectors/missing-right-token.html": [
     [
      "/css/selectors/missing-right-token.html",
      {}
     ]
    ],
    "css/selectors/user-invalid.html": [
     [
@@ -324344,22 +324178,16 @@
     ]
    ],
    "html/editing/editing-0/contenteditable/contentEditable-invalidvalue.html": [
     [
      "/html/editing/editing-0/contenteditable/contentEditable-invalidvalue.html",
      {}
     ]
    ],
-   "html/editing/editing-0/contenteditable/contentEditable-slotted-inherit.html": [
-    [
-     "/html/editing/editing-0/contenteditable/contentEditable-slotted-inherit.html",
-     {}
-    ]
-   ],
    "html/editing/editing-0/contenteditable/user-interaction-editing-contenteditable.html": [
     [
      "/html/editing/editing-0/contenteditable/user-interaction-editing-contenteditable.html",
      {}
     ]
    ],
    "html/editing/editing-0/making-entire-documents-editable-the-designmode-idl-attribute/user-interaction-editing-designMode.html": [
     [
@@ -328320,22 +328148,16 @@
    "html/semantics/forms/textfieldselection/selection.html": [
     [
      "/html/semantics/forms/textfieldselection/selection.html",
      {
       "timeout": "long"
      }
     ]
    ],
-   "html/semantics/forms/textfieldselection/setSelectionRange.html": [
-    [
-     "/html/semantics/forms/textfieldselection/setSelectionRange.html",
-     {}
-    ]
-   ],
    "html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html": [
     [
      "/html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html",
      {}
     ]
    ],
    "html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html": [
     [
@@ -330778,22 +330600,16 @@
     ]
    ],
    "html/semantics/scripting-1/the-script-element/module/specifier-error.html": [
     [
      "/html/semantics/scripting-1/the-script-element/module/specifier-error.html",
      {}
     ]
    ],
-   "html/semantics/scripting-1/the-script-element/muted-errors.sub.html": [
-    [
-     "/html/semantics/scripting-1/the-script-element/muted-errors.sub.html",
-     {}
-    ]
-   ],
    "html/semantics/scripting-1/the-script-element/nomodule-reflect.html": [
     [
      "/html/semantics/scripting-1/the-script-element/nomodule-reflect.html",
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html": [
     [
@@ -359788,106 +359604,34 @@
     ]
    ],
    "webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html": [
     [
      "/webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html",
      {}
     ]
    ],
-   "webauthn/createcredential-badargs-attestation.https.html": [
-    [
-     "/webauthn/createcredential-badargs-attestation.https.html",
-     {}
-    ]
-   ],
-   "webauthn/createcredential-badargs-authnrselection.https.html": [
-    [
-     "/webauthn/createcredential-badargs-authnrselection.https.html",
-     {}
-    ]
-   ],
-   "webauthn/createcredential-badargs-challenge.https.html": [
-    [
-     "/webauthn/createcredential-badargs-challenge.https.html",
-     {}
-    ]
-   ],
    "webauthn/createcredential-badargs-rp.https.html": [
     [
      "/webauthn/createcredential-badargs-rp.https.html",
      {}
     ]
    ],
-   "webauthn/createcredential-badargs-user.https.html": [
-    [
-     "/webauthn/createcredential-badargs-user.https.html",
-     {}
-    ]
-   ],
-   "webauthn/createcredential-excludecredentials.https.html": [
-    [
-     "/webauthn/createcredential-excludecredentials.https.html",
-     {}
-    ]
-   ],
-   "webauthn/createcredential-extensions.https.html": [
-    [
-     "/webauthn/createcredential-extensions.https.html",
-     {}
-    ]
-   ],
    "webauthn/createcredential-passing.https.html": [
     [
      "/webauthn/createcredential-passing.https.html",
      {}
     ]
    ],
-   "webauthn/createcredential-pubkeycredparams.https.html": [
-    [
-     "/webauthn/createcredential-pubkeycredparams.https.html",
-     {}
-    ]
-   ],
-   "webauthn/createcredential-timeout.https.html": [
-    [
-     "/webauthn/createcredential-timeout.https.html",
-     {}
-    ]
-   ],
-   "webauthn/getcredential-badargs-rpid.https.html": [
-    [
-     "/webauthn/getcredential-badargs-rpid.https.html",
-     {}
-    ]
-   ],
-   "webauthn/getcredential-badargs-userverification.https.html": [
-    [
-     "/webauthn/getcredential-badargs-userverification.https.html",
-     {}
-    ]
-   ],
-   "webauthn/getcredential-extensions.https.html": [
-    [
-     "/webauthn/getcredential-extensions.https.html",
-     {}
-    ]
-   ],
    "webauthn/getcredential-passing.https.html": [
     [
      "/webauthn/getcredential-passing.https.html",
      {}
     ]
    ],
-   "webauthn/getcredential-timeout.https.html": [
-    [
-     "/webauthn/getcredential-timeout.https.html",
-     {}
-    ]
-   ],
    "webauthn/interfaces.https.html": [
     [
      "/webauthn/interfaces.https.html",
      {}
     ]
    ],
    "webauthn/securecontext.http.html": [
     [
@@ -385936,17 +385680,17 @@
    "f8af4287f3b0f6925a2a6c5c75b3788e24de1680",
    "support"
   ],
   "./config.default.json": [
    "403d365196f6fe2c631d27fe6042e3114d204016",
    "support"
   ],
   "./lint.whitelist": [
-   "67c693358b77f86e338e779ec808d00caeb5a253",
+   "2292c83ea0bd1432a7ba43e86a6b9f9fa8836e23",
    "support"
   ],
   "./serve.py": [
    "0efa39b1f26f86d73f2fce4f9e46003d62057b41",
    "support"
   ],
   "./server-side.md": [
    "c51b17fbac2a2e3121dc74f7badbd2873ce92f61",
@@ -386812,17 +386556,17 @@
    "eb891aa1f73c52c257c29103df1c6025db974d37",
    "testharness"
   ],
   "2dcontext/drawing-images-to-the-canvas/2d.drawImage.wrongtype.html": [
    "fcf561702051e3f0e136390d63066b0af7b2b277",
    "testharness"
   ],
   "2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html": [
-   "9050f39a7cca4caca0a113e0454415a940885995",
+   "2b10225d76ad749b305a966f055b79e43f949b78",
    "testharness"
   ],
   "2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html": [
    "636cdfbf1d0528e6be9b1c43753bd855d2ebe604",
    "testharness"
   ],
   "2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html": [
    "4674a8a0b00f134aec38b80915cb16568c123218",
@@ -389916,33 +389660,33 @@
    "d7862903e270295fd11e2d98c5c4dbcde4ae0717",
    "support"
   ],
   "2dcontext/tools/name2dir.yaml": [
    "3a852f1cc85eae2a17e67d56ce0c9bb5e4e69b41",
    "support"
   ],
   "2dcontext/tools/spec.yaml": [
-   "232dbb047756e3cef85089de215e492c3550f927",
+   "4692cedcc0d1d5af9ac917fa19d3979e2129a933",
    "support"
   ],
   "2dcontext/tools/specextract.py": [
    "5c656f7f4859ec0eb0559b1b1dfe6e085032d7c8",
    "support"
   ],
   "2dcontext/tools/templates.yaml": [
    "343f3ef053fadbb9e6a841d0244a737065f9e208",
    "support"
   ],
   "2dcontext/tools/tests.yaml": [
    "7a0d644759c65dc61373eaef42d7c9581683f660",
    "support"
   ],
   "2dcontext/tools/tests2d.yaml": [
-   "b25e82429ec7963e85a760247906839f9e631b24",
+   "057e6bc1199bb897e84a0d2ed7efefb616ba978c",
    "support"
   ],
   "2dcontext/tools/tests2dtext.yaml": [
    "7ae8c51177c71b7b0e2394406e88f0096853b244",
    "support"
   ],
   "2dcontext/transformations/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
@@ -391575,26 +391319,18 @@
   "IndexedDB/interfaces.idl": [
    "f367517cad717e2066ad8179df9ba5aa3b402c97",
    "support"
   ],
   "IndexedDB/interfaces.worker.js": [
    "fdacaee0ed6b2a97b579495f5944df04e70b7deb",
    "testharness"
   ],
-  "IndexedDB/interleaved-cursors-common.js": [
-   "6744105fe1a15a91058e3e5993f8a1f88548e3a3",
-   "support"
-  ],
-  "IndexedDB/interleaved-cursors-large.html": [
-   "4ee13538a407fe15fe310c8776d84c7526b7b363",
-   "testharness"
-  ],
-  "IndexedDB/interleaved-cursors-small.html": [
-   "04e4aad6c03ba0bc413a72f7674587816e1f63a2",
+  "IndexedDB/interleaved-cursors.html": [
+   "131b1965caae735de9ef8893e6ca55f24ce36f81",
    "testharness"
   ],
   "IndexedDB/key-conversion-exceptions.htm": [
    "aed58068ec48e3fd682a195bd5b0ea3f87c5a0e7",
    "testharness"
   ],
   "IndexedDB/key_invalid.htm": [
    "8c0257c4231c413dde10c6f541f17f57634bff1c",
@@ -396007,16 +395743,20 @@
   "common/canvas-tests.js": [
    "329e3ae1cfde2ee0525302e6a3260faed3885f28",
    "support"
   ],
   "common/canvas-tests.js.headers": [
    "e3593850f8098d3f3ff82c042deab15f51c66a52",
    "support"
   ],
+  "common/css-paint-tests.js": [
+   "81e8d7dc10c489d1d3ef2666a437b5e3972b9643",
+   "support"
+  ],
   "common/css-paint-tests.js.headers": [
    "e3593850f8098d3f3ff82c042deab15f51c66a52",
    "support"
   ],
   "common/css-red.txt": [
    "9edd8c61eb63c9b63fd7301e65174b5f7f87bbe1",
    "support"
   ],
@@ -396119,36 +395859,28 @@
   "common/utils.js": [
    "1d8598ff2c801c54c0f9be1c688b753bb6291c94",
    "support"
   ],
   "common/utils.js.headers": [
    "e3593850f8098d3f3ff82c042deab15f51c66a52",
    "support"
   ],
-  "common/worklet-reftest.js": [
-   "b8ebd1ad4a6a5600cfa0e9e60e26981bbccf19f0",
-   "support"
-  ],
   "compat/OWNERS": [
    "e714708a95e56bc556b64d991cb72f0ccace4f92",
    "support"
   ],
   "compat/green-ref.html": [
    "4b23ea52d785a6dd19785bd4278bf700eb5547f8",
    "support"
   ],
   "compat/historical.html": [
    "2d71e7532fc32af61d2410927b6405a9e79279a4",
    "testharness"
   ],
-  "compat/webkit-appearance.tentative.html": [
-   "19f5d49ab9383759357d9b7cd73f15fe7fff2939",
-   "testharness"
-  ],
   "compat/webkit-linear-gradient-line-bottom.html": [
    "af59a0aa3b8a195ba7ef401b582be9384a23a388",
    "reftest"
   ],
   "compat/webkit-linear-gradient-line-left.html": [
    "f131166051da9a82ede93f076f15832f61f39234",
    "reftest"
   ],
@@ -448267,20 +447999,16 @@
   "css/CSS2/normal-flow/inlines-020-ref.xht": [
    "a31254e929342c84c104a35cb99e238c087c98ed",
    "support"
   ],
   "css/CSS2/normal-flow/inlines-020.xht": [
    "a19a4cc8d7c500e01a0b591b16c13cd9a18773db",
    "reftest"
   ],
-  "css/CSS2/normal-flow/margin-collapse-through-zero-height-block.html": [
-   "33e6e180ed6e9896b7aeb3fcd9060bedb162291c",
-   "reftest"
-  ],
   "css/CSS2/normal-flow/max-height-001.xht": [
    "34a501cb70b591b6998234f3366361c33a064a18",
    "reftest"
   ],
   "css/CSS2/normal-flow/max-height-002.xht": [
    "3953046b0bca50a90b44ab66fb91691526096ccc",
    "reftest"
   ],
@@ -475808,17 +475536,17 @@
    "f5f4f2279506dc6106de38080a639979ad7e05d0",
    "testharness"
   ],
   "css/css-align/content-distribution/place-content-shorthand-003.html": [
    "966e8dd3893c487b02bb139ac26862995b655603",
    "testharness"
   ],
   "css/css-align/content-distribution/place-content-shorthand-004.html": [
-   "17c135945710d209b2e410d36867f6244ac358a0",
+   "5aa5cda5b2b0204bd2deb5c813532f394644b31f",
    "testharness"
   ],
   "css/css-align/content-distribution/place-content-shorthand-005.html": [
    "6b3d7b9ae7d5b28510385cccaaade09268409cab",
    "testharness"
   ],
   "css/css-align/content-distribution/place-content-shorthand-006.html": [
    "a40c054505716dda72b642ada40d8796a5d68795",
@@ -475856,17 +475584,17 @@
    "e5b9aed617b086152a25ffb4b3a39a8898a3622e",
    "testharness"
   ],
   "css/css-align/default-alignment/parse-justify-items-001.html": [
    "a60f7ed4a16ad9e6c12c8004b90bb1f88083af31",
    "testharness"
   ],
   "css/css-align/default-alignment/parse-justify-items-002.html": [
-   "12902e19304a7f02a52c576f3daf72fd9eb45ff8",
+   "b74652a3770f5bf8b7184748d62a21625f9121b3",
    "testharness"
   ],
   "css/css-align/default-alignment/parse-justify-items-003.html": [
    "3a66f7c4d618f0ea0ff112ac7dce8e5d6257084a",
    "testharness"
   ],
   "css/css-align/default-alignment/parse-justify-items-004.html": [
    "e2e61304ecccb8f0892eebb0eda6b510287174a6",
@@ -475888,17 +475616,17 @@
    "a087659c5fa60012fa11b685701b64a14fdda4ea",
    "testharness"
   ],
   "css/css-align/default-alignment/place-items-shorthand-003.html": [
    "f169ae9d27ef461fca3fae0729a7f3d41ddba6de",
    "testharness"
   ],
   "css/css-align/default-alignment/place-items-shorthand-004.html": [
-   "51b0eff81deca9f5e056f5db1d49f3e9be80435b",
+   "d4b6346f68b085a297ba5b15a5803258cbf661da",
    "testharness"
   ],
   "css/css-align/default-alignment/place-items-shorthand-005.html": [
    "638f5cbcc320477d495b9b0a752e6aaa048fee5e",
    "testharness"
   ],
   "css/css-align/default-alignment/place-items-shorthand-006.html": [
    "b7106d0ee863673c0d9a6160d035706edb3c67a8",
@@ -479703,20 +479431,16 @@
   "css/css-color/color-002.html": [
    "3ec299abc57c6ff6a55c604c751182abdadd6c8a",
    "reftest"
   ],
   "css/css-color/color-003.html": [
    "ec85953fb0594db50a69ca9952092aeab403cf2c",
    "reftest"
   ],
-  "css/css-color/color-function-parsing.html": [
-   "7c6abb0ab3f4c08d075cb1a5a13fe78964d55e15",
-   "testharness"
-  ],
   "css/css-color/color-resolving-hsl.html": [
    "672137820a0289306d53b3866ffa1f00daacc019",
    "testharness"
   ],
   "css/css-color/color-resolving-keywords.html": [
    "2789a985787f59179c9bf1ad49ccb8dbbb8fea11",
    "testharness"
   ],
@@ -497732,377 +497456,377 @@
    "0c1517f7ba747014c7c091b61d48f11421ed91c2",
    "support"
   ],
   "css/css-paint-api/background-image-alpha-ref.html": [
    "45ef6e998e5f266741f5403df650cd9557dbe005",
    "support"
   ],
   "css/css-paint-api/background-image-alpha.https.html": [
-   "9e49088b455ebad6c98af7e5610c31d59cb70d5c",
+   "84acc5f998812497d344067d7095c7561dda13ee",
    "reftest"
   ],
   "css/css-paint-api/background-image-multiple-ref.html": [
    "9ff536499d72240f67eb6911b768c624371ea678",
    "support"
   ],
   "css/css-paint-api/background-image-multiple.https.html": [
-   "89f02190795801c78429786e376a9731a03aca99",
+   "9e43ca2821fa0075073a898efde7595f6b57fad4",
    "reftest"
   ],
   "css/css-paint-api/background-image-tiled-ref.html": [
    "bcee5040691f057a672e58eec3beed75122be3b8",
    "support"
   ],
   "css/css-paint-api/background-image-tiled.https.html": [
-   "90f38d9cafef5f492085e8c161dc62cf4de2561d",
+   "83f9e2566f9e6957fdf3b67e9e62374984861e78",
    "reftest"
   ],
   "css/css-paint-api/geometry-background-image-001-ref.html": [
    "bca138ca3ce5b6dee10f935fd2ff9756d18b12ef",
    "support"
   ],
   "css/css-paint-api/geometry-background-image-001.https.html": [
-   "f4553e156ec81284b6c96a3b5ed5f2c3f5e4378f",
+   "a1f6d2148bfcdb68e4ca437b396b0ccbada101a9",
    "reftest"
   ],
   "css/css-paint-api/geometry-background-image-002-ref.html": [
    "4d33168e6298c1ed7d44ff431791615cdaf9038f",
    "support"
   ],
   "css/css-paint-api/geometry-background-image-002.https.html": [
-   "f3e6717b942fc8c674d359583dfb46b1e71aef8a",
+   "f48a940cfc7b3654ee92b655330ae30af5315e17",
    "reftest"
   ],
   "css/css-paint-api/geometry-background-image-tiled-001-ref.html": [
    "475fd7979cd173f378c03a7d9d27503e12c2dc7c",
    "support"
   ],
   "css/css-paint-api/geometry-background-image-tiled-001.https.html": [
-   "8bc58319aad57fb82025a35403ef3bb8848cfc34",
+   "a892266cab4d74a3f4df2bbe1cda8823a38f3153",
    "reftest"
   ],
   "css/css-paint-api/geometry-background-image-tiled-002-ref.html": [
    "c5363f4f7843ff8025ae5457524c0c9f4aac144c",
    "support"
   ],
   "css/css-paint-api/geometry-background-image-tiled-002.https.html": [
-   "c3dcbe7e2c7ddb8944cdb5d4c535bbb5f52fe27e",
+   "051788b53366cffcc10debdf2d678d50bffd1f54",
    "reftest"
   ],
   "css/css-paint-api/geometry-background-image-tiled-003-ref.html": [
    "d4f9428be3b8f9003eb9373b3eb87ebed0c55c15",
    "support"
   ],
   "css/css-paint-api/geometry-background-image-tiled-003.https.html": [
-   "946dd278cd4c8f847032dc03155422480713bb50",
+   "29141ae2c9c87237ed3406dd43c6b3a7a1a5aa36",
    "reftest"
   ],
   "css/css-paint-api/geometry-border-image-001-ref.html": [
    "81026e756ea8e3be653e176c09f1762507915cb8",
    "support"
   ],
   "css/css-paint-api/geometry-border-image-001.https.html": [
-   "b7532a7b90f081f981dc2e20371fd9a8c367054b",
+   "d8f948af1254c810496739e4c7cc570ba96cf64f",
    "reftest"
   ],
   "css/css-paint-api/geometry-border-image-002-ref.html": [
    "076c1f3e3b5cfd3a434e94f33872f5f598a7225b",
    "support"
   ],
   "css/css-paint-api/geometry-border-image-002.https.html": [
-   "416b0c72bcc019565452a6b26547ae40a70f497f",
+   "57b518eb310db31c40f0db37637b0f8199ee9734",
    "reftest"
   ],
   "css/css-paint-api/geometry-border-image-003-ref.html": [
    "141bf94dcd935420b95ee4da52139bf51318196d",
    "support"
   ],
   "css/css-paint-api/geometry-border-image-003.https.html": [
-   "e8c1b3b43198df01d1205a7f6a8399d9ae76471b",
+   "9d01df8817d9e5beb27d3439789cbe914c418b2c",
    "reftest"
   ],
   "css/css-paint-api/geometry-border-image-004-ref.html": [
    "d730b44bd1020305b70da095a15f9a4f7e9f262a",
    "support"
   ],
   "css/css-paint-api/geometry-border-image-004.https.html": [
-   "f61171df06dc738ec169c985245674c3cd10c215",
+   "368a9d855ffc46457e6c54cddfbc934e92096ee0",
    "reftest"
   ],
   "css/css-paint-api/geometry-with-float-size-ref.html": [
    "4ccf13c66fbd9ce8a2f04eab8b5f6cd24a6601fa",
    "support"
   ],
   "css/css-paint-api/geometry-with-float-size.https.html": [
-   "f8aee6ab06544b722f8f001c1397748268db5e91",
+   "911b7945792a8d3157cf183e4eb02e6e10ffa80a",
    "reftest"
   ],
   "css/css-paint-api/hidpi/device-pixel-ratio-ref.html": [
    "18f9d4d369de750ceb92c2e275ede5fcb3bf6f49",
    "support"
   ],
   "css/css-paint-api/hidpi/device-pixel-ratio.https.html": [
-   "6e59c99888bc19315b0d83463f8c387902548742",
+   "470ec454e18e5398718f3117171b172208f84fee",
    "reftest"
   ],
   "css/css-paint-api/invalid-image-constructor-error-ref.html": [
    "9ae74dc1b6bc4a2f346d072eca0020e7fd1b39ec",
    "support"
   ],
   "css/css-paint-api/invalid-image-constructor-error.https.html": [
-   "6a713ff6efbe731edbd47b94a9d95cafebcdcfd8",
+   "3fb935202b776ac0669804e7484a6a56667db64a",
    "reftest"
   ],
   "css/css-paint-api/invalid-image-paint-error-ref.html": [
    "b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
    "support"
   ],
   "css/css-paint-api/invalid-image-paint-error.https.html": [
-   "9f5dcb1bdd25a5edcd541683238965292426bf83",
+   "14d684741bcea0c95b1f50881f489e29abff080c",
    "reftest"
   ],
   "css/css-paint-api/invalid-image-pending-script-ref.html": [
    "b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
    "support"
   ],
   "css/css-paint-api/invalid-image-pending-script.https.html": [
-   "3e24c1a63d52d6ccb7aab1406667c35ffd162709",
+   "780d368f790ae61cd3d9a575213dd8c9cce9a3a6",
    "reftest"
   ],
   "css/css-paint-api/overdraw-ref.html": [
    "b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
    "support"
   ],
   "css/css-paint-api/overdraw.https.html": [
-   "4822897ab8620c5f3600083374f9e36831c96b2c",
+   "1f8f97b0a2141f5f8530a535b24b2b04dadae31c",
    "reftest"
   ],
   "css/css-paint-api/paint-arguments-ref.html": [
    "cbe0372259011ca94f0fd8d233413439ba9cf117",
    "support"
   ],
   "css/css-paint-api/paint-arguments.https.html": [
-   "364a86396ba71e411ae23a0ff3c0f6b8100b039e",
+   "7acf977d7e09bb85ada1b0df7fd9e4ea3a11ddfe",
    "reftest"
   ],
   "css/css-paint-api/paint-function-arguments-ref.html": [
    "a3aebfce59d0f62ab229248b7903b0dc731835d5",
    "support"
   ],
   "css/css-paint-api/paint-function-arguments.https.html": [
-   "a3a7bac75240254b43af5c6803521d8e9f342bab",
+   "cc19f4bc39c7a2cc1d9ed35a6a5a50d3935830af",
    "reftest"
   ],
   "css/css-paint-api/paint2d-composite-ref.html": [
    "60c069de8135b934df166560db5c592d5becbc92",
    "support"
   ],
   "css/css-paint-api/paint2d-composite.https.html": [
-   "674d96db571b91ced743d18bf4bb9529bc984a42",
+   "bfe095afc5c9a4325b06cfc22414a09395084113",
    "reftest"
   ],
   "css/css-paint-api/paint2d-filter-ref.html": [
    "6f1be576ae7ead2a724357b16ea88c92b3b19a0d",
    "support"
   ],
   "css/css-paint-api/paint2d-filter.https.html": [
-   "66b99ac471afe4b1d0e2b61d33d17529c4a315da",
+   "75d3792f2947cac41657257a8d74d72521c82c7f",
    "reftest"
   ],
   "css/css-paint-api/paint2d-gradient-ref.html": [
    "3b2abb3632893c0f5a2714fc325467f0076001a8",
    "support"
   ],
   "css/css-paint-api/paint2d-gradient.https.html": [
-   "49d6ba27001cf3c88104cbfa10f30e4757fec091",
+   "57a163232fe53272e9e2d37293908cf7b18267bb",
    "reftest"
   ],
   "css/css-paint-api/paint2d-image-ref.html": [
    "d4abe5cfd1d2416da7e390d28bc359feac91a2e7",
    "support"
   ],
   "css/css-paint-api/paint2d-image.https.html": [
-   "b40bf2610998b02857c021542116027fde52c9c8",
+   "df6ce0e992726401b8b3eec1ee72029c2f113316",
    "reftest"
   ],
   "css/css-paint-api/paint2d-paths-ref.html": [
    "cf154ab8a37bdbce2175193dfc456f4771bfeca8",
    "support"
   ],
   "css/css-paint-api/paint2d-paths.https.html": [
-   "b3f185c78bdc52f6c5bb596248a7b8b81f337337",
+   "06e13a31033ace03f012556b59ad3c0ac5cf39c1",
    "reftest"
   ],
   "css/css-paint-api/paint2d-rects-ref.html": [
    "2a469427fbdbee6b096a63b95846cdeda92c0255",
    "support"
   ],
   "css/css-paint-api/paint2d-rects.https.html": [
-   "1d696296ce1a91fecac2404f3b671ddcb9332cde",
+   "fbb8bf17e5dfd21d87b7d34bdb038e59e16ede46",
    "reftest"
   ],
   "css/css-paint-api/paint2d-shadows-ref.html": [
    "f882c26b0dfb58fe1ab3177060f421dad0148456",
    "support"
   ],
   "css/css-paint-api/paint2d-shadows.https.html": [
-   "d87f6308521b836ef6ca1d5a480e52d04ad7d5c6",
+   "6c7dab36d84540407eeb9571f8a9607e8d27ce6b",
    "reftest"
   ],
   "css/css-paint-api/paint2d-transform-ref.html": [
    "5eff507eeee563399205645668c7ed3df79213c9",
    "support"
   ],
   "css/css-paint-api/paint2d-transform.https.html": [
-   "6b8b00ce4b726e07843b5c1ed552db3e85d02240",
+   "f840916bab6d10cff1b08d1cfaecee97699d80cb",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-001.https.html": [
-   "4736591bcaf3b2d9d496f325f5709cbd24ee0d84",
+   "0ba1a9978d295825784a2909447e565701e6fc09",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-002.https.html": [
-   "a3cc3277704e5c7036a1f04127ea39a873f726a3",
+   "d35b4e39d8b0f54935571ee62fe7255e93c917dd",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-003.https.html": [
-   "5ea19b47a28e67d75e598023c92ce0ff06c0be79",
+   "f6c8cb6feba2b14349bc3fa3170b278e698df526",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-004.https.html": [
-   "fe30afff3fcfe646b6cd200768f3e404f80af622",
+   "1dd64759c041d9633ce04add066f4e1573fd05e5",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-005.https.html": [
-   "8c1f96a546b788aff4153028c33af08fe13de426",
+   "25d32d33e5de6d289d0e8c776876cb66f03e7c2e",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-006.https.html": [
-   "a5fbccaf088103440586d18812c147af7605e401",
+   "effa515567b0212403d83588c335d8fc72c056f6",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-007.https.html": [
-   "f28e6353da3e967a4b563e5bb4d978ad599e9344",
+   "f2f837e7c82462f17d9ebb1a8ab5346e5b8c945c",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-008.https.html": [
-   "eac2412dec6c73c198bb6f0035947967d46e987b",
+   "60034209a8984ac0be807494fc4373329d3792eb",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-009.https.html": [
-   "80e219e76653fbf3470466363dc4790c2219dbe7",
+   "d57e2370218d385a02e2021219869b5dec0e45c4",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-010.https.html": [
-   "284675f2aec06ae04a1ad006ee88e0a2321a7ede",
+   "9d4ef380f3596a73ea7816d13b3913b541ec05b9",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-011.https.html": [
-   "d470cd59be239ad2bcb5165e69c75d8b93a60975",
+   "b464f59c89fd6b515cdb2e027240b953bcf229d8",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-012.https.html": [
-   "5f5af76e9f22f19ad04f4580f6b04591b6b4c6cb",
+   "0cc064f143a0b1bed6b6e3b79f9a95754eb60ea3",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-013.https.html": [
-   "14e3abcf590a312e8a5f2fea4e9a1bcec23db4ae",
+   "e4a99687b156723308ed27a9e863754cb6dcdbd2",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-014.https.html": [
-   "6f858212364f918385ed4e952dbe22dbd28261ab",
+   "c10d44a53a00e6a9745d6ea1c359298723a0aee1",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-015.https.html": [
-   "2fa0c26c03a46b583f9db8362c12de363f551bda",
+   "a78c728b67af31e47c8d46e60e33ba437769a020",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-016.https.html": [
-   "f1629ddc373d8bd76b8e7f925729c6920500a035",
+   "1c14dbe6c6bc0f218724731112c4c45888ede8b5",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-017.https.html": [
-   "ecb703a89b1fcba7f0933e848d279cf431c90a2b",
+   "cba3754c5044665b2648fec05e25d7b6028c185f",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-018-ref.html": [
    "a831ef2690027b266f499d652b25ed8684e0fbaf",
    "support"
   ],
   "css/css-paint-api/parse-input-arguments-018.https.html": [
-   "0e918c827285cb1d841d4e9cf162a8df4bb7873e",
+   "2ae9cf7d13fa40e568d2324d060885a68ea3dbbd",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-019.https.html": [
-   "4255d8a07c8af95aa6dc924afe5ff262182d46be",
+   "db11565957c3da1ca7a51b9ab36cd4a823386a55",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-020.https.html": [
-   "673c41e96a7cbbe0c9c4ec98281d1d36a821ad3d",
+   "acbff610abd29a01574add30679b43d7a735c9bd",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-021.https.html": [
-   "f4e0fe1b41cfd198a828a48a1202f6bb0c90602b",
+   "6f567a29ed4ec26ad8c97277469783a614a5811b",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-022.https.html": [
-   "43b210e27fec1e601eedf1cf8964d185b7f34751",
+   "9f0efcee3e1412faa19fe50f475623fd5cf2852b",
    "reftest"
   ],
   "css/css-paint-api/parse-input-arguments-ref.html": [
    "6133bd65ef569456f58f1e501d81e088256bdc0a",
    "support"
   ],
   "css/css-paint-api/registered-properties-in-custom-paint.https.html": [
-   "de1e6dabe19bdd355060a62c7d697c64f49929fe",
+   "4eee3e45f32779df4464132fa43717a3afc135b2",
    "reftest"
   ],
   "css/css-paint-api/resources/html5.png": [
    "0b71ad4f2c95d41419082c2f1a2fc8370b14ebd2",
    "support"
   ],
   "css/css-paint-api/style-background-image-ref.html": [
    "0985e20363c8aac715c534ad59f1209889244fb0",
    "support"
   ],
   "css/css-paint-api/style-background-image.https.html": [
-   "c3359a8ee23b9c3d9007066235aef894ddbaf47f",
+   "4288eba641144a33ba79390102d141693a2c14d6",
    "reftest"
   ],
   "css/css-paint-api/style-before-pseudo-ref.html": [
    "6dcbe78ab89343178e18e3e92744b25759ec8241",
    "support"
   ],
   "css/css-paint-api/style-before-pseudo.https.html": [
-   "cd16dfc6e532851b23abdf47cb4cc89f20a6c655",
+   "e491dcde66880750f3b277d520f5288e0508d13a",
    "reftest"
   ],
   "css/css-paint-api/style-first-letter-pseudo-ref.html": [
    "c6a94e5bafa098b8f4023312db97abebe992abc3",
    "support"
   ],
   "css/css-paint-api/style-first-letter-pseudo.https.html": [
-   "996d9f2e93bc8ba0a54415d0ffcab4cdb7c1ffa7",
+   "75bee076f1fd0629eb7b0064ccf2c6ed882a4fbd",
    "reftest"
   ],
   "css/css-paint-api/valid-image-after-load-ref.html": [
    "b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
    "support"
   ],
   "css/css-paint-api/valid-image-after-load.https.html": [
-   "ed072976b2054f941dc4653d3318f19b94d52a0c",
+   "c00a13e38ba694a79e4934c854684aaaf0b19068",
    "reftest"
   ],
   "css/css-paint-api/valid-image-before-load-ref.html": [
    "b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
    "support"
   ],
   "css/css-paint-api/valid-image-before-load.https.html": [
-   "9ddb41d4292ad70c50530c76d6ac505347bec30e",
+   "89d6d44680d1df3fdc7ece62ff7ed2edffbaa01d",
    "reftest"
   ],
   "css/css-position/position-relative-table-left-ref.html": [
    "044d07924d19f223eaa43950f9e9197d267e6be8",
    "support"
   ],
   "css/css-position/position-relative-table-tbody-left-absolute-child.html": [
    "52021ff94a08452e93b2d9054d9aef69bf32ee0a",
@@ -498463,20 +498187,16 @@
   "css/css-pseudo/first-letter-004-ref.html": [
    "4387a0cec6417a73b99caa4482eaf343921ce285",
    "support"
   ],
   "css/css-pseudo/first-letter-004.html": [
    "5a7a51802925bda01fbb62c8635a0e3205683e51",
    "reftest"
   ],
-  "css/css-pseudo/first-letter-property-whitelist.html": [
-   "38d0844f6ef10d214b7d23af45d02c8093d9c00e",
-   "testharness"
-  ],
   "css/css-pseudo/marker-and-other-pseudo-elements-ref.html": [
    "73ab862dcf3131ae7d7166ef06e52db0cd0eb7c7",
    "support"
   ],
   "css/css-pseudo/marker-and-other-pseudo-elements.html": [
    "ce59ad1afe6f3182565076bb951149bc1e5526f0",
    "reftest"
   ],
@@ -515244,17 +514964,17 @@
    "65c2418988148bf9662f5f502bb4650cc6105a85",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-normalization/normalize-resource.tentative.html": [
    "a52fdeadf8f0663e5e8f455e60a233da816e05ca",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html": [
-   "f7c3ad3efe7406845cc58dbf20a022bbaecc011d",
+   "4bc704fca50d3a114fe0fde76b6030516662d43a",
    "visual"
   ],
   "css/css-typed-om/stylevalue-normalization/positionvalue-normalization.tentative.html": [
    "9334ee684f4a2897f6a191d9217e63af5630cc0d",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-normalization/transformvalue-normalization.tentative.html": [
    "a4c39f9ea72acba74027e6ffb26e221606dcd9ac",
@@ -515296,17 +515016,17 @@
    "5bb6823ff35152e1a55f573d568e29b7edfcf2d7",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html": [
    "e1c27e0baa33d990c83ee3d562a3eeae3106b833",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html": [
-   "d2881899fa46277dc15828dca1354d7adfe422c0",
+   "7ba0e1c9db3799bad925036de1da7c51fd102610",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-serialization/cssUrlImageValue.tentative.html": [
    "7b7fa7d06c5dcf614864bab0adef083359278ab6",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/cssKeywordValue-invalid.html": [
    "63600cc74e62ecbaf98bf786de17362764ec947e",
@@ -515352,17 +515072,17 @@
    "c1ee0153bd654f64b64f74bf00b6b0709c7cb9ed",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/cssTranslate.tentative.html": [
    "700fae462f258404f3d0b8fad290613fc1929e1d",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/cssUnparsedValue.html": [
-   "16725f5047477a1a8837e464935af3da0a01deb2",
+   "cf1e8d553a9ebc111a1a81de48a821f7f7ad0bf1",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/cssUrlImageValue-interface.html": [
    "5565653081f6615d8d88323b98ed670a653bef9b",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/cssUrlImageValue-invalid.html": [
    "2d776d5a92feebe4803434878c3f76973313063b",
@@ -515372,17 +515092,17 @@
    "286ec3f30141247b58facd09a17879d29109950c",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue-invalid.html": [
    "ba012ace40e63718694a8cd91ba74039787ff666",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html": [
-   "ee4e9932846d84d1692b2456a3ec0df5348f0ab3",
+   "69014384152e249f0f0ac15aec00ad41b82dbbf4",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/numeric-objects/add-two-types.tentative.html": [
    "46432efb6b1ed44b87e27b66332ef78d68748c89",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/numeric-objects/arithmetic.tentative.html": [
    "1490c7159f3daf01195daf92d869e2f8fa2ca70a",
@@ -515432,89 +515152,89 @@
    "9216fee77d3666464ed55992fc7df739d85d5667",
    "testharness"
   ],
   "css/css-typed-om/stylevalue-subclasses/numeric-objects/toSum.tentative.html": [
    "6240dbd450965b33ed5da87f554acc54a32b6ad4",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html": [
-   "460bdf5cc3e35360eb8d910274cef440837f0eaf",
+   "f217ed58d7f56ea588aa942fddfec0322d557283",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/computed/get-invalid.html": [
    "429ff102428a84ca0a1903de1752a56c3ff5bd29",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/computed/get.html": [
-   "3280beb7f3d0f3a1d1c50a2b36ac34158b809147",
+   "39d85ac0274ffcbc060654df3e53ae0984dce9d3",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html": [
-   "2c9c39367ccf02f014b8bf62057f810a70ff58bf",
+   "4393dba1aea1936ac0ff0f08ef6b5810eaaa8b6b",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/computed/getProperties.tentative.html": [
    "9e0018aed64fbca86d25f5ec466f88212ebd4906",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/computed/has.tentative.html": [
    "b7b16ab44745e235883303b8c495aa1ceb874d0c",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html": [
-   "d157e58980ae6b303374af2d69b3971af610de0f",
+   "71dc6c117d3b0e17ddcee46c9db11953197edb75",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/append.tentative.html": [
    "6a408857cd88d03a4a00ee2127a3825380d2565f",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html": [
-   "7a6bbc1b04f6d1ee82332ddbf58a27604645a86b",
+   "a879640d94c42f82bf81f80942f1ed7d181ee642",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/delete-invalid.html": [
    "fe2d4e5f02b1c931e479253d523f7ec2f59c67a7",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/delete.html": [
    "5e2a8ca9f0246aaba3e7d7d038cad125194c5f14",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/get-invalid.html": [
    "649ab2a64f0b0959e06bdc7968fc28247841bb25",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/get.html": [
-   "9ef39a7e4c8c51a528a0d39604afc1476248fb0d",
+   "45032bb362cf1c6faed623e0538779db6a6dea3a",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html": [
-   "df90a13e37ebcdbcf046e66f7e90ad2fc7edd9df",
+   "ba694cbe689837f183601aab4872c4525613ebd4",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/getProperties.tentative.html": [
    "7cb65bf76de24fe33a48178f5193bc05c5ec3f44",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/has.tentative.html": [
    "3299b5537f2d535988f2f6dac65b3eaba63833b2",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html": [
-   "299e7d1dd78df981bd0e53aacfbdd23bf56d4311",
+   "3652cf0e25de23c04beadbaf2e4ddfffb244333d",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/set.tentative.html": [
-   "23c875b8bb41344e9c4ffc0753f8f8fb36171d8b",
+   "2e8b919993a68f96008f17a0e95c08d05434e6a6",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/declared/update.tentative.html": [
-   "797aeb1b92addefc6bb5e76c6939a9a2d3a4de97",
+   "02eff9d89e280182fd065b63d71167041c6a8394",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/append.tentative.html": [
    "df640de5b24c8276459a1a7fbc8a02cc97db6223",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/delete-invalid.html": [
    "df4903a2c18099bb5291a307f50778ee757824ed",
@@ -515524,41 +515244,41 @@
    "922297b80497c164d4217559658a9043a99ebbf8",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/get-invalid.html": [
    "1494cfe202fb93881fc60a3ed2a372a7a8b25b37",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/get.html": [
-   "8958e75fed15d057cb70c34583c1be13e32bde7b",
+   "ffed62a6ddbeb7bfe7cb71e76f4d4c5d7e9039e7",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html": [
-   "2a8c50a83cbfd1c3da5614daac7070df0f5c83ff",
+   "a149643634642b6277c4ada8da9b712f40ccf9b5",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/getProperties.tentative.html": [
    "5187e1eb4fb23b6b9a7fba8130d2649c4ea9152e",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/has.tentative.html": [
    "89b6d05db8717f1bc1f82690706d849a57104ec7",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html": [
-   "5fc93754e7119ee023897095a8d2499b8ae58267",
+   "e8317c96cea894eaa47d361ba5adbb15d237726e",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/set.tentative.html": [
-   "68095148a2ede91974f5df04d29a64bcad3ab2f6",
+   "00d06230cd8f21d522ab895c853201f9910d0d90",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/inline/update.tentative.html": [
-   "197b30d860a97f20a8c25a5357f5b2e096c7b2fd",
+   "30ee6179d77f18692867217c18852db94b1d10bb",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/display.html": [
    "344c75e256cf3284d6582c2cd3c9f726d6d7f443",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/margin-top.html": [
    "3a6cb963dd8ff07522ade6839f8de5493fd49414",
@@ -519703,48 +519423,16 @@
   "css/css-writing-modes/available-size-009.html": [
    "0d10d0e6ef2133fee22f1cf3e0d46d3df87cdadd",
    "reftest"
   ],
   "css/css-writing-modes/available-size-010.html": [
    "d0143fe32c956ab0be6e9573cae23f5c718161a1",
    "reftest"
   ],
-  "css/css-writing-modes/available-size-011.html": [
-   "d813b114682deacc67a3193e6b2729023d43c9be",
-   "reftest"
-  ],
-  "css/css-writing-modes/available-size-012.html": [
-   "0060352f87e3266f27e63c3d345c073fdfc86b55",
-   "reftest"
-  ],
-  "css/css-writing-modes/available-size-013.html": [
-   "223fcd267f512c2ffb0be67fef68f14999994a26",
-   "reftest"
-  ],
-  "css/css-writing-modes/available-size-014.html": [
-   "8146d041bf020ab6d341e4301d2683df26da22e8",
-   "reftest"
-  ],
-  "css/css-writing-modes/available-size-015.html": [
-   "22249614e7b8eea6b7bf1a0459fe9672501b6f7b",
-   "reftest"
-  ],
-  "css/css-writing-modes/available-size-016.html": [
-   "b55fefb1f5ab8744634ff87bded194e072a38e0f",
-   "reftest"
-  ],
-  "css/css-writing-modes/available-size-017.html": [
-   "05e3ccc43d47a2f26d731dcd37bd8eab29909e54",
-   "reftest"
-  ],
-  "css/css-writing-modes/available-size-018.html": [
-   "ce16806681745f6904483d09d1954152605bf39b",
-   "reftest"
-  ],
   "css/css-writing-modes/background-position-vlr-003.xht": [
    "c56c42d17b140be6868cc6f413f545dd6a5180e8",
    "manual"
   ],
   "css/css-writing-modes/background-position-vlr-005.xht": [
    "a405264206d13149078ea26c5d458ed92aa80c85",
    "manual"
   ],
@@ -521987,20 +521675,16 @@
   "css/css-writing-modes/reference/available-size-001-ref.html": [
    "0f6b3e3907f1898bae7b58b11bc4ee0b04a7e94d",
    "support"
   ],
   "css/css-writing-modes/reference/available-size-002-ref.html": [
    "db010e663d44ba9cdd1dbf4036003cb88b460fe9",
    "support"
   ],
-  "css/css-writing-modes/reference/available-size-011-ref.html": [
-   "25ca398093bcbc623a0b710df4eba2a026c558cf",
-   "support"
-  ],
   "css/css-writing-modes/reference/bidi-embed-001.html": [
    "6000e9bf08042d5e79b805132a64038875973008",
    "support"
   ],
   "css/css-writing-modes/reference/bidi-embed-002.html": [
    "78fb4e2e85231b88b87dfd73f5ccfae46489993e",
    "support"
   ],
@@ -528871,24 +528555,16 @@
   "css/selectors/invalidation/sheet-going-away-002-ref.html": [
    "5616ec15bb322f49c4b28761df2cfb40fdafc226",
    "support"
   ],
   "css/selectors/invalidation/sheet-going-away-002.html": [
    "d23ac4f08cb0c70d06bfac4c4be121a8de8af48f",
    "reftest"
   ],
-  "css/selectors/matches-nested.html": [
-   "fbfe269916b375d5dea97ba7c76ed75ccaf2dc4c",
-   "testharness"
-  ],
-  "css/selectors/matches-specificity.html": [
-   "89f8fd14f1faa838d60e4b047c501f6c08de0b42",
-   "testharness"
-  ],
   "css/selectors/missing-right-token.html": [
    "d961e801f7df57161cd8c7b5a4b26ae24013c3e9",
    "testharness"
   ],
   "css/selectors/of-type-selectors-ref.xhtml": [
    "59f848418882c75898c422a9600c14ffab64c3d9",
    "support"
   ],
@@ -537508,17 +537184,17 @@
    "9af8f2dc7778feeea4fa8e557d7885b10d325dea",
    "testharness"
   ],
   "custom-elements/Document-createElement.html": [
    "2275720296bd3ea4ef012ed5ef3ea63a4c5f953d",
    "testharness"
   ],
   "custom-elements/Document-createElementNS.html": [
-   "799f59e3bf8ab0830e44faa3ffef6d3303da42eb",
+   "04cd97839e98c6082f67740dbcfc7588e2b251b9",
    "testharness"
   ],
   "custom-elements/HTMLElement-constructor.html": [
    "64522527ef425b90c704b20b000c8feef0d1ca25",
    "testharness"
   ],
   "custom-elements/OWNERS": [
    "9f6553b67cad3b479d3beb678653db4e712ed227",
@@ -552867,20 +552543,16 @@
   "html/editing/editing-0/contenteditable/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/editing/editing-0/contenteditable/contentEditable-invalidvalue.html": [
    "372717e3b59b7bd22ac9ada31f04a7fdd2eeb60e",
    "testharness"
   ],
-  "html/editing/editing-0/contenteditable/contentEditable-slotted-inherit.html": [
-   "146bb5c2136d6e266f75e94266e9642f0b6485ff",
-   "testharness"
-  ],
   "html/editing/editing-0/contenteditable/user-interaction-editing-contenteditable.html": [
    "14b2b941663b0e447fa232d98f6a248d6395ccf4",
    "testharness"
   ],
   "html/editing/editing-0/editing-apis/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
@@ -558467,20 +558139,16 @@
   "html/semantics/forms/textfieldselection/selection-value-interactions.html": [
    "39fe9646bbc2741e9bd3296d4e01513c99106151",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection.html": [
    "7f3969423e86313ec20846c84f8deecc95048b82",
    "testharness"
   ],
-  "html/semantics/forms/textfieldselection/setSelectionRange.html": [
-   "a047ea5e4c00894fcc30e972f84bcedc4a8226cf",
-   "testharness"
-  ],
   "html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html": [
    "92e1dbed4c1cd07879b7748b764bf01d8685240e",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html": [
    "4ca73ff5658b3512784e9e1b236c78861ca4ecc9",
    "testharness"
   ],
@@ -559675,20 +559343,16 @@
   "html/semantics/scripting-1/the-script-element/async_010.htm": [
    "febc63e0b0676fccebc45cfe5acfde2e4c704326",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/async_011.htm": [
    "c5147ae243c2a2855397c94f23c73c0bf8a729ce",
    "testharness"
   ],
-  "html/semantics/scripting-1/the-script-element/cacheable-script-throw.py": [
-   "2eb7a0a6000ca0f028093f4f84f3e84c54c158b4",
-   "support"
-  ],
   "html/semantics/scripting-1/the-script-element/contains.json": [
    "f9a602045e19618260a2ea96f188d77536bd772e",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/data-url.html": [
    "1fe7fe27c3680b24fbbb9c09c849ecb007637d3f",
    "testharness"
   ],
@@ -561203,24 +560867,16 @@
   "html/semantics/scripting-1/the-script-element/module/throw.js": [
    "d071fd2e76896c4b66636f359d4426fe101f6d0f",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/throw2.js": [
    "34c282c0357c639400877b65bf21f30db3b99ea5",
    "support"
   ],
-  "html/semantics/scripting-1/the-script-element/muted-errors-iframe.html": [
-   "f99f7d4941f22f18101cfd39cc83b36c6721aaec",
-   "support"
-  ],
-  "html/semantics/scripting-1/the-script-element/muted-errors.sub.html": [
-   "b973843fcd299b45b03c14d71b1b5b3ee2340045",
-   "testharness"
-  ],
   "html/semantics/scripting-1/the-script-element/nomodule-reflect.html": [
    "ac2b3c16e9e9263cd4c14de205b63709c14ec2e3",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html": [
    "19fe5862149465a52c6437e12535c6febdac2324",
    "testharness"
   ],
@@ -563908,17 +563564,17 @@
    "b2cece17c61be3b2d6ebf3294c268ebf1061026e",
    "support"
   ],
   "interfaces/WebCryptoAPI.idl": [
    "87b02fc82a1b204ac59a51932e58f9369b4a77c6",
    "support"
   ],
   "interfaces/accelerometer.idl": [
-   "badeb96ae83c8173bb00884346d4f6dc675bbffa",
+   "eaa4e8fd76cf191c84921df18e9347a087e8c3d9",
    "support"
   ],
   "interfaces/ambient-light.idl": [
    "bdede54deab80b5465f904a9726ee86f1260858d",
    "support"
   ],
   "interfaces/clipboard.idl": [
    "5af2846c7f9ff93f2f4f13780d0356cdac6a0d4f",
@@ -568232,21 +567888,21 @@
    "b92f4f490ccbb30c00a0923d84bdd39d8b4cdd1e",
    "testharness"
   ],
   "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.wrongtype.worker.js": [
    "f14950786127dc3e209013caa1569f2132dd1fba",
    "testharness"
   ],
   "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html": [
-   "64541bbd1d8ceff92a5c2a69821572c8d1483dfd",
+   "6af600ae8e09335caac85715358736fe9939bc93",
    "testharness"
   ],
   "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js": [
-   "e097f9d9b64416668b3cac956af4f910b607524c",
+   "0714f09495ad37384995324a0644047cb51e1533",
    "testharness"
   ],
   "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.html": [
    "7f88f6b46b5fe5ec13eb8432a05f728b570c734c",
    "testharness"
   ],
   "offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.html": [
    "abe094ac8977d07c89d04aeb823b1133fa0f8a25",
@@ -572956,17 +572612,17 @@
    "ed640afbc6614fa9b53e6061192544b0fdc4f51e",
    "support"
   ],
   "offscreen-canvas/tools/templates.yaml": [
    "d8959532cf7948a99fb99b086ed22eb13f1870db",
    "support"
   ],
   "offscreen-canvas/tools/tests2d.yaml": [
-   "0e1cf2837f41da2e37a0a4786fba207a104e2e0b",
+   "d2e4f9e53a36426b9d62f9e0969d31a46b88b6b3",
    "support"
   ],
   "offscreen-canvas/transformations/2d.transformation.order.html": [
    "5d2711b430dbf5822df83d53c034312bacf474b6",
    "testharness"
   ],
   "offscreen-canvas/transformations/2d.transformation.order.worker.js": [
    "e74361161f3f8aa94a0e8f9ea4ab8db29ffb32aa",
@@ -593131,94 +592787,46 @@
   "webaudio/the-audio-api/the-waveshapernode-interface/waveshaper.html": [
    "84975ca29be6d977ed238a46ff6597959ab05047",
    "testharness"
   ],
   "webauthn/OWNERS": [
    "368ab4153a7f6843ce65ce924a3b4af92f3488ee",
    "support"
   ],
-  "webauthn/createcredential-badargs-attestation.https.html": [
-   "397a6f0b95e75cf2b743eb208f6c79c767ec648a",
-   "testharness"
-  ],
-  "webauthn/createcredential-badargs-authnrselection.https.html": [
-   "f5f5c8316551a921823bfe000031d42d91d9baa1",
-   "testharness"
-  ],
-  "webauthn/createcredential-badargs-challenge.https.html": [
-   "741efba3e4c583d5983a5005803f718bdaa435b0",
-   "testharness"
-  ],
   "webauthn/createcredential-badargs-rp.https.html": [
-   "8ab678da79853a5c41ff142704bb4732b026e06c",
-   "testharness"
-  ],
-  "webauthn/createcredential-badargs-user.https.html": [
-   "37f734eed5ecd34f6feb90bb96154e16a763140a",
-   "testharness"
-  ],
-  "webauthn/createcredential-excludecredentials.https.html": [
-   "387387626892215c1552ef5e742fd32d800df4ad",
-   "testharness"
-  ],
-  "webauthn/createcredential-extensions.https.html": [
-   "9642dafa7ed7ce75d5812328fcd3ac2239e33ebd",
+   "941a9bda02e22b7d54855e3a4714a49d8392fa9d",
    "testharness"
   ],
   "webauthn/createcredential-passing.https.html": [
-   "e89da85133f56cf0b5b78f6d6f39b43926ed9fda",
-   "testharness"
-  ],
-  "webauthn/createcredential-pubkeycredparams.https.html": [
-   "009193df4404190c820618840104da8db380eaa8",
-   "testharness"
-  ],
-  "webauthn/createcredential-timeout.https.html": [
-   "c0e639f8a32a1bc3553fd437a4fcf694a63960c2",
-   "testharness"
-  ],
-  "webauthn/getcredential-badargs-rpid.https.html": [
-   "275511dbafc9a536f92e74ef4c0531a7d8b7a437",
-   "testharness"
-  ],
-  "webauthn/getcredential-badargs-userverification.https.html": [
-   "5ac7b919d473bfc126c3e57df70c2f0defc60671",
-   "testharness"
-  ],
-  "webauthn/getcredential-extensions.https.html": [
-   "ea4d0533a5939927dd9eaa5d81116dbcc2f3ccbe",
+   "32a6ac38f91ec6b887e9e57519eb1603b4abcdbb",
    "testharness"
   ],
   "webauthn/getcredential-passing.https.html": [
-   "1b0f77b533a4e528b3abc484ba4d74b56833131f",
-   "testharness"
-  ],
-  "webauthn/getcredential-timeout.https.html": [
-   "b8c71a3fccdf39c2e35bd34a3cd42561cac5836b",
+   "6272128ea3af65ecb4fc40055b062a678bfbb2fd",
    "testharness"
   ],
   "webauthn/helpers.js": [
-   "9ce729fb89ba1863fb14dfc4d567e6b544a5238d",
+   "e6224e8e2be8657e2e312f4197cbe0225c819cea",
    "support"
   ],
   "webauthn/interfaces.https.html": [
    "5a30981934a38e09328a946352b21a8abc90851f",
    "testharness"
   ],
   "webauthn/interfaces.idl": [
    "77076f0828383c0f48f36131a81b25186622b3a3",
    "support"
   ],
   "webauthn/securecontext.http.html": [
-   "7abf48e74debed79578e39934d1b84655731a3ea",
+   "afc1492723d140e34027a3bdbf0d1e09843ef5d6",
    "testharness"
   ],
   "webauthn/securecontext.https.html": [
-   "9bdd7e09c7f468b9b0c106d4764d61e77b32131f",
+   "7f7a7aba32b9e049c618203121fae0884936643a",
    "testharness"
   ],
   "webdriver/OWNERS": [
    "752d7099018be8b67e4ca16628bbecfa08da8e82",
    "support"
   ],
   "webdriver/README.md": [
    "185acb69e9516e0564e16bf7d7f8dc2a4c48d3c7",
--- a/testing/web-platform/meta/cors/304.htm.ini
+++ b/testing/web-platform/meta/cors/304.htm.ini
@@ -1,1 +1,2 @@
 prefs: [network.http.rcwn.enabled:false]
+[304.htm]
--- a/testing/web-platform/meta/css/css-align/default-alignment/parse-justify-items-002.html.ini
+++ b/testing/web-platform/meta/css/css-align/default-alignment/parse-justify-items-002.html.ini
@@ -1,4 +1,22 @@
 [parse-justify-items-002.html]
+  [Test 'initial' value when nothing is specified]
+    expected: FAIL
+
+  [Test justify-items: 'initial']
+    expected: FAIL
+
+  [Test grid items justify-items: 'initial']
+    expected: FAIL
+
   [Test flex items justify-items: 'initial']
     expected: FAIL
 
+  [Test absolute positioned elements justify-items: 'initial']
+    expected: FAIL
+
+  [Test absolute positioned grid items justify-items: 'initial']
+    expected: FAIL
+
+  [Test absolute positioned flex items justify-items: 'initial']
+    expected: FAIL
+
--- a/testing/web-platform/meta/css/css-align/default-alignment/place-items-shorthand-004.html.ini
+++ b/testing/web-platform/meta/css/css-align/default-alignment/place-items-shorthand-004.html.ini
@@ -3,11 +3,8 @@
     expected:
       if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       if debug and stylo and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       FAIL
 
-  [Verify 'auto' value is invalid.]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-color/color-function-parsing.html.ini
+++ /dev/null
@@ -1,64 +0,0 @@
-[color-function-parsing.html]
-  [Basic sRGB white]
-    expected: FAIL
-
-  [White with lots of space]
-    expected: FAIL
-
-  [sRGB color]
-    expected: FAIL
-
-  [Different case for sRGB]
-    expected: FAIL
-
-  [sRGB color with unnecessary decimals]
-    expected: FAIL
-
-  [sRGB white with 0.5 alpha]
-    expected: FAIL
-
-  [sRGB white with 0 alpha]
-    expected: FAIL
-
-  [sRGB white with 50% alpha]
-    expected: FAIL
-
-  [sRGB white with 0% alpha]
-    expected: FAIL
-
-  [One missing component is 0]
-    expected: FAIL
-
-  [Two missing components are 0]
-    expected: FAIL
-
-  [All components missing]
-    expected: FAIL
-
-  [Display P3 color]
-    expected: FAIL
-
-  [Different case for Display P3]
-    expected: FAIL
-
-  [Unknown color space should fallback]
-    expected: FAIL
-
-  [sRGB color with negative component should clamp to 0]
-    expected: FAIL
-
-  [sRGB color with component > 1 should clamp]
-    expected: FAIL
-
-  [Display P3 color with negative component should clamp to 0]
-    expected: FAIL
-
-  [Display P3 color with component > 1 should clamp]
-    expected: FAIL
-
-  [Alpha > 1 should clamp]
-    expected: FAIL
-
-  [Negative alpha should clamp]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-pseudo/first-letter-property-whitelist.html.ini
+++ /dev/null
@@ -1,37 +0,0 @@
-[first-letter-property-whitelist.html]
-  [Whitelisted property backgroundImage should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property backgroundPosition should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property border should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property borderImage should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property borderRadius should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property font should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property fontVariationSettings should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property margin should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property padding should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property opacity should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property textJustify should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
-  [Whitelisted property textUnderlinePosition should be applied to first-letter pseudo elements.]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/available-size-011.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[available-size-011.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/available-size-012.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[available-size-012.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/available-size-013.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[available-size-013.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/available-size-014.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[available-size-014.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/available-size-015.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[available-size-015.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/available-size-016.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[available-size-016.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/available-size-018.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[available-size-018.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/selectors/matches-nested.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[matches-nested.html]
-  [Test nested :matches() chooses highest specificity for class outside :matches().]
-    expected: FAIL
-
-  [Test nested :matches() specificity for class within arguments.]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/css/selectors/matches-specificity.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[matches-specificity.html]
-  [Test :matches() uses highest possible specificity]
-    expected: FAIL
-
--- a/testing/web-platform/meta/fetch/api/basic/conditional-get.html.ini
+++ b/testing/web-platform/meta/fetch/api/basic/conditional-get.html.ini
@@ -1,1 +1,2 @@
 prefs: [network.http.rcwn.enabled:false]
+[conditional-get.html]
--- a/testing/web-platform/meta/fetch/api/request/request-cache-default.html.ini
+++ b/testing/web-platform/meta/fetch/api/request/request-cache-default.html.ini
@@ -1,1 +1,2 @@
 prefs: [network.http.rcwn.enabled:false]
+[request-cache-default.html]
--- a/testing/web-platform/meta/fetch/api/request/request-cache-force-cache.html.ini
+++ b/testing/web-platform/meta/fetch/api/request/request-cache-force-cache.html.ini
@@ -1,1 +1,2 @@
 prefs: [network.http.rcwn.enabled:false]
+[request-cache-force-cache.html]
--- a/testing/web-platform/meta/fetch/api/request/request-cache-reload.html.ini
+++ b/testing/web-platform/meta/fetch/api/request/request-cache-reload.html.ini
@@ -1,1 +1,2 @@
 prefs: [network.http.rcwn.enabled:false]
+[request-cache-reload.html]
deleted file mode 100644
--- a/testing/web-platform/meta/html/editing/editing-0/contenteditable/contentEditable-slotted-inherit.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[contentEditable-slotted-inherit.html]
-  [Slotted child of contenteditable host should be editable - slot direct child of shadow root]
-    expected: FAIL
-
-  [Slotted child of contenteditable host should be editable - slot wrapped in shadow tree ancestor]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/muted-errors.sub.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[muted-errors.sub.html]
-  [Errors for cross-origin script should be muted]
-    expected: FAIL
-
-  [Errors for cross-origin script should be muted even if the script is once loaded as same-origin]
-    expected: FAIL
-
--- a/testing/web-platform/meta/html/syntax/parsing/html5lib_tests15.html.ini
+++ b/testing/web-platform/meta/html/syntax/parsing/html5lib_tests15.html.ini
@@ -6,8 +6,12 @@
     expected: FAIL
 
   [html5lib_tests15.html 8ed7e05d49dfc6701ef8325a5d9504d596d8d083]
     expected: FAIL
 
   [html5lib_tests15.html 938af694979b4eae59e7bd3ab71d76e5254192a0]
     expected: FAIL
 
+
+[html5lib_tests15.html?run_type=write]
+
+[html5lib_tests15.html?run_type=uri]
--- a/testing/web-platform/meta/intersection-observer/timestamp.html.ini
+++ b/testing/web-platform/meta/intersection-observer/timestamp.html.ini
@@ -1,1 +1,2 @@
 prefs: [privacy.reduceTimerPrecision:false]
+[timestamp.html]
--- a/testing/web-platform/meta/navigation-timing/nav2_test_redirect_server.html.ini
+++ b/testing/web-platform/meta/navigation-timing/nav2_test_redirect_server.html.ini
@@ -1,1 +1,2 @@
 prefs: [privacy.reduceTimerPrecision:false]
+[nav2_test_redirect_server.html]
--- a/testing/web-platform/meta/preload/link-header-preload-delay-onload.html.ini
+++ b/testing/web-platform/meta/preload/link-header-preload-delay-onload.html.ini
@@ -1,3 +1,3 @@
 [link-header-preload-delay-onload.html]
   disabled:
-    if os == "linux": https://bugzilla.mozilla.org/show_bug.cgi?id=1437081
+    if (os == "linux"): https://bugzilla.mozilla.org/show_bug.cgi?id=1437081
--- a/testing/web-platform/meta/requestidlecallback/basic.html.ini
+++ b/testing/web-platform/meta/requestidlecallback/basic.html.ini
@@ -1,1 +1,2 @@
 prefs: [privacy.reduceTimerPrecision:false]
+[basic.html]
--- a/testing/web-platform/meta/service-workers/service-worker/extendable-event-async-waituntil.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/extendable-event-async-waituntil.https.html.ini
@@ -1,5 +1,4 @@
 [extendable-event-async-waituntil.https.html]
   type: testharness
   [Test calling waitUntil in a different microtask without an existing extension throws]
     expected: FAIL
-
--- a/testing/web-platform/meta/service-workers/service-worker/resource-timing.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/resource-timing.https.html.ini
@@ -1,1 +1,2 @@
 prefs: [privacy.reduceTimerPrecision:false]
+[resource-timing.https.html]
--- a/testing/web-platform/meta/url/interfaces.any.js.ini
+++ b/testing/web-platform/meta/url/interfaces.any.js.ini
@@ -1,4 +1,6 @@
 [interfaces.any.html]
   [URL interface: legacy window alias]
     expected: FAIL
 
+
+[interfaces.any.worker.html]
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/createcredential-badargs-authnrselection.https.html.ini
+++ /dev/null
@@ -1,47 +0,0 @@
-[createcredential-badargs-authnrselection.https.html]
-  expected: TIMEOUT
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection is empty array]
-    expected: TIMEOUT
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection is null]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection is empty string]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection is string]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment is empty string]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment is empty object]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment is null]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment platform]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection residentKey true]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection residentKey is string]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification empty string]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification empty object]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification bad value]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification null]
-    expected: NOTRUN
-
-  [Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification required]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/createcredential-badargs-challenge.https.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[createcredential-badargs-challenge.https.html]
-  expected: TIMEOUT
-  [Bad challenge: challenge is empty ArrayBuffer]
-    expected: TIMEOUT
-
--- a/testing/web-platform/meta/webauthn/createcredential-badargs-rp.https.html.ini
+++ b/testing/web-platform/meta/webauthn/createcredential-badargs-rp.https.html.ini
@@ -1,13 +1,19 @@
 [createcredential-badargs-rp.https.html]
   expected: TIMEOUT
   [Bad rp: id is object]
     expected: FAIL
 
+  [Bad rp: id is null]
+    expected: FAIL
+
+  [Bad rp: id is empty String]
+    expected: FAIL
+
   [Bad rp: name is object]
     expected: TIMEOUT
 
   [Bad rp: name is null]
     expected: NOTRUN
 
   [Bad rp: name is empty String]
     expected: NOTRUN
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/createcredential-badargs-user.https.html.ini
+++ /dev/null
@@ -1,56 +0,0 @@
-[createcredential-badargs-user.https.html]
-  expected: TIMEOUT
-  [Bad user: id is empty ArrayBuffer]
-    expected: TIMEOUT
-
-  [Bad user: ArrayBuffer id is too long (65 bytes)]
-    expected: NOTRUN
-
-  [Bad user: Int16Array id is too long (66 bytes)]
-    expected: NOTRUN
-
-  [Bad user: Int32Array id is too long (68 bytes)]
-    expected: NOTRUN
-
-  [Bad user: Float32Array id is too long (68 bytes)]
-    expected: NOTRUN
-
-  [Bad user: Float64Array id is too long (72 bytes)]
-    expected: NOTRUN
-
-  [Bad user: id is too long (65 bytes)]
-    expected: NOTRUN
-
-  [user missing name]
-    expected: NOTRUN
-
-  [Bad user: name is object]
-    expected: NOTRUN
-
-  [Bad user: name is null]
-    expected: NOTRUN
-
-  [Bad user: name is empty String]
-    expected: NOTRUN
-
-  [Bad user: icon is object]
-    expected: NOTRUN
-
-  [Bad user: icon is null]
-    expected: NOTRUN
-
-  [Bad user: icon is empty String]
-    expected: NOTRUN
-
-  [Bad user: displayName is undefined]
-    expected: NOTRUN
-
-  [Bad user: displayName is object]
-    expected: NOTRUN
-
-  [Bad user: displayName is null]
-    expected: NOTRUN
-
-  [Bad user: displayName is empty String]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/createcredential-excludecredentials.https.html.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[createcredential-excludecredentials.https.html]
-  expected: TIMEOUT
-  [excludeCredentials missing]
-    expected: TIMEOUT
-
-  [excludeCredentials empty array]
-    expected: NOTRUN
-
-  [exclude existing credential]
-    expected: NOTRUN
-
-  [exclude random (non-existing) credential]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/createcredential-extensions.https.html.ini
+++ /dev/null
@@ -1,26 +0,0 @@
-[createcredential-extensions.https.html]
-  expected: TIMEOUT
-  [Bad extensions: extensions is string]
-    expected: TIMEOUT
-
-  [Bad extensions: extensions is null]
-    expected: NOTRUN
-
-  [Bad extensions: extensions is empty Array]
-    expected: NOTRUN
-
-  [Bad extensions: extensions is empty ArrayBuffer]
-    expected: NOTRUN
-
-  [Bad extensions: malformatted JSON]
-    expected: NOTRUN
-
-  [Bad extensions: JavaScript object]
-    expected: NOTRUN
-
-  [Bad extensions: extension ID too long]
-    expected: NOTRUN
-
-  [extensions is a nonsensical JSON string]
-    expected: NOTRUN
-
--- a/testing/web-platform/meta/webauthn/createcredential-passing.https.html.ini
+++ b/testing/web-platform/meta/webauthn/createcredential-passing.https.html.ini
@@ -1,119 +1,5 @@
 [createcredential-passing.https.html]
   expected: TIMEOUT
   [WebAuthn credential.create() Passing Tests]
     expected: TIMEOUT
 
-  [passing credentials.create() with default arguments]
-    expected: TIMEOUT
-
-  [passing credentials.create() with rpId (host and port)]
-    expected: NOTRUN
-
-  [passing credentials.create() with rpId (hostname)]
-    expected: NOTRUN
-
-  [passing credentials.create() without rp.icon]
-    expected: NOTRUN
-
-  [very short user id]
-    expected: NOTRUN
-
-  [max length user id]
-    expected: NOTRUN
-
-  [Uint8Array user id]
-    expected: NOTRUN
-
-  [Int8Array user id]
-    expected: NOTRUN
-
-  [Int16Array user id]
-    expected: NOTRUN
-
-  [Int32Array user id]
-    expected: NOTRUN
-
-  [Float32Array user id]
-    expected: NOTRUN
-
-  [DataView user id]
-    expected: NOTRUN
-
-  [passing credentials.create() without user.icon]
-    expected: NOTRUN
-
-  [Int16Array challenge]
-    expected: NOTRUN
-
-  [Int32Array challenge]
-    expected: NOTRUN
-
-  [Float32Array challenge]
-    expected: NOTRUN
-
-  [Float64Array challenge]
-    expected: NOTRUN
-
-  [DataView challenge]
-    expected: NOTRUN
-
-  [Absurdly large challenge]
-    expected: NOTRUN
-
-  [Bad pubKeyCredParams: pubKeyCredParams is empty Array]
-    expected: NOTRUN
-
-  [EC256 pubKeyCredParams]
-    expected: NOTRUN
-
-  [SelectEC256 pubKeyCredParams from a list]
-    expected: NOTRUN
-
-  [passing credentials.create() with no timeout]
-    expected: NOTRUN
-
-  [authenticatorSelection is undefined]
-    expected: NOTRUN
-
-  [authenticatorSelection is empty object]
-    expected: NOTRUN
-
-  [authenticatorSelection default values]
-    expected: NOTRUN
-
-  [authenticatorSelection attachment undefined]
-    expected: NOTRUN
-
-  [authenticatorSelection residentKey undefined]
-    expected: NOTRUN
-
-  [authenticatorSelection residentKey false]
-    expected: NOTRUN
-
-  [authenticatorSelection userVerification undefined]
-    expected: NOTRUN
-
-  [authenticatorSelection userVerification discouraged]
-    expected: NOTRUN
-
-  [attestation parameter: attestation is "none"]
-    expected: NOTRUN
-
-  [attestation parameter: attestation is "indirect"]
-    expected: NOTRUN
-
-  [attestation parameter: attestation is "direct"]
-    expected: NOTRUN
-
-  [attestation parameter: attestation is undefined]
-    expected: NOTRUN
-
-  [extensions undefined]
-    expected: NOTRUN
-
-  [extensions are empty object]
-    expected: NOTRUN
-
-  [extensions are dict of empty strings]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/createcredential-timeout.https.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[createcredential-timeout.https.html]
-  [ensure create credential times out]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/getcredential-badargs-rpid.https.html.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-[getcredential-badargs-rpid.https.html]
-  expected: TIMEOUT
-  [Bad rpId: empty string]
-    expected: TIMEOUT
-
-  [Bad rpId: null]
-    expected: NOTRUN
-
-  [Bad rpId: invalid domain (has space)]
-    expected: NOTRUN
-
-  [Bad rpId: invalid domain (starts with dash)]
-    expected: NOTRUN
-
-  [Bad rpId: invalid domain (starts with number)]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/getcredential-badargs-userverification.https.html.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-[getcredential-badargs-userverification.https.html]
-  expected: TIMEOUT
-  [Bad userVerification: empty string]
-    expected: TIMEOUT
-
-  [Bad userVerification: empty object]
-    expected: NOTRUN
-
-  [Bad userVerification: bad value]
-    expected: NOTRUN
-
-  [Bad userVerification: null]
-    expected: NOTRUN
-
-  [Bad userVerification: "required"]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/getcredential-extensions.https.html.ini
+++ /dev/null
@@ -1,26 +0,0 @@
-[getcredential-extensions.https.html]
-  expected: TIMEOUT
-  [Bad extensions: extensions is string]
-    expected: TIMEOUT
-
-  [Bad extensions: extensions is null]
-    expected: NOTRUN
-
-  [Bad extensions: extensions is empty Array]
-    expected: NOTRUN
-
-  [Bad extensions: extensions is empty ArrayBuffer]
-    expected: NOTRUN
-
-  [Bad extensions: malformatted JSON]
-    expected: NOTRUN
-
-  [Bad extensions: JavaScript object]
-    expected: NOTRUN
-
-  [Bad extensions: extension ID too long]
-    expected: NOTRUN
-
-  [extensions is a nonsensical JSON string]
-    expected: NOTRUN
-
--- a/testing/web-platform/meta/webauthn/getcredential-passing.https.html.ini
+++ b/testing/web-platform/meta/webauthn/getcredential-passing.https.html.ini
@@ -1,38 +1,2 @@
 [getcredential-passing.https.html]
   expected: TIMEOUT
-  [passing credentials.get() with default args]
-    expected: TIMEOUT
-
-  [passing credentials.create() with no timeout]
-    expected: NOTRUN
-
-  [rpId undefined]
-    expected: NOTRUN
-
-  [passing credentials.get() with rpId (host and port)]
-    expected: NOTRUN
-
-  [passing credentials.get() with rpId (hostname)]
-    expected: NOTRUN
-
-  [no credential specified]
-    expected: NOTRUN
-
-  [authenticatorSelection userVerification undefined]
-    expected: NOTRUN
-
-  [authenticatorSelection userVerification preferred]
-    expected: NOTRUN
-
-  [authenticatorSelection userVerification discouraged]
-    expected: NOTRUN
-
-  [extensions undefined]
-    expected: NOTRUN
-
-  [extensions are empty object]
-    expected: NOTRUN
-
-  [extensions are dict of empty strings]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/getcredential-timeout.https.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[getcredential-timeout.https.html]
-  expected: TIMEOUT
-  [ensure create credential times out]
-    expected: TIMEOUT
-
--- a/testing/web-platform/meta/webdriver/tests/navigation/current_url.py.ini
+++ b/testing/web-platform/meta/webdriver/tests/navigation/current_url.py.ini
@@ -1,3 +1,3 @@
 [current_url.py]
   disabled:
-    if os == "linux": https://bugzilla.mozilla.org/show_bug.cgi?id=1429391
+    if (os == "linux"): https://bugzilla.mozilla.org/show_bug.cgi?id=1429391
--- a/testing/web-platform/meta/websockets/constructor/014.html.ini
+++ b/testing/web-platform/meta/websockets/constructor/014.html.ini
@@ -1,4 +1,6 @@
 [014.html]
   disabled:
     if (os == "win") and (version == "5.1.2600"): https://bugzilla.mozilla.org/show_bug.cgi?id=1090198
     if e10s and debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1090198
+
+[014.html?wss]
--- a/testing/web-platform/meta/websockets/cookies/006.html.ini
+++ b/testing/web-platform/meta/websockets/cookies/006.html.ini
@@ -1,4 +1,6 @@
 [006.html?wss]
   [WebSockets: setting Secure cookie with document.cookie, checking ws request]
     expected: FAIL
 
+
+[006.html]
--- a/testing/web-platform/meta/workers/WorkerPerformanceNow.html.ini
+++ b/testing/web-platform/meta/workers/WorkerPerformanceNow.html.ini
@@ -1,1 +1,2 @@
 prefs: [privacy.reduceTimerPrecision:false]
+[WorkerPerformanceNow.html]
--- a/testing/web-platform/meta/workers/semantics/navigation/002.html.ini
+++ b/testing/web-platform/meta/workers/semantics/navigation/002.html.ini
@@ -1,1 +1,2 @@
 prefs: [privacy.reduceTimerPrecision:false]
+[002.html]
--- a/testing/web-platform/tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html
+++ b/testing/web-platform/tests/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html
@@ -3,36 +3,41 @@
 <title>Canvas test: 2d.drawImage.zerocanvas</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/common/canvas-tests.js"></script>
 <link rel="stylesheet" href="/common/canvas-tests.css">
 <body class="show_output">
 
 <h1>2d.drawImage.zerocanvas</h1>
-<p class="desc">drawImage with zero-sized canvas as the source shoud throw exception</p>
+<p class="desc"></p>
 
 
 <p class="output">Actual output:</p>
 <canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
 <ul id="d"></ul>
 <script>
-var t = async_test("drawImage with zero-sized canvas as the source shoud throw exception");
+var t = async_test("");
 _addTest(function(canvas, ctx) {
 
+ctx.fillStyle = '#0f0';
+ctx.fillRect(0, 0, 100, 50);
+
 var canvas2 = document.createElement('canvas');
 canvas2.width = 0;
-canvas2.height = 50;
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(canvas2, 0, 0); });
+canvas2.height = 10;
+ctx.drawImage(canvas2, 0, 0);
 
-canvas2.width = 50;
+canvas2.width = 10;
 canvas2.height = 0;
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(canvas2, 0, 0); });
+ctx.drawImage(canvas2, 0, 0);
 
 canvas2.width = 0;
 canvas2.height = 0;
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(canvas2, 0, 0); });
+ctx.drawImage(canvas2, 0, 0);
+
+_assertPixelApprox(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2);
 
 
 });
 </script>
 
--- a/testing/web-platform/tests/2dcontext/tools/spec.yaml
+++ b/testing/web-platform/tests/2dcontext/tools/spec.yaml
@@ -581,17 +581,17 @@ assertions:
     text: "void drawImage(in HTMLVideoElement image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);<^>"
   - id: 2d.drawImage.incomplete.image
     text: "If the image argument is an HTMLImageElement object that is not fully decodable<^><...> then the implementation *must* return without drawing anything."
   - id: 2d.drawImage.incomplete.video
     previously: [ 6, "dw and dh" ]
     text: "If the image argument is <...> an HTMLVideoElement object whose readyState attribute is either HAVE_NOTHING or HAVE_METADATA<^>, then the implementation *must* return without drawing anything."
   - id: 2d.drawImage.zerocanvas
     previously: [ 10, "dw and dh" ]
-    text: "If the image argument is an HTMLCanvasElement or an OffscreenCanvas object with either a horizontal dimension or a vertical dimension equal to zero, then the implementation *must* throw an INVALID_STATE_ERR exception<^>."
+    text: "If the image argument is an HTMLCanvasElement object with either a horizontal dimension or a vertical dimension equal to zero, then the implementation *must* return without drawing anything<^>."
   - id: 2d.drawImage.zerosource
     text: "If one of the sw or sh arguments is zero<^>, the implementation *must* return without drawing anything."
   - id: 2d.drawImage.paint
     text: "When drawImage() is invoked, the region of the image specified by the source rectangle *must* be painted on the region of the canvas specified by the destination rectangle<^>, after applying the current transformation matrix to the points of the destination rectangle."
   - id: 2d.drawImage.original
     text: "The original image data of the source image *must* be used, not the image as it is rendered (e.g. width and height attributes on the source element have no effect)<^>."
   - id: 2d.drawImage.direction
     text: "The image data *must* be processed in the original direction, even if the dimensions given are negative<^>."
--- a/testing/web-platform/tests/2dcontext/tools/tests2d.yaml
+++ b/testing/web-platform/tests/2dcontext/tools/tests2d.yaml
@@ -8997,32 +8997,37 @@
     ctx.fillStyle = '#0f0';
     ctx.fillRect(0, 0, 100, 50);
     var img = document.getElementById('broken.png');
     ctx.drawImage(img, 0, 0);
     @assert pixel 50,25 ==~ 0,255,0,255; @moz-todo
   expected: green
 
 - name: 2d.drawImage.zerocanvas
-  desc: drawImage with zero-sized canvas as the source shoud throw exception
   testing:
     - 2d.drawImage.zerocanvas
   code: |
+    ctx.fillStyle = '#0f0';
+    ctx.fillRect(0, 0, 100, 50);
+
     var canvas2 = document.createElement('canvas');
     canvas2.width = 0;
-    canvas2.height = 50;
-    @assert throws INVALID_STATE_ERR ctx.drawImage(canvas2, 0, 0);
-
-    canvas2.width = 50;
+    canvas2.height = 10;
+    ctx.drawImage(canvas2, 0, 0);
+
+    canvas2.width = 10;
     canvas2.height = 0;
-    @assert throws INVALID_STATE_ERR ctx.drawImage(canvas2, 0, 0);
+    ctx.drawImage(canvas2, 0, 0);
 
     canvas2.width = 0;
     canvas2.height = 0;
-    @assert throws INVALID_STATE_ERR ctx.drawImage(canvas2, 0, 0);
+    ctx.drawImage(canvas2, 0, 0);
+
+    @assert pixel 50,25 ==~ 0,255,0,255;
+  expected: green
 
 - name: 2d.drawImage.svg
   desc: drawImage() of an SVG image
   testing:
     - 2d.drawImage.svg
   images:
     - green.svg
   code: |
deleted file mode 100644
--- a/testing/web-platform/tests/IndexedDB/interleaved-cursors-common.js
+++ /dev/null
@@ -1,188 +0,0 @@
-// Infrastructure shared by interleaved-cursors-{small,large}.html
-
-// Number of objects that each iterator goes over.
-const itemCount = 10;
-
-// Ratio of small objects to large objects.
-const largeObjectRatio = 5;
-
-// Size of large objects. This should exceed the size of a block in the storage
-// method underlying the browser's IndexedDB implementation. For example, this
-// needs to exceed the LevelDB block size on Chrome, and the SQLite block size
-// on Firefox.
-const largeObjectSize = 48 * 1024;
-
-function objectKey(cursorIndex, itemIndex) {
-  return `${cursorIndex}-key-${itemIndex}`;
-}
-
-function objectValue(cursorIndex, itemIndex) {
-  if ((cursorIndex * itemCount + itemIndex) % largeObjectRatio === 0) {
-    // We use a typed array (as opposed to a string) because IndexedDB
-    // implementations may serialize strings using UTF-8 or UTF-16, yielding
-    // larger IndexedDB entries than we'd expect. It's very unlikely that an
-    // IndexedDB implementation would use anything other than the raw buffer to
-    // serialize a typed array.
-    const buffer = new Uint8Array(largeObjectSize);
-
-    // Some IndexedDB implementations, like LevelDB, compress their data blocks
-    // before storing them to disk. We use a simple 32-bit xorshift PRNG, which
-    // should be sufficient to foil any fast generic-purpose compression scheme.
-
-    // 32-bit xorshift - the seed can't be zero
-    let state = 1000 + (cursorIndex * itemCount + itemIndex);
-
-    for (let i = 0; i < largeObjectSize; ++i) {
-      state ^= state << 13;
-      state ^= state >> 17;
-      state ^= state << 5;
-      buffer[i] = state & 0xff;
-    }
-
-    return buffer;
-  }
-  return [cursorIndex, 'small', itemIndex];
-}
-
-// Writes the objects to be read by one cursor. Returns a promise that resolves
-// when the write completes.
-//
-// We want to avoid creating a large transaction, because that is outside the
-// test's scope, and it's a bad practice. So we break up the writes across
-// multiple transactions. For simplicity, each transaction writes all the
-// objects that will be read by a cursor.
-function writeCursorObjects(database, cursorIndex) {
-  return new Promise((resolve, reject) => {
-    const transaction = database.transaction('cache', 'readwrite');
-    transaction.onabort = () => { reject(transaction.error); };
-
-    const store = transaction.objectStore('cache');
-    for (let i = 0; i < itemCount; ++i) {
-      store.put({
-          key: objectKey(cursorIndex, i), value: objectValue(cursorIndex, i)});
-    }
-    transaction.oncomplete = resolve;
-  });
-}
-
-// Returns a promise that resolves when the store has been populated.
-function populateTestStore(testCase, database, cursorCount) {
-  let promiseChain = Promise.resolve();
-
-  for (let i = 0; i < cursorCount; ++i)
-    promiseChain = promiseChain.then(() => writeCursorObjects(database, i));
-
-  return promiseChain;
-}
-
-// Reads cursors in an interleaved fashion, as shown below.
-//
-// Given N cursors, each of which points to the beginning of a K-item sequence,
-// the following accesses will be made.
-//
-// OC(i)    = open cursor i
-// RD(i, j) = read result of cursor i, which should be at item j
-// CC(i)    = continue cursor i
-// |        = wait for onsuccess on the previous OC or CC
-//
-// OC(1)            | RD(1, 1) OC(2) | RD(2, 1) OC(3) | ... | RD(n-1, 1) CC(n) |
-// RD(n, 1)   CC(1) | RD(1, 2) CC(2) | RD(2, 2) CC(3) | ... | RD(n-1, 2) CC(n) |
-// RD(n, 2)   CC(1) | RD(1, 3) CC(2) | RD(2, 3) CC(3) | ... | RD(n-1, 3) CC(n) |
-// ...
-// RD(n, k-1) CC(1) | RD(1, k) CC(2) | RD(2, k) CC(3) | ... | RD(n-1, k) CC(n) |
-// RD(n, k)           done
-function interleaveCursors(testCase, store, cursorCount) {
-  return new Promise((resolve, reject) => {
-    // The cursors used for iteration are stored here so each cursor's onsuccess
-    // handler can call continue() on the next cursor.
-    const cursors = [];
-
-    // The results of IDBObjectStore.openCursor() calls are stored here so we
-    // we can change the requests' onsuccess handler after every
-    // IDBCursor.continue() call.
-    const requests = [];
-
-    const checkCursorState = (cursorIndex, itemIndex) => {
-      const cursor = cursors[cursorIndex];
-      assert_equals(cursor.key, objectKey(cursorIndex, itemIndex));
-      assert_equals(cursor.value.key, objectKey(cursorIndex, itemIndex));
-      assert_equals(
-          cursor.value.value.join('-'),
-          objectValue(cursorIndex, itemIndex).join('-'));
-    };
-
-    const openCursor = (cursorIndex, callback) => {
-      const request = store.openCursor(
-          IDBKeyRange.lowerBound(objectKey(cursorIndex, 0)));
-      requests[cursorIndex] = request;
-
-      request.onsuccess = testCase.step_func(() => {
-        const cursor = request.result;
-        cursors[cursorIndex] = cursor;
-        checkCursorState(cursorIndex, 0);
-        callback();
-      });
-      request.onerror = event => reject(request.error);
-    };
-
-    const readItemFromCursor = (cursorIndex, itemIndex, callback) => {
-      const request = requests[cursorIndex];
-      request.onsuccess = testCase.step_func(() => {
-        const cursor = request.result;
-        cursors[cursorIndex] = cursor;
-        checkCursorState(cursorIndex, itemIndex);
-        callback();
-      });
-
-      const cursor = cursors[cursorIndex];
-      cursor.continue();
-    };
-
-    // We open all the cursors one at a time, then cycle through the cursors and
-    // call continue() on each of them. This access pattern causes maximal
-    // trashing to an LRU cursor cache. Eviction scheme aside, any cache will
-    // have to evict some cursors, and this access pattern verifies that the
-    // cache correctly restores the state of evicted cursors.
-    const steps = [];
-    for (let cursorIndex = 0; cursorIndex < cursorCount; ++cursorIndex)
-      steps.push(openCursor.bind(null, cursorIndex));
-    for (let itemIndex = 1; itemIndex < itemCount; ++itemIndex) {
-      for (let cursorIndex = 0; cursorIndex < cursorCount; ++cursorIndex)
-        steps.push(readItemFromCursor.bind(null, cursorIndex, itemIndex));
-    }
-
-    const runStep = (stepIndex) => {
-      if (stepIndex === steps.length) {
-        resolve();
-        return;
-      }
-      steps[stepIndex](() => { runStep(stepIndex + 1); });
-    };
-    runStep(0);
-  });
-}
-
-function cursorTest(cursorCount) {
-  promise_test(testCase => {
-    return createDatabase(testCase, (database, transaction) => {
-      const store = database.createObjectStore('cache',
-          { keyPath: 'key', autoIncrement: true });
-    }).then(database => {
-      return populateTestStore(testCase, database, cursorCount).then(
-          () => database);
-    }).then(database => {
-      database.close();
-    }).then(() => {
-      return openDatabase(testCase);
-    }).then(database => {
-      const transaction = database.transaction('cache', 'readonly');
-      transaction.onabort = () => { reject(transaction.error); };
-
-      const store = transaction.objectStore('cache');
-      return interleaveCursors(testCase, store, cursorCount).then(
-          () => database);
-    }).then(database => {
-      database.close();
-    });
-  }, `${cursorCount} cursors`);
-}
deleted file mode 100644
--- a/testing/web-platform/tests/IndexedDB/interleaved-cursors-large.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<meta name="timeout" content="long">
-<title>IndexedDB: Interleaved iteration of multiple cursors</title>
-<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="support-promises.js"></script>
-<script src="interleaved-cursors-common.js"></script>
-<script>
-cursorTest(250);
-</script>
deleted file mode 100644
--- a/testing/web-platform/tests/IndexedDB/interleaved-cursors-small.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<meta name="timeout" content="long">
-<title>IndexedDB: Interleaved iteration of multiple cursors</title>
-<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="support-promises.js"></script>
-<script src="interleaved-cursors-common.js"></script>
-<script>
-cursorTest(1);
-cursorTest(10);
-cursorTest(100);
-</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/IndexedDB/interleaved-cursors.html
@@ -0,0 +1,196 @@
+<!doctype html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<title>IndexedDB: Interleaved iteration of multiple cursors</title>
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+// Number of objects that each iterator goes over.
+const itemCount = 10;
+
+// Ratio of small objects to large objects.
+const largeObjectRatio = 5;
+
+// Size of large objects. This should exceed the size of a block in the storage
+// method underlying the browser's IndexedDB implementation. For example, this
+// needs to exceed the LevelDB block size on Chrome, and the SQLite block size
+// on Firefox.
+const largeObjectSize = 48 * 1024;
+
+function objectKey(cursorIndex, itemIndex) {
+  return `${cursorIndex}-key-${itemIndex}`;
+}
+
+function objectValue(cursorIndex, itemIndex) {
+  if ((cursorIndex * itemCount + itemIndex) % largeObjectRatio === 0) {
+    // We use a typed array (as opposed to a string) because IndexedDB
+    // implementations may serialize strings using UTF-8 or UTF-16, yielding
+    // larger IndexedDB entries than we'd expect. It's very unlikely that an
+    // IndexedDB implementation would use anything other than the raw buffer to
+    // serialize a typed array.
+    const buffer = new Uint8Array(largeObjectSize);
+
+    // Some IndexedDB implementations, like LevelDB, compress their data blocks
+    // before storing them to disk. We use a simple 32-bit xorshift PRNG, which
+    // should be sufficient to foil any fast generic-purpose compression scheme.
+
+    // 32-bit xorshift - the seed can't be zero
+    let state = 1000 + (cursorIndex * itemCount + itemIndex);
+
+    for (let i = 0; i < largeObjectSize; ++i) {
+      state ^= state << 13;
+      state ^= state >> 17;
+      state ^= state << 5;
+      buffer[i] = state & 0xff;
+    }
+
+    return buffer;
+  }
+  return [cursorIndex, 'small', itemIndex];
+}
+
+// Writes the objects to be read by one cursor. Returns a promise that resolves
+// when the write completes.
+//
+// We want to avoid creating a large transaction, because that is outside the
+// test's scope, and it's a bad practice. So we break up the writes across
+// multiple transactions. For simplicity, each transaction writes all the
+// objects that will be read by a cursor.
+function writeCursorObjects(database, cursorIndex) {
+  return new Promise((resolve, reject) => {
+    const transaction = database.transaction('cache', 'readwrite');
+    transaction.onabort = () => { reject(transaction.error); };
+
+    const store = transaction.objectStore('cache');
+    for (let i = 0; i < itemCount; ++i) {
+      store.put({
+          key: objectKey(cursorIndex, i), value: objectValue(cursorIndex, i)});
+    }
+    transaction.oncomplete = resolve;
+  });
+}
+
+// Returns a promise that resolves when the store has been populated.
+function populateTestStore(testCase, database, cursorCount) {
+  let promiseChain = Promise.resolve();
+
+  for (let i = 0; i < cursorCount; ++i)
+    promiseChain = promiseChain.then(() => writeCursorObjects(database, i));
+
+  return promiseChain;
+}
+
+// Reads cursors in an interleaved fashion, as shown below.
+//
+// Given N cursors, each of which points to the beginning of a K-item sequence,
+// the following accesses will be made.
+//
+// OC(i)    = open cursor i
+// RD(i, j) = read result of cursor i, which should be at item j
+// CC(i)    = continue cursor i
+// |        = wait for onsuccess on the previous OC or CC
+//
+// OC(1)            | RD(1, 1) OC(2) | RD(2, 1) OC(3) | ... | RD(n-1, 1) CC(n) |
+// RD(n, 1)   CC(1) | RD(1, 2) CC(2) | RD(2, 2) CC(3) | ... | RD(n-1, 2) CC(n) |
+// RD(n, 2)   CC(1) | RD(1, 3) CC(2) | RD(2, 3) CC(3) | ... | RD(n-1, 3) CC(n) |
+// ...
+// RD(n, k-1) CC(1) | RD(1, k) CC(2) | RD(2, k) CC(3) | ... | RD(n-1, k) CC(n) |
+// RD(n, k)           done
+function interleaveCursors(testCase, store, cursorCount) {
+  return new Promise((resolve, reject) => {
+    // The cursors used for iteration are stored here so each cursor's onsuccess
+    // handler can call continue() on the next cursor.
+    const cursors = [];
+
+    // The results of IDBObjectStore.openCursor() calls are stored here so we
+    // we can change the requests' onsuccess handler after every
+    // IDBCursor.continue() call.
+    const requests = [];
+
+    const checkCursorState = (cursorIndex, itemIndex) => {
+      const cursor = cursors[cursorIndex];
+      assert_equals(cursor.key, objectKey(cursorIndex, itemIndex));
+      assert_equals(cursor.value.key, objectKey(cursorIndex, itemIndex));
+      assert_equals(
+          cursor.value.value.join('-'),
+          objectValue(cursorIndex, itemIndex).join('-'));
+    };
+
+    const openCursor = (cursorIndex, callback) => {
+      const request = store.openCursor(
+          IDBKeyRange.lowerBound(objectKey(cursorIndex, 0)));
+      requests[cursorIndex] = request;
+
+      request.onsuccess = testCase.step_func(() => {
+        const cursor = request.result;
+        cursors[cursorIndex] = cursor;
+        checkCursorState(cursorIndex, 0);
+        callback();
+      });
+      request.onerror = event => reject(request.error);
+    };
+
+    const readItemFromCursor = (cursorIndex, itemIndex, callback) => {
+      const request = requests[cursorIndex];
+      request.onsuccess = testCase.step_func(() => {
+        const cursor = request.result;
+        cursors[cursorIndex] = cursor;
+        checkCursorState(cursorIndex, itemIndex);
+        callback();
+      });
+
+      const cursor = cursors[cursorIndex];
+      cursor.continue();
+    };
+
+    // We open all the cursors one at a time, then cycle through the cursors and
+    // call continue() on each of them. This access pattern causes maximal
+    // trashing to an LRU cursor cache. Eviction scheme aside, any cache will
+    // have to evict some cursors, and this access pattern verifies that the
+    // cache correctly restores the state of evicted cursors.
+    const steps = [];
+    for (let cursorIndex = 0; cursorIndex < cursorCount; ++cursorIndex)
+      steps.push(openCursor.bind(null, cursorIndex));
+    for (let itemIndex = 1; itemIndex < itemCount; ++itemIndex) {
+      for (let cursorIndex = 0; cursorIndex < cursorCount; ++cursorIndex)
+        steps.push(readItemFromCursor.bind(null, cursorIndex, itemIndex));
+    }
+
+    const runStep = (stepIndex) => {
+      if (stepIndex === steps.length) {
+        resolve();
+        return;
+      }
+      steps[stepIndex](() => { runStep(stepIndex + 1); });
+    };
+    runStep(0);
+  });
+}
+
+for (let cursorCount of [1, 10, 100, 500]) {
+  promise_test(testCase => {
+    return createDatabase(testCase, (database, transaction) => {
+      const store = database.createObjectStore('cache',
+          { keyPath: 'key', autoIncrement: true });
+    }).then(database => {
+      return populateTestStore(testCase, database, cursorCount).then(
+          () => database);
+    }).then(database => {
+      database.close();
+    }).then(() => {
+      return openDatabase(testCase);
+    }).then(database => {
+      const transaction = database.transaction('cache', 'readonly');
+      transaction.onabort = () => { reject(transaction.error); };
+
+      const store = transaction.objectStore('cache');
+      return interleaveCursors(testCase, store, cursorCount).then(
+          () => database);
+    }).then(database => {
+      database.close();
+    });
+  }, `${cursorCount} cursors`);
+}
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/common/css-paint-tests.js
@@ -0,0 +1,18 @@
+// To make sure that we take the snapshot at the right time, we do double
+// requestAnimationFrame. In the second frame, we take a screenshot, that makes
+// sure that we already have a full frame.
+function importPaintWorkletAndTerminateTestAfterAsyncPaint(code) {
+    if (typeof CSS.paintWorklet == "undefined") {
+        takeScreenshot();
+    } else {
+        var blob = new Blob([code], {type: 'text/javascript'});
+        CSS.paintWorklet.addModule(URL.createObjectURL(blob)).then(function() {
+            requestAnimationFrame(function() {
+                requestAnimationFrame(function() {
+                    takeScreenshot();
+                });
+            });
+        });
+    }
+}
+
deleted file mode 100644
--- a/testing/web-platform/tests/common/worklet-reftest.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// To make sure that we take the snapshot at the right time, we do double
-// requestAnimationFrame. In the second frame, we take a screenshot, that makes
-// sure that we already have a full frame.
-function importWorkletAndTerminateTestAfterAsyncPaint(worklet, code) {
-    if (typeof worklet == "undefined") {
-        takeScreenshot();
-    } else {
-        var blob = new Blob([code], {type: 'text/javascript'});
-        worklet.addModule(URL.createObjectURL(blob)).then(function() {
-            requestAnimationFrame(function() {
-                requestAnimationFrame(function() {
-                    takeScreenshot();
-                });
-            });
-        });
-    }
-}
-
deleted file mode 100644
--- a/testing/web-platform/tests/compat/webkit-appearance.tentative.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html>
-<title>-webkit-appearance support</title>
-<!-- There is no spec for -webkit-appearance. It is supported in Opera, Safari,
-     Chrome, and Edge. Firefox has expressed intent to support it. -->
-<link rel="help" href="https://github.com/whatwg/compat/issues/6">
-<meta name="assert" content="This test checks for support of the -webkit-appearance CSS attribute." />
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<div id="tester"></div>
-
-<script>
-const WEBKIT_APPEARANCE_VALUES = [
-  'none',
-  'checkbox',
-  'radio',
-  'push-button',
-  'square-button',
-  'button',
-  'button-bevel',
-  'inner-spin-button',
-  'listbox',
-  'listitem',
-  'media-enter-fullscreen-button',
-  'media-exit-fullscreen-button',
-  'media-mute-button',
-  'media-play-button',
-  'media-overlay-play-button',
-  'media-toggle-closed-captions-button',
-  'media-slider',
-  'media-sliderthumb',
-  'media-volume-slider-container',
-  'media-volume-slider',
-  'media-volume-sliderthumb',
-  'media-controls-background',
-  'media-controls-fullscreen-background',
-  'media-current-time-display',
-  'media-time-remaining-display',
-  'menulist',
-  'menulist-button',
-  'menulist-text',
-  'menulist-textfield',
-  'meter',
-  'progress-bar',
-  'progress-bar-value',
-  'slider-horizontal',
-  'slider-vertical',
-  'sliderthumb-horizontal',
-  'sliderthumb-vertical',
-  'caret',
-  'searchfield',
-  'searchfield-cancel-button',
-  'textfield',
-  'textarea',
-];
-
-for (const appearance_value of WEBKIT_APPEARANCE_VALUES) {
-  test(() => {
-    const div = document.getElementById('tester');
-    div.style = `-webkit-appearance: ${appearance_value}`;
-    assert_equals(getComputedStyle(div).webkitAppearance, appearance_value);
-  });
-}
-</script>
deleted file mode 100644
--- a/testing/web-platform/tests/css/CSS2/normal-flow/margin-collapse-through-zero-height-block.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<title>Collapse bottom margin from previous sibling through zero height block to next sibling</title>
-<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
-<link rel="help" href="https://www.w3.org/TR/CSS22/box.html#collapsing-margins" title="8.3.1 Collapsing margins">
-<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
-<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
-<div style="overflow:hidden; width:200px; height:400px; background:green;">
-  <div style="margin-bottom:200px;"></div>
-  <div style="height:0;"></div>
-  <div style="height:200px; margin-top:100px; background:white;"></div>
-  <div style="height:200px; background:red;"></div>
-</div>
--- a/testing/web-platform/tests/css/css-align/content-distribution/place-content-shorthand-004.html
+++ b/testing/web-platform/tests/css/css-align/content-distribution/place-content-shorthand-004.html
@@ -43,17 +43,11 @@
     test(function() {
         checkInvalidValues("auto")
         checkInvalidValues("auto right")
         checkInvalidValues("auto auto")
         checkInvalidValues("start auto")
     }, "Verify 'auto' values are invalid");
 
     test(function() {
-        checkInvalidValues("self-start")
-        checkInvalidValues("center self-end")
-        checkInvalidValues("self-end start")
-    }, "Verify self-position values are invalid");
-
-    test(function() {
         checkInvalidValues("")
     }, "Verify empty declaration is invalid");
 </script>
--- a/testing/web-platform/tests/css/css-align/default-alignment/parse-justify-items-002.html
+++ b/testing/web-platform/tests/css/css-align/default-alignment/parse-justify-items-002.html
@@ -14,44 +14,44 @@
 container = document.createElement("div");
 element = document.createElement("div");
 container.appendChild(element);
 document.body.appendChild(container);
 
 test(function() {
     element = document.createElement("div");
     document.body.appendChild(element);
-    checkValues(element, "justifyItems", "justify-items", "", "normal");
+    checkValues(element, "justifyItems", "justify-items", "", "legacy");
 }, "Test 'initial' value when nothing is specified");
 
 test(function() {
     container.style.display = "";
-    checkInitialValues(element, "justifyItems", "justify-items", "center", "normal");
+    checkInitialValues(element, "justifyItems", "justify-items", "center", "legacy");
 }, "Test justify-items: 'initial'");
 
 test(function() {
     container.style.display = "grid";
-    checkInitialValues(element, "justifyItems", "justify-items", "safe start", "normal");
+    checkInitialValues(element, "justifyItems", "justify-items", "safe start", "legacy");
 }, "Test grid items justify-items: 'initial'");
 
 test(function() {
     container.style.display = "flex";
-    checkInitialValues(element, "justifyItems", "justify-items", "unsafe end", "normal");
+    checkInitialValues(element, "justifyItems", "justify-items", "unsafe end", "legacy");
 }, "Test flex items justify-items: 'initial'");
 
 test(function() {
     container.style.display = "";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifyItems", "justify-items", "start", "normal");
+    checkInitialValues(element, "justifyItems", "justify-items", "start", "legacy");
 }, "Test absolute positioned elements justify-items: 'initial'");
 
 test(function() {
     container.style.display = "grid";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifyItems", "justify-items", "end", "normal");
+    checkInitialValues(element, "justifyItems", "justify-items", "end", "legacy");
 }, "Test absolute positioned grid items justify-items: 'initial'");
 
 test(function() {
     container.style.display = "flex";
     element.style.position = "absolute";
-    checkInitialValues(element, "justifyItems", "justify-items", "end", "normal");
+    checkInitialValues(element, "justifyItems", "justify-items", "end", "legacy");
 }, "Test absolute positioned flex items justify-items: 'initial'");
 </script>
--- a/testing/web-platform/tests/css/css-align/default-alignment/place-items-shorthand-004.html
+++ b/testing/web-platform/tests/css/css-align/default-alignment/place-items-shorthand-004.html
@@ -32,25 +32,14 @@
         checkInvalidValues("10px left")
         checkInvalidValues("right 10%")
     }, "Verify numeric values are invalid");
 
     test(function() {
        checkInvalidValues("auto")
        checkInvalidValues("auto right")
        checkInvalidValues("auto auto")
-       checkInvalidValues("center auto")
-    }, "Verify 'auto' value is invalid.");
-
-    test(function() {
-       checkInvalidValues("legacy")
-       checkInvalidValues("legacy start")
-       checkInvalidValues("end legacy")
-       checkInvalidValues("legacy left")
-       checkInvalidValues("center legacy")
-       checkInvalidValues("start legacy center")
-    }, "Verify 'legacy' value is invalid.");
-
+    }, "Verify 'auto' value is invalid as first longhand value.");
 
     test(function() {
         checkInvalidValues("")
     }, "Verify empty declaration is invalid");
 </script>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-color/color-function-parsing.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>CSS Color 4: color() parsing</title>
-<link rel="help" href="https://drafts.csswg.org/css-color-4/#color-function">
-<meta name="assert" content="Tests basic parsing of the color function">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="test"></div>
-<script>
-    const div = document.querySelector("#test");
-    function testColorFunction(description, rule, expectedValue) {
-        test(function() {
-            div.style.color = "black";
-            div.style.color = rule;
-            assert_equals(getComputedStyle(div).color, expectedValue);
-        }, description);
-    }
-
-    testColorFunction("Basic sRGB white", "color(srgb 1 1 1)", "color(srgb 1 1 1)");
-    testColorFunction("White with lots of space", "color(    srgb         1      1 1       )", "color(srgb 1 1 1)");
-    testColorFunction("sRGB color", "color(srgb 0.25 0.5 0.75)", "color(srgb 0.25 0.5 0.75)");
-    testColorFunction("Different case for sRGB", "color(SrGb 0.25 0.5 0.75)", "color(srgb 0.25 0.5 0.75)");
-    testColorFunction("sRGB color with unnecessary decimals", "color(srgb 1.00000 0.500000 0.20)", "color(srgb 1 0.5 0.2)");
-    testColorFunction("sRGB white with 0.5 alpha", "color(srgb 1 1 1 / 0.5)", "color(srgb 1 1 1 / 0.5)");
-    testColorFunction("sRGB white with 0 alpha", "color(srgb 1 1 1 / 0)", "color(srgb 1 1 1 / 0)");
-    testColorFunction("sRGB white with 50% alpha", "color(srgb 1 1 1 / 50%)", "color(srgb 1 1 1 / 0.5)");
-    testColorFunction("sRGB white with 0% alpha", "color(srgb 1 1 1 / 0%)", "color(srgb 1 1 1 / 0)");
-    testColorFunction("One missing component is 0", "color(srgb 1 1)", "color(srgb 1 1 0)");
-    testColorFunction("Two missing components are 0", "color(srgb 1)", "color(srgb 1 0 0)");
-    testColorFunction("All components missing", "color(srgb)", "color(srgb 0 0 0)");
-    testColorFunction("Display P3 color", "color(display-p3 0.6 0.7 0.8)", "color(display-p3 0.6 0.7 0.8)");
-    testColorFunction("Different case for Display P3", "color(dIspLaY-P3 0.6 0.7 0.8)", "color(display-p3 0.6 0.7 0.8)");
-
-    testColorFunction("Unknown color space should fallback", "color(unknown 1 2 3, red)", "color(unknown 1 2 3, red)");
-
-    testColorFunction("sRGB color with negative component should clamp to 0", "color(srgb -0.25 0.5 0.75)", "color(srgb 0 0.5 0.75)");
-    testColorFunction("sRGB color with component > 1 should clamp", "color(srgb 0.25 1.5 0.75)", "color(srgb 0.25 1 0.75)");
-    testColorFunction("Display P3 color with negative component should clamp to 0", "color(display-p3 0.5 -199 0.75)", "color(display-p3 0.5 0 0.75)");
-    testColorFunction("Display P3 color with component > 1 should clamp", "color(display-p3 184 1.00001 2347329746587)", "color(display-p3 1 1 1)");
-    testColorFunction("Alpha > 1 should clamp", "color(srgb 0.1 0.2 0.3 / 1.9)", "color(srgb 0.1 0.2 0.3)");
-    testColorFunction("Negative alpha should clamp", "color(srgb 1 1 1 / -0.2)", "color(srgb 1 1 1 / 0)");
-
-    // Invalid properties
-    testColorFunction("Empty", "color()", "rgb(0, 0, 0)");
-    testColorFunction("Bad color space", "color(banana 1 1 1)", "rgb(0, 0, 0)");
-    testColorFunction("Bad Display P3 color space", "color(displayp3 1 1 1)", "rgb(0, 0, 0)");
-    testColorFunction("No color space", "color(1 1 1)", "rgb(0, 0, 0)");
-    testColorFunction("Too many parameters", "color(srgb 1 1 1 1)", "rgb(0, 0, 0)");
-    testColorFunction("Way too many parameters", "color(srgb 1 1 1 1 1)", "rgb(0, 0, 0)");
-    testColorFunction("Bad parameters", "color(srgb 1 eggs 1)", "rgb(0, 0, 0)");
-    testColorFunction("Bad alpha", "color(srgb 1 1 1 / bacon)", "rgb(0, 0, 0)");
-    testColorFunction("Junk after alpha", "color(srgb 1 1 1 / 1 cucumber)", "rgb(0, 0, 0)");
-</script>
--- a/testing/web-platform/tests/css/css-paint-api/background-image-alpha.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/background-image-alpha.https.html
@@ -16,17 +16,17 @@
 }
 
 #background {
   background-color: yellow;
   display: inline-block;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="background">
   <div id="canvas-opaque" class="container"></div>
   <div id="canvas-nonopaque" class="container"></div>
 </div>
 
 <script id="code" type="text/worklet">
 registerPaint('opaque', class {
@@ -44,12 +44,12 @@ registerPaint('nonOpaque', class {
         ctx.strokeStyle = 'blue';
         ctx.lineWidth = 4;
         ctx.strokeRect(20, 20, 60, 60);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/background-image-multiple.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/background-image-multiple.https.html
@@ -4,17 +4,17 @@
 <style>
     #output {
         width: 100px;
         height: 100px;
         background-image: paint(n0), paint(n1), paint(n2);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 var colors = ['red', 'green', 'blue'];
 
 for (let i = 0; i < 3; i++) {
     registerPaint('n' + i, class {
@@ -22,12 +22,12 @@ for (let i = 0; i < 3; i++) {
             ctx.fillStyle = colors[i];
             ctx.fillRect(i * 20, i * 20, 40, 40);
         }
     });
 }
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/background-image-tiled.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/background-image-tiled.https.html
@@ -16,29 +16,29 @@
 
     #two {
         background:
             paint(ellipse) top left/50% 20% repeat-y,
             paint(ellipse) center right/50% 50% no-repeat;
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="one"></div>
 <div id="two"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('ellipse', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.beginPath();
         ctx.rect(0, 0, geom.width, geom.height);
         ctx.fill();
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-background-image-001.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-background-image-001.https.html
@@ -8,27 +8,27 @@ html, body { margin: 0; padding: 0; }
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         ctx.strokeStyle = 'green';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-background-image-002.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-background-image-002.https.html
@@ -8,27 +8,27 @@ html, body { margin: 0; padding: 0; }
   height: 200px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         ctx.strokeStyle = 'green';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-001.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-001.https.html
@@ -9,28 +9,28 @@ html, body { margin: 0; padding: 0; }
   background: paint(geometry) top left/50% 50% repeat-x;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.beginPath();
         ctx.rect(0, 0, geom.width, geom.height);
         ctx.fill();
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-002.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-002.https.html
@@ -9,27 +9,27 @@ html, body { margin: 0; padding: 0; }
   background: paint(geometry) center right/50% 20% no-repeat;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         ctx.strokeStyle = 'green';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-003.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-background-image-tiled-003.https.html
@@ -9,27 +9,27 @@ html, body { margin: 0; padding: 0; }
   background: paint(geometry) center center/60px 80px no-repeat;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         ctx.strokeStyle = 'green';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-border-image-001.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-border-image-001.https.html
@@ -10,17 +10,17 @@ html, body { margin: 0; padding: 0; }
 
 #canvas-geometry {
   border: solid 0;
   border-image: paint(geometry);
   border-image-slice: 0 fill;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         if (geom.width == 220 && geom.height == 220)
             ctx.strokeStyle = 'green';
@@ -29,12 +29,12 @@ registerPaint('geometry', class {
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
     document.getElementById('canvas-geometry').style.borderWidth = '10px';
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-border-image-002.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-border-image-002.https.html
@@ -10,17 +10,17 @@ html, body { margin: 0; padding: 0; }
 
 #canvas-geometry {
   border: solid 0;
   border-image: paint(geometry);
   border-image-slice: 0 fill;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         if (geom.width == 90 && geom.height == 90)
             ctx.strokeStyle = 'green';
@@ -29,12 +29,12 @@ registerPaint('geometry', class {
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
     document.getElementById('canvas-geometry').style.borderImageOutset = '20px';
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-border-image-003.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-border-image-003.https.html
@@ -10,17 +10,17 @@ html, body { margin: 0; padding: 0; }
 
 #canvas-geometry {
   border: solid 0;
   border-image: paint(geometry);
   border-image-slice: 0 fill;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         if (geom.width == 80 && geom.height == 120)
             ctx.strokeStyle = 'green';
@@ -29,12 +29,12 @@ registerPaint('geometry', class {
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
     document.getElementById('canvas-geometry').style.borderImageOutset = '10px';
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-border-image-004.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-border-image-004.https.html
@@ -10,17 +10,17 @@ html, body { margin: 0; padding: 0; }
 
 #canvas-geometry {
   border: solid 0;
   border-image: paint(geometry);
   border-image-slice: 0 fill;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         if (geom.width == 140 && geom.height == 140)
             ctx.strokeStyle = 'green';
@@ -30,12 +30,12 @@ registerPaint('geometry', class {
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
     document.getElementById('canvas-geometry').style.borderWidth = '10px';
     document.getElementById('canvas-geometry').style.borderImageOutset = '10px';
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/geometry-with-float-size.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/geometry-with-float-size.https.html
@@ -7,29 +7,29 @@
   width: 100.5px;
   height: 200.5px;
 }
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     paint(ctx, geom) {
         if (geom.width == 101 && geom.height == 201)
             ctx.fillStyle = 'green';
         else
             ctx.fillStyle = 'red';
         ctx.fillRect(0, 0, 50, 50);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/hidpi/device-pixel-ratio.https.html
@@ -8,17 +8,17 @@ html, body { margin: 0; padding: 0; }
   height: 150px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <p>This test ensures that the PaintWorkletGlobalScope.devicePixelRatio returns
 the correct value, which should be identical as window.devicePixelRatio. To
 manually test, open both this file and "device-pixel-ratio-ref.html" with a
 browser, and you should see two idential green rectangles.</p>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
@@ -28,12 +28,12 @@ registerPaint('geometry', class {
         var draw_width = Math.floor(geom.width / devicePixelRatio);
         var draw_height = Math.floor(geom.height / devicePixelRatio);
         ctx.fillRect(0, 0, draw_width, draw_height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/invalid-image-constructor-error.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/invalid-image-constructor-error.https.html
@@ -4,17 +4,17 @@
 <style>
     #output {
         width: 100px;
         height: 100px;
         background-image: paint(errorIndicator), paint(successIndicator);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('errorIndicator', class {
     constructor() { throw Error('failed!'); }
     // The paint function should not be executed because an error has been
     // thrown.
@@ -28,13 +28,13 @@ registerPaint('successIndicator', class 
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(50, 50, 50, 50);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/invalid-image-paint-error.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/invalid-image-paint-error.https.html
@@ -4,17 +4,17 @@
 <style>
     #output {
         width: 100px;
         height: 100px;
         background-image: paint(errorIndicator), paint(successIndicator);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('errorIndicator', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'red';
         ctx.fillRect(0, 0, geom.width, geom.height);
@@ -25,12 +25,12 @@ registerPaint('successIndicator', class 
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/invalid-image-pending-script.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/invalid-image-pending-script.https.html
@@ -4,29 +4,29 @@
 <style>
     #output {
         width: 100px;
         height: 100px;
         background-image: paint(invalid), paint(successIndicator);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 // This is testing that even though there is no paint function registered for
 // 'invalid', it won't cause any error, and the other painter (successIndicator)
 // will paint as usual.
 registerPaint('successIndicator', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/overdraw.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/overdraw.https.html
@@ -5,26 +5,26 @@
     #output {
         width: 100px;
         height: 100px;
         background-image: paint(green);
         background-color: red;
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('green', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(-10, -10, geom.width + 20, geom.height + 20);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint-arguments.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint-arguments.https.html
@@ -16,17 +16,17 @@
 }
 
 #background {
   background-color: yellow;
   display: inline-block;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 
 <div id="background">
   <div id="canvas-box-green" class="container"></div>
   <div id="canvas-box-red" class="container"></div>
 </div>
 
 <script id="code" type="text/worklet">
@@ -38,12 +38,12 @@ registerPaint('box', class {
         ctx.lineWidth = 4;
         ctx.strokeRect(20, 20, 60, 60);
     }
 });
 
 </script>
 
 <script>
-  importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+  importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint-function-arguments.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint-function-arguments.https.html
@@ -16,17 +16,17 @@
 }
 
 #background {
   background-color: yellow;
   display: inline-block;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 
 <div id="background">
   <div id="canvas-box-1" class="container"></div>
   <div id="canvas-box-2" class="container"></div>
 </div>
 
 <script id="code" type="text/worklet">
@@ -38,12 +38,12 @@ registerPaint('box', class {
         ctx.lineWidth = args[1].toString();
         ctx.strokeRect(40, 40, 120, 120);
     }
 });
 
 </script>
 
 <script>
-  importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+  importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-composite.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-composite.https.html
@@ -14,17 +14,17 @@
     #destination-over { background-image: paint(destination-over); }
     #destination-in { background-image: paint(destination-in); }
     #destination-out { background-image: paint(destination-out); }
     #destination-atop { background-image: paint(destination-atop); }
     #lighter { background-image: paint(lighter); }
     #xor { background-image: paint(xor); }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="source-over"></div>
 <div id="source-in"></div>
 <div id="source-out"></div>
 <div id="source-atop"></div>
 <br>
 <div id="destination-over"></div>
 <div id="destination-in"></div>
@@ -62,12 +62,12 @@ function doPaint(ctx, op) {
 
 for (var i = 0; i < compositeOps.length; i++) {
     let op = compositeOps[i];
     registerPaint(op, class { paint(ctx, geom) { doPaint(ctx, op); } });
 }
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-filter.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-filter.https.html
@@ -19,17 +19,17 @@
     #filter-invert { background-image: paint(filter-invert); }
     #filter-opacity { background-image: paint(filter-opacity); }
     #filter-saturate { background-image: paint(filter-saturate); }
     #filter-sepia { background-image: paint(filter-sepia); }
     #filter-hue-rotate { background-image: paint(filter-hue-rotate); }
     #filter-url { background-image: paint(filter-url); }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="filter-none"></div>
 <div id="filter-blur-10px"></div>
 <div id="filter-blur-50vh"></div>
 <div id="filter-blur-1em"></div>
 <div id="filter-blur-2percent"></div>
 <br>
 <div id="filter-brightness"></div>
@@ -95,12 +95,12 @@ function doPaint(ctx, op) {
 
 for (var i = 0; i < filterOps.length; i++) {
   let op = filterOps[i];
   registerPaint(paintNames[i], class { paint(ctx, geom) { doPaint(ctx, op); } });
 }
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-gradient.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-gradient.https.html
@@ -4,17 +4,17 @@
 <style>
     #output {
         width: 200px;
         height: 100px;
         background-image: paint(gradients);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('gradients', class {
     paint(ctx, geom) {
         var linearGradient = ctx.createLinearGradient(0, 0, 100, 100);
         linearGradient.addColorStop(0, 'blue');
@@ -29,12 +29,12 @@ registerPaint('gradients', class {
         radialGradient.addColorStop(1, 'white');
         ctx.fillStyle = radialGradient;
         ctx.fillRect(100, 0, 100, 100);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-image.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-image.https.html
@@ -5,26 +5,26 @@
 #output {
     width: 300px;
     height: 300px;
     background-image: paint(image);
     border-image: url("./resources/html5.png");
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
     registerPaint('image', class {
         static get inputProperties() { return [ 'border-image-source' ]; };
         paint(ctx, geom, styleMap) {
             ctx.fillStyle = 'green';
             ctx.fillRect(0, 0, geom.width, geom.height);
             ctx.drawImage(styleMap.get('border-image-source'), 0, 0);
         }
     });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-paths.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-paths.https.html
@@ -4,17 +4,17 @@
 <style>
     #output {
         width: 300px;
         height: 400px;
         background-image: paint(paths);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('paths', class {
     paint(ctx, geom) {
         ctx.beginPath();
         ctx.lineWidth = '10';
@@ -37,12 +37,12 @@ registerPaint('paths', class {
         ctx.arc(75, 325, 50, 0, Math.PI * 2, true);
         ctx.arc(75, 325, 20, 0, Math.PI * 2, true);
         ctx.fill('evenodd');
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-rects.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-rects.https.html
@@ -5,17 +5,17 @@
     #output {
         width: 100px;
         height: 100px;
         background-image: paint(rects);
         background-color: blue;
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('rects', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(0, 0, geom.width, geom.height);
@@ -25,12 +25,12 @@ registerPaint('rects', class {
         ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(20, 20, 60, 60);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-shadows.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-shadows.https.html
@@ -4,17 +4,17 @@
 <style>
     #output {
         width: 200px;
         height: 100px;
         background-image: paint(shadows);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('shadows', class {
     paint(ctx, geom) {
         ctx.shadowColor = 'black';
         ctx.shadowOffsetY = 10;
@@ -28,12 +28,12 @@ registerPaint('shadows', class {
         ctx.shadowOffsetY = 5;
         ctx.fillStyle = 'green';
         ctx.fillRect(110, 10, 50, 50);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/paint2d-transform.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/paint2d-transform.https.html
@@ -4,17 +4,17 @@
 <style>
     #output {
         width: 200px;
         height: 200px;
         background-image: paint(transform);
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('transform', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.transform(1, 0.5, 0, 1, 20, 20);
@@ -27,12 +27,12 @@ registerPaint('transform', class {
         ctx.rotate(60 * Math.PI / 180);
         ctx.scale(1.5, 1);
         ctx.fillRect(0, 0, 50, 50);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-001.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-001.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo', class {
         static get inputArguments() {
@@ -37,12 +37,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-002.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-002.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo1', class {
         static get inputArguments() {
@@ -37,12 +37,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-003.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-003.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo2', class {
         static get inputArguments() {
@@ -37,12 +37,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-004.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-004.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo3', class {
         static get inputArguments() {
@@ -38,12 +38,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-005.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-005.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo', class { paint() { } });
     registerPaint('foo', class { paint() { } });
@@ -34,12 +34,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-006.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-006.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('', class { });
 } catch(ex) {
@@ -33,12 +33,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-007.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-007.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo3', class {
         static get inputProperties() {
@@ -37,12 +37,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-008.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-008.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo4', class {
         static get inputProperties() {
@@ -37,12 +37,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-009.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-009.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     var a = function() { };
     a.prototype = undefined;
@@ -35,12 +35,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-010.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-010.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     var b = function() { };
     b.prototype = 42;
@@ -35,12 +35,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-011.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-011.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo7', class { });
 } catch(ex) {
@@ -33,12 +33,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-012.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-012.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo8', class {
         get paint() {
@@ -37,12 +37,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-013.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-013.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo9', class { paint() { } });
     testsPassed = true;
@@ -33,12 +33,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-014.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-014.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     var c = function() { };
     c.prototype.paint = function() { };
@@ -35,12 +35,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-015.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-015.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo11', class {
         static get inputProperties() {
@@ -38,12 +38,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-016.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-016.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo12', class {
         static get contextOptions() {
@@ -37,12 +37,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-017.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-017.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo13', class {
         static get contextOptions() { return {alpha: true}; }
@@ -36,12 +36,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-018.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-018.https.html
@@ -8,17 +8,17 @@
 }
 
 #canvas-geometry {
     border:1px solid black;
     background-image: paint(failureIndicator), paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <p>This test result should show a rect with black border, where the rect is
 filled with green on the lower right corner. The registerPaint('failureIndicator')
 will be called twice and the inputArguments will return two different strings,
 which will throw an exception and the paint function with 'failureIndicator'
 should never be called. In other words, there should be no red painted in the result.</p>
 <div id="canvas-geometry" class="container"></div>
 
@@ -58,12 +58,12 @@ registerPaint('geometry', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(50, 50, 50, 50);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-019.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-019.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo', class {
         static get contextOptions() { return {alpha: 42}; }
@@ -36,12 +36,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-020.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-020.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo', class {
         paint() {}
@@ -35,12 +35,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-021.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-021.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo', class {
         // Setting anything other than alpha should not throw exception, and
@@ -38,12 +38,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-022.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/parse-input-arguments-022.https.html
@@ -7,17 +7,17 @@
   height: 100px;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 var testsPassed = false;
 try {
     registerPaint('foo', class {
         static get contextOptions() { return null; }
@@ -36,12 +36,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'red';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/registered-properties-in-custom-paint.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/registered-properties-in-custom-paint.https.html
@@ -9,17 +9,17 @@
   --number: 10;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     static get inputProperties() {
         return [
             '--length',
@@ -51,12 +51,12 @@ registerPaint('geometry', class {
     }
 });
 </script>
 
 <script>
     CSS.registerProperty({name: '--length', syntax: '<length>', initialValue: '0px'});
     CSS.registerProperty({name: '--length-initial', syntax: '<length>', initialValue: '20px'});
     CSS.registerProperty({name: '--number', syntax: '<number>', initialValue: '0'});
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/style-background-image.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/style-background-image.https.html
@@ -9,17 +9,17 @@
   --foo: bar;
 }
 
 #canvas-geometry {
   background-image: paint(geometry);
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="canvas-geometry" class="container"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     static get inputProperties() {
         return [
             '--bar',
@@ -51,12 +51,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'cyan';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/style-before-pseudo.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/style-before-pseudo.https.html
@@ -13,17 +13,17 @@ div::before {
     color: rgba(0, 0, 0, 0);
 
     background-image: paint(geometry);
     border-radius: 2px;
     --foo: bar;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body style="font: 10px/1 Ahem;">
 <div></div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     static get inputProperties() {
         return [
             '--bar',
@@ -52,12 +52,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'yellow';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/style-first-letter-pseudo.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/style-first-letter-pseudo.https.html
@@ -10,17 +10,17 @@ div {
 
 div::first-letter {
     background-image: paint(geometry);
     color: rgb(255, 0, 0);
     line-height: 2px;
 }
 </style>
 <script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body style="font: 10px/1 Ahem;">
 <div>ppp</div>
 
 <script id="code" type="text/worklet">
 registerPaint('geometry', class {
     static get inputProperties() {
         return [
             'color',
@@ -46,12 +46,12 @@ registerPaint('geometry', class {
             ctx.strokeStyle = 'blue';
         ctx.lineWidth = 4;
         ctx.strokeRect(0, 0, geom.width, geom.height);
     }
 });
 </script>
 
 <script>
-    importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, document.getElementById('code').textContent);
+    importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-paint-api/valid-image-after-load.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/valid-image-after-load.https.html
@@ -4,16 +4,17 @@
 <style>
     #output {
         width: 100px;
         height: 100px;
         background-color: red;
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('green', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(0, 0, geom.width, geom.height);
--- a/testing/web-platform/tests/css/css-paint-api/valid-image-before-load.https.html
+++ b/testing/web-platform/tests/css/css-paint-api/valid-image-before-load.https.html
@@ -4,16 +4,17 @@
 <style>
     #output {
         width: 100px;
         height: 100px;
         background-color: red;
     }
 </style>
 <script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
 <body>
 <div id="output"></div>
 
 <script id="code" type="text/worklet">
 registerPaint('green', class {
     paint(ctx, geom) {
         ctx.fillStyle = 'green';
         ctx.fillRect(0, 0, geom.width, geom.height);
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-pseudo/first-letter-property-whitelist.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Test: Properties allowed on ::first-letter pseudo elements</title>
-<link rel="author" title="Chris Nardi" href="mailto:cnardi@chromium.org">
-<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#first-letter-styling">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<style>
-#target::first-letter {}
-#target { visibility: hidden; }
-</style>
-<div id="target">text</div>
-<script>
-'use strict';
-var style;
-const target = document.querySelector("#target");
-var defaultComputedStyle = getComputedStyle(target);
-
-test(function() {
-  var styleRule = document.styleSheets[0].cssRules[0];
-  assert_equals(styleRule.selectorText, '#target::first-letter', 'make sure we have the correct style rule');
-  style = styleRule.style;
-}, 'pre test setup');
-
-var validProperties = {
-  backgroundAttachment: 'fixed',
-  backgroundBlendMode: 'hue',
-  backgroundClip: 'padding-box',
-  backgroundColor: 'rgb(10, 20, 30)',
-  backgroundImage: 'linear-gradient(black, white)',
-  backgroundOrigin: 'border-box',
-  backgroundPosition: 'left 10px top 20px',
-  backgroundRepeat: 'no-repeat',
-  backgroundSize: '10px 20px',
-  border: '40px dotted rgb(10, 20, 30)',
-  borderImage: 'linear-gradient(black, white) 10% / 20 / 30px repeat',
-  borderRadius: '10px 20px',
-  boxShadow: 'rgb(10, 20, 30) 10px 20px 30px 40px inset',
-  color: 'rgba(10, 20, 30, 0.4)',
-  float: 'right',
-  font: 'italic small-caps 900 normal 10px / 20px sans-serif',
-  fontFeatureSettings: '"vert" 2',
-  fontSizeAdjust: '0.5',
-  fontKerning: 'none',
-  fontVariationSettings: '"XHGT" 0.7',
-  letterSpacing: '12px',
-  margin: '10px 20px 30px 40px',
-  padding: '10px 20px 30px 40px',
-  opacity: '0.5',
-  textDecoration: 'overline wavy rgb(10, 20, 30)',
-  textJustify: 'inter-word',
-  textShadow: 'rgb(10, 20, 30) 10px 20px 30px',
-  textTransform: 'capitalize',
-  textUnderlinePosition: 'under',
-  verticalAlign: '12%',
-  wordSpacing: '12px'
-};
-
-var invalidProperties = {
-  transition: 'transform 1s',
-  transform: 'rotate(45deg)',
-  wordBreak: 'break-all'
-};
-
-function testFirstLetterProperty(property, rule, expected, reason) {
-  test(function() {
-    style[property] = "";
-    style[property] = rule;
-    assert_equals(getComputedStyle(target, '::first-letter')[property], expected);
-    style[property] = "";
-  }, reason);
-}
-
-for (var property in validProperties) {
-  testFirstLetterProperty(property, validProperties[property], validProperties[property],
-                          "Whitelisted property " + property + " should be applied to first-letter pseudo elements.");
-}
-
-for (var property in invalidProperties) {
-  testFirstLetterProperty(property, invalidProperties[property], defaultComputedStyle[property],
-                          "Non-whitelisted property " + property + " should not be applied to first-letter pseudo elements.");
-}
-</script>
--- a/testing/web-platform/tests/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/stylevalue-normalization/normalize-tokens.tentative.html
@@ -24,40 +24,40 @@ const gTestCases = [
     value: 'var(--A)',
     expectedResult: [
       new CSSVariableReferenceValue('--A'),
     ]
   },
   {
     value: 'var(--A, 1em)',
     expectedResult: [
-      new CSSVariableReferenceValue('--A', new CSSUnparsedValue([' 1em'])),
+      new CSSVariableReferenceValue('--A', new CSSUnparsedValue(' 1em')),
     ]
   },
   {
     value: 'var(--A, var(--B))',
     expectedResult: [
-      new CSSVariableReferenceValue('--A', new CSSUnparsedValue([' ', new CSSVariableReferenceValue('--B')])),
+      new CSSVariableReferenceValue('--A', new CSSUnparsedValue(' ', new CSSVariableReferenceValue('--B'))),
     ]
   },
   {
     value: 'calc(42px + var(--foo, 15em) + var(--bar, var(--far) + 15px))',
     expectedResult: [
       'calc(42px + ',
-      new CSSVariableReferenceValue('--foo', new CSSUnparsedValue([' 15em'])),
+      new CSSVariableReferenceValue('--foo', new CSSUnparsedValue(' 15em')),
       ' + ',
-      new CSSVariableReferenceValue('--bar', new CSSUnparsedValue([' ', new CSSVariableReferenceValue('--far'), ' + 15px'])),
+      new CSSVariableReferenceValue('--bar', new CSSUnparsedValue(' ', new CSSVariableReferenceValue('--far'), ' + 15px')),
       ')',
     ]
   },
 ];
 
 for (const {value, expectedResult} of gTestCases) {
   test(t => {
-    assert_string_normalizes_to(t, 'color', value, new CSSUnparsedValue(expectedResult));
+    assert_string_normalizes_to(t, 'color', value, new CSSUnparsedValue(...expectedResult));
   }, 'Normalizing "' + value + '" on a CSS property returns correct CSSUnparsedValue');
 
   test(t => {
-    assert_string_normalizes_to(t, '--X', value, new CSSUnparsedValue(expectedResult));
+    assert_string_normalizes_to(t, '--X', value, new CSSUnparsedValue(...expectedResult));
   }, 'Normalizing "' + value + '" on a custom property returns correct CSSUnparsedValue');
 }
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html
+++ b/testing/web-platform/tests/css/css-typed-om/stylevalue-serialization/cssUnparsedValue.html
@@ -6,32 +6,32 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <body>
 <div id="tag">
 <script>
 'use strict';
 
 test(() => {
-  assert_equals(new CSSUnparsedValue(['lem', 'on', 'ade']).toString(), 'lemonade');
+  assert_equals(new CSSUnparsedValue('lem', 'on', 'ade').toString(), 'lemonade');
 }, 'CSSUnparsedValue containing strings serializes to its concatenated contents');
 
 test(() => {
-  assert_equals(new CSSUnparsedValue([
+  assert_equals(new CSSUnparsedValue(
       new CSSVariableReferenceValue('--A',
-        new CSSUnparsedValue([new CSSVariableReferenceValue('--B')])),
-      new CSSVariableReferenceValue('--C')]).toString(),
+        new CSSUnparsedValue(new CSSVariableReferenceValue('--B'))),
+      new CSSVariableReferenceValue('--C')).toString(),
     'var(--A,var(--B))var(--C)');
 }, 'CSSUnparsedValue containing variable references serializes its ' +
    'concatenated contents');
 
 test(() => {
-  assert_equals(new CSSUnparsedValue(['foo', 'bar ',
+  assert_equals(new CSSUnparsedValue('foo', 'bar ',
       new CSSVariableReferenceValue('--A',
-        new CSSUnparsedValue(['baz ',
-          new CSSVariableReferenceValue('--B'), 'lemon'])),
+        new CSSUnparsedValue('baz ',
+          new CSSVariableReferenceValue('--B'), 'lemon')),
       new CSSVariableReferenceValue('--C',
-        new CSSUnparsedValue(['ade']))]).toString(),
+        new CSSUnparsedValue('ade'))).toString(),
     'foobar var(--A,baz var(--B)lemon)var(--C,ade)');
 }, 'CSSUnparsedValue containing mix of strings and variable references ' +
    'serializes to its concatenated contents');
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/stylevalue-subclasses/cssUnparsedValue.html
+++ b/testing/web-platform/tests/css/css-typed-om/stylevalue-subclasses/cssUnparsedValue.html
@@ -32,17 +32,17 @@ const gTestArguments = [
       'baz',
       new CSSVariableReferenceValue('--B')
     ],
   },
 ];
 
 for (const {args, description} of gTestArguments) {
   test(() => {
-    const result = new CSSUnparsedValue(args);
+    const result = new CSSUnparsedValue(...args);
 
     assert_not_equals(result, null,
         'A CSSUnparsedValue should be created');
     assert_array_equals(result, args,
         'Content of CSSUnparsedValue should be same as the arguments ' +
         'passed in the constructor');
   }, 'CSSUnparsedValue can be constructed from ' + description);
 }
--- a/testing/web-platform/tests/css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html
+++ b/testing/web-platform/tests/css/css-typed-om/stylevalue-subclasses/cssVariableReferenceValue.html
@@ -17,25 +17,25 @@ test(() => {
   assert_equals(result.variable, '--foo',
       'Variable member should be same as passed in the constructor');
   assert_equals(result.fallback, null,
       'Fallback member should be null');
 }, 'CSSVariableReferenceValue can be constructed with no fallback');
 
 test(() => {
   const result = new CSSVariableReferenceValue('--foo',
-      new CSSUnparsedValue(['lemon']));
+      new CSSUnparsedValue('lemon'));
 
   assert_not_equals(result, null,
       'A CSSVariableReferenceValue should be created');
   assert_equals(result.variable, '--foo',
       'Variable member should be same as passed in the constructor');
   assert_not_equals(result.fallback, null,
       'Fallback member should not be null');
-  assert_style_value_equals(result.fallback, new CSSUnparsedValue(['lemon']),
+  assert_style_value_equals(result.fallback, new CSSUnparsedValue('lemon'),
       'Fallback member should be as same as passed in the constructor');
 }, 'CSSVariableReferenceValue can be constructed with fallback');
 
 test(() => {
   let result = new CSSVariableReferenceValue('--foo');
   result.variable = '--bar';
 
   assert_equals(result.variable, '--bar',
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/computed.tentative.html
@@ -33,27 +33,27 @@ test(() => {
 
 test(() => {
   const result = styleMap.get('height');
   assert_style_value_equals(result, CSS.px(10));
 }, 'Computed StylePropertyMap contains CSS property declarations in style rules');
 
 test(() => {
   const result = styleMap.get('--foo');
-  assert_style_value_equals(result, new CSSUnparsedValue([' auto']));
+  assert_style_value_equals(result, new CSSUnparsedValue(' auto'));
 }, 'Computed StylePropertyMap contains custom property declarations in style rules');
 
 test(() => {
   const result = styleMap.get('top');
   assert_style_value_equals(result, CSS.px(5));
 }, 'Computed StylePropertyMap contains CSS property declarations in inline styles');
 
 test(() => {
   const result = styleMap.get('--bar');
-  assert_style_value_equals(result, new CSSUnparsedValue([' 5']));
+  assert_style_value_equals(result, new CSSUnparsedValue(' 5'));
 }, 'Computed StylePropertyMap contains custom property declarations in inline rules');
 
 test(() => {
   const computedStyle = getComputedStyle(target);
   assert_equals(computedStyle.width, '25px');
 
   const result = styleMap.get('width');
   assert_style_value_equals(result, CSS.percent(50));
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/get.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/get.html
@@ -19,17 +19,17 @@ test(t => {
 test(t => {
   const styleMap = createComputedStyleMap(t, 'width: 10px; height: 20px');
   assert_style_value_equals(styleMap.get('width'), new CSSUnitValue(10, 'px'));
 }, 'Getting a valid property from computed style returns the correct entry');
 
 test(t => {
   const styleMap = createComputedStyleMap(t, '--foo: auto; --bar: 10px');
   assert_style_value_equals(styleMap.get('--foo'),
-      new CSSUnparsedValue([' auto']));
+      new CSSUnparsedValue(' auto'));
 }, 'Getting a valid custom property from computed style returns the ' +
    'correct entry');
 
 test(t => {
   const styleMap = createComputedStyleMap(t,
       'width: 10px; transition-duration: 1s, 2s; height: 10px;');
   assert_style_value_equals(styleMap.get('transition-duration'),
       new CSSUnitValue(1, 's'));
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/getAll.tentative.html
@@ -26,17 +26,17 @@ test(t => {
 
 test(t => {
   const styleMap = createComputedStyleMap(t, 'height: 20px; width: 10px');
   assert_style_value_array_equals(styleMap.getAll('wIdTh'), [CSS.px(10)]);
 }, 'StylePropertyMap.getAll is case-insensitive');
 
 test(t => {
   const styleMap = createComputedStyleMap(t, '--foo: auto; --bar: 10px');
-  assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue([' auto'])]);
+  assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue(' auto')]);
 }, 'Calling StylePropertyMap.getAll with a valid custom property returns a single element list with the correct entry');
 
 test(t => {
   const styleMap = createComputedStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
   assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
 }, 'Calling StylePropertyMap.getAll with a list-valued property returns all the values');
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/iterable.tentative.html
@@ -29,14 +29,14 @@ test(t => {
 
 test(t => {
   const styleMap = createComputedStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
   assert_style_value_array_equals(findInStyleMap(styleMap, 'transition-duration'), [CSS.s(1), CSS.s(2)]);
 }, 'StylePropertyMap iterator returns list-valued properties with the correct CSSStyleValue');
 
 test(t => {
   const styleMap = createComputedStyleMap(t, '--A: A; --C: C; color: red; --B: B;');
-  assert_style_value_equals(findInStyleMap(styleMap, '--A'), new CSSUnparsedValue([' A']));
-  assert_style_value_equals(findInStyleMap(styleMap, '--B'), new CSSUnparsedValue([' B']));
-  assert_style_value_equals(findInStyleMap(styleMap, '--C'), new CSSUnparsedValue([' C']));
+  assert_style_value_equals(findInStyleMap(styleMap, '--A'), new CSSUnparsedValue(' A'));
+  assert_style_value_equals(findInStyleMap(styleMap, '--B'), new CSSUnparsedValue(' B'));
+  assert_style_value_equals(findInStyleMap(styleMap, '--C'), new CSSUnparsedValue(' C'));
 }, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/declared.tentative.html
@@ -40,17 +40,17 @@ test(() => {
 }, 'Declared StylePropertyMap contains CSS property declarations in style rules');
 
 test(() => {
   assert_equals(styleMap.get('top'), null);
   assert_equals(styleMap.get('--bar'), null);
 }, 'Declared StylePropertyMap does not contain inline styles');
 
 test(() => {
-  assert_style_value_equals(styleMap.get('--foo'), new CSSUnparsedValue([' auto']));
+  assert_style_value_equals(styleMap.get('--foo'), new CSSUnparsedValue(' auto'));
 }, 'Declared StylePropertyMap contains custom property declarations');
 
 test(() => {
   assert_equals(styleMap.get('color'), null);
 }, 'Declared StylePropertyMap does not contain properties with invalid values');
 
 test(() => {
   assert_style_value_equals(styleMap.get('width'), CSS.percent(50));
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/get.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/get.html
@@ -24,17 +24,17 @@ test(t => {
 test(t => {
   const styleMap = createDeclaredStyleMap(t, 'width: 10px; height: 20px');
   assert_style_value_equals(styleMap.get('width'), new CSSUnitValue(10, 'px'));
 }, 'Getting a valid property from CSS rule returns the correct entry');
 
 test(t => {
   const styleMap = createDeclaredStyleMap(t, '--foo: auto; --bar: 10px');
   assert_style_value_equals(styleMap.get('--foo'),
-      new CSSUnparsedValue([' auto']));
+      new CSSUnparsedValue(' auto'));
 }, 'Getting a valid custom property from CSS rule returns the ' +
    'correct entry');
 
 test(t => {
   const styleMap = createDeclaredStyleMap(t,
       'width: 10px; transition-duration: 1s, 2s; height: 10px;');
   assert_style_value_equals(styleMap.get('transition-duration'),
       new CSSUnitValue(1, 's'));
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/getAll.tentative.html
@@ -31,17 +31,17 @@ test(t => {
 
 test(t => {
   const styleMap = createDeclaredStyleMap(t, 'height: 20px; width: 10px');
   assert_style_value_array_equals(styleMap.getAll('wIdTh'), [CSS.px(10)]);
 }, 'StylePropertyMap.getAll is case-insensitive');
 
 test(t => {
   const styleMap = createDeclaredStyleMap(t, '--foo: auto; --bar: 10px');
-  assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue([' auto'])]);
+  assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue(' auto')]);
 }, 'Calling StylePropertyMap.getAll with a valid custom property returns a single element list with the correct entry');
 
 test(t => {
   const styleMap = createDeclaredStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
   assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
 }, 'Calling StylePropertyMap.getAll with a list-valued property returns all the values');
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/iterable.tentative.html
@@ -37,15 +37,15 @@ test(t => {
 }, 'StylePropertyMap iterator returns list-valued properties with the correct CSSStyleValue');
 
 test(t => {
   const styleMap = createDeclaredStyleMap(t, '--A: A; --B: B; --C: C');
   const keys = [...styleMap.keys()], values = [...styleMap.values()];
 
   assert_array_equals(keys, ['--A', '--B', '--C']);
   assert_style_value_array_equals(values, [
-    new CSSUnparsedValue([' A']),
-    new CSSUnparsedValue([' B']),
-    new CSSUnparsedValue([' C']),
+    new CSSUnparsedValue(' A'),
+    new CSSUnparsedValue(' B'),
+    new CSSUnparsedValue(' C'),
   ])
 }, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/set.tentative.html
@@ -58,21 +58,21 @@ test(t => {
 
   styleMap.set('transition-duration', '1s, 2s');
   assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
 }, 'Setting a list-valued property with a list-valued string updates its value');
 
 test(t => {
   let styleMap = createDeclaredStyleMap(t, '');
 
-  styleMap.set('--foo', new CSSUnparsedValue(['auto']));
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['auto']));
+  styleMap.set('--foo', new CSSUnparsedValue('auto'));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
 
   styleMap.set('--foo', '20px');
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['20px']));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
 }, 'Setting a custom property with CSSStyleValue or String updates its value');
 
 test(t => {
   let styleMap = createDeclaredStyleMap(t, 'transition-duration: 5s, 10s');
 
   styleMap.set('tRaNsItIoN-dUrAtIoN', '1s', CSS.s(2));
   const result = styleMap.getAll('transition-duration');
   assert_style_value_array_equals(result, [CSS.s(1), CSS.s(2)]);
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/declared/update.tentative.html
@@ -41,21 +41,21 @@ test(t => {
 
   styleMap.update('transition-duration', () => CSS.s(2));
   assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(2)]);
 }, 'Updating a list-valued property with CSSStyleValue updates its value');
 
 test(t => {
   let styleMap = createDeclaredStyleMap(t, '');
 
-  styleMap.update('--foo', () => new CSSUnparsedValue(['auto']));
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['auto']));
+  styleMap.update('--foo', () => new CSSUnparsedValue('auto'));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
 
-  styleMap.update('--foo', () => new CSSUnparsedValue(['20px']));
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['20px']));
+  styleMap.update('--foo', () => new CSSUnparsedValue('20px'));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
 }, 'Updating a custom property with CSSStyleValue updates its value');
 
 test(t => {
   let styleMap = createDeclaredStyleMap(t, '');
   styleMap.update('width', oldValue => {
     assert_equals(oldValue, null);
     return CSS.px(10);
   });
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/get.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/get.html
@@ -24,17 +24,17 @@ test(t => {
 test(t => {
   const styleMap = createInlineStyleMap(t, 'width: 10px; height: 20px');
   assert_style_value_equals(styleMap.get('width'), new CSSUnitValue(10, 'px'));
 }, 'Getting a valid property from inline style returns the correct entry');
 
 test(t => {
   const styleMap = createInlineStyleMap(t, '--foo: auto; --bar: 10px');
   assert_style_value_equals(styleMap.get('--foo'),
-      new CSSUnparsedValue([' auto']));
+      new CSSUnparsedValue(' auto'));
 }, 'Getting a valid custom property from inline style returns the ' +
    'correct entry');
 
 test(t => {
   const styleMap = createInlineStyleMap(t,
       'width: 10px; transition-duration: 1s, 2s; height: 10px;');
   assert_style_value_equals(styleMap.get('transition-duration'),
       new CSSUnitValue(1, 's'));
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/getAll.tentative.html
@@ -31,17 +31,17 @@ test(t => {
 
 test(t => {
   const styleMap = createInlineStyleMap(t, 'height: 20px; width: 10px');
   assert_style_value_array_equals(styleMap.getAll('wIdTh'), [CSS.px(10)]);
 }, 'StylePropertyMap.getAll is case-insensitive');
 
 test(t => {
   const styleMap = createInlineStyleMap(t, '--foo: auto; --bar: 10px');
-  assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue([' auto'])]);
+  assert_style_value_array_equals(styleMap.getAll('--foo'), [new CSSUnparsedValue(' auto')]);
 }, 'Calling StylePropertyMap.getAll with a valid custom property returns a single element list with the correct entry');
 
 test(t => {
   const styleMap = createInlineStyleMap(t, 'width: 10px; transition-duration: 1s, 2s; height: 20px');
   assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
 }, 'Calling StylePropertyMap.getAll with a list-valued property returns all the values');
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/iterable.tentative.html
@@ -37,15 +37,15 @@ test(t => {
 }, 'StylePropertyMap iterator returns list-valued properties with the correct CSSStyleValue');
 
 test(t => {
   const styleMap = createInlineStyleMap(t, '--A: A; --B: B; --C: C');
   const keys = [...styleMap.keys()], values = [...styleMap.values()];
 
   assert_array_equals(keys, ['--A', '--B', '--C']);
   assert_style_value_array_equals(values, [
-    new CSSUnparsedValue([' A']),
-    new CSSUnparsedValue([' B']),
-    new CSSUnparsedValue([' C']),
+    new CSSUnparsedValue(' A'),
+    new CSSUnparsedValue(' B'),
+    new CSSUnparsedValue(' C'),
   ])
 }, 'StylePropertyMap iterator returns custom properties with the correct CSSStyleValue');
 
 </script>
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/set.tentative.html
@@ -58,21 +58,21 @@ test(t => {
 
   styleMap.set('transition-duration', '1s, 2s');
   assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(1), CSS.s(2)]);
 }, 'Setting a list-valued property with a list-valued string updates its value');
 
 test(t => {
   let styleMap = createInlineStyleMap(t, '');
 
-  styleMap.set('--foo', new CSSUnparsedValue(['auto']));
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['auto']));
+  styleMap.set('--foo', new CSSUnparsedValue('auto'));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
 
   styleMap.set('--foo', '20px');
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['20px']));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
 }, 'Setting a custom property with CSSStyleValue or String updates its value');
 
 test(t => {
   let styleMap = createInlineStyleMap(t, 'transition-duration: 5s, 10s');
 
   styleMap.set('tRaNsItIoN-dUrAtIoN', '1s', CSS.s(2));
   const result = styleMap.getAll('transition-duration');
   assert_style_value_array_equals(result, [CSS.s(1), CSS.s(2)]);
--- a/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/inline/update.tentative.html
@@ -41,21 +41,21 @@ test(t => {
 
   styleMap.update('transition-duration', () => CSS.s(2));
   assert_style_value_array_equals(styleMap.getAll('transition-duration'), [CSS.s(2)]);
 }, 'Updating a list-valued property with CSSStyleValue updates its value');
 
 test(t => {
   let styleMap = createInlineStyleMap(t, '');
 
-  styleMap.update('--foo', () => new CSSUnparsedValue(['auto']));
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['auto']));
+  styleMap.update('--foo', () => new CSSUnparsedValue('auto'));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('auto'));
 
-  styleMap.update('--foo', () => new CSSUnparsedValue(['20px']));
-  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue(['20px']));
+  styleMap.update('--foo', () => new CSSUnparsedValue('20px'));
+  assert_style_value_array_equals(styleMap.get('--foo'), new CSSUnparsedValue('20px'));
 }, 'Updating a custom property with CSSStyleValue updates its value');
 
 test(t => {
   let styleMap = createInlineStyleMap(t, '');
   styleMap.update('width', oldValue => {
     assert_equals(oldValue, null);
     return CSS.px(10);
   });
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-011.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!doctype html>
-<title>orthogonal flow parent with max-height</title>
-<meta charset=utf-8>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<meta name="assert" content="If an orthogonal flow's parent doesn't have a definite block size but does have a max block size, use that as the available size">
-<link rel="match" href="reference/available-size-011-ref.html">
-<meta name="flags" content="">
-<style>
-main {
-  max-height: 1em;
-  line-height: 1em;
-}
-div {
-  writing-mode: vertical-rl;
-}
-</style>
-
-<p>This test passes if the word “PASS” (without the quotation marks) appears below, written horizontally from left to right.
-<main><div>S S A P</div></main>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-012.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Testing Available Space in Orthogonal Flows / max-height + min-height / content height</title>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<link rel="match" href="reference/available-size-001-ref.html">
-<meta name="assert" content="When an orthogonal flow's parent doesn't have a definite block size and the nearest ancestor scroller does not have a fixed height but does have a fixed max-height, use that, increased by min-height if it exists and is larger. (same as -001, with min-height)">
-<meta name="flags" content="">
-<style>
-body > div {
-  font-family: monospace; /* to be able to reliably measure things in ch*/
-  font-size: 20px;
-  max-height: 4ch; /* **max**-height does not give the element a definite block size */
-  min-height: 8ch;
-  overflow: hidden;
-  color: transparent;
-  position: relative; /* to act as a container of #red */
-  padding: 1ch 0;
-}
-
-div > div { writing-mode: vertical-rl; }
-
-span {
-  background: green;
-  display: inline-block; /* This should not change it's size or position, but makes the size of the background predictable*/
-}
-
-#red { /* Not necessary when when comparing to the reference, but makes human judgement easier */
-  position: absolute;
-  background: red;
-  left: 0; top: 1ch;
-  writing-mode: vertical-rl;
-  z-index: -1;
-}
-</style>
-
-<p>Test passes if there is a <strong>green rectangle</strong> below and <strong>no red</strong>.
-
-<div>
-  <aside id="red">0</aside>
-  <div>0 0 0 0 <span>0</span> 0 0 0</div> <!-- If this div take its height from
-  the min-height of its parent, it should wrap just right for the green 0 to
-  overlap with the red one. -->
-</div>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-013.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Testing Available Space in Orthogonal Flows / height + min-height/ content height</title>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<link rel="match" href="reference/available-size-001-ref.html">
-<meta name="assert" content="When an orthogonal flow's parent doesn't have a definite block size and the nearest ancestor scroller does have a fixed height, use that, increased by the min-height if it is set and is larger (same as -003, with min-height).">
-<meta name="flags" content="">
-<style>
-body > div {
-  font-family: monospace; /* to be able to reliably measure things in ch*/
-  font-size: 20px;
-  height: 4ch;
-  min-height: 8ch;
-  width: 300px; /* Shrinkwrapping this div is not what we're interested in testing here, so give it a width. See nested-orthogonal-001.html for that. */
-  overflow: hidden;
-  color: transparent;
-  position: relative; /* to act as a container of #red */
-  writing-mode: vertical-lr;
-  padding: 1ch 0;
-}
-
-div > div { padding-bottom: 2ch; } /* so that the content height of the parent and of the fixed size scrolling ancestor are different */
-div > div > div { writing-mode: vertical-rl; }
-
-span {
-  background: green;
-  display: inline-block; /* This should not change it's size or position, but makes the size of the background predictable*/
-}
-
-#red { /* Not necessary when when comparing to the reference, but makes human judgement easier */
-  position: absolute;
-  background: red;
-  left: 0; top: 1ch;
-  writing-mode: vertical-rl;
-  z-index: -1;
-}
-</style>
-
-<p>Test passes if there is a <strong>green rectangle</strong> below and <strong>no red</strong>.
-
-<div>
-  <aside id="red">0</aside>
-  <div><div>0 0 0 0 <span>0</span> 0 0 0</div></div> <!-- If this div take its height from
-  the height of its scrollable ancestor, it should wrap just right for the green 0 to
-  overlap with the red one. -->
-</div>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-014.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Testing Available Space in Orthogonal Flows / height + min-height / not remaining size</title>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<link rel="match" href="reference/available-size-001-ref.html">
-<meta name="assert" content="When an orthogonal flow's parent doesn't have a definite block size and the nearest ancestor scroller does a have fixed height, use that whole height increased by min-height if that's larger, even if some other content already consumes some of it (same as -005, with min-height).">
-<meta name="flags" content="">
-<style>
-body > div {
-  font-family: monospace; /* to be able to reliably measure things in ch*/
-  font-size: 20px;
-  height: 4ch;
-  min-height: 8ch;
-  width: 300px; /* Shrinkwrapping this div is not what we're interested in testing here, so give it a width. See nested-orthogonal-001.html for that. */
-  overflow: hidden;
-  color: transparent;
-  position: relative; /* to act as a container of #red */
-}
-
-div > div { padding-bottom: 2ch; } /* so that the content height of the parent and of the fixed size scrolling ancestor are different */
-div > div > div { writing-mode: vertical-rl; }
-
-span {
-  background: green;
-  display: inline-block; /* This should not change it's size or position, but makes the size of the background predictable*/
-}
-
-#red { /* Not necessary when when comparing to the reference, but makes human judgement easier */
-  position: absolute;
-  background: red;
-  left: 0;
-  writing-mode: vertical-rl;
-  z-index: -1;
-  top: 1ch;
-}
-#spacer { /* shrinks the remaining space of the parent div. */
-  height: 1ch;
-  width: 100%;
-}
-</style>
-
-<p>Test passes if there is a <strong>green rectangle</strong> below and <strong>no red</strong>.
-
-<div>
-  <aside id="red">0</aside>
-  <div><aside id="spacer"></aside><div>0 0 0 0 <span>0</span> 0 0 0</div></div>
-  <!-- If the inner div take its height from the height of its scrollable
-  ancestor, it should wrap just right for the green 0 to overlap with the red
-  one. If instead it takes it size from the remaining height after having
-  removed #spacer, or does some other calculation that takes #spacer into
-  account, it won't line up with #red.-->
-</div>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-015.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Testing Available Space in Orthogonal Flows / ICB / tall max-height + min-height scroller</title>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<link rel="match" href="reference/available-size-002-ref.html">
-<meta name="assert" content="When an orthogonal flow's parent doesn't have a definite block size, and there's a scroller with max-height and min-height, and max-height is smaller than the ICB but min-height is larger than the ICB, use the ICB as the available space (same as -008, with min-height).">
-<meta name="flags" content="">
-<style>
-body { margin-top: 0; margin-bottom: 0; } /* Shouldn't matter, but in some browsers does. -007 tests this aspect specifically. */
-div {
-  writing-mode: vertical-rl;
-  font-family: monospace;
-  font-size: 20px;
-  position: relative; /* to be a container for #red*/
-}
-.spacer { /* using 5 spacers of 20vh each instead of a single large one, so
-             that the line would wrap between spacers if it ends up being
-             shorter thatn 100vh*/
-  display: inline-block;
-  height: calc(20vh - 0.1px); /*Using this instead of 20vh, to account for accumulation of rounding errors, that might make 5*20vh taller than 100vh in some browsers*/
-}
-
-span {
-  background: green;
-  display: inline-block; /* This should not change it's size or position, but makes the size of the background predictable*/
-  color: transparent;
-}
-
-#red { /* Not necessary when when comparing to the reference, but makes human judgement easier */
-  position: absolute;
-  background: red;
-  writing-mode: vertical-rl;
-  z-index: -1;
-  font-family: monospace;
-  font-size: 20px;
-  left: 0; top: 0;
-}
-
-section {
-  overflow: hidden;
-  max-height: 40vh;
-  min-height: 120vh;
-}
-</style>
-
-<p>Test passes if there is a <strong>green rectangle</strong> below and <strong>no red</strong>.
-
-<section>
-<div><aside id="red">0</aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside> <span>0</span></div>
-</section>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-016.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Testing Available Space in Orthogonal Flows / ICB / tall height + min-height scroller</title>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<link rel="match" href="reference/available-size-002-ref.html">
-<meta name="assert" content="When an orthogonal flow's parent doesn't have a definite block size, and there's a scroller with height and min-height, and height is smaller than the ICB but min-height is larger than the ICB, use the ICB as the available space (same as -009, with min-height).">
-<meta name="flags" content="">
-<style>
-body { margin-top: 0; margin-bottom: 0; } /* Shouldn't matter, but in some browsers does. -007 tests this aspect specifically. */
-div {
-  writing-mode: vertical-rl;
-  font-family: monospace;
-  font-size: 20px;
-  position: relative; /* to be a container for #red*/
-}
-.spacer { /* using 5 spacers of 20vh each instead of a single large one, so
-             that the line would wrap between spacers if it ends up being
-             shorter thatn 100vh*/
-  display: inline-block;
-  height: calc(20vh - 0.1px); /*Using this instead of 20vh, to account for accumulation of rounding errors, that might make 5*20vh taller than 100vh in some browsers*/
-}
-
-span {
-  background: green;
-  display: inline-block; /* This should not change it's size or position, but makes the size of the background predictable*/
-  color: transparent;
-}
-
-#red { /* Not necessary when when comparing to the reference, but makes human judgement easier */
-  position: absolute;
-  background: red;
-  writing-mode: vertical-rl;
-  z-index: -1;
-  font-family: monospace;
-  font-size: 20px;
-  left: 0; top: 0;
-}
-
-section {
-  overflow: hidden;
-  writing-mode: vertical-rl;
-  height: 40vh;
-  min-height: 120vh;
-}
-section > section {
-  writing-mode: horizontal-tb;
-}
-</style>
-
-<p>Test passes if there is a <strong>green rectangle</strong> below and <strong>no red</strong>.
-
-<section>
-<div><aside id="red">0</aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside><aside class="spacer"></aside> <span>0</span></div>
-</section>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-017.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Testing Available Space in Orthogonal Flows / height + min-height parent</title>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<link rel="match" href="reference/available-size-002-ref.html">
-<meta name="assert" content="When an orthogonal flow's parent has a height and a min-height larger than the height, use min-height as the available size.">
-<meta name="flags" content="">
-<style>
-body > div {
-  font-family: monospace; /* to be able to reliably measure things in ch*/
-  font-size: 20px;
-  height: 4ch;
-  min-height: 8ch;
-  color: transparent;
-  position: relative; /* to act as a container of #green */
-}
-
-div > div { writing-mode: vertical-rl; }
-
-span {
-  background: green;
-  display: inline-block; /* This should not change it's size or position, but makes the size of the background predictable*/
-}
-
-#red {
-  position: absolute;
-  background: red;
-  left: 0;
-  writing-mode: vertical-rl;
-  z-index: -1;
-}
-</style>
-
-<p>Test passes if there is a <strong>green rectangle</strong> below and <strong>no red</strong>.
-
-<div>
-  <aside id="red">0</aside>
-  <div>0 0 0 0 <span>0</span> 0 0 0</div> <!-- If this div takes its height from
-  the min-height of its parent (which it should)
-  it should wrap just right for the green 0 to
-  overlap with the red one. -->
-</div>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/available-size-018.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Testing Available Space in Orthogonal Flows / max-height + min-height parent</title>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
-<link rel="match" href="reference/available-size-002-ref.html">
-<meta name="assert" content="When an orthogonal flow's parent has a max-height and a min-height larger than the height, use min-height as the available size.">
-<meta name="flags" content="">
-<style>
-body > div {
-  font-family: monospace; /* to be able to reliably measure things in ch*/
-  font-size: 20px;
-  max-height: 4ch;
-  min-height: 8ch;
-  color: transparent;
-  position: relative; /* to act as a container of #green */
-}
-
-div > div { writing-mode: vertical-rl; }
-
-span {
-  background: green;
-  display: inline-block; /* This should not change it's size or position, but makes the size of the background predictable*/
-}
-
-#red {
-  position: absolute;
-  background: red;
-  left: 0;
-  writing-mode: vertical-rl;
-  z-index: -1;
-}
-</style>
-
-<p>Test passes if there is a <strong>green rectangle</strong> below and <strong>no red</strong>.
-
-<div>
-  <aside id="red">0</aside>
-  <div>0 0 0 0 <span>0</span> 0 0 0</div> <!-- If this div takes its height from
-  the min-height of its parent (which it should)
-  it should wrap just right for the green 0 to
-  overlap with the red one. -->
-</div>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/reference/available-size-011-ref.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html>
-<title>CSS writing mode test reference</title>
-<meta charset=utf-8>
-<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
-<style>
-div {
-  line-height: 1em;
-  height: 1em;
-  writing-mode: vertical-rl;
-}
-</style>
-
-<p>This test passes if the word “PASS” (without the quotation marks) appears below, written horizontally from left to right.
-<div>S S A P</div>
deleted file mode 100644
--- a/testing/web-platform/tests/css/selectors/matches-nested.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>CSS Selectors: :matches()</title>
-    <link rel="author" title="Victoria Su" href="mailto:victoriaytsu@google.com">
-    <link rel="help" href="https://drafts.csswg.org/selectors-4/#matches">
-    <meta name="assert" content="This tests that the :matches() selector is effective when nested">
-    <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharnessreport.js"></script>
-    <style>
-      /* Testing that highest specificity is chosen for class outside of :matches() */
-      .a+.b+.c>.e+.d {
-        color: black;
-        font-size: 10px;
-        width: 10px;
-      }
-      .a+:matches(.b+.f, .b+:matches(*, .c>.e, .g, *))+.d {
-        color: red;
-        font-size: 20px;
-      }
-      .a+.b+.c>.e+.d {
-        color: yellow;
-      }
-      /* Testing specificty of a class within :matches() */
-      .a+.c>.e {
-        color: black;
-      }
-      .a+:matches(.b+.f, :matches(.c>.e, .g)) {
-        color: red;
-      }
-      .c>.e {
-        color: black;
-      }
-    </style>
-  </head>
-  <body>
-    <div class="a">
-    </div>
-    <div class="b" id="b2">
-    </div>
-    <div class="c" id="c2">
-      <div class="e">
-      </div>
-      <div class="d" id="d1">
-        Yellow
-      </div>
-    </div>
-    <div class="a">
-    </div>
-    <div class="c" id="c2">
-      <div class="e" id="e1">
-        Red
-      </div>
-    </div>
-    <script>
-
-      var red = "rgb(255, 0, 0)";
-      var yellow = "rgb(255, 255, 0)";
-
-      test(() => {
-        assert_equals(getComputedStyle(d1).color, yellow);
-        assert_equals(getComputedStyle(d1).fontSize, "20px");
-        assert_equals(getComputedStyle(d1).width, "10px");
-      }, "Test nested :matches() chooses highest specificity for class outside :matches().");
-
-      test(() => {
-        assert_equals(getComputedStyle(e1).color, red);
-      }, "Test nested :matches() specificity for class within arguments.");
-
-    </script>
-  </body>
-</html>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/css/selectors/matches-specificity.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>CSS Selectors: :matches()</title>
-    <link rel="author" title="Victoria Su" href="mailto:victoriaytsu@google.com">
-    <link rel="help" href="https://drafts.csswg.org/selectors-4/#matches">
-    <meta name="assert" content="This tests that the :matches() selector chooses the correct specificity">
-    <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharnessreport.js"></script>
-    <style>
-      .b.c + .d + .q.r + .s + #target {
-        font-size: 10px;
-        height: 10px;
-        width: 10px;
-      }
-      :matches(.a, .b.c + .d, .e) + :matches(* + .p, .q.r + .s, * + .t) + #target {
-        height: 20px;
-        width: 20px;
-      }
-      .b.c + .d + .q.r + .s + #target {
-        width: 30px;
-      }
-    </style>
-  </head>
-  <body>
-    <div class="b c"></div>
-    <div class="a d e"></div>
-    <div class="q r"></div>
-    <div class="p s t"></div>
-    <div id="target"></div>
-    <script>
-
-      test(() => {
-        assert_equals(getComputedStyle(target).width, "30px");
-        assert_equals(getComputedStyle(target).height, "20px");
-        assert_equals(getComputedStyle(target).fontSize, "10px");
-      }, "Test :matches() uses highest possible specificity");
-
-    </script>
-  </body>
-</html>
\ No newline at end of file
--- a/testing/web-platform/tests/custom-elements/Document-createElementNS.html
+++ b/testing/web-platform/tests/custom-elements/Document-createElementNS.html
@@ -19,24 +19,16 @@ test(() => {
   class MyElement2 extends HTMLElement {};
 
   customElements.define('my-autonomous2', MyElement2);
   let element = document.createElementNS('urn:example', 'my-autonomous2');
   assert_false(element instanceof MyElement2);
 }, 'autonomous: document.createElementNS should check namespaces.');
 
 test(() => {
-  const xhtmlNS = 'http://www.w3.org/1999/xhtml';
-  assert_false(document.createElementNS(xhtmlNS, 'x-foo') instanceof HTMLUnknownElement);
-  assert_false(document.createElementNS(xhtmlNS, 'x-foo', {}) instanceof HTMLUnknownElement);
-  assert_false((new Document()).createElementNS(xhtmlNS, 'x-foo') instanceof HTMLUnknownElement);
-  assert_false((new Document()).createElementNS(xhtmlNS, 'x-foo', {}) instanceof HTMLUnknownElement);
-}, 'autonomous: document.createElementNS should not create HTMLUnknownElement for a valid custom element name');
-
-test(() => {
   class MyBuiltinElement extends HTMLElement {};
 
   customElements.define('my-builtin', MyBuiltinElement, { extends: 'address' });
   let element = document.createElementNS('http://www.w3.org/1999/xhtml', 'p:address', { is: 'my-builtin'});
   assert_true(element instanceof MyBuiltinElement);
   assert_equals(element.prefix, 'p');
 }, 'builtin: document.createElementNS should create custom elements with prefixes.');
 
deleted file mode 100644
--- a/testing/web-platform/tests/html/editing/editing-0/contenteditable/contentEditable-slotted-inherit.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>contentEditable inherit from light tree parent</title>
-<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
-<link rel=help href="https://html.spec.whatwg.org/multipage/#contenteditable">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<p>You should see the word PASS two times below and no FAIL.</p>
-<div id="host1" contenteditable><div>FAILPASS</div></div>
-<div id="host2" contenteditable><div>FAILPASS</div></div>
-<script>
-  test(() => {
-    const root = host1.attachShadow({mode:"open"});
-    root.innerHTML = "<slot></slot>";
-    const text = host1.firstChild.firstChild;
-    const selection = window.getSelection();
-    selection.collapse(text, 0);
-    selection.extend(text, 4);
-    host1.focus();
-    document.execCommand("delete");
-    host1.blur();
-    assert_equals(text.data, "PASS", "Text should be PASS after FAIL is deleted");
-  }, "Slotted child of contenteditable host should be editable - slot direct child of shadow root");
-
-  test(() => {
-    const root = host2.attachShadow({mode:"open"});
-    root.innerHTML = "<div><slot></slot></div>";
-    const text = host2.firstChild.firstChild;
-    const selection = window.getSelection();
-    selection.collapse(text, 0);
-    selection.extend(text, 4);
-    host2.focus();
-    document.execCommand("delete");
-    host2.blur();
-    assert_equals(text.data, "PASS", "Text should be PASS after FAIL is deleted");
-  }, "Slotted child of contenteditable host should be editable - slot wrapped in shadow tree ancestor");
-</script>
deleted file mode 100644
--- a/testing/web-platform/tests/html/semantics/forms/textfieldselection/setSelectionRange.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<title></title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<textarea>
-
-</textarea>
-<script>
-test(function() {
-    let textarea = document.querySelector('textarea');
-    assert_equals(textarea.selectionStart, 0);
-    assert_equals(textarea.selectionEnd, 0);
-    textarea.setSelectionRange(0, 1);
-    assert_equals(textarea.selectionStart, 0);
-    assert_equals(textarea.selectionEnd, 1);
-}, "setSelectionRange on line boundaries");
-</script>
deleted file mode 100644
--- a/testing/web-platform/tests/html/semantics/scripting-1/the-script-element/cacheable-script-throw.py
+++ /dev/null
@@ -1,4 +0,0 @@
-def main(request, response):
-    headers = [("Content-Type", "text/javascript"), ("Cache-control", "public, max-age=100")]
-    body = "throw('fox');"
-    return 200, headers, body
deleted file mode 100644
--- a/testing/web-platform/tests/html/semantics/scripting-1/the-script-element/muted-errors-iframe.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<!DOCTYPE html>
-<script src="cacheable-script-throw.py?iframe"></script>
deleted file mode 100644
--- a/testing/web-platform/tests/html/semantics/scripting-1/the-script-element/muted-errors.sub.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<title>Muted Errors</title>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-// https://html.spec.whatwg.org/#report-the-error
-// If script's muted errors is true, then set message to "Script error.",
-// urlString to the empty string, line and col to 0, and errorValue to null.
-    setup({allow_uncaught_exception: true});
-
-    window.log = [];
-    window.addEventListener("error", ev => log.push(ev));
-
-    function check(shouldBeMuted) {
-      assert_equals(log.length, 1);
-      var ev = log[0];
-      log = [];
-      if (shouldBeMuted) {
-        assert_equals(ev.message, "Script error.");
-        assert_equals(ev.error, null, 'error');
-        assert_equals(ev.filename, "", 'filename');
-        assert_equals(ev.lineno, 0, 'lineno');
-        assert_equals(ev.colno, 0, 'colno');
-      } else {
-        assert_not_equals(ev.message, "Script error.");
-        assert_not_equals(ev.error, null);
-      }
-    }
-
-    var test1 = async_test("Errors for same-origin script shouldn't be muted");
-    var check1 = test1.step_func_done(() => check(false));
-
-    var test2 = async_test("Errors for cross-origin script should be muted");
-    var check2 = test2.step_func_done(() => check(true));
-
-    var test3 = async_test("Errors for cross-origin script should be muted " +
-                           "even if the script is once loaded as same-origin");
-    function step3() {
-      var script = document.createElement('script');
-      script.setAttribute('src', "//{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/cacheable-script-throw.py?iframe");
-      script.onerror = test3.unreached_func();
-      script.onload = test3.step_func_done(() => check(true));
-      document.body.appendChild(script);
-    }
-    function unreachable() { log.push("unexpected"); }
-</script>
-<script src="cacheable-script-throw.py" onerror="test1.unreached_func()()" onload="check1()"></script>
-<script src="//{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/cacheable-script-throw.py"
-    onerror="test2.unreached_func()()" onload="check2()"></script>
-<iframe src="//{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/muted-errors-iframe.html"
-    onerror="test3.unreached_func()()" onload="step3()"></iframe>
--- a/testing/web-platform/tests/interfaces/accelerometer.idl
+++ b/testing/web-platform/tests/interfaces/accelerometer.idl
@@ -1,20 +1,14 @@
-enum LocalCoordinateSystem { "device", "screen" };
-
-dictionary SpatialSensorOptions : SensorOptions {
-  LocalCoordinateSystem referenceFrame = "device";
-};
-
-[Constructor(optional SpatialSensorOptions options), SecureContext, Exposed=Window]
+[Constructor(optional SensorOptions options), SecureContext, Exposed=Window]
 interface Accelerometer : Sensor {
   readonly attribute double? x;
   readonly attribute double? y;
   readonly attribute double? z;
 };
 
-[Constructor(optional SpatialSensorOptions options), SecureContext, Exposed=Window]
+[Constructor(optional SensorOptions options), SecureContext, Exposed=Window]
 interface LinearAccelerationSensor : Accelerometer {
 };
 
 [Constructor(optional SensorOptions options), SecureContext, Exposed=Window]
 interface GravitySensor : Accelerometer {
 };
--- a/testing/web-platform/tests/lint.whitelist
+++ b/testing/web-platform/tests/lint.whitelist
@@ -221,17 +221,16 @@ SET TIMEOUT: streams/piping/error-propag
 SET TIMEOUT: streams/piping/error-propagation-forward.js
 SET TIMEOUT: streams/piping/general.js
 SET TIMEOUT: streams/readable-streams/cancel.js
 SET TIMEOUT: streams/resources/rs-utils.js
 SET TIMEOUT: streams/writable-streams/byte-length-queuing-strategy.js
 SET TIMEOUT: user-timing/*
 SET TIMEOUT: webaudio/js/lodash.js
 SET TIMEOUT: webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html
-SET TIMEOUT: webauthn/*timeout.https.html
 SET TIMEOUT: webdriver/*
 SET TIMEOUT: webmessaging/*
 SET TIMEOUT: websockets/*
 SET TIMEOUT: webstorage/eventTestHarness.js
 SET TIMEOUT: webvtt/*
 SET TIMEOUT: workers/*
 SET TIMEOUT: xhr/resources/init.htm
 SET TIMEOUT: xhr/resources/xmlhttprequest-timeout.js
--- a/testing/web-platform/tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html
+++ b/testing/web-platform/tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html
@@ -11,23 +11,24 @@
 
 <script>
 var t = async_test("");
 t.step(function() {
 
 var offscreenCanvas = new OffscreenCanvas(100, 50);
 var ctx = offscreenCanvas.getContext('2d');
 
+ctx.fillStyle = '#0f0';
+ctx.fillRect(0, 0, 100, 50);
 var offscreenCanvas2 = new OffscreenCanvas(0, 10);
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(offscreenCanvas2, 0, 0); });
-
+ctx.drawImage(offscreenCanvas2, 0, 0);
 offscreenCanvas2.width = 10;
 offscreenCanvas2.height = 0;
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(offscreenCanvas2, 0, 0); });
-
+ctx.drawImage(offscreenCanvas2, 0, 0);
 offscreenCanvas2.width = 0;
 offscreenCanvas2.height = 0;
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(offscreenCanvas2, 0, 0); });
+ctx.drawImage(offscreenCanvas2, 0, 0);
+_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2);
 
 t.done();
 
 });
 </script>
--- a/testing/web-platform/tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js
+++ b/testing/web-platform/tests/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.js
@@ -7,23 +7,24 @@ importScripts("/resources/testharness.js
 importScripts("/common/canvas-tests.js");
 
 var t = async_test("");
 t.step(function() {
 
 var offscreenCanvas = new OffscreenCanvas(100, 50);
 var ctx = offscreenCanvas.getContext('2d');
 
+ctx.fillStyle = '#0f0';
+ctx.fillRect(0, 0, 100, 50);
 var offscreenCanvas2 = new OffscreenCanvas(0, 10);
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(offscreenCanvas2, 0, 0); });
-
+ctx.drawImage(offscreenCanvas2, 0, 0);
 offscreenCanvas2.width = 10;
 offscreenCanvas2.height = 0;
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(offscreenCanvas2, 0, 0); });
-
+ctx.drawImage(offscreenCanvas2, 0, 0);
 offscreenCanvas2.width = 0;
 offscreenCanvas2.height = 0;
-assert_throws("INVALID_STATE_ERR", function() { ctx.drawImage(offscreenCanvas2, 0, 0); });
+ctx.drawImage(offscreenCanvas2, 0, 0);
+_assertPixelApprox(offscreenCanvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255", 2);
 
 t.done();
 
 });
 done();
--- a/testing/web-platform/tests/offscreen-canvas/tools/tests2d.yaml
+++ b/testing/web-platform/tests/offscreen-canvas/tools/tests2d.yaml
@@ -4412,26 +4412,27 @@
     - 2d.drawImage.IDL
   code: |
     @assert throws TypeError ctx.drawImage(null, 0, 0);
 
 - name: 2d.drawImage.zerocanvas
   testing:
     - 2d.drawImage.zerocanvas
   code: |
+    ctx.fillStyle = '#0f0';
+    ctx.fillRect(0, 0, 100, 50);
     var offscreenCanvas2 = new OffscreenCanvas(0, 10);
-    @assert throws INVALID_STATE_ERR ctx.drawImage(offscreenCanvas2, 0, 0);
-
+    ctx.drawImage(offscreenCanvas2, 0, 0);
     offscreenCanvas2.width = 10;
     offscreenCanvas2.height = 0;
-    @assert throws INVALID_STATE_ERR ctx.drawImage(offscreenCanvas2, 0, 0);
-
+    ctx.drawImage(offscreenCanvas2, 0, 0);
     offscreenCanvas2.width = 0;
     offscreenCanvas2.height = 0;
-    @assert throws INVALID_STATE_ERR ctx.drawImage(offscreenCanvas2, 0, 0);
+    ctx.drawImage(offscreenCanvas2, 0, 0);
+    @assert pixel 50,25 ==~ 0,255,0,255;
 
 - name: 2d.drawImage.wrongtype
   desc: Incorrect image types in drawImage do not match any defined overloads, so WebIDL throws a TypeError
   testing:
     - 2d.drawImage.IDL
   code: |
     @assert throws TypeError ctx.drawImage(undefined, 0, 0);
     @assert throws TypeError ctx.drawImage(0, 0, 0);
--- a/testing/web-platform/tests/payment-request/interfaces.https.html
+++ b/testing/web-platform/tests/payment-request/interfaces.https.html
@@ -11,17 +11,17 @@ promise_test(async () => {
   const [dom, payment_request] = await Promise.all(
     urls.map(url => fetch(url).then(r => r.text())));
   const idlArray = new IdlArray();
   idlArray.add_untested_idls(dom);
   idlArray.add_idls(payment_request);
 
   // typedef EventHandler from HTML
   // https://html.spec.whatwg.org/#eventhandler
-  idlArray.add_idls(`
+  idlArray.add_untested_idls(`
     [TreatNonObjectAsNull]
     callback EventHandlerNonNull = any (Event event);
     typedef EventHandlerNonNull? EventHandler;
   `);
   const methods = "[{supportedMethods: 'foo'}]";
   const amount = "{currency: 'USD', value: '0'}";
   const details = `{total: {label: 'bar', amount: ${amount}} }`;
   idlArray.add_objects({
--- a/testing/web-platform/tests/resources/idlharness.js
+++ b/testing/web-platform/tests/resources/idlharness.js
@@ -1602,28 +1602,25 @@ IdlInterface.prototype.test_self = funct
             assert_equals(typeof desc.value, "object",
                           this.name + '.prototype[Symbol.unscopables] should be an object');
             assert_equals(Object.getPrototypeOf(desc.value), null,
                           this.name + '.prototype[Symbol.unscopables] should have a null prototype');
             assert_equals(Object.getOwnPropertySymbols(desc.value).length,
                           0,
                           this.name + '.prototype[Symbol.unscopables] should have the right number of symbol-named properties');
 
-            // Check that we do not have _extra_ unscopables.  Checking that we
-            // have all the ones we should will happen in the per-member tests.
-            var observed = Object.getOwnPropertyNames(desc.value);
-            for (var prop of observed) {
-                assert_not_equals(unscopables.indexOf(prop),
-                                  -1,
-                                  this.name + '.prototype[Symbol.unscopables] has unexpected property "' + prop + '"');
-            }
+            // It would be nice to check that we do not have _extra_
+            // unscopables, but someone might be calling us with only a subset
+            // of the IDL the browser know about, and our subset may exclude
+            // unscopable things that really do exist.
         } else {
-            assert_equals(Object.getOwnPropertyDescriptor(self[this.name].prototype, Symbol.unscopables),
-                          undefined,
-                          this.name + '.prototype should not have @@unscopables');
+            // It would be nice to assert that there is no @@unscopables on this
+            // prototype, but someone might be calling us with only a subset of
+            // the IDL the browser know about, and our subset may exclude
+            // unscopable things that really do exist.
         }
     }.bind(this), this.name + ' interface: existence and properties of interface prototype object\'s @@unscopables property');
 
 };
 
 //@}
 IdlInterface.prototype.test_immutable_prototype = function(type, obj)
 //@{
@@ -1957,16 +1954,18 @@ IdlInterface.prototype.do_member_unscopa
 {
     // Check that if the member is unscopable then it's in the
     // @@unscopables object properly.
     if (!member.isUnscopable) {
         return;
     }
 
     var unscopables = self[this.name].prototype[Symbol.unscopables];
+    assert_equals(typeof unscopables, "object",
+                  this.name + '.prototype[Symbol.unscopables] must exist');
     var prop = member.name;
     var propDesc = Object.getOwnPropertyDescriptor(unscopables, prop);
     assert_equals(typeof propDesc, "object",
                   this.name + '.prototype[Symbol.unscopables].' + prop + ' must exist')
     assert_false("get" in propDesc,
                  this.name + '.prototype[Symbol.unscopables].' + prop + ' must have no getter');
     assert_false("set" in propDesc,
                  this.name + '.prototype[Symbol.unscopables].' + prop + ' must have no setter');
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-badargs-attestation.https.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() attestation parameter Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    // attestation bad values
-    new CreateCredentialsTest("options.publicKey.attestation", {}).runTest("Bad attestation parameter: attestation is empty object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.attestation", []).runTest("Bad attestation parameter: attestation is empty array", new TypeError());
-    new CreateCredentialsTest("options.publicKey.attestation", null).runTest("Bad attestation parameter: attestation is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.attestation", "noneofyourbusiness").runTest("Bad attestation parameter: attestation is \"noneofyourbusiness\"", new TypeError());
-    new CreateCredentialsTest("options.publicKey.attestation", "").runTest("Bad attestation parameter: attestation is empty string", new TypeError());
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-badargs-authnrselection.https.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() authenticator selection Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    var defaultAuthnrSel = {
-        authenticatorAttachment: "cross-platform",
-        requireResidentKey: false,
-        userVerification: "preferred"
-    };
-    // attachment
-    var authnrSelAttachPlatform = cloneObject(defaultAuthnrSel);
-    authnrSelAttachPlatform.authenticatorAttachment = "platform";
-    var authnrSelBadAttachEmptyStr = cloneObject(defaultAuthnrSel);
-    authnrSelBadAttachEmptyStr.authenticatorAttachment = "";
-    var authnrSelBadAttachEmptyObj = cloneObject(defaultAuthnrSel);
-    authnrSelBadAttachEmptyObj.authenticatorAttachment = {};
-    var authnrSelBadAttachNull = cloneObject(defaultAuthnrSel);
-    authnrSelBadAttachNull.authenticatorAttachment = null;
-    // resident key
-    var authnrSelRkTrue = cloneObject(defaultAuthnrSel);
-    authnrSelRkTrue.requireResidentKey = true;
-    var authnrSelRkBadString = cloneObject(defaultAuthnrSel);
-    authnrSelRkBadString.requireResidentKey = "foo";
-    // user verification
-    var authnrSelUvRequired = cloneObject(defaultAuthnrSel);
-    authnrSelUvRequired.userVerification = "required";
-    var authnrSelBadUvEmptyStr = cloneObject(defaultAuthnrSel);
-    authnrSelBadUvEmptyStr.userVerification = "";
-    var authnrSelBadUvEmptyObj = cloneObject(defaultAuthnrSel);
-    authnrSelBadUvEmptyObj.userVerification = {};
-    var authnrSelBadUvStr = cloneObject(defaultAuthnrSel);
-    authnrSelBadUvStr.userVerification = "requiredshirtshoestshirt";
-    var authnrSelBadUvNull = cloneObject(defaultAuthnrSel);
-    authnrSelBadUvNull.userVerification = null;
-
-    // authenticatorSelection bad values
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", []).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection is empty array", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", null).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", "").runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection is empty string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", "none").runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection is string", new TypeError());
-
-    // authenticatorSelection bad attachment values
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelBadAttachEmptyStr).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment is empty string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelBadAttachEmptyObj).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment is empty object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelBadAttachNull).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment is null", new TypeError());
-    // XXX: assumes authnr is behaving like most U2F authnrs; really depends on the authnr or mock configuration
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelAttachPlatform).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection attachment platform", "NotAllowedError");
-
-    // authenticatorSelection bad requireResidentKey values
-   // XXX: assumes authnr is behaving like most U2F authnrs; really depends on the authnr or mock configuration
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelRkTrue).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection residentKey true", "NotAllowedError");
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelRkBadString).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection residentKey is string", new TypeError());
-    // TODO: not sure if rk is "boolean" or "truthy"; add test cases if it should only accept boolean values
-
-    // authenticatorSelection bad userVerification values
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelBadUvEmptyStr).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification empty string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelBadUvEmptyObj).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification empty object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelBadUvStr).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification bad value", new TypeError());
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelBadUvNull).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification null", new TypeError());
-    // XXX: assumes this is a mock authenticator the properly reports that it is not doing userVerfication
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelUvRequired).runTest("Bad AuthenticatorSelectionCriteria: authenticatorSelection userVerification required", "NotAllowedError");
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest, cloneObject */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-badargs-challenge.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() challenge Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    // bad challenge values
-    new CreateCredentialsTest({path: "options.publicKey.challenge", value: undefined}).runTest("Bad challenge: challenge missing", new TypeError());
-    new CreateCredentialsTest("options.publicKey.challenge", "hi mom").runTest("Bad challenge: challenge is string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.challenge", null).runTest("Bad challenge: challenge is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.challenge", {}).runTest("Bad challenge: challenge is empty object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.challenge", new Array()).runTest("Bad challenge: challenge is empty Array", new TypeError());
-    new CreateCredentialsTest("options.publicKey.challenge", new ArrayBuffer(0)).runTest("Bad challenge: challenge is empty ArrayBuffer", new TypeError());
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest */
-</script>
\ No newline at end of file
--- a/testing/web-platform/tests/webauthn/createcredential-badargs-rp.https.html
+++ b/testing/web-platform/tests/webauthn/createcredential-badargs-rp.https.html
@@ -7,36 +7,36 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src=helpers.js></script>
 <body></body>
 <script>
 standardSetup(function() {
     "use strict";
 
     // rp bad values
-    new CreateCredentialsTest({path: "options.publicKey.rp", value: undefined}).runTest("Bad rp: rp missing", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp", "hi mom").runTest("Bad rp: rp is string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp", {}).runTest("Bad rp: rp is empty object", new TypeError());
+    new CreateCredentialsTest({path: "options.publicKey.rp", value: undefined}).testBadArgs("rp missing");
+    new CreateCredentialsTest("options.publicKey.rp", "hi mom").testBadArgs("rp is string");
+    // new CreateCredentialsTest("options.publicKey.rp", {}).testBadArgs("rp is empty object");
 
-    // // rp.id
-    new CreateCredentialsTest("options.publicKey.rp.id", {}).runTest("Bad rp: id is object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp.id", null).runTest("Bad rp: id is null", "SecurityError");
-    new CreateCredentialsTest("options.publicKey.rp.id", "").runTest("Bad rp: id is empty String", "SecurityError");
-    new CreateCredentialsTest("options.publicKey.rp.id", "invalid domain.com").runTest("Bad rp: id is invalid domain (has space)", "SecurityError");
-    new CreateCredentialsTest("options.publicKey.rp.id", "-invaliddomain.com").runTest("Bad rp: id is invalid domain (starts with dash)", "SecurityError");
-    new CreateCredentialsTest("options.publicKey.rp.id", "0invaliddomain.com").runTest("Bad rp: id is invalid domain (starts with number)", "SecurityError");
+    // rp.id
+    // new CreateCredentialsTest({path: "options.publicKey.rp.id", value: undefined}).testBadArgs("rp missing id");
+    new CreateCredentialsTest("options.publicKey.rp.id", {}).testBadArgs("Bad rp: id is object");
+    new CreateCredentialsTest("options.publicKey.rp.id", null).testBadArgs("Bad rp: id is null");
+    new CreateCredentialsTest("options.publicKey.rp.id", "").testBadArgs("Bad rp: id is empty String");
 
-    // // rp.name
-    new CreateCredentialsTest({path: "options.publicKey.rp.name", value: undefined}).runTest("rp missing name", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp.name", {}).runTest("Bad rp: name is object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp.name", null).runTest("Bad rp: name is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp.name", "").runTest("Bad rp: name is empty String", new TypeError());
+    // rp.name
+    // new CreateCredentialsTest({path: "options.publicKey.rp.name", value: undefined}).testBadArgs("rp missing name");
+    new CreateCredentialsTest("options.publicKey.rp.name", {}).testBadArgs("Bad rp: name is object");
+    new CreateCredentialsTest("options.publicKey.rp.name", null).testBadArgs("Bad rp: name is null");
+    new CreateCredentialsTest("options.publicKey.rp.name", "").testBadArgs("Bad rp: name is empty String");
 
-    // // rp.icon
-    new CreateCredentialsTest("options.publicKey.rp.icon", {}).runTest("Bad rp: icon is object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp.icon", null).runTest("Bad rp: icon is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.rp.icon", "").runTest("Bad rp: icon is empty String", new TypeError());
-    // // TODO: unicode tests for icon URL (see also: USVString)
+    // rp.icon
+    // new CreateCredentialsTest({path: "options.publicKey.rp.icon", value: undefined}).testBadArgs("rp missing icon");
+    new CreateCredentialsTest("options.publicKey.rp.icon", {}).testBadArgs("Bad rp: icon is object");
+    new CreateCredentialsTest("options.publicKey.rp.icon", null).testBadArgs("Bad rp: icon is null");
+    new CreateCredentialsTest("options.publicKey.rp.icon", "").testBadArgs("Bad rp: icon is empty String");
+    // TODO: see https://github.com/w3c/webauthn/issues/587 for the 'undefined' tests that are commented out above
+    // TODO: unicode tests for icon URL (see also: USVString)
 });
 
 /* JSHINT */
 /* globals standardSetup, CreateCredentialsTest */
 </script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-badargs-user.https.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() user Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    // user bad values
-    new CreateCredentialsTest({path: "options.publicKey.user", value: undefined}).runTest("Bad user: user missing", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user", "hi mom").runTest("Bad user: user is string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user", {}).runTest("Bad user: user is empty object", new TypeError());
-
-    // // user.id
-    new CreateCredentialsTest({path: "options.publicKey.user.id", value: undefined}).runTest("Bad user: id is undefined", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", {}).runTest("Bad user: id is object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", null).runTest("Bad user: id is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", "").runTest("Bad user: id is empty String", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", new Array()).runTest("Bad user: id is empty Array", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", new ArrayBuffer(0)).runTest("Bad user: id is empty ArrayBuffer", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", new ArrayBuffer(65)).runTest("Bad user: ArrayBuffer id is too long (65 bytes)", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", new Int16Array(33)).runTest("Bad user: Int16Array id is too long (66 bytes)", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", new Int32Array(17)).runTest("Bad user: Int32Array id is too long (68 bytes)", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", new Float32Array(17)).runTest("Bad user: Float32Array id is too long (68 bytes)", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.id", new Float64Array(9)).runTest("Bad user: Float64Array id is too long (72 bytes)", new TypeError());
-    var buf = new ArrayBuffer(65);
-    new CreateCredentialsTest("options.publicKey.user.id", new DataView(buf)).runTest("Bad user: id is too long (65 bytes)", new TypeError());
-
-    // // user.name
-    new CreateCredentialsTest({path: "options.publicKey.user.name", value: undefined}).runTest("user missing name", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.name", {}).runTest("Bad user: name is object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.name", null).runTest("Bad user: name is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.name", "").runTest("Bad user: name is empty String", new TypeError());
-
-    // // user.icon
-    new CreateCredentialsTest("options.publicKey.user.icon", {}).runTest("Bad user: icon is object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.icon", null).runTest("Bad user: icon is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.icon", "").runTest("Bad user: icon is empty String", new TypeError());
-    // // TODO: unicode tests for icon URL (see also: USVString)
-
-    // // user.displayName
-    new CreateCredentialsTest({path: "options.publicKey.user.displayName", value: undefined}).runTest("Bad user: displayName is undefined", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.displayName", {}).runTest("Bad user: displayName is object", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.displayName", null).runTest("Bad user: displayName is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.user.displayName", "").runTest("Bad user: displayName is empty String", new TypeError());
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-excludecredentials.https.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() excludeCredentials Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    // bad excludeCredentials values
-    new CreateCredentialsTest("options.publicKey.excludeCredentials", "hi mom").runTest("Bad excludeCredentials: string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.excludeCredentials", {}).runTest("Bad excludeCredentials: empty object", new TypeError());
-    // TODO: bad excludeCredentials with [{.type}] or [{.id}] or [{.transports}] wrong
-
-    // good excludeCredentials values
-    new CreateCredentialsTest({path: "options.publicKey.excludeCredentials", value: undefined}).runTest("excludeCredentials missing");
-    new CreateCredentialsTest("options.publicKey.excludeCredentials", []).runTest("excludeCredentials empty array");
-
-    // proper excludeCredentials behavior
-    // should error on excluding existing credential
-    promise_test((t) => {
-        var cred1;
-        return Promise.resolve()
-            .then(() => {
-                return createCredential();
-            })
-            .then((cred) => {
-                cred1 = cred;
-                var excludeCred = {
-                    id: cred.rawId,
-                    type: "public-key"
-                };
-                var args = {
-                    options: {
-                        publicKey: {
-                            excludeCredentials: [excludeCred]
-                        }
-                    }
-                };
-                var p = createCredential(args);
-                return promise_rejects (t, "NotAllowedError", p, "expected to fail on excluded credenetial");
-            });
-    }, "exclude existing credential");
-
-    // should not error on excluding random credential
-    promise_test(() => {
-        return Promise.resolve()
-            .then(() => {
-                return createCredential();
-            })
-            .then(() => {
-                var randomCredId = new Uint8Array(162);
-                window.crypto.getRandomValues(randomCredId);
-
-                var excludeCred = {
-                    id: randomCredId,
-                    type: "public-key"
-                };
-                var args = {
-                    options: {
-                        publicKey: {
-                            excludeCredentials: [excludeCred]
-                        }
-                    }
-                };
-                return createCredential(args);
-            });
-    }, "exclude random (non-existing) credential");
-
-    // TODO: exclude including transport type (USB, BLE, NFC)
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest, createCredential, promise_test, promise_rejects */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-extensions.https.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() extensions Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    var dummyExtension = {
-        foo: true,
-        bar: "yup"
-    };
-
-    // bad extension values
-    new CreateCredentialsTest("options.publicKey.extensions", "hi mom").runTest("Bad extensions: extensions is string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.extensions", null).runTest("Bad extensions: extensions is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.extensions", []).runTest("Bad extensions: extensions is empty Array", new TypeError());
-    new CreateCredentialsTest("options.publicKey.extensions", new ArrayBuffer(0)).runTest("Bad extensions: extensions is empty ArrayBuffer", new TypeError());
-    var badJson = '{"foo": true, "bar: "yup"}'; // missing quote after "bar"
-    new CreateCredentialsTest("options.publicKey.extensions", {foo: badJson}).runTest("Bad extensions: malformatted JSON", new TypeError());
-    new CreateCredentialsTest("options.publicKey.extensions", {foo: dummyExtension}).runTest("Bad extensions: JavaScript object", new TypeError());
-    var badExtId = {};
-    badExtId[createRandomString(65)] = dummyExtension;
-    new CreateCredentialsTest("options.publicKey.extensions", {badExtId: dummyExtension}).runTest("Bad extensions: extension ID too long", new TypeError());
-
-    // phony extensions
-    // TODO: not sure if this should pass or fail
-    // should be clarified as part of https://github.com/w3c/webauthn/pull/765
-    var randomExtId = {};
-    randomExtId[createRandomString(64)] = dummyExtension;
-    new CreateCredentialsTest("options.publicKey.extensions", {foo: JSON.stringify(randomExtId)}).runTest("extensions is a nonsensical JSON string");
-
-    // TODO
-    // defined extensions:
-    // * appid
-    // * txAuthSimple
-    // * txAuthGeneric
-    // * authnSel
-    // * exts
-    // * uvi
-    // * loc
-    // * uvm
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest, createRandomString */
-</script>
\ No newline at end of file
--- a/testing/web-platform/tests/webauthn/createcredential-passing.https.html
+++ b/testing/web-platform/tests/webauthn/createcredential-passing.https.html
@@ -7,113 +7,14 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src=helpers.js></script>
 <body></body>
 <script>
 standardSetup(function() {
     "use strict";
 
     // CreateCredentialTest passing tests
-
-    // default arguments
-    new CreateCredentialsTest().runTest("passing credentials.create() with default arguments");
-
-    // rp
-    new CreateCredentialsTest({path: "options.publicKey.rp.id", value: window.location.host}).runTest("passing credentials.create() with rpId (host and port)");
-    new CreateCredentialsTest({path: "options.publicKey.rp.id", value: window.location.hostname}).runTest("passing credentials.create() with rpId (hostname)");
-    new CreateCredentialsTest({path: "options.publicKey.rp.icon", value: undefined}).runTest("passing credentials.create() without rp.icon");
-
-    // user
-    new CreateCredentialsTest("options.publicKey.user.id", new ArrayBuffer(1)).runTest("very short user id");
-    new CreateCredentialsTest("options.publicKey.user.id", new ArrayBuffer(64)).runTest("max length user id");
-    new CreateCredentialsTest("options.publicKey.user.id", new Uint8Array(64)).runTest("Uint8Array user id");
-    new CreateCredentialsTest("options.publicKey.user.id", new Int8Array(64)).runTest("Int8Array user id");
-    new CreateCredentialsTest("options.publicKey.user.id", new Int16Array(32)).runTest("Int16Array user id");
-    new CreateCredentialsTest("options.publicKey.user.id", new Int32Array(16)).runTest("Int32Array user id");
-    new CreateCredentialsTest("options.publicKey.user.id", new Float32Array(16)).runTest("Float32Array user id");
-    var dvBuf1 = new ArrayBuffer(16);
-    new CreateCredentialsTest("options.publicKey.user.id", new DataView(dvBuf1)).runTest("DataView user id");
-    new CreateCredentialsTest({path: "options.publicKey.user.icon", value: undefined}).runTest("passing credentials.create() without user.icon");
-
-    // good challenge values
-    // all these challenges are zero-filled buffers... think anyone will complain?
-    new CreateCredentialsTest("options.publicKey.challenge", new Int16Array(33)).runTest("Int16Array challenge");
-    new CreateCredentialsTest("options.publicKey.challenge", new Int32Array(17)).runTest("Int32Array challenge");
-    new CreateCredentialsTest("options.publicKey.challenge", new Float32Array(17)).runTest("Float32Array challenge");
-    new CreateCredentialsTest("options.publicKey.challenge", new Float64Array(9)).runTest("Float64Array challenge");
-    var dvBuf2 = new ArrayBuffer(65);
-    new CreateCredentialsTest("options.publicKey.challenge", new DataView(dvBuf2)).runTest("DataView challenge");
-    new CreateCredentialsTest("options.publicKey.challenge", new ArrayBuffer(8192)).runTest("Absurdly large challenge");
-
-    // good pubKeyCredParams values
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", []).runTest("Bad pubKeyCredParams: pubKeyCredParams is empty Array");
-    const pkParamEC256 = {
-        type: "public-key",
-        alg: cose_alg_ECDSA_w_SHA256
-    };
-    const pkParamEC512 = {
-        type: "public-key",
-        alg: cose_alg_ECDSA_w_SHA512
-    };
-    // XXX: presumes all mock authenticators support EC256
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC256]).runTest("EC256 pubKeyCredParams");
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC512, pkParamEC256])
-        .runTest("SelectEC256 pubKeyCredParams from a list");
-    // TODO: currently most browsers are mocking FIDO U2F, which is EC256 only
-    // new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC512]).runTest("EC512 pubKeyCredParams");
-
-    // NOTE: excludeCredentials parameter -- see also: createcredential-excludecredentials.https.html
-
-    // timeout
-    new CreateCredentialsTest({path: "options.publicKey.timeout", value: undefined}).runTest("passing credentials.create() with no timeout");
-
-    // valid authenticatorSelection values
-    var defaultAuthnrSel = {
-        authenticatorAttachment: "cross-platform",
-        requireResidentKey: false,
-        userVerification: "preferred"
-    };
-    // attachment
-    var authnrSelAttachUndef = cloneObject(defaultAuthnrSel);
-    authnrSelAttachUndef.authenticatorAttachment = undefined;
-    // resident key
-    var authnrSelRkUndef = cloneObject(defaultAuthnrSel);
-    authnrSelRkUndef.requireResidentKey = undefined;
-    var authnrSelRkFalse = cloneObject(defaultAuthnrSel);
-    authnrSelRkFalse.requireResidentKey = false;
-    // user verification
-    var authnrSelUvUndef = cloneObject(defaultAuthnrSel);
-    authnrSelUvUndef.userVerification = undefined;
-    var authnrSelUvDiscouraged = cloneObject(defaultAuthnrSel);
-    authnrSelUvDiscouraged.userVerification = "discouraged";
-    new CreateCredentialsTest({path: "options.publicKey.authenticatorSelection", value: undefined}).runTest("authenticatorSelection is undefined");
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", {}).runTest("authenticatorSelection is empty object");
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", cloneObject(defaultAuthnrSel)).runTest("authenticatorSelection default values");
-
-    // authnr selection attachment
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelAttachUndef).runTest("authenticatorSelection attachment undefined");
-
-    // authnr selection resident key
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelRkUndef).runTest("authenticatorSelection residentKey undefined");
-    // XXX: assumes authnr is behaving like most U2F authnrs; really depends on the authnr or mock configuration
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelRkFalse).runTest("authenticatorSelection residentKey false");
-
-    // authnr selection user verification
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelUvUndef).runTest("authenticatorSelection userVerification undefined");
-    new CreateCredentialsTest("options.publicKey.authenticatorSelection", authnrSelUvDiscouraged).runTest("authenticatorSelection userVerification discouraged");
-
-
-    // good attestation values
-    new CreateCredentialsTest("options.publicKey.attestation", "none").runTest("attestation parameter: attestation is \"none\"");
-    new CreateCredentialsTest("options.publicKey.attestation", "indirect").runTest("attestation parameter: attestation is \"indirect\"");
-    new CreateCredentialsTest("options.publicKey.attestation", "direct").runTest("attestation parameter: attestation is \"direct\"");
-    new CreateCredentialsTest({path: "options.publicKey.attestation", value: undefined}).runTest("attestation parameter: attestation is undefined");
-    // TODO: test this with multiple mock authenticators to make sure that the right options are chosen when available?
-
-    // good extension values
-    new CreateCredentialsTest({path: "options.publicKey.extensions", value: undefined}).runTest("extensions undefined");
-    new CreateCredentialsTest("options.publicKey.extensions", {}).runTest("extensions are empty object");
-    new CreateCredentialsTest("options.publicKey.extensions", {foo: "", bar: "", bat: ""}).runTest("extensions are dict of empty strings");
+    new CreateCredentialsTest().test();
 });
 
 /* JSHINT */
-/* globals standardSetup, CreateCredentialsTest, cose_alg_ECDSA_w_SHA256, cose_alg_ECDSA_w_SHA512, cloneObject */
+/* globals standardSetup, CreateCredentialsTest */
 </script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-pubkeycredparams.https.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() pubKeyCredParams Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    var badType = {
-        type: "something-else",
-        alg: cose_alg_ECDSA_w_SHA512
-    };
-    var badTypeEmptyString = cloneObject(badType);
-    badTypeEmptyString.type = "";
-    var badTypeNull = cloneObject(badType);
-    badTypeNull.type = null;
-    var badTypeEmptyObj = cloneObject(badType);
-    badTypeEmptyObj.type = {};
-
-    var badAlg = {
-        type: "public-key",
-        alg: 42
-    };
-    var badAlgZero = cloneObject(badAlg);
-    badAlgZero.alg = 0;
-
-    // bad pubKeyCredParams values
-    new CreateCredentialsTest({path: "options.publicKey.pubKeyCredParams", value: undefined}).runTest("Bad pubKeyCredParams: pubKeyCredParams is undefined", new TypeError());
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", "hi mom").runTest("Bad pubKeyCredParams: pubKeyCredParams is string", new TypeError());
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", null).runTest("Bad pubKeyCredParams: pubKeyCredParams is null", new TypeError());
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [badType]).runTest("Bad pubKeyCredParams: first param has bad type (\"something-else\")", new TypeError());
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [badTypeEmptyString]).runTest("Bad pubKeyCredParams: first param has bad type (\"\")", new TypeError());
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [badTypeNull]).runTest("Bad pubKeyCredParams: first param has bad type (null)", new TypeError());
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [badTypeEmptyObj]).runTest("Bad pubKeyCredParams: first param has bad type (empty object)", new TypeError());
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [badAlg]).runTest("Bad pubKeyCredParams: first param has bad alg (42)", "NotSupportedError");
-    new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [badAlgZero]).runTest("Bad pubKeyCredParams: first param has bad alg (0)", "NotSupportedError");
-
-    // TODO: come back to this when mock authenticators support multiple cryptos so that we can test the preference ranking
-    // function verifyEC256(res) {
-    //     debug ("verifyEC256 got", res);
-    //     debug ("client data JSON", ab2str(res.response.clientDataJSON));
-    //     parseAuthenticatorData(res.response.attestationObject);
-    // }
-    // new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC256, pkParamEC512])
-    //     .afterTest(verifyEC256)
-    //     .runTest("EC256, EC512 pubKeyCredParams");
-    // function verifyEC512(res) {
-    //     debug ("verifyEC512 got", res);
-    //     debug ("client data JSON", ab2str(res.response.clientDataJSON));
-    //     // parseAuthenticatorData(res.response.attestationObject);
-    //     printHex ("clientDataJSON", res.response.clientDataJSON);
-    //     printHex ("attestationObject", res.response.attestationObject);
-    // }
-    // new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC512, pkParamEC256])
-    //     .afterTest(verifyEC512)
-    //     .runTest("EC512, EC256 pubKeyCredParams");
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest, cose_alg_ECDSA_w_SHA512, cloneObject */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/createcredential-timeout.https.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.create() timeout Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    // bad timeout values
-    // TODO: there is some debate as to whether MAX_UNSIGNED_LONG + 1 and / or -1 should be disallowed since they get converted to valid values internally
-    // new CreateCredentialsTest({path: "options.publicKey.timeout", value: -1}).runTest("Bad timeout: negative", new TypeError());
-    // new CreateCredentialsTest({path: "options.publicKey.timeout", value: 4294967295 + 1}).runTest("Bad timeout: too big", new TypeError());
-
-    // timeout test
-    // XXX: this probably always passes with most mock authenticators unless
-    // some setup happens right here to make sure they don't return a credential
-    // right away. So... uhh... I guess test this with a real authenticator if you
-    // want to see if it really works.
-    promise_test(() => {
-        return new Promise((resolve, reject) => {
-            var args = {
-                options: {
-                    publicKey: {
-                        timeout: 1
-                    }
-                }
-            };
-
-            setTimeout(() => {
-                reject(new Error ("timed out"));
-            }, 1000);
-
-            createCredential(args).then((res) => {
-                resolve(res);
-            });
-        });
-    }, "ensure create credential times out");
-    // TODO: createCredential.timeout > 1s && setTimeout < 1s
-    // TODO: createCredential.timeout < 5s && setTimeout > 5s
-});
-
-/* JSHINT */
-/* globals standardSetup, CreateCredentialsTest, createCredential, promise_test */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/getcredential-badargs-rpid.https.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn credential.get() rpId Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    var credPromise = createCredential();
-
-    new GetCredentialsTest("options.publicKey.rpId", "")
-        .addCredential(credPromise)
-        .runTest("Bad rpId: empty string", "SecurityError");
-    new GetCredentialsTest("options.publicKey.rpId", null)
-        .addCredential(credPromise)
-        .runTest("Bad rpId: null", "SecurityError");
-    new GetCredentialsTest("options.publicKey.rpId", "invalid domain.com")
-        .addCredential(credPromise)
-        .runTest("Bad rpId: invalid domain (has space)", "SecurityError");
-    new GetCredentialsTest("options.publicKey.rpId", "-invaliddomain.com")
-        .addCredential(credPromise)
-        .runTest("Bad rpId: invalid domain (starts with dash)", "SecurityError");
-    new GetCredentialsTest("options.publicKey.rpId", "0invaliddomain.com")
-        .addCredential(credPromise)
-        .runTest("Bad rpId: invalid domain (starts with number)", "SecurityError");
-});
-
-/* JSHINT */
-/* globals standardSetup, GetCredentialsTest, createCredential */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/getcredential-badargs-userverification.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.get() user verification Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    var credPromise = createCredential();
-
-    // authenticatorSelection bad userVerification values
-    new GetCredentialsTest("options.publicKey.userVerification", "")
-        .addCredential(credPromise)
-        .runTest("Bad userVerification: empty string", new TypeError());
-    new GetCredentialsTest("options.publicKey.userVerification", {})
-        .addCredential(credPromise)
-        .runTest("Bad userVerification: empty object", new TypeError());
-    new GetCredentialsTest("options.publicKey.userVerification", "requiredshirtshoestshirt")
-        .addCredential(credPromise)
-        .runTest("Bad userVerification: bad value", new TypeError());
-    new GetCredentialsTest("options.publicKey.userVerification", null)
-        .addCredential(credPromise)
-        .runTest("Bad userVerification: null", new TypeError());
-    // XXX: assumes this is a mock authenticator the properly reports that it is not doing userVerfication
-    new GetCredentialsTest("options.publicKey.userVerification", "required")
-        .addCredential(credPromise)
-        .runTest("Bad userVerification: \"required\"", "NotAllowedError");
-});
-
-/* JSHINT */
-/* globals standardSetup, GetCredentialsTest, createCredential */
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/getcredential-extensions.https.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.get() extensions Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    var dummyExtension = {
-        foo: true,
-        bar: "yup"
-    };
-    var credPromise = createCredential();
-
-    // bad extension values
-    new GetCredentialsTest("options.publicKey.extensions", "hi mom")
-        .addCredential(credPromise)
-        .runTest("Bad extensions: extensions is string", new TypeError());
-    new GetCredentialsTest("options.publicKey.extensions", null)
-        .addCredential(credPromise)
-        .runTest("Bad extensions: extensions is null", new TypeError());
-    new GetCredentialsTest("options.publicKey.extensions", [])
-        .addCredential(credPromise)
-        .runTest("Bad extensions: extensions is empty Array", new TypeError());
-    new GetCredentialsTest("options.publicKey.extensions", new ArrayBuffer(0))
-        .addCredential(credPromise)
-        .runTest("Bad extensions: extensions is empty ArrayBuffer", new TypeError());
-    var badJson = '{"foo": true, "bar: "yup"}'; // missing quote after "bar"
-    new GetCredentialsTest("options.publicKey.extensions", {foo: badJson})
-        .addCredential(credPromise)
-        .runTest("Bad extensions: malformatted JSON", new TypeError());
-    new GetCredentialsTest("options.publicKey.extensions", {foo: dummyExtension})
-        .addCredential(credPromise)
-        .runTest("Bad extensions: JavaScript object", new TypeError());
-    var badExtId = {};
-    badExtId[createRandomString(65)] = dummyExtension;
-    new GetCredentialsTest("options.publicKey.extensions", {badExtId: dummyExtension})
-        .addCredential(credPromise)
-        .runTest("Bad extensions: extension ID too long", new TypeError());
-
-    // phony extensions
-    // TODO: not sure if this should pass or fail
-    // should be clarified as part of https://github.com/w3c/webauthn/pull/765
-    var randomExtId = {};
-    randomExtId[createRandomString(64)] = dummyExtension;
-    new GetCredentialsTest("options.publicKey.extensions", {foo: JSON.stringify(randomExtId)})
-        .addCredential(credPromise)
-        .runTest("extensions is a nonsensical JSON string");
-
-    // TODO
-    // defined extensions:
-    // * appid
-    // * txAuthSimple
-    // * txAuthGeneric
-    // * authnSel
-    // * exts
-    // * uvi
-    // * loc
-    // * uvm
-});
-
-/* JSHINT */
-/* globals standardSetup, GetCredentialsTest, createRandomString, createCredential */
-</script>
\ No newline at end of file
--- a/testing/web-platform/tests/webauthn/getcredential-passing.https.html
+++ b/testing/web-platform/tests/webauthn/getcredential-passing.https.html
@@ -6,61 +6,16 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src=helpers.js></script>
 <body></body>
 <script>
 standardSetup(function() {
     "use strict";
 
-    var credPromise = createCredential();
-
-    // GetCredentialsTest with default args
-    new GetCredentialsTest()
-        .addCredential(credPromise)
-        .runTest("passing credentials.get() with default args");
-
-    // timeout
-    new GetCredentialsTest({path: "options.publicKey.timeout", value: undefined})
-        .addCredential(credPromise)
-        .runTest("passing credentials.create() with no timeout");
-
-    // rpId
-    new GetCredentialsTest({path: "options.publicKey.rpId", value: undefined})
-        .addCredential(credPromise)
-        .runTest("rpId undefined");
-    new GetCredentialsTest({path: "options.publicKey.rpId", value: window.location.host})
-        .addCredential(credPromise)
-        .runTest("passing credentials.get() with rpId (host and port)");
-    new GetCredentialsTest({path: "options.publicKey.rpId", value: window.location.hostname})
-        .addCredential(credPromise)
-        .runTest("passing credentials.get() with rpId (hostname)");
-
-    // allowCredentials
-    new GetCredentialsTest({path: "options.publicKey.allowCredentials", value: undefined})
-        .runTest("no credential specified");
-
-    // authnr selection user verification
-    new GetCredentialsTest({path: "options.publicKey.userVerification", value: undefined})
-        .addCredential(credPromise)
-        .runTest("authenticatorSelection userVerification undefined");
-    new GetCredentialsTest("options.publicKey.userVerification", "preferred")
-        .addCredential(credPromise)
-        .runTest("authenticatorSelection userVerification preferred");
-    new GetCredentialsTest("options.publicKey.userVerification", "discouraged")
-        .addCredential(credPromise)
-        .runTest("authenticatorSelection userVerification discouraged");
-
-    // good extension values
-    new GetCredentialsTest({path: "options.publicKey.extensions", value: undefined})
-        .addCredential(credPromise)
-        .runTest("extensions undefined");
-    new GetCredentialsTest("options.publicKey.extensions", {})
-        .addCredential(credPromise)
-        .runTest("extensions are empty object");
-    new GetCredentialsTest("options.publicKey.extensions", {foo: "", bar: "", bat: ""})
-        .addCredential(credPromise)
-        .runTest("extensions are dict of empty strings");
+    // GetCredentialsTest passing tests
+    // new GetCredentialsTest().addCredential();
+    new GetCredentialsTest().addCredential().test();
 });
 
 /* JSHINT */
-/* globals standardSetup, GetCredentialsTest, createCredential */
+/* globals standardSetup, GetCredentialsTest */
 </script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/webauthn/getcredential-timeout.https.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>WebAuthn navigator.credentials.get() timeout Tests</title>
-<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
-<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=helpers.js></script>
-<body></body>
-<script>
-standardSetup(function() {
-    "use strict";
-
-    var credPromise = createCredential();
-
-    // bad timeout values
-    // TODO: there is some debate as to whether MAX_UNSIGNED_LONG + 1 and / or -1 should be disallowed since they get converted to valid values internally
-    // new GetCredentialsTest({path: "options.publicKey.timeout", value: -1})
-    //     .addCredential(credPromise)
-    //     .runTest("Bad timeout: negative", new TypeError());
-    // new GetCredentialsTest({path: "options.publicKey.timeout", value: 4294967295 + 1})
-    //     .addCredential(credPromise)
-    //     .runTest("Bad timeout: too big", new TypeError());
-
-    // timeout test
-    // XXX: this probably always passes with most mock authenticators unless
-    // some setup happens right here to make sure they don't return a credential
-    // right away. So... uhh... I guess test this with a real authenticator if you
-    // want to see if it really works.
-    var timer;
-    function startTimer() {
-        timer = setTimeout(() => {
-            throw new Error("Timer went off before timeout");
-        }, 1000);
-    }
-    function stopTimer() {
-        clearTimeout(timer);
-    }
-    new GetCredentialsTest({path: "options.publicKey.timeout", value: 1})
-        .addCredential(credPromise)
-        .beforeTest(startTimer)
-        .afterTest(stopTimer)
-        .runTest("ensure create credential times out");
-    // TODO: createCredential.timeout > 1s && setTimeout < 1s
-    // TODO: createCredential.timeout < 5s && setTimeout > 5s
-});
-
-/* JSHINT */
-/* globals standardSetup, GetCredentialsTest, createCredential */
-</script>
\ No newline at end of file
--- a/testing/web-platform/tests/webauthn/helpers.js
+++ b/testing/web-platform/tests/webauthn/helpers.js
@@ -1,131 +1,21 @@
-// Useful constants for working with COSE key objects
+
+/* Useful constants for working with COSE key objects */
 const cose_kty = 1;
 const cose_kty_ec2 = 2;
 const cose_alg = 3;
 const cose_alg_ECDSA_w_SHA256 = -7;
 const cose_alg_ECDSA_w_SHA512 = -36;
 const cose_crv = -1;
 const cose_crv_P256 = 1;
 const cose_crv_x = -2;
 const cose_crv_y = -3;
 
 /**
- * These are the default arguments that will be passed to navigator.credentials.create()
- * unless modified by a specific test case
- */
-var createCredentialDefaultArgs = {
-    options: {
-        publicKey: {
-            // Relying Party:
-            rp: {
-                name: "Acme",
-                icon: "https://www.w3.org/StyleSheets/TR/2016/logos/W3C"
-            },
-
-            // User:
-            user: {
-                id: new Uint8Array(16), // Won't survive the copy, must be rebuilt
-                name: "john.p.smith@example.com",
-                displayName: "John P. Smith",
-                icon: "https://pics.acme.com/00/p/aBjjjpqPb.png"
-            },
-
-            pubKeyCredParams: [{
-                type: "public-key",
-                alg: cose_alg_ECDSA_w_SHA256,
-            }],
-
-            timeout: 60000, // 1 minute
-            excludeCredentials: [] // No excludeList
-        }
-    }
-};
-
-/**
- * These are the default arguments that will be passed to navigator.credentials.get()
- * unless modified by a specific test case
- */
-var getCredentialDefaultArgs = {
-    options: {
-        publicKey: {
-            timeout: 60000
-            // allowCredentials: [newCredential]
-        }
-    }
-};
-
-function createCredential(opts) {
-    opts = opts || {};
-
-    // set the default options
-    var createArgs = cloneObject(createCredentialDefaultArgs);
-    let challengeBytes = new Uint8Array(16);
-    window.crypto.getRandomValues(challengeBytes);
-    createArgs.options.publicKey.challenge = challengeBytes;
-    createArgs.options.publicKey.user.id = new Uint8Array(16);
-
-    // change the defaults with any options that were passed in
-    extendObject (createArgs, opts);
-
-    // create the credential, return the Promise
-    return navigator.credentials.create(createArgs.options);
-}
-
-function createRandomString(len) {
-    var text = "";
-    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
-    for(var i = 0; i < len; i++) {
-        text += possible.charAt(Math.floor(Math.random() * possible.length));
-    }
-    return text;
-}
-
-
-function ab2str(buf) {
-    return String.fromCharCode.apply(null, new Uint8Array(buf));
-}
-
-// Useful constants for working with attestation data
-const authenticator_data_user_present = 0x01;
-const authenticator_data_user_verified = 0x04;
-const authenticator_data_attested_cred_data = 0x40;
-const authenticator_data_extension_data = 0x80;
-
-function parseAuthenticatorData(buf) {
-    if (buf.byteLength < 37) {
-        throw new TypeError ("parseAuthenticatorData: buffer must be at least 37 bytes");
-    }
-
-    printHex ("authnrData", buf);
-
-    var authnrData = new DataView(buf);
-    var authnrDataObj = {};
-    authnrDataObj.length = buf.byteLength;
-
-    authnrDataObj.rpIdHash = new Uint8Array (buf.slice (0,32));
-    authnrDataObj.rawFlags = authnrData.getUint8(32);
-    authnrDataObj.counter = authnrData.getUint32(33, false);
-    authnrDataObj.rawCounter = [];
-    authnrDataObj.rawCounter[0] = authnrData.getUint8(33);
-    authnrDataObj.rawCounter[1] = authnrData.getUint8(34);
-    authnrDataObj.rawCounter[2] = authnrData.getUint8(35);
-    authnrDataObj.rawCounter[3] = authnrData.getUint8(36);
-    authnrDataObj.flags = {};
-
-    authnrDataObj.flags.userPresent = (authnrDataObj.rawFlags&authenticator_data_user_present)?true:false;
-    authnrDataObj.flags.userVerified = (authnrDataObj.rawFlags&authenticator_data_user_verified)?true:false;
-    authnrDataObj.flags.attestedCredentialData = (authnrDataObj.rawFlags&authenticator_data_attested_cred_data)?true:false;
-    authnrDataObj.flags.extensionData = (authnrDataObj.rawFlags&authenticator_data_extension_data)?true:false;
-
-    return authnrDataObj;
-}
-
-/**
  * TestCase
  *
  * A generic template for test cases
  * Is intended to be overloaded with subclasses that override testObject, testFunction and argOrder
  * The testObject is the default arguments for the testFunction
  * The default testObject can be modified with the modify() method, making it easy to create new tests based on the default
  * The testFunction is the target of the test and is called by the doIt() method. doIt() applies the testObject as arguments via toArgs()
  * toArgs() uses argOrder to make sure the resulting array is in the right order of the arguments for the testFunction
@@ -223,137 +113,76 @@ class TestCase {
             throw new Error("Test function not found");
         }
 
         return this.testFunction.call(this.ctx, ...this.toArgs());
     }
 
     /**
      * run the test function with the top-level properties of the test object applied as arguments
-     * expects the test to pass, and then validates the results
      */
-    testPasses(desc) {
-        return this.doIt()
-            .then((ret) => {
-                // check the result
-                this.validateRet(ret);
-                return ret;
-            });
-    }
-
-    /**
-     * run the test function with the top-level properties of the test object applied as arguments
-     * expects the test to fail
-     */
-    testFails(t, testDesc, expectedErr) {
-        return promise_rejects(t, expectedErr, this.doIt(), "Expected bad parameters to fail");
-    }
-
-    /**
-     * Runs the test that's implemented by the class by calling the doIt() function
-     * @param  {String} desc                A description of the test being run
-     * @param  [Error|String] expectedErr   A string matching an error type, such as "SecurityError" or an object with a .name value that is an error type string
-     */
-    runTest(desc, expectedErr) {
-        promise_test((t) => {
-            return Promise.resolve().then(() => {
-                return this.testSetup();
-            }).then(() => {
-                if (expectedErr === undefined) {
-                    return this.testPasses(desc);
-                } else {
-                    return this.testFails(t, desc, expectedErr);
-                }
-            }).then((res