Import wpt@2e19bfdaee6edb2c1069c07e14037284167284a3

Using wpt-import in Chromium 5ed1942e0d49397f14d1df21b6da622e7bbf3ed2.
With Chromium commits locally applied on WPT:
e8a7911921 "Fixed wpt csp reporting tests and moved over chrome internal ones"


Build: https://ci.chromium.org/buildbot/chromium.infra.cron/wpt-importer/10757

Note to sheriffs: This CL imports external tests and adds
expectations for those tests; if this CL is large and causes
a few new failures, please fix the failures by adding new
lines to TestExpectations rather than reverting. See:
https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_platform_tests.md

Directory owners for changes in this CL:
ecobos@igalia.com:
  external/wpt/css/css-display
jfernandez@igalia.com:
  external/wpt/css/css-align
kojii@chromium.org:
  external/wpt/css/css-scoping
meade@chromium.org:
  external/wpt/web-animations
rego@igalia.com:
  external/wpt/css/css-ui
tyoshino@chromium.org, yhirano@chromium.org, mkwst@chromium.org, japhet@chromium.org:
  external/wpt/fetch

TBR=jsbell

No-Export: true
Change-Id: I1ec2d92b8637c03f9e0be741c1ce40a2be660093
Reviewed-on: https://chromium-review.googlesource.com/881762
Commit-Queue: Blink WPT Bot <blink-w3c-test-autoroller@chromium.org>
Reviewed-by: Blink WPT Bot <blink-w3c-test-autoroller@chromium.org>
Cr-Commit-Position: refs/heads/master@{#531384}
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index cfdb272..5148b0c 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1753,6 +1753,8 @@
 crbug.com/805061 external/wpt/custom-elements/upgrading/Node-cloneNode.html [ Crash ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/css-display/display-contents-fieldset-nested-legend.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-ui/text-overflow-026.html [ Failure ]
 crbug.com/626703 external/wpt/svg/path/closepath/segment-completing.svg [ Failure ]
 crbug.com/626703 external/wpt/svg/path/distance/pathLength-positive.svg [ Failure ]
 crbug.com/626703 external/wpt/svg/path/distance/pathLength-zero.svg [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index 26c1931..606a927 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -27029,6 +27029,18 @@
      {}
     ]
    ],
+   "css/css-align/content-distribution/place-content-shorthand-007.html": [
+    [
+     "/css/css-align/content-distribution/place-content-shorthand-007.html",
+     [
+      [
+       "/css/css-align/content-distribution/place-content-shorthand-007-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-align/distribution-values/space-evenly-001.html": [
     [
      "/css/css-align/distribution-values/space-evenly-001.html",
@@ -33929,6 +33941,18 @@
      {}
     ]
    ],
+   "css/css-display/display-contents-fieldset-nested-legend.html": [
+    [
+     "/css/css-display/display-contents-fieldset-nested-legend.html",
+     [
+      [
+       "/css/css-display/display-contents-fieldset-nested-legend-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-display/display-contents-fieldset.html": [
     [
      "/css/css-display/display-contents-fieldset.html",
@@ -67013,6 +67037,18 @@
      {}
     ]
    ],
+   "css/css-ui/text-overflow-026.html": [
+    [
+     "/css/css-ui/text-overflow-026.html",
+     [
+      [
+       "/css/css-ui/text-overflow-026-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-values/attr-color-invalid-cast.html": [
     [
      "/css/css-values/attr-color-invalid-cast.html",
@@ -67169,6 +67205,18 @@
      {}
     ]
    ],
+   "css/css-values/calc-ch-ex-lang.html": [
+    [
+     "/css/css-values/calc-ch-ex-lang.html",
+     [
+      [
+       "/css/css-values/calc-ch-ex-lang-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-values/calc-in-calc.html": [
     [
      "/css/css-values/calc-in-calc.html",
@@ -67229,6 +67277,18 @@
      {}
     ]
    ],
+   "css/css-values/calc-rem-lang.html": [
+    [
+     "/css/css-values/calc-rem-lang.html",
+     [
+      [
+       "/css/css-values/calc-rem-lang-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-values/ch-unit-001.html": [
     [
      "/css/css-values/ch-unit-001.html",
@@ -98752,6 +98812,11 @@
      {}
     ]
    ],
+   "css/css-align/content-distribution/place-content-shorthand-007-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-align/reference/ttwf-reftest-alignContent-ref.html": [
     [
      {}
@@ -100412,6 +100477,11 @@
      {}
     ]
    ],
+   "css/css-display/display-contents-fieldset-nested-legend-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-display/display-contents-flex-001-ref.html": [
     [
      {}
@@ -111542,6 +111612,11 @@
      {}
     ]
    ],
+   "css/css-scoping/slotted-invalidation-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/css-scoping/slotted-with-pseudo-element-ref.html": [
     [
      {}
@@ -117812,6 +117887,11 @@
      {}
     ]
    ],
+   "css/css-ui/text-overflow-026-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-ui/text-overflow-ref.html": [
     [
      {}
@@ -117822,6 +117902,16 @@
      {}
     ]
    ],
+   "css/css-values/calc-ch-ex-lang-ref.html": [
+    [
+     {}
+    ]
+   ],
+   "css/css-values/calc-rem-lang-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-values/calc-serialization-expected.txt": [
     [
      {}
@@ -139747,6 +139837,11 @@
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/module/resources/fast-module.js": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js": [
     [
      {}
@@ -139802,6 +139897,11 @@
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/module/resources/slow-module.js": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/module/set-currentScript-on-window.js": [
     [
      {}
@@ -148207,6 +148307,11 @@
      {}
     ]
    ],
+   "service-workers/service-worker/fetch-response-taint.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "service-workers/service-worker/import-scripts-redirect.https-expected.txt": [
     [
      {}
@@ -148357,11 +148462,6 @@
      {}
     ]
    ],
-   "service-workers/service-worker/registration-updateviacache.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "service-workers/service-worker/resource-timing.https-expected.txt": [
     [
      {}
@@ -148372,6 +148472,16 @@
      {}
     ]
    ],
+   "service-workers/service-worker/resources/about-blank-replacement-blank-dynamic-nested-frame.html": [
+    [
+     {}
+    ]
+   ],
+   "service-workers/service-worker/resources/about-blank-replacement-blank-nested-frame.html": [
+    [
+     {}
+    ]
+   ],
    "service-workers/service-worker/resources/about-blank-replacement-frame.py": [
     [
      {}
@@ -148387,6 +148497,11 @@
      {}
     ]
    ],
+   "service-workers/service-worker/resources/about-blank-replacement-srcdoc-nested-frame.html": [
+    [
+     {}
+    ]
+   ],
    "service-workers/service-worker/resources/about-blank-replacement-uncontrolled-nested-frame.html": [
     [
      {}
@@ -149477,6 +149592,11 @@
      {}
     ]
    ],
+   "service-workers/service-worker/unregister-then-register-new-script.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "service-workers/service-worker/update-after-oneday.https-expected.txt": [
     [
      {}
@@ -151397,6 +151517,11 @@
      {}
     ]
    ],
+   "web-animations/interfaces/KeyframeEffect/composite-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "web-animations/interfaces/KeyframeEffect/constructor-expected.txt": [
     [
      {}
@@ -167921,6 +168046,12 @@
      {}
     ]
    ],
+   "credential-management/require_securecontext.html": [
+    [
+     "/credential-management/require_securecontext.html",
+     {}
+    ]
+   ],
    "css/css-align/content-distribution/parse-align-content-001.html": [
     [
      "/css/css-align/content-distribution/parse-align-content-001.html",
@@ -170179,6 +170310,12 @@
      {}
     ]
    ],
+   "css/css-scoping/slotted-invalidation.html": [
+    [
+     "/css/css-scoping/slotted-invalidation.html",
+     {}
+    ]
+   ],
    "css/css-scoping/slotted-parsing.html": [
     [
      "/css/css-scoping/slotted-parsing.html",
@@ -174673,6 +174810,12 @@
      {}
     ]
    ],
+   "custom-elements/parser/parser-constructs-custom-elements-with-is.html": [
+    [
+     "/custom-elements/parser/parser-constructs-custom-elements-with-is.html",
+     {}
+    ]
+   ],
    "custom-elements/parser/parser-constructs-custom-elements.html": [
     [
      "/custom-elements/parser/parser-constructs-custom-elements.html",
@@ -189497,6 +189640,14 @@
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html": [
     [
      "/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html",
@@ -240800,6 +240951,10 @@
    "3ce3b0a2eaa10928aec1f32c9e3bcbe2af5fafba",
    "testharness"
   ],
+  "credential-management/require_securecontext.html": [
+   "4a266e0c663a12ace13f6f08a7899236b489f698",
+   "testharness"
+  ],
   "credential-management/support/echoing-nester.html": [
    "408bf741f31a9f69a2a9a50d93877f6a999cd9d9",
    "support"
@@ -254660,6 +254815,14 @@
    "5eaf145e4c91b972937ee364ba07be05cb44d1fd",
    "testharness"
   ],
+  "css/css-align/content-distribution/place-content-shorthand-007-ref.html": [
+   "6008fc2ca235c4b4c171ace405fd312647be3313",
+   "support"
+  ],
+  "css/css-align/content-distribution/place-content-shorthand-007.html": [
+   "5268627f55928b969e022a626961958ac8f92e05",
+   "reftest"
+  ],
   "css/css-align/default-alignment/justify-items-legacy-001.html": [
    "bcf17f709a9b87ef728262b658d1dfa65afc93bb",
    "testharness"
@@ -259248,6 +259411,14 @@
    "c874f59947d37659e640d4e0abb8a0dc0f03927d",
    "reftest"
   ],
+  "css/css-display/display-contents-fieldset-nested-legend-ref.html": [
+   "89fbd146ffbd862ba3d0f058d8d8c9d8024da0fa",
+   "support"
+  ],
+  "css/css-display/display-contents-fieldset-nested-legend.html": [
+   "45be585ab1523c180b3ba159d25d0dadd80456ac",
+   "reftest"
+  ],
   "css/css-display/display-contents-fieldset.html": [
    "353abc0ce5abe98a1678fbd5832bf16a0d8b5094",
    "reftest"
@@ -273876,6 +274047,14 @@
    "46913ea7e47811b11be898de5c3bd0a330ea6637",
    "testharness"
   ],
+  "css/css-scoping/slotted-invalidation-expected.txt": [
+   "ba0ab97c9e166125c81cf46fba09387c5333b874",
+   "support"
+  ],
+  "css/css-scoping/slotted-invalidation.html": [
+   "c500e1ceba1b293d45df5f66fd89d4a5d9ceb952",
+   "testharness"
+  ],
   "css/css-scoping/slotted-parsing.html": [
    "6bac5b15011d7177a40f7ca3e3c5f7e410643920",
    "testharness"
@@ -288428,6 +288607,14 @@
    "b4a2e0d1b86fd8893421de4335c9b6f36df1fc4d",
    "reftest"
   ],
+  "css/css-ui/text-overflow-026-ref.html": [
+   "03c0337af58ba7bada64ab36721d9f1fe2f9a2f3",
+   "support"
+  ],
+  "css/css-ui/text-overflow-026.html": [
+   "5087fe90cb3ef8e340be316f1534cb6dba3e0d17",
+   "reftest"
+  ],
   "css/css-ui/text-overflow-ref.html": [
    "db55b0b95a7406e9c4f00081b3e2cbe6b07363f7",
    "support"
@@ -288500,6 +288687,14 @@
    "70627dbbfc5af5fb859fdf1362f0004b38c64e34",
    "reftest"
   ],
+  "css/css-values/calc-ch-ex-lang-ref.html": [
+   "218e1cb6782b554de35aad70913cddb8e7d71da2",
+   "support"
+  ],
+  "css/css-values/calc-ch-ex-lang.html": [
+   "d15f42e237b281793ac808e06af92217d4f9593e",
+   "reftest"
+  ],
   "css/css-values/calc-in-calc.html": [
    "be08a1510714e8b4fbc4d35582db5708924d06b2",
    "reftest"
@@ -288524,6 +288719,14 @@
    "080551c1bee3d7bf54dda2c3d5b7e5a9fbd8aed6",
    "reftest"
   ],
+  "css/css-values/calc-rem-lang-ref.html": [
+   "08bbc95f3078421a489e1e93cc7a4f035af40d5b",
+   "support"
+  ],
+  "css/css-values/calc-rem-lang.html": [
+   "6fa668d2bcaf01f5c4680e3e14a0e86160d1b5d5",
+   "reftest"
+  ],
   "css/css-values/calc-serialization-expected.txt": [
    "d38b12521063bf2abf97c7481a84977c796296a7",
    "support"
@@ -301053,7 +301256,7 @@
    "testharness"
   ],
   "custom-elements/Document-createElement.html": [
-   "074c9f703cc7feb1dfc3d07aedd08460bd591d42",
+   "14960ee9498f6ff23c1c94d3351a8ef383e60067",
    "testharness"
   ],
   "custom-elements/HTMLElement-constructor.html": [
@@ -301069,7 +301272,7 @@
    "testharness"
   ],
   "custom-elements/attribute-changed-callback.html": [
-   "1ad26231aa638a0e0f9b76d77bdd93a3712dda98",
+   "320fb2bb26e7495d0829c39c113df3ea7ec1f4ef",
    "testharness"
   ],
   "custom-elements/connected-callbacks.html": [
@@ -301124,6 +301327,10 @@
    "dc0ca4a066d9a05362a81b263594965763919e46",
    "testharness"
   ],
+  "custom-elements/parser/parser-constructs-custom-elements-with-is.html": [
+   "17145d44113ea88688060c6cfd10d162cd97e28b",
+   "testharness"
+  ],
   "custom-elements/parser/parser-constructs-custom-elements.html": [
    "228d4a90d57dc942692becc6f126ec9130b3a4e0",
    "testharness"
@@ -301133,7 +301340,7 @@
    "testharness"
   ],
   "custom-elements/parser/parser-sets-attributes-and-children.html": [
-   "422bd43f10b48f0450b20fd4b0de046d465bec38",
+   "8049449173e4082b2f4ccadfe552abadadc0834a",
    "testharness"
   ],
   "custom-elements/parser/parser-uses-constructed-element.html": [
@@ -301289,7 +301496,7 @@
    "testharness"
   ],
   "custom-elements/upgrading/Node-cloneNode.html": [
-   "cc121ea56de1b8e1074062b5dda69f57e2add665",
+   "264a2631a79370bce8392657ba52c8b0c949b7e1",
    "testharness"
   ],
   "custom-elements/upgrading/upgrading-enqueue-reactions.html": [
@@ -306929,7 +307136,7 @@
    "testharness"
   ],
   "fetch/api/response/response-init-002.html": [
-   "9806050696657f48e609bbc943ba15a78d6464d1",
+   "5b87fa0d008f633d73bd87ab1755eee719b104cc",
    "testharness"
   ],
   "fetch/api/response/response-static-error.html": [
@@ -308401,7 +308608,7 @@
    "testharness"
   ],
   "html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-anchor-name.html": [
-   "8de758988400b4b1acad6bb4c94069b4d0167c20",
+   "9bc91bc9bb368e8bf42810ed8aed936a6c9d581a",
    "testharness"
   ],
   "html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-id-top.html": [
@@ -323972,6 +324179,10 @@
    "15b0b32d86bc6411b29c5d978db71053c00a1d65",
    "testharness"
   ],
+  "html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html": [
+   "790fc3e9e9b9661da1e88d536e50f540792ee729",
+   "testharness"
+  ],
   "html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html": [
    "b48335aa61dc13c34d2a77806f20663e2156bc6f",
    "testharness"
@@ -324208,6 +324419,10 @@
    "f09db3d2acdf3aba3fc8c67b2f089a0ba506c799",
    "support"
   ],
+  "html/semantics/scripting-1/the-script-element/module/resources/fast-module.js": [
+   "218ea0b166fa79df83ee7ac7aff3bca8437b44aa",
+   "support"
+  ],
   "html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js": [
    "5ff227dc83335d8a3e8da0161993c1de239ee7f8",
    "support"
@@ -324252,6 +324467,10 @@
    "a148d34314c2734fd49bf69d201006618fdac78f",
    "support"
   ],
+  "html/semantics/scripting-1/the-script-element/module/resources/slow-module.js": [
+   "6a68189c41bb8a69fc0468bb048a50f8b8961101",
+   "support"
+  ],
   "html/semantics/scripting-1/the-script-element/module/script-for-event.html": [
    "c225684e0c7d09f9628aab589c8673b140994243",
    "testharness"
@@ -326953,7 +327172,7 @@
    "testharness"
   ],
   "http/resources/securedimage.py": [
-   "b03f45c4dad3a9cd0f0fb67a99a79be3ba64b199",
+   "d5aa250e8cba8384f47fca2c559aa6a310dff457",
    "support"
   ],
   "imagebitmap-renderingcontext/OWNERS": [
@@ -347093,11 +347312,11 @@
    "testharness"
   ],
   "service-workers/service-worker/about-blank-replacement.https-expected.txt": [
-   "9c2d84a4261cecfb71edd469d30cdf47e5708379",
+   "fded8485b910b8bca6dafbfab0b01d1ae00d0ae4",
    "support"
   ],
   "service-workers/service-worker/about-blank-replacement.https.html": [
-   "345259908d040e4f5d810ae7089dab8a8c909b0a",
+   "d2cc0fc99820308096d549d892962fe10b19f0ae",
    "testharness"
   ],
   "service-workers/service-worker/activate-event-after-install-state-change.https.html": [
@@ -347388,8 +347607,12 @@
    "b30618dfe4c10370865229cbe9606cce8ed42040",
    "testharness"
   ],
+  "service-workers/service-worker/fetch-response-taint.https-expected.txt": [
+   "5f2efb4ef948762ad45dd33c86964cbe070c3971",
+   "support"
+  ],
   "service-workers/service-worker/fetch-response-taint.https.html": [
-   "217383b4dddcc6f984c4cc7cd5f99e1f9b86cdd1",
+   "154a52255d0aae9a99879389afba6214b803b08d",
    "testharness"
   ],
   "service-workers/service-worker/fetch-response-xhr.https.html": [
@@ -347748,10 +347971,6 @@
    "04a6fd8d3ff62fa4d969b629eb5f541c6447ae12",
    "testharness"
   ],
-  "service-workers/service-worker/registration-updateviacache.https-expected.txt": [
-   "a2bfe6d6414cf0816391aa6830efcf09863053e1",
-   "support"
-  ],
   "service-workers/service-worker/registration-updateviacache.https.html": [
    "c1caf6840bc36eed4f4ece8e42702151e08b3754",
    "testharness"
@@ -347776,6 +347995,14 @@
    "567d0a7de3ef54adaa8339bb04632a2ecfcc57a5",
    "support"
   ],
+  "service-workers/service-worker/resources/about-blank-replacement-blank-dynamic-nested-frame.html": [
+   "bfd2c8e7acb010cd7b5a0076a9138d8584e5efab",
+   "support"
+  ],
+  "service-workers/service-worker/resources/about-blank-replacement-blank-nested-frame.html": [
+   "79cb319dbdbae7efb9abf3405c2bc76ad9f0bc0f",
+   "support"
+  ],
   "service-workers/service-worker/resources/about-blank-replacement-frame.py": [
    "2f22a4c92cfb7c7e8cfbe6f168872c2f5875867d",
    "support"
@@ -347788,6 +348015,10 @@
    "498a08b652ec0d867e8d2e173be954f69354a208",
    "support"
   ],
+  "service-workers/service-worker/resources/about-blank-replacement-srcdoc-nested-frame.html": [
+   "6a0d88da977057eb365dfc8bfb531558d7a1bd4a",
+   "support"
+  ],
   "service-workers/service-worker/resources/about-blank-replacement-uncontrolled-nested-frame.html": [
    "ab2ce3693bbc40943b7390c8d76f3601f52410ca",
    "support"
@@ -348732,8 +348963,12 @@
    "24cf65bf38dcdd90e24c20bd6be3823db1e9a601",
    "testharness"
   ],
+  "service-workers/service-worker/unregister-then-register-new-script.https-expected.txt": [
+   "faa8da73056499ee1f43ce3aa3fb1f428664ff28",
+   "support"
+  ],
   "service-workers/service-worker/unregister-then-register-new-script.https.html": [
-   "43964791edbb2b5cd3b3ed27b600e78412902240",
+   "ee8d7cd4e47cdb9bcf2b39c911593bc671df914d",
    "testharness"
   ],
   "service-workers/service-worker/unregister-then-register.https.html": [
@@ -348789,11 +349024,11 @@
    "testharness"
   ],
   "service-workers/service-worker/worker-interception.https-expected.txt": [
-   "fdb0f552918d830b4bab99b9e80d142bb84e180a",
+   "d880a66c3cea35ee82db031c353a81ed0278cb16",
    "support"
   ],
   "service-workers/service-worker/worker-interception.https.html": [
-   "2c5e8cb2b7be6d394aaa1400158d3f14895909f3",
+   "41f7e5e8da2c305370fddad83518cd0fa57547eb",
    "testharness"
   ],
   "service-workers/specgen.json": [
@@ -352617,7 +352852,7 @@
    "support"
   ],
   "web-animations/README.md": [
-   "6344565e53b2f9e8d6ee7658d1c5c5670e68fc98",
+   "9dfaf5979c3bf30bf075b3929ac3620954e83497",
    "support"
   ],
   "web-animations/animation-model/animation-types/accumulation-per-property.html": [
@@ -352681,7 +352916,7 @@
    "testharness"
   ],
   "web-animations/interfaces/Animatable/animate-expected.txt": [
-   "abe2a3dc989e0d16f53a8cd7f31a24731852d136",
+   "fbce268cd84f360db7a36749f48eb796362960c9",
    "support"
   ],
   "web-animations/interfaces/Animatable/animate-no-browsing-context-expected.txt": [
@@ -352769,7 +353004,7 @@
    "testharness"
   ],
   "web-animations/interfaces/Animation/playbackRate.html": [
-   "27d289f603953b3e39322287fb2a55f84dd8dc54",
+   "a298a65aaeb5a337fe894f0160493693f309c2a1",
    "testharness"
   ],
   "web-animations/interfaces/Animation/ready.html": [
@@ -352785,11 +353020,11 @@
    "testharness"
   ],
   "web-animations/interfaces/AnimationEffectTiming/direction.html": [
-   "11398d5ea40bb4137b4f5d4e6e6238af64caf3c5",
+   "642207ce454fb816cc47d14fbe29f65d92ddf6ed",
    "testharness"
   ],
   "web-animations/interfaces/AnimationEffectTiming/duration.html": [
-   "315810a1e73f9b4ef2cffea868fb766af5ee5c93",
+   "14abe09cb19080585a315115e387b85784c7d862",
    "testharness"
   ],
   "web-animations/interfaces/AnimationEffectTiming/easing.html": [
@@ -352797,7 +353032,7 @@
    "testharness"
   ],
   "web-animations/interfaces/AnimationEffectTiming/endDelay.html": [
-   "b36d9c8a4e4082e6a75ac5d8f336cf474cd75aab",
+   "a8609f22672b092178c2391d7ba7ef804112bef4",
    "testharness"
   ],
   "web-animations/interfaces/AnimationEffectTiming/fill.html": [
@@ -352817,11 +353052,11 @@
    "testharness"
   ],
   "web-animations/interfaces/AnimationEffectTiming/iterationStart.html": [
-   "734743adeec628da907ea2f6cc4ae3be3aab7329",
+   "393b37098ab470e75b1254b53875901e705d8d1b",
    "testharness"
   ],
   "web-animations/interfaces/AnimationEffectTiming/iterations.html": [
-   "c8705eb209d8a4912b5d3fd94a05c763b7707eca",
+   "1e8bb46b5a1eef496edda32b16c856baa16e9b30",
    "testharness"
   ],
   "web-animations/interfaces/AnimationPlaybackEvent/constructor-expected.txt": [
@@ -352856,16 +353091,20 @@
    "72cb7900f86611e9c2a1b0f4acd0f634555310b9",
    "testharness"
   ],
+  "web-animations/interfaces/KeyframeEffect/composite-expected.txt": [
+   "bdbc5995e5c8bd4f9bc2be80048d4f139c263a24",
+   "support"
+  ],
   "web-animations/interfaces/KeyframeEffect/composite.html": [
-   "7dd18327d8da81914adaf443086891ba3646d882",
+   "12fc2e8e7bcfb1eab6e162b68731ff6fcb767438",
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/constructor-expected.txt": [
-   "54e2bcc35dfd50361b58f817eef7d2dc826893b4",
+   "edc358f2e88d17412ac2e843efc88940860b9d82",
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/constructor.html": [
-   "4a80ea073da0a9c62dcb9587676445a2fba234e1",
+   "2f6449cbf2b47ae457efb23fb52b8fd1709837ac",
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/copy-constructor.html": [
@@ -352893,7 +353132,7 @@
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-001.html": [
-   "165b651cea12ab9e0825f4335e7f697ce1fc6247",
+   "f54c7c0da5728f88f37a067761af7ad815fea005",
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-002.html": [
@@ -352925,7 +353164,7 @@
    "support"
   ],
   "web-animations/resources/keyframe-tests.js": [
-   "52ffc50c4ebf0326db8f4e1d0cc1234f6c860dc2",
+   "b31029042fdfa77ba8bf0e9370f63a423fbe0da9",
    "support"
   ],
   "web-animations/resources/keyframe-utils.js": [
@@ -352937,11 +353176,11 @@
    "support"
   ],
   "web-animations/testcommon.js": [
-   "94130b39fda8e95ca495d297f9d47eefa6430a04",
+   "de3f89d5ed07d00d453746df5d13387d15f05016",
    "support"
   ],
   "web-animations/timing-model/animation-effects/active-time.html": [
-   "68ca985984ed6f868cebb539dfde6d7ddba6c824",
+   "f05ff3594dde7248c84db42f8a80a6d0136b5f54",
    "testharness"
   ],
   "web-animations/timing-model/animation-effects/current-iteration-expected.txt": [
@@ -352969,7 +353208,7 @@
    "testharness"
   ],
   "web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt": [
-   "d0d2980c7836fd5782d91b518c41c444acc56472",
+   "0467ff08867c5f9940f380f2bba0a1739c7d83ab",
    "support"
   ],
   "web-animations/timing-model/animation-effects/simple-iteration-progress.html": [
@@ -352985,7 +353224,7 @@
    "testharness"
   ],
   "web-animations/timing-model/animations/current-time.html": [
-   "390e2ba8d6de9bfea5f26cd2e7a42ccdf73f1a35",
+   "52d23e752878c821754b2c2b752e7393882609e2",
    "testharness"
   ],
   "web-animations/timing-model/animations/finishing-an-animation.html": [
@@ -353009,7 +353248,7 @@
    "testharness"
   ],
   "web-animations/timing-model/animations/playing-an-animation.html": [
-   "6ee1b850154ce22fffafa686fc2fdfef9dded38b",
+   "1ae05a904e5b4fbcf1d904f02825f836da7b4c18",
    "testharness"
   ],
   "web-animations/timing-model/animations/reversing-an-animation-expected.txt": [
@@ -353021,7 +353260,7 @@
    "testharness"
   ],
   "web-animations/timing-model/animations/set-the-animation-start-time.html": [
-   "10fea7d0b0dbe046d72b4048607816c9ebe37f7f",
+   "fa26feebcde00a5b0b63f8f3587acc313a58f26a",
    "testharness"
   ],
   "web-animations/timing-model/animations/set-the-target-effect-of-an-animation-expected.txt": [
@@ -353037,7 +353276,7 @@
    "support"
   ],
   "web-animations/timing-model/animations/set-the-timeline-of-an-animation.html": [
-   "ef8ce243226296718453e10d89b4cfd68b2d765e",
+   "bd33cb8638aa373b17cda20906af5aea2f5a7503",
    "testharness"
   ],
   "web-animations/timing-model/animations/updating-the-finished-state.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/credential-management/require_securecontext.html b/third_party/WebKit/LayoutTests/external/wpt/credential-management/require_securecontext.html
new file mode 100644
index 0000000..b1f3103
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/credential-management/require_securecontext.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test that Credential Management requires secure contexts</title>
+<link rel="help" href="https://w3c.github.io/webappsec-credential-management/#idl-index">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+  test(() => {
+    assert_false(isSecureContext);
+    assert_false('credentials' in navigator);
+  }, "Credential Management must not be accessible in insecure contexts");
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-align/content-distribution/place-content-shorthand-007-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/content-distribution/place-content-shorthand-007-ref.html
new file mode 100644
index 0000000..67727f4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/content-distribution/place-content-shorthand-007-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+div {
+  width: 400px;
+  height: 400px;
+  background: blue;
+  position: relative;
+}
+span {
+  background: green;
+  width: 200px;
+  height: 200px;
+  position: absolute;
+  bottom: 0;
+  left: 100px;
+}
+</style>
+Should see a green square centered and at the bottom of the blue square.
+<div><span></span></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-align/content-distribution/place-content-shorthand-007.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/content-distribution/place-content-shorthand-007.html
new file mode 100644
index 0000000..be954c97
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-align/content-distribution/place-content-shorthand-007.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment: place-content shorthand with fallback</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-align/#propdef-place-content">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1430622">
+<link rel="match" href="place-content-shorthand-007-ref.html">
+<style>
+div {
+  display: grid;
+  grid: 200px / 200px;
+  width: 400px;
+  height: 400px;
+  background: blue;
+  place-content: end space-evenly;
+}
+span {
+  background: green;
+}
+</style>
+Should see a green square centered and at the bottom of the blue square.
+<div><span></span></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-display/display-contents-fieldset-nested-legend-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/display-contents-fieldset-nested-legend-ref.html
new file mode 100644
index 0000000..6f547b3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/display-contents-fieldset-nested-legend-ref.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<meta charset="utf-8">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+<title>CSS Test Reference</title>
+<fieldset style="color: green">P<legend style="padding: 0">legend</legend>ASS</fieldset>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-display/display-contents-fieldset-nested-legend.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/display-contents-fieldset-nested-legend.html
new file mode 100644
index 0000000..a3bd2fc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-display/display-contents-fieldset-nested-legend.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<meta charset="utf-8">
+<link rel="match" href="display-contents-fieldset-nested-legend-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-display/#unbox">
+<link rel="help" href="https://drafts.csswg.org/css-display/#valdef-display-contents">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1427292">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+<title>CSS Test: display: contents on legend</title>
+<style>
+fieldset {
+  color: red;
+}
+.contents {
+  display: contents;
+  color: green;
+  border: 10px solid red;
+}
+</style>
+<fieldset><legend class="contents">P<legend>legend</legend>ASS</legend></fieldset>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-scoping/slotted-invalidation-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-scoping/slotted-invalidation-expected.txt
new file mode 100644
index 0000000..e0bb3e9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-scoping/slotted-invalidation-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL CSS Test: Style invalidation for ::slotted() assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-scoping/slotted-invalidation.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-scoping/slotted-invalidation.html
new file mode 100644
index 0000000..f847106
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-scoping/slotted-invalidation.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<title>CSS Test: Style invalidation for ::slotted()</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#slotted-pseudo">
+<div id="host">
+  <div>
+    <span></span>
+    <span></span>
+  </div>
+  <div id="slotted">
+    <span></span>
+    <span></span>
+  </div>
+  <div>
+    <span></span>
+    <span></span>
+  </div>
+</div>
+<script>
+test(function() {
+  var root = host.attachShadow({"mode":"open"});
+  root.innerHTML = '<style>.outer ::slotted(#slotted) { background-color: red } .outer .inner::slotted(#slotted) { background-color: green }</style><div id="outer"><slot id="inner"></slot></div>';
+
+  assert_equals(window.getComputedStyle(slotted).backgroundColor, "rgba(0, 0, 0, 0)");
+
+  root.querySelector("#outer").className = "outer";
+  assert_equals(window.getComputedStyle(slotted).backgroundColor, "rgb(255, 0, 0)");
+
+  root.querySelector("#inner").className = "inner";
+  assert_equals(window.getComputedStyle(slotted).backgroundColor, "rgb(0, 128, 0)");
+})
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/text-overflow-026-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/text-overflow-026-ref.html
new file mode 100644
index 0000000..f2db8c7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/text-overflow-026-ref.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html><head>
+  <meta charset="utf-8">
+  <title>Reference: text-overflow with leading white-space</title>
+  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1403986">
+  <style type="text/css">
+html,body {
+  color:black; background-color:white; font:16px/1 monospace;
+}
+
+.ellipsize {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 100px;
+  border: 1px solid;
+}
+
+.inline-block {
+  display: inline-block;
+  background: red;
+}
+  </style>
+</head>
+<body>
+
+<pre>
+The test PASS if all of the following are true:
+1. there are no red areas
+2. the first two blocks display "PASS" but no ellipsis
+3. the last three blocks display an ellipsis
+</pre>
+
+<div class="ellipsize" style="text-overflow: clip">
+  <span style="margin-left:5px"></span><span class="inline-block" style="background:lime">
+    PASS PASS PASS PASS PASS</span>
+</div>
+
+<div class="ellipsize" style="text-overflow: clip">
+  <span style="margin-left:5px"></span>
+  <span class="inline-block" style="background:lime">
+    PASS PASS PASS PASS PASS</span>
+</div>
+
+<div class="ellipsize">
+  <span style="margin-left:10px"></span>&nbsp;&#x2026;
+</div>
+
+<div class="ellipsize">
+  &nbsp;&#x2026;
+</div>
+
+<div class="ellipsize">
+  a&#x2026;
+</div>
+
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/text-overflow-026.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/text-overflow-026.html
new file mode 100644
index 0000000..2d1aa57
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-ui/text-overflow-026.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html><head>
+  <meta charset="utf-8">
+  <title>Test: text-overflow with leading white-space</title>
+  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1403986">
+  <link rel="help" href="https://www.w3.org/TR/css3-ui/#text-overflow" title="5.2. the 'text-overflow' property">
+  <link rel="match" href="text-overflow-026-ref.html">
+  <style type="text/css">
+html,body {
+  color:black; background-color:white; font:16px/1 monospace;
+}
+
+.ellipsize {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 100px;
+  border: 1px solid;
+}
+
+.inline-block {
+  display: inline-block;
+  background: red;
+}
+  </style>
+</head>
+<body>
+
+<pre>
+The test PASS if all of the following are true:
+1. there are no red areas
+2. the first two blocks display "PASS" but no ellipsis
+3. the last three blocks display an ellipsis
+</pre>
+
+<div class="ellipsize">
+  <span style="margin-left:5px"></span><span class="inline-block" style="background:lime">
+    PASS PASS PASS PASS PASS</span>
+</div>
+
+<div class="ellipsize">
+  <span style="margin-left:5px"></span>
+  <span class="inline-block" style="background:lime">
+    PASS PASS PASS PASS PASS</span>
+</div>
+
+<div class="ellipsize">
+  <span style="margin-left:10px"></span>&nbsp;<span class="inline-block">
+    FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL </span>
+</div>
+
+<div class="ellipsize">
+  &nbsp;<span class="inline-block">
+    FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL </span>
+</div>
+
+<div class="ellipsize">
+  a<span class="inline-block">
+    FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL </span>
+</div>
+
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-ch-ex-lang-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-ch-ex-lang-ref.html
new file mode 100644
index 0000000..e0ac1ea
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-ch-ex-lang-ref.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+div {
+  width: calc(1ex + 1ch + 1em);
+  height: calc(1ex + 1ch + 1em);
+  background: green;
+}
+</style>
+<div></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-ch-ex-lang.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-ch-ex-lang.html
new file mode 100644
index 0000000..eb44747
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-ch-ex-lang.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: Calc in font-size with ch / ex units across lang changes</title>
+<link rel="help" href="https://drafts.csswg.org/css-values/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-values/#ex">
+<link rel="help" href="https://drafts.csswg.org/css-values/#funcdef-calc">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1431031">
+<link rel="match" href="calc-ch-ex-lang-ref.html">
+<style>
+div[lang] {
+  font-size: calc(1ex + 1ch + 1em);
+}
+</style>
+<div lang="en">
+  <div style="width: 1em; height: 1em; background: green;"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-rem-lang-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-rem-lang-ref.html
new file mode 100644
index 0000000..a0f6add6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-rem-lang-ref.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<p>You should see a green box twice-the-initial-font-size wide.</p>
+<div style="width: 2em; height: 2em; background: green;"></div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-rem-lang.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-rem-lang.html
new file mode 100644
index 0000000..3994efc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-values/calc-rem-lang.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<html lang="en"><!-- The lang is important! -->
+<meta charset="utf-8">
+<title>CSS Test: Calc with rem and relative units on the root element</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-values/#rem">
+<link rel="help" href="https://drafts.csswg.org/css-values/#funcdef-calc">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1431031">
+<link rel="match" href="calc-rem-lang-ref.html">
+<style>
+  html {
+    font-size: calc(1rem + 1em);
+  }
+</style>
+<p style="font-size: initial">You should see a green box twice-the-initial-font-size wide.</p>
+<div style="width: 1em; height: 1em; background: green;"></div>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html
index e446c50..52a68e8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/Document-createElement.html
@@ -29,6 +29,21 @@
 
 }, 'document.createElement must create an instance of custom elements');
 
+test(function () {
+    class AutonomousCustomElement extends HTMLElement {};
+    class IsCustomElement extends HTMLElement {};
+
+    customElements.define('autonomous-custom-element', AutonomousCustomElement);
+    customElements.define('is-custom-element', IsCustomElement);
+
+    var instance = document.createElement('autonomous-custom-element', { is: "is-custom-element"});
+
+    assert_true(instance instanceof AutonomousCustomElement);
+    assert_equals(instance.localName, 'autonomous-custom-element');
+    assert_equals(instance.namespaceURI, 'http://www.w3.org/1999/xhtml', 'A custom element HTML must use HTML namespace');
+
+}, 'document.createElement must create an instance of autonomous custom elements when it has is attribute');
+
 function assert_reports(expected, testFunction, message) {
     var uncaughtError = null;
     window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/attribute-changed-callback.html b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/attribute-changed-callback.html
index bd46791..5090bfb 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/attribute-changed-callback.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/attribute-changed-callback.html
@@ -11,6 +11,7 @@
 </head>
 <body>
 <div id="log"></div>
+<parser-created-element title></parser-created-element>
 <script>
 
 var customElement = define_new_custom_element(['title', 'id', 'r']);
@@ -218,6 +219,36 @@
     assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: 'hello', namespace: null});
 }, 'attributedChangedCallback must not be enqueued when mutating inline style declaration if the style attribute is not observed');
 
+test(function () {
+    var calls = [];
+    class CustomElement extends HTMLElement { }
+    CustomElement.prototype.attributeChangedCallback = function (...args) {
+        calls.push(create_attribute_changed_callback_log(this, ...args));
+    }
+    CustomElement.observedAttributes = ['title'];
+    customElements.define('parser-created-element', CustomElement);
+    assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: '', namespace: null});
+}, 'Upgrading a parser created element must enqueue and invoke attributeChangedCallback for an HTML attribute');
+
+test(function () {
+    var calls = [];
+    class CustomElement extends HTMLElement { }
+    CustomElement.prototype.attributeChangedCallback = function (...args) {
+        calls.push(create_attribute_changed_callback_log(this, ...args));
+    }
+    CustomElement.observedAttributes = ['title'];
+    customElements.define('cloned-element-with-attribute', CustomElement);
+
+    var instance = document.createElement('cloned-element-with-attribute');
+    assert_equals(calls.length, 0);
+    instance.title = '';
+    assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: '', namespace: null});
+
+    calls = [];
+    var clone = instance.cloneNode(false);
+    assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: '', namespace: null});
+}, 'Upgrading a cloned element must enqueue and invoke attributeChangedCallback for an HTML attribute');
+
 </script>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/parser/parser-constructs-custom-elements-with-is.html b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/parser/parser-constructs-custom-elements-with-is.html
new file mode 100644
index 0000000..96c0027
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/parser/parser-constructs-custom-elements-with-is.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Changes to the HTML parser</title>
+<meta name="author" title="John Dai" href="mailto:jdai@mozilla.com">
+<meta name="assert" content="HTML parser creates a custom element which contains is attribute">
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<autonomous-custom-element id="instance1" is="is-custom-element"></autonomous-custom-element>
+<script>
+
+class AutonomousCustomElement extends HTMLElement { };
+class IsCustomElement extends HTMLElement { };
+
+customElements.define('autonomous-custom-element', AutonomousCustomElement);
+customElements.define('is-custom-element', IsCustomElement);
+
+test(function () {
+    var customElement = document.getElementById('instance1');
+
+    assert_true(customElement instanceof HTMLElement, 'A resolved custom element must be an instance of HTMLElement');
+    assert_false(customElement instanceof HTMLUnknownElement, 'A resolved custom element must NOT be an instance of HTMLUnknownElement');
+    assert_true(customElement instanceof AutonomousCustomElement, 'A resolved custom element must be an instance of that custom element');
+    assert_equals(customElement.localName, 'autonomous-custom-element');
+    assert_equals(customElement.namespaceURI, 'http://www.w3.org/1999/xhtml', 'A custom element HTML must use HTML namespace');
+
+}, 'HTML parser must create a defined autonomous custom element when customElements.define comes after HTML parser creation');
+
+</script>
+<autonomous-custom-element id="instance2" is="is-custom-element"></autonomous-custom-element>
+<script>
+
+test(function () {
+    var customElement = document.getElementById('instance2');
+
+    assert_true(customElement instanceof HTMLElement, 'A resolved custom element must be an instance of HTMLElement');
+    assert_false(customElement instanceof HTMLUnknownElement, 'A resolved custom element must NOT be an instance of HTMLUnknownElement');
+    assert_true(customElement instanceof AutonomousCustomElement, 'A resolved custom element must be an instance of that custom element');
+    assert_equals(customElement.localName, 'autonomous-custom-element');
+    assert_equals(customElement.namespaceURI, 'http://www.w3.org/1999/xhtml', 'A custom element HTML must use HTML namespace');
+
+}, 'HTML parser must create a defined autonomous custom element when customElements.define comes before HTML parser creation');
+
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/parser/parser-sets-attributes-and-children.html b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/parser/parser-sets-attributes-and-children.html
index ba33137..ef4689f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/parser/parser-sets-attributes-and-children.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/parser/parser-sets-attributes-and-children.html
@@ -8,6 +8,7 @@
 <link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
 </head>
 <body>
 <div id="log"></div>
@@ -15,6 +16,7 @@
 
 var numberOfAttributesInConstructor;
 var numberOfChildNodesInConstructor;
+var attributesChangedCalls = [];
 
 class MyCustomElement extends HTMLElement {
     constructor(...args) {
@@ -22,6 +24,14 @@
         numberOfAttributesInConstructor = this.attributes.length;
         numberOfChildNodesInConstructor = this.childNodes.length;
     }
+
+    attributeChangedCallback(...args) {
+        attributesChangedCalls.push(create_attribute_changed_callback_log(this, ...args));
+    }
+
+    static get observedAttributes() {
+        return ['id', 'class'];
+    }
 };
 customElements.define('my-custom-element', MyCustomElement);
 
@@ -54,6 +64,12 @@
     assert_equals(numberOfChildNodesInConstructor, 0, 'HTML parser must not append child nodes to a custom element before invoking the constructor');
 }, 'HTML parser must set the attributes or append children before calling constructor');
 
+test(function () {
+    assert_equals(attributesChangedCalls.length, 2);
+    assert_attribute_log_entry(attributesChangedCalls[0], {name: 'id', oldValue: null, newValue: 'custom-element-id', namespace: null});
+    assert_attribute_log_entry(attributesChangedCalls[1], {name: 'class', oldValue: null, newValue: 'class1 class2', namespace: null});
+}, 'HTML parser must enqueue attributeChanged reactions');
+
 </script>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/upgrading/Node-cloneNode.html b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/upgrading/Node-cloneNode.html
index 0d158fd..0492e1f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/custom-elements/upgrading/Node-cloneNode.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/custom-elements/upgrading/Node-cloneNode.html
@@ -30,6 +30,25 @@
         'A cloned custom element must be an instance of the custom element');
 }, 'Node.prototype.cloneNode(false) must be able to clone a custom element');
 
+test(function () {
+    class AutonomousCustomElement extends HTMLElement {};
+    class IsCustomElement extends HTMLElement {};
+
+    customElements.define('autonomous-custom-element', AutonomousCustomElement);
+    customElements.define('is-custom-element', IsCustomElement);
+
+    var instance = document.createElement('autonomous-custom-element', { is: "is-custom-element"});
+    assert_true(instance instanceof HTMLElement);
+    assert_true(instance instanceof AutonomousCustomElement);
+
+    var clone = instance.cloneNode(false);
+    assert_not_equals(instance, clone);
+    assert_true(clone instanceof HTMLElement,
+        'A cloned custom element must be an instance of HTMLElement');
+    assert_true(clone instanceof AutonomousCustomElement,
+        'A cloned custom element must be an instance of the custom element');
+}, 'Node.prototype.cloneNode(false) must be able to clone as a autonomous custom element when it contains is attribute');
+
 test_with_window(function (contentWindow) {
     var contentDocument = contentWindow.document;
     class MyCustomElement extends contentWindow.HTMLElement {}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-init-002.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-init-002.html
index 0bb2e8d..a48af83 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-init-002.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/response/response-init-002.html
@@ -65,6 +65,11 @@
         });
       }, "Testing empty Response Content-Type header");
 
+      test(function() {
+        var response = new Response(null, {status: 204});
+        assert_equals(response.body, null);
+      }, "Testing null Response body");
+
     </script>
   </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-anchor-name.html b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-anchor-name.html
index 43dbaf9..060aed1 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-anchor-name.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-anchor-name.html
@@ -8,6 +8,7 @@
 <a name="anchor1" style="position:absolute; top:200px;"></a>
 <div id="id-equals-anchor" style="position:absolute; top:300px;"></div>
 <a name="id-equals-anchor" style="position:absolute; top:400px;"></a>
+<a name="§1" style="position:absolute; top:400px;"></a>
 <div style="height:200em;"></div>
 <script>
 var steps = [{
@@ -21,6 +22,11 @@
         // id still takes precedence over anchor name
         assert_equals( scrollPosition(), 300 );
       }
+    },{
+      fragid:'§1',
+      handler: function(){
+        assert_equals( scrollPosition(), 400 );
+      }
     }];
 
 function scrollPosition(){
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html
new file mode 100644
index 0000000..db03612
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html
@@ -0,0 +1,29 @@
+<html>
+  <head>
+    <title>Inline async module script execution order</title>
+    <meta name=timeout content=long>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
+    <script>
+      let loaded = [];
+      let test = async_test("Inline async module script execution order");
+      window.addEventListener("load", test.step_func(function() {
+        assert_array_equals(loaded,
+                            ["fast", "fast", "fast", "slow", "slow", "slow"]);
+      test.done();
+      }));
+    </script>
+    <script type="module" async src="resources/slow-module.js?pipe=trickle(d2)&unique=1"></script>
+    <script type="module" async>
+      import "./resources/slow-module.js?pipe=trickle(d2)&unique=2";
+      loaded.push("slow");
+    </script>
+    <script type="module" async src="resources/fast-module.js?unique=1"></script>
+    <script type="module" async>
+      import "./resources/fast-module.js?unique=2";
+      loaded.push("fast");
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/fast-module.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/fast-module.js
new file mode 100644
index 0000000..3a76cf7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/fast-module.js
@@ -0,0 +1 @@
+loaded.push("fast");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/slow-module.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/slow-module.js
new file mode 100644
index 0000000..4623ef7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/slow-module.js
@@ -0,0 +1,3 @@
+// This module is imported with pipe=trickle(d2) to make it load more slowly
+// than fast-module.js
+loaded.push("slow");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/http/resources/securedimage.py b/third_party/WebKit/LayoutTests/external/wpt/http/resources/securedimage.py
index 89cbd72..510ddca 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/http/resources/securedimage.py
+++ b/third_party/WebKit/LayoutTests/external/wpt/http/resources/securedimage.py
@@ -6,10 +6,12 @@
     if "authorization" not in request.headers:
         response.status = 401
         response.headers.set("WWW-Authenticate", "Basic")
+        return
     else:
         auth = request.headers.get("Authorization")
         if auth != "Basic dGVzdHVzZXI6dGVzdHBhc3M=":
             response.set_error(403, "Invalid username or password - " + auth)
+            return
 
     response.status = 301
     response.headers.set("Location", image_url)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https-expected.txt
index 27d781c..5913659b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https-expected.txt
@@ -3,5 +3,8 @@
 FAIL Initial about:blank modified by parent is controlled, exposed to clients.matchAll(), and matches final Client. assert_false: result: failure: could not find about:blank client expected false got true
 FAIL Popup initial about:blank is controlled, exposed to clients.matchAll(), and matches final Client. assert_false: result: failure: could not find about:blank client expected false got true
 PASS Initial about:blank is controlled, exposed to clients.matchAll(), and final Client is not controlled by a service worker.
+FAIL Simple about:blank is controlled and is exposed to clients.matchAll(). promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'scriptURL' of null"
+FAIL Nested about:srcdoc is controlled and is exposed to clients.matchAll(). promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'scriptURL' of null"
+FAIL Dynamic about:blank is controlled and is exposed to clients.matchAll(). promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'scriptURL' of null"
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html
index 3acfe1b..e1fefaf 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/about-blank-replacement.https.html
@@ -58,7 +58,7 @@
   });
 }
 
-async function doAsyncTest(t, scope, extraSearchParams) {
+async function doAsyncTest(t, scope) {
   let reg = await service_worker_unregister_and_register(t, worker, scope);
   await wait_for_state(t, reg.installing, 'activated');
 
@@ -70,20 +70,30 @@
   let initialResult = frame.contentWindow.nested().document.body.textContent;
   assert_false(initialResult.startsWith('failure:'), `result: ${initialResult}`);
 
+  assert_equals(frame.contentWindow.navigator.serviceWorker.controller.scriptURL,
+                frame.contentWindow.nested().navigator.serviceWorker.controller.scriptURL,
+                'nested about:blank should have same controlling service worker');
+
   // Next, ask the service worker to find the final client ID for the fully
   // loaded nested frame.
-  let nestedURL = new URL(scope, window.location);
-  nestedURL.searchParams.set('nested', true);
-  extraSearchParams = extraSearchParams || {};
-  for (let p in extraSearchParams) {
-    nestedURL.searchParams.set(p, extraSearchParams[p]);
-  }
+  let nestedURL = new URL(frame.contentWindow.nested().location);
   let finalResult = await getClientIdByURL(reg.active, nestedURL);
   assert_false(finalResult.startsWith('failure:'), `result: ${finalResult}`);
 
-  // The initial about:blank client and the final loaded client should have
-  // the same ID value.
-  assert_equals(initialResult, finalResult, 'client ID values should match');
+  // If the nested frame doesn't have a URL to load, then there is no fetch
+  // event and the body should be empty.  We can't verify the final client ID
+  // against anything.
+  if (nestedURL.href === 'about:blank' ||
+      nestedURL.href === 'about:srcdoc') {
+    assert_equals('', initialResult, 'about:blank text content should be blank');
+  }
+
+  // If the nested URL is not about:blank, though, then the fetch event handler
+  // should have populated the body with the client id of the initial about:blank.
+  // Verify the final client id matches.
+  else {
+    assert_equals(initialResult, finalResult, 'client ID values should match');
+  }
 
   frame.remove();
   await service_worker_unregister_and_done(t, scope);
@@ -101,8 +111,7 @@
   // worker can ping the client to verify its existence.  This ping-pong
   // check is performed during the initial load and when verifying the
   // final loaded client.
-  await doAsyncTest(t, 'resources/about-blank-replacement-ping-frame.py',
-                    { 'ping': true });
+  await doAsyncTest(t, 'resources/about-blank-replacement-ping-frame.py');
 }, 'Initial about:blank modified by parent is controlled, exposed to ' +
    'clients.matchAll(), and matches final Client.');
 
@@ -142,5 +151,27 @@
 }, 'Initial about:blank is controlled, exposed to clients.matchAll(), and ' +
    'final Client is not controlled by a service worker.');
 
+promise_test(async function(t) {
+  // Execute a test where the nested frame is an iframe without a src
+  // attribute.  This simple nested about:blank should still inherit the
+  // controller and be visible to clients.matchAll().
+  await doAsyncTest(t, 'resources/about-blank-replacement-blank-nested-frame.html');
+}, 'Simple about:blank is controlled and is exposed to clients.matchAll().');
+
+promise_test(async function(t) {
+  // Execute a test where the nested frame is an iframe using a non-empty
+  // srcdoc containing only a tag pair so its textContent is still empty.
+  // This nested iframe should still inherit the controller and be visible
+  // to clients.matchAll().
+  await doAsyncTest(t, 'resources/about-blank-replacement-srcdoc-nested-frame.html');
+}, 'Nested about:srcdoc is controlled and is exposed to clients.matchAll().');
+
+promise_test(async function(t) {
+  // Execute a test where the nested frame is dynamically added without a src
+  // attribute.  This simple nested about:blank should still inherit the
+  // controller and be visible to clients.matchAll().
+  await doAsyncTest(t, 'resources/about-blank-replacement-blank-dynamic-nested-frame.html');
+}, 'Dynamic about:blank is controlled and is exposed to clients.matchAll().');
+
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-response-taint.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-response-taint.https-expected.txt
new file mode 100644
index 0000000..4aeacfa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-response-taint.https-expected.txt
@@ -0,0 +1,135 @@
+This is a testharness.js-based test.
+PASS initialize global state
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"same-origin" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"same-origin" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"same-origin" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"cors" credentials:"include" should succeed.
+PASS url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"same-origin" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"no-cors" credentials:"include" should succeed.
+PASS url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"cors" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"cors" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?" mode:"cors" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin=*" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin=*" mode:"cors" credentials:"same-origin" should succeed.
+PASS url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin=*" mode:"cors" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/service-workers/service-worker/resources/fetch-access-control.py?ACAOrigin=https://web-platform.test:8444&ACACredentials=true" mode:"cors" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"include" should succeed.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"same-origin" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"same-origin" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"same-origin" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"cors" credentials:"include" should succeed.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"same-origin" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fweb-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=same-origin&" mode:"cors" credentials:"include" should succeed.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"include" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"omit" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"same-origin" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"include" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"omit" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"same-origin" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"include" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"same-origin" credentials:"include" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"no-cors" credentials:"include" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=same-origin&credentials=omit&" mode:"cors" credentials:"include" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"same-origin" credentials:"include" should fail.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"include" should succeed.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"omit" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"same-origin" should fail.
+PASS url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"include" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"same-origin" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"no-cors" credentials:"include" should succeed.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3F&mode=no-cors&credentials=omit&" mode:"cors" credentials:"include" should fail.
+FAIL url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"omit" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
+FAIL url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"same-origin" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
+FAIL url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"include" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"cors" credentials:"include" should succeed.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"same-origin" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3D*&mode=cors&credentials=omit&" mode:"cors" credentials:"include" should succeed.
+FAIL url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"same-origin" credentials:"omit" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
+FAIL url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"same-origin" credentials:"same-origin" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
+FAIL url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"same-origin" credentials:"include" should fail. assert_unreached: Should have rejected: undefined Reached unreachable code
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"cors" credentials:"include" should succeed.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"same-origin" credentials:"omit" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"same-origin" credentials:"same-origin" should fail.
+PASS url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"same-origin" credentials:"include" should fail.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"no-cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"no-cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"no-cors" credentials:"include" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"cors" credentials:"omit" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"cors" credentials:"same-origin" should succeed.
+PASS fetching url:"https://www1.web-platform.test:8444/?url=https%3A%2F%2Fwww1.web-platform.test%3A8444%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8444%26ACACredentials%3Dtrue&mode=cors&credentials=include&" mode:"cors" credentials:"include" should succeed.
+PASS restore global state
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-response-taint.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-response-taint.https.html
index a6e7f98..8ebee0c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-response-taint.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/fetch-response-taint.https.html
@@ -193,6 +193,9 @@
   // Fetch to the other origin with same-origin mode should fail.
   if (origin == OTHER_ORIGIN && mode == 'same-origin') {
     ng_test(url, mode, credentials);
+  } else if (origin == BASE_ORIGIN && mode == 'same-origin') {
+    // Cors type response to a same-origin mode request should fail
+    ng_test(url, mode, credentials);
   } else {
     // The response from the SW should be cors.
     ok_test(url, mode, credentials, 'cors', 'undefined');
@@ -208,6 +211,9 @@
   // Fetch to the other origin with same-origin mode should fail.
   if (origin == OTHER_ORIGIN && mode == 'same-origin') {
     ng_test(url, mode, credentials);
+  } else if (origin == BASE_ORIGIN && mode == 'same-origin') {
+    // Cors type response to a same-origin mode request should fail
+    ng_test(url, mode, credentials);
   } else {
     // The response from the SW should be cors.
     ok_test(url, mode, credentials, 'cors', 'username1s');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-blank-dynamic-nested-frame.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-blank-dynamic-nested-frame.html
new file mode 100644
index 0000000..1e0c620
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-blank-dynamic-nested-frame.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+<body>
+<script>
+function nestedLoaded() {
+  parent.postMessage({ type: 'NESTED_LOADED' }, '*');
+}
+
+// dynamically add an about:blank iframe
+var f = document.createElement('iframe');
+f.onload = nestedLoaded;
+document.body.appendChild(f);
+
+// Helper routine to make it slightly easier for our parent to find
+// the nested frame.
+function nested() {
+  return f.contentWindow;
+}
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-blank-nested-frame.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-blank-nested-frame.html
new file mode 100644
index 0000000..99d07a4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-blank-nested-frame.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<html>
+<body>
+<script>
+function nestedLoaded() {
+  parent.postMessage({ type: 'NESTED_LOADED' }, '*');
+}
+</script>
+<iframe id="nested" onload="nestedLoaded()"></iframe>
+<script>
+// Helper routine to make it slightly easier for our parent to find
+// the nested frame.
+function nested() {
+  return document.getElementById('nested').contentWindow;
+}
+
+// NOTE: Make sure not to touch the iframe directly here.  We want to
+//       test the case where the initial about:blank document is not
+//       directly accessed before load.
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-srcdoc-nested-frame.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-srcdoc-nested-frame.html
new file mode 100644
index 0000000..0122a00
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/about-blank-replacement-srcdoc-nested-frame.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<html>
+<body>
+<script>
+function nestedLoaded() {
+  parent.postMessage({ type: 'NESTED_LOADED' }, '*');
+}
+</script>
+<iframe id="nested" srcdoc="<div></div>" onload="nestedLoaded()"></iframe>
+<script>
+// Helper routine to make it slightly easier for our parent to find
+// the nested frame.
+function nested() {
+  return document.getElementById('nested').contentWindow;
+}
+
+// NOTE: Make sure not to touch the iframe directly here.  We want to
+//       test the case where the initial about:blank document is not
+//       directly accessed before load.
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https-expected.txt
new file mode 100644
index 0000000..1e948c5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+PASS Registering a new script URL while an unregistered registration is in use
+FAIL Registering a new script URL that 404s does resurrect an unregistered registration assert_unreached: unexpected rejection: Cannot read property 'scriptURL' of null Reached unreachable code
+FAIL Registering a new script URL that fails to install does resurrect an unregistered registration assert_unreached: unexpected rejection: Cannot read property 'scriptURL' of null Reached unreachable code
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html
index 385430c..582132a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/unregister-then-register-new-script.https.html
@@ -90,9 +90,12 @@
           return registration.unregister();
         })
       .then(function() {
+          // Step 5.1 of Register clears the uninstall flag before fetching
+          // the script:
+          //
+          //  https://w3c.github.io/ServiceWorker/#register-algorithm
           var promise = navigator.serviceWorker.register('this-will-404',
                                                          { scope: scope });
-          iframe.remove();
           return promise;
         })
       .then(
@@ -100,17 +103,28 @@
           assert_unreached('register should reject the promise');
         },
         function() {
+          assert_equals(registration.installing, null,
+                        'registration.installing');
+          assert_equals(registration.waiting, null,
+                        'registration.waiting');
+          assert_equals(registration.active.scriptURL, normalizeURL(worker_url),
+                        'registration.active');
+          iframe.remove();
           return with_iframe(scope);
         })
       .then(function(frame) {
-          assert_equals(frame.contentWindow.navigator.serviceWorker.controller,
-                        null,
-                        'document should not load with a controller');
+          assert_equals(
+              frame.contentWindow.navigator.serviceWorker.controller.scriptURL,
+              normalizeURL(worker_url),
+              'the original worker should control a new document');
           frame.remove();
+          return registration.unregister();
+        })
+      .then(function() {
           t.done();
         })
       .catch(unreached_rejection(t));
-}, 'Registering a new script URL that 404s does not resurrect an ' +
+}, 'Registering a new script URL that 404s does resurrect an ' +
        'unregistered registration');
 
 async_test(function(t) {
@@ -131,9 +145,12 @@
           return registration.unregister();
         })
       .then(function() {
+          // Step 5.1 of Register clears the uninstall flag before firing
+          // the install event:
+          //
+          //  https://w3c.github.io/ServiceWorker/#register-algorithm
           var promise = navigator.serviceWorker.register(
               'resources/reject-install-worker.js', { scope: scope });
-          iframe.remove();
           return promise;
         })
       .then(function(r) {
@@ -141,12 +158,20 @@
           return wait_for_state(t, r.installing, 'redundant');
         })
       .then(function() {
+          assert_equals(registration.installing, null,
+                        'registration.installing');
+          assert_equals(registration.waiting, null,
+                        'registration.waiting');
+          assert_equals(registration.active.scriptURL, normalizeURL(worker_url),
+                        'registration.active');
+          iframe.remove();
           return with_iframe(scope);
         })
       .then(function(frame) {
-          assert_equals(frame.contentWindow.navigator.serviceWorker.controller,
-                        null,
-                        'document should not load with a controller');
+          assert_equals(
+              frame.contentWindow.navigator.serviceWorker.controller.scriptURL,
+              normalizeURL(worker_url),
+              'the original worker should control a new document');
           frame.remove();
           return registration.unregister();
         })
@@ -154,6 +179,6 @@
           t.done();
         })
       .catch(unreached_rejection(t));
-  }, 'Registering a new script URL that fails to install does not resurrect ' +
+  }, 'Registering a new script URL that fails to install does resurrect ' +
        'an unregistered registration');
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https-expected.txt
index f6d95f7..8e12b7c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
 FAIL Verify worker script from uncontrolled document is intercepted by Service Worker promise_test: Unhandled rejection with value: undefined
 FAIL Verify worker script intercepted by same-origin response succeeds promise_test: Unhandled rejection with value: undefined
-FAIL Verify worker script intercepted by cors response succeeds promise_test: Unhandled rejection with value: undefined
+PASS Verify worker script intercepted by cors response fails
 PASS Verify worker script intercepted by no-cors cross-origin response fails
 PASS Verify worker loads from controlled document are intercepted by Service Worker
 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https.html
index 3ec66a5..4f14746d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/worker-interception.https.html
@@ -81,10 +81,16 @@
             });
         })
       .then(function(data) {
-          assert_equals(data, 'dummy-worker-script loaded');
+          assert_unreached('intercepted cors response to a same-origin mode ' +
+                           'worker load should fail');
           service_worker_unregister_and_done(t, scope);
-        });
-  }, 'Verify worker script intercepted by cors response succeeds');
+        })
+      .catch(function(e) {
+          assert_true(true, 'intercepted cors response to a same-origin mode ' +
+                            'worker load should fail');
+          service_worker_unregister_and_done(t, scope);
+       });
+  }, 'Verify worker script intercepted by cors response fails');
 
 promise_test(function(t) {
     var worker_url = 'resources/dummy-no-cors-worker.js';
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/README.md b/third_party/WebKit/LayoutTests/external/wpt/web-animations/README.md
index 475f58a..f6efbf9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/README.md
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/README.md
@@ -98,10 +98,19 @@
     Remember, even if we do need to make all tests take, say 200s each, text
     editors are very good at search and replace.
 
-*   Use the `assert_times_equal` assertion for comparing calculated times.
-    It tests times are equal using the precision recommended in the spec whilst
-    allowing implementations to override the function to meet their own
-    precision requirements.
+*   Use the `assert_times_equal` assertion for comparing times returned from
+    the API. This asserts that the time values are equal using a tolerance
+    based on the precision recommended in the spec. This tolerance is applied
+    to *both* of the values being compared. That is, it effectively allows
+    double the epsilon that is used when comparing with an absolute value.
+
+    For comparing a time value returned from the API to an absolute value, use
+    `assert_time_equals_literal`. This tests that the actual value is equal to
+    the expected value within the precision recommended in the spec.
+
+    Both `assert_times_equal` and `assert_time_equals_literal` are defined in a
+    way that implementations can override them to meet their own precision
+    requirements.
 
 *   There are quite a few bad tests in the repository. We're learning as
     we go. Don't just copy them blindly&mdash;please fix them!
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
index a766d2c..5a9ef92 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 121 tests; 110 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 121 tests; 63 PASS, 58 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Element.animate() creates an Animation object
 PASS Element.animate() creates an Animation object in the relevant realm of the target element
 PASS Element.animate() creates an Animation object with a KeyframeEffect
@@ -8,64 +8,64 @@
 PASS Element.animate() accepts empty keyframe lists (input: [])
 PASS Element.animate() accepts empty keyframe lists (input: null)
 PASS Element.animate() accepts empty keyframe lists (input: undefined)
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification
-FAIL Element.animate() accepts a one shorthand property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-FAIL Element.animate() accepts a two property (one shorthand and one of its longhand components) two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a two property two value property-indexed keyframes specification
-PASS Element.animate() accepts a two property property-indexed keyframes specification with different numbers of values
-PASS Element.animate() accepts a property-indexed keyframes specification with an invalid value
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification that needs to stringify its values
-PASS Element.animate() accepts a property-indexed keyframes specification with a CSS variable reference
-FAIL Element.animate() accepts a property-indexed keyframes specification with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a one property one value property-indexed keyframes specification
-PASS Element.animate() accepts a one property one non-array value property-indexed keyframes specification
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification where the first value is invalid
-PASS Element.animate() accepts a one property two value property-indexed keyframes specification where the second value is invalid
-PASS Element.animate() accepts a property-indexed keyframe with a single offset
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets that is too short
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets that is too long
-PASS Element.animate() accepts a property-indexed keyframe with an empty array of offsets
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with an embedded null value
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with a trailing null value
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with leading and trailing null values
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with adjacent null values
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets with all null values (and too many at that)
-PASS Element.animate() accepts a property-indexed keyframe with a single null offset
-PASS Element.animate() accepts a property-indexed keyframe with an array of offsets that is not strictly ascending in the unused part of the array
-PASS Element.animate() accepts a property-indexed keyframe without any specified easing
-PASS Element.animate() accepts a property-indexed keyframe with a single easing
-PASS Element.animate() accepts a property-indexed keyframe with an array of easings
-PASS Element.animate() accepts a property-indexed keyframe with an array of easings that is too short
-PASS Element.animate() accepts a property-indexed keyframe with a single-element array of easings
-PASS Element.animate() accepts a property-indexed keyframe with an empty array of easings
-PASS Element.animate() accepts a property-indexed keyframe with an array of easings that is too long
+FAIL Element.animate() accepts a one property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a one shorthand property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL Element.animate() accepts a two property (one shorthand and one of its longhand components) two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL Element.animate() accepts a two property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
+FAIL Element.animate() accepts a two property property-indexed keyframes specification with different numbers of values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
+FAIL Element.animate() accepts a property-indexed keyframes specification with an invalid value assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
+FAIL Element.animate() accepts a one property two value property-indexed keyframes specification that needs to stringify its values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,offset,opacity" but got "computedOffset,easing,offset,opacity"
+FAIL Element.animate() accepts a property-indexed keyframes specification with a CSS variable reference assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframes specification with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL Element.animate() accepts a one property one value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a one property one non-array value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a one property two value property-indexed keyframes specification where the first value is invalid assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,offset" but got "computedOffset,easing,offset"
+FAIL Element.animate() accepts a one property two value property-indexed keyframes specification where the second value is invalid assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with a single offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets that is too short assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets that is too long assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an empty array of offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets with an embedded null value assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets with a trailing null value assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets with leading and trailing null values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets with adjacent null values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets with all null values (and too many at that) assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with a single null offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of offsets that is not strictly ascending in the unused part of the array assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe without any specified easing assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with a single easing assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of easings assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of easings that is too short assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with a single-element array of easings assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an empty array of easings assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a property-indexed keyframe with an array of easings that is too long assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS Element.animate() accepts a property-indexed keyframe with a single composite operation
 FAIL Element.animate() accepts a property-indexed keyframe with a composite array Failed to execute 'animate' on 'Element': Invalid composite value: 'accumulate'
 PASS Element.animate() accepts a property-indexed keyframe with a composite array that is too short
 FAIL Element.animate() accepts a property-indexed keyframe with a composite array that is too long Failed to execute 'animate' on 'Element': Invalid composite value: 'accumulate'
 PASS Element.animate() accepts a property-indexed keyframe with a single-element composite array
-PASS Element.animate() accepts a one property one keyframe sequence
-PASS Element.animate() accepts a one property two keyframe sequence
-PASS Element.animate() accepts a two property two keyframe sequence
-FAIL Element.animate() accepts a one shorthand property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-FAIL Element.animate() accepts a two property (a shorthand and one of its component longhands) two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a two property keyframe sequence where one property is missing from the first keyframe
-PASS Element.animate() accepts a two property keyframe sequence where one property is missing from the last keyframe
-PASS Element.animate() accepts a one property two keyframe sequence that needs to stringify its values
-PASS Element.animate() accepts a keyframe sequence with a CSS variable reference
-FAIL Element.animate() accepts a keyframe sequence with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
-PASS Element.animate() accepts a keyframe sequence with duplicate values for a given interior offset
-PASS Element.animate() accepts a keyframe sequence with duplicate values for offsets 0 and 1
-PASS Element.animate() accepts a two property four keyframe sequence
-PASS Element.animate() accepts a single keyframe sequence with omitted offset
-PASS Element.animate() accepts a single keyframe sequence with null offset
-PASS Element.animate() accepts a single keyframe sequence with string offset
-PASS Element.animate() accepts a one property keyframe sequence with some omitted offsets
-PASS Element.animate() accepts a one property keyframe sequence with some null offsets
-PASS Element.animate() accepts a two property keyframe sequence with some omitted offsets
-PASS Element.animate() accepts a one property keyframe sequence with all omitted offsets
-PASS Element.animate() accepts a keyframe sequence with different easing values, but the same easing value for a given offset
+FAIL Element.animate() accepts a one property one keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a one property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a two property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
+FAIL Element.animate() accepts a one shorthand property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL Element.animate() accepts a two property (a shorthand and one of its component longhands) two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL Element.animate() accepts a two property keyframe sequence where one property is missing from the first keyframe assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a two property keyframe sequence where one property is missing from the last keyframe assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
+FAIL Element.animate() accepts a one property two keyframe sequence that needs to stringify its values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,offset,opacity" but got "computedOffset,easing,offset,opacity"
+FAIL Element.animate() accepts a keyframe sequence with a CSS variable reference assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a keyframe sequence with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL Element.animate() accepts a keyframe sequence with duplicate values for a given interior offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a keyframe sequence with duplicate values for offsets 0 and 1 assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a two property four keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a single keyframe sequence with omitted offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a single keyframe sequence with null offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a single keyframe sequence with string offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a one property keyframe sequence with some omitted offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a one property keyframe sequence with some null offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a two property keyframe sequence with some omitted offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
+FAIL Element.animate() accepts a one property keyframe sequence with all omitted offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
+FAIL Element.animate() accepts a keyframe sequence with different easing values, but the same easing value for a given offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS Element.animate() accepts a keyframe sequence with different composite values, but the same composite value for a given offset
 PASS Element.animate() does not accept keyframes with an out-of-bounded positive offset
 PASS Element.animate() does not accept keyframes with an out-of-bounded negative offset
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/playbackRate.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/playbackRate.html
index 9a3b762..be5bf96 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/playbackRate.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/playbackRate.html
@@ -14,16 +14,14 @@
                              previousAnimationCurrentTime,
                              previousTimelineCurrentTime,
                              description) {
-  const accuracy = 0.001; /* accuracy of DOMHighResTimeStamp */
   const animationCurrentTimeDifference =
     animation.currentTime - previousAnimationCurrentTime;
   const timelineCurrentTimeDifference =
     animation.timeline.currentTime - previousTimelineCurrentTime;
 
-  assert_approx_equals(animationCurrentTimeDifference,
-                       timelineCurrentTimeDifference * animation.playbackRate,
-                       accuracy,
-                       description);
+  assert_times_equal(animationCurrentTimeDifference,
+                     timelineCurrentTimeDifference * animation.playbackRate,
+                     description);
 }
 
 promise_test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/direction.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/direction.html
index 7bc315d..3238f5d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/direction.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/direction.html
@@ -31,13 +31,13 @@
   const div = createDiv(t);
   const anim = div.animate(null, { duration: 10000, direction: 'normal' });
   anim.currentTime = 7000;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.7,
-                     'progress before updating direction');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.7,
+                             'progress before updating direction');
 
   anim.effect.timing.direction = 'reverse';
 
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.3,
-                     'progress after updating direction');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3,
+                             'progress after updating direction');
 }, 'Can be changed from \'normal\' to \'reverse\' while in progress');
 
 test(t => {
@@ -78,13 +78,13 @@
                              duration: 10000,
                              direction: 'normal' });
   anim.currentTime = 17000;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.7,
-                     'progress before updating direction');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.7,
+                             'progress before updating direction');
 
   anim.effect.timing.direction = 'alternate';
 
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.3,
-                     'progress after updating direction');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3,
+                             'progress after updating direction');
 }, 'Can be changed from \'normal\' to \'alternate\' while in progress');
 
 test(t => {
@@ -94,13 +94,13 @@
                              duration: 10000,
                              direction: 'alternate' });
   anim.currentTime = 17000;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.3,
-                     'progress before updating direction');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3,
+                             'progress before updating direction');
 
   anim.effect.timing.direction = 'alternate-reverse';
 
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.7,
-                     'progress after updating direction');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.7,
+                             'progress after updating direction');
 }, 'Can be changed from \'alternate\' to \'alternate-reverse\' while in'
    + ' progress');
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/duration.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/duration.html
index 9caa0e3..42913f5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/duration.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/duration.html
@@ -19,10 +19,10 @@
   const div = createDiv(t);
   const anim = div.animate({ opacity: [ 0, 1 ] }, 2000);
   anim.effect.timing.duration = 123.45;
-  assert_times_equal(anim.effect.timing.duration, 123.45,
-                     'set duration 123.45');
-  assert_times_equal(anim.effect.getComputedTiming().duration, 123.45,
-                     'getComputedTiming() after set duration 123.45');
+  assert_time_equals_literal(anim.effect.timing.duration, 123.45,
+                             'set duration 123.45');
+  assert_time_equals_literal(anim.effect.getComputedTiming().duration, 123.45,
+                             'getComputedTiming() after set duration 123.45');
 }, 'Can be set to a double value');
 
 test(t => {
@@ -176,8 +176,8 @@
   assert_equals(anim.effect.getComputedTiming().progress, 1,
                 'progress when animation is finished');
   anim.effect.timing.duration *= 2;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5,
-                     'progress after doubling the duration');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5,
+                             'progress after doubling the duration');
   anim.effect.timing.duration = 0;
   assert_equals(anim.effect.getComputedTiming().progress, 1,
                 'progress after setting duration to zero');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/endDelay.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/endDelay.html
index b6793ed..3062c8c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/endDelay.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/endDelay.html
@@ -19,10 +19,10 @@
   const div = createDiv(t);
   const anim = div.animate({ opacity: [ 0, 1 ] }, 2000);
   anim.effect.timing.endDelay = 123.45;
-  assert_times_equal(anim.effect.timing.endDelay, 123.45,
-                     'set endDelay 123.45');
-  assert_times_equal(anim.effect.getComputedTiming().endDelay, 123.45,
-                     'getComputedTiming() after set endDelay 123.45');
+  assert_time_equals_literal(anim.effect.timing.endDelay, 123.45,
+                             'set endDelay 123.45');
+  assert_time_equals_literal(anim.effect.getComputedTiming().endDelay, 123.45,
+                             'getComputedTiming() after set endDelay 123.45');
 }, 'Can be set to a positive number');
 
 test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterationStart.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterationStart.html
index 5521f1e..73bc481 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterationStart.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterationStart.html
@@ -24,7 +24,7 @@
                              duration: 100,
                              delay: 1 });
   anim.effect.timing.iterationStart = 2.5;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
   assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
 }, 'Changing the value updates computed timing when backwards-filling');
 
@@ -37,7 +37,7 @@
                              duration: 100,
                              delay: 0 });
   anim.effect.timing.iterationStart = 2.5;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
   assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
 }, 'Changing the value updates computed timing during the active phase');
 
@@ -51,7 +51,7 @@
                              delay: 0 });
   anim.finish();
   anim.effect.timing.iterationStart = 2.5;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
   assert_equals(anim.effect.getComputedTiming().currentIteration, 3);
 }, 'Changing the value updates computed timing when forwards-filling');
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterations.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterations.html
index 3239062..3bfaf8e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterations.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/AnimationEffectTiming/iterations.html
@@ -70,10 +70,12 @@
 
   anim.effect.timing.iterations = 2;
 
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0,
-                     'progress after adding an iteration');
-  assert_times_equal(anim.effect.getComputedTiming().currentIteration, 1,
-                     'current iteration after adding an iteration');
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress,
+                             0,
+                             'progress after adding an iteration');
+  assert_time_equals_literal(anim.effect.getComputedTiming().currentIteration,
+                             1,
+                             'current iteration after adding an iteration');
 
   anim.effect.timing.iterations = 0;
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/composite-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/composite-expected.txt
new file mode 100644
index 0000000..be099f2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/composite-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+PASS Default value
+PASS Change composite value
+FAIL Unspecified keyframe composite value when setting effect composite assert_equals: unspecified keyframe composite value should be null even if effect composite is set expected (object) null but got (undefined) undefined
+PASS Specified keyframe composite value when setting effect composite
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/composite.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/composite.html
index 745f66b..82ac633 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/composite.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/composite.html
@@ -29,8 +29,8 @@
 
   anim.effect.composite = 'add';
   const keyframes = anim.effect.getKeyframes();
-  assert_equals(keyframes[0].composite, undefined,
-                'unspecified keyframe composite value should be absent even ' +
+  assert_equals(keyframes[0].composite, null,
+                'unspecified keyframe composite value should be null even ' +
                 'if effect composite is set');
 }, 'Unspecified keyframe composite value when setting effect composite');
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt
index bce450f..38f7472 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor-expected.txt
@@ -1,74 +1,74 @@
 This is a testharness.js-based test.
-Found 167 tests; 149 PASS, 18 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 167 tests; 102 PASS, 65 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS A KeyframeEffectReadOnly can be constructed with no frames
 PASS easing values are parsed correctly when passed to the KeyframeEffectReadOnly constructor in KeyframeEffectOptions
 PASS Invalid easing values are correctly rejected when passed to the KeyframeEffectReadOnly constructor in KeyframeEffectOptions
 FAIL composite values are parsed correctly when passed to the KeyframeEffectReadOnly constructor in property-indexed keyframes Failed to construct 'KeyframeEffectReadOnly': Invalid composite value: 'accumulate'
 FAIL composite values are parsed correctly when passed to the KeyframeEffectReadOnly constructor in regular keyframes Failed to construct 'KeyframeEffectReadOnly': Invalid composite value: 'accumulate'
-FAIL composite value is absent if the composite operation specified on the keyframe effect is being used Failed to construct 'KeyframeEffectReadOnly': Invalid composite value: 'accumulate'
-PASS A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification
+FAIL composite value is null if the composite operation specified on the keyframe effect is being used assert_equals: resulting composite for 'replace' expected (object) null but got (undefined) undefined
+FAIL A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property two value property-indexed keyframes specification roundtrips
-FAIL A KeyframeEffectReadOnly can be constructed with a one shorthand property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL A KeyframeEffectReadOnly can be constructed with a one shorthand property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
 PASS A KeyframeEffectReadOnly constructed with a one shorthand property two value property-indexed keyframes specification roundtrips
-FAIL A KeyframeEffectReadOnly can be constructed with a two property (one shorthand and one of its longhand components) two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL A KeyframeEffectReadOnly can be constructed with a two property (one shorthand and one of its longhand components) two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
 PASS A KeyframeEffectReadOnly constructed with a two property (one shorthand and one of its longhand components) two value property-indexed keyframes specification roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a two property two value property-indexed keyframes specification
+FAIL A KeyframeEffectReadOnly can be constructed with a two property two value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
 PASS A KeyframeEffectReadOnly constructed with a two property two value property-indexed keyframes specification roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a two property property-indexed keyframes specification with different numbers of values
+FAIL A KeyframeEffectReadOnly can be constructed with a two property property-indexed keyframes specification with different numbers of values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
 PASS A KeyframeEffectReadOnly constructed with a two property property-indexed keyframes specification with different numbers of values roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframes specification with an invalid value
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframes specification with an invalid value assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframes specification with an invalid value roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification that needs to stringify its values
+FAIL A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification that needs to stringify its values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,offset,opacity" but got "computedOffset,easing,offset,opacity"
 PASS A KeyframeEffectReadOnly constructed with a one property two value property-indexed keyframes specification that needs to stringify its values roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframes specification with a CSS variable reference
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframes specification with a CSS variable reference assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframes specification with a CSS variable reference roundtrips
-FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframes specification with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframes specification with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
 FAIL A KeyframeEffectReadOnly constructed with a property-indexed keyframes specification with a CSS variable reference in a shorthand property roundtrips assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset" but got "computedOffset,easing,offset"
-PASS A KeyframeEffectReadOnly can be constructed with a one property one value property-indexed keyframes specification
+FAIL A KeyframeEffectReadOnly can be constructed with a one property one value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property one value property-indexed keyframes specification roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property one non-array value property-indexed keyframes specification
+FAIL A KeyframeEffectReadOnly can be constructed with a one property one non-array value property-indexed keyframes specification assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property one non-array value property-indexed keyframes specification roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification where the first value is invalid
+FAIL A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification where the first value is invalid assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,offset" but got "computedOffset,easing,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property two value property-indexed keyframes specification where the first value is invalid roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification where the second value is invalid
+FAIL A KeyframeEffectReadOnly can be constructed with a one property two value property-indexed keyframes specification where the second value is invalid assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property two value property-indexed keyframes specification where the second value is invalid roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single offset
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with a single offset roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets that is too short
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets that is too short assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets that is too short roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets that is too long
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets that is too long assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets that is too long roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an empty array of offsets
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an empty array of offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an empty array of offsets roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with an embedded null value
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with an embedded null value assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets with an embedded null value roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with a trailing null value
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with a trailing null value assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets with a trailing null value roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with leading and trailing null values
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with leading and trailing null values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets with leading and trailing null values roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with adjacent null values
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with adjacent null values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets with adjacent null values roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with all null values (and too many at that)
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets with all null values (and too many at that) assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets with all null values (and too many at that) roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single null offset
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single null offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with a single null offset roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets that is not strictly ascending in the unused part of the array
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of offsets that is not strictly ascending in the unused part of the array assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of offsets that is not strictly ascending in the unused part of the array roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe without any specified easing
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe without any specified easing assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe without any specified easing roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single easing
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single easing assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with a single easing roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of easings
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of easings assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of easings roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of easings that is too short
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of easings that is too short assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of easings that is too short roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single-element array of easings
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single-element array of easings assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with a single-element array of easings roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an empty array of easings
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an empty array of easings assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an empty array of easings roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of easings that is too long
+FAIL A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with an array of easings that is too long assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with an array of easings that is too long roundtrips
 PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single composite operation
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with a single composite operation roundtrips
@@ -80,47 +80,47 @@
 FAIL A KeyframeEffectReadOnly constructed with a property-indexed keyframe with a composite array that is too long roundtrips Failed to construct 'KeyframeEffectReadOnly': Invalid composite value: 'accumulate'
 PASS A KeyframeEffectReadOnly can be constructed with a property-indexed keyframe with a single-element composite array
 PASS A KeyframeEffectReadOnly constructed with a property-indexed keyframe with a single-element composite array roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property one keyframe sequence
+FAIL A KeyframeEffectReadOnly can be constructed with a one property one keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property one keyframe sequence roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property two keyframe sequence
+FAIL A KeyframeEffectReadOnly can be constructed with a one property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property two keyframe sequence roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a two property two keyframe sequence
+FAIL A KeyframeEffectReadOnly can be constructed with a two property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
 PASS A KeyframeEffectReadOnly constructed with a two property two keyframe sequence roundtrips
-FAIL A KeyframeEffectReadOnly can be constructed with a one shorthand property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL A KeyframeEffectReadOnly can be constructed with a one shorthand property two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
 PASS A KeyframeEffectReadOnly constructed with a one shorthand property two keyframe sequence roundtrips
-FAIL A KeyframeEffectReadOnly can be constructed with a two property (a shorthand and one of its component longhands) two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL A KeyframeEffectReadOnly can be constructed with a two property (a shorthand and one of its component longhands) two keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,marginTop,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
 PASS A KeyframeEffectReadOnly constructed with a two property (a shorthand and one of its component longhands) two keyframe sequence roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a two property keyframe sequence where one property is missing from the first keyframe
+FAIL A KeyframeEffectReadOnly can be constructed with a two property keyframe sequence where one property is missing from the first keyframe assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a two property keyframe sequence where one property is missing from the first keyframe roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a two property keyframe sequence where one property is missing from the last keyframe
+FAIL A KeyframeEffectReadOnly can be constructed with a two property keyframe sequence where one property is missing from the last keyframe assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
 PASS A KeyframeEffectReadOnly constructed with a two property keyframe sequence where one property is missing from the last keyframe roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property two keyframe sequence that needs to stringify its values
+FAIL A KeyframeEffectReadOnly can be constructed with a one property two keyframe sequence that needs to stringify its values assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,offset,opacity" but got "computedOffset,easing,offset,opacity"
 PASS A KeyframeEffectReadOnly constructed with a one property two keyframe sequence that needs to stringify its values roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with a CSS variable reference
+FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with a CSS variable reference assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with a CSS variable reference roundtrips
-FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
+FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with a CSS variable reference in a shorthand property assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,margin,offset" but got "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset"
 FAIL A KeyframeEffectReadOnly constructed with a keyframe sequence with a CSS variable reference in a shorthand property roundtrips assert_equals: properties on ComputedKeyframe #0 should match expected "computedOffset,easing,marginBottom,marginLeft,marginRight,marginTop,offset" but got "computedOffset,easing,offset"
-PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for a given interior offset
+FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for a given interior offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with duplicate values for a given interior offset roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for offsets 0 and 1
+FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for offsets 0 and 1 assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with duplicate values for offsets 0 and 1 roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a two property four keyframe sequence
+FAIL A KeyframeEffectReadOnly can be constructed with a two property four keyframe sequence assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a two property four keyframe sequence roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with omitted offset
+FAIL A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with omitted offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a single keyframe sequence with omitted offset roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with null offset
+FAIL A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with null offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a single keyframe sequence with null offset roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with string offset
+FAIL A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with string offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a single keyframe sequence with string offset roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property keyframe sequence with some omitted offsets
+FAIL A KeyframeEffectReadOnly can be constructed with a one property keyframe sequence with some omitted offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property keyframe sequence with some omitted offsets roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property keyframe sequence with some null offsets
+FAIL A KeyframeEffectReadOnly can be constructed with a one property keyframe sequence with some null offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property keyframe sequence with some null offsets roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a two property keyframe sequence with some omitted offsets
+FAIL A KeyframeEffectReadOnly can be constructed with a two property keyframe sequence with some omitted offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset,top" but got "computedOffset,easing,left,offset,top"
 PASS A KeyframeEffectReadOnly constructed with a two property keyframe sequence with some omitted offsets roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a one property keyframe sequence with all omitted offsets
+FAIL A KeyframeEffectReadOnly can be constructed with a one property keyframe sequence with all omitted offsets assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a one property keyframe sequence with all omitted offsets roundtrips
-PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with different easing values, but the same easing value for a given offset
+FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with different easing values, but the same easing value for a given offset assert_equals: properties on ComputedKeyframe #0 should match expected "composite,computedOffset,easing,left,offset" but got "computedOffset,easing,left,offset"
 PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with different easing values, but the same easing value for a given offset roundtrips
 PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with different composite values, but the same composite value for a given offset
 PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with different composite values, but the same composite value for a given offset roundtrips
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor.html
index b257257..dfdebde 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/constructor.html
@@ -57,7 +57,7 @@
     assert_equals(effect.getKeyframes()[0].composite, composite,
                   `resulting composite for '${composite}'`);
   }
-  for (const composite of gBadCompositeValueTests) {
+  for (const composite of gBadKeyframeCompositeValueTests) {
     assert_throws(new TypeError, () => {
       new KeyframeEffectReadOnly(target, getKeyframe(composite));
     });
@@ -76,7 +76,7 @@
     assert_equals(effect.getKeyframes()[0].composite, composite,
                   `resulting composite for '${composite}'`);
   }
-  for (const composite of gBadCompositeValueTests) {
+  for (const composite of gBadKeyframeCompositeValueTests) {
     assert_throws(new TypeError, () => {
       new KeyframeEffectReadOnly(target, getKeyframes(composite));
     });
@@ -89,17 +89,17 @@
     const effect = new KeyframeEffectReadOnly(target, {
       left: ['10px', '20px']
     }, { composite: composite });
-    assert_equals(effect.getKeyframes()[0].composite, undefined,
+    assert_equals(effect.getKeyframes()[0].composite, null,
                   `resulting composite for '${composite}'`);
   }
-  for (const composite of gBadCompositeValueTests) {
+  for (const composite of gBadOptionsCompositeValueTests) {
     assert_throws(new TypeError, () => {
       new KeyframeEffectReadOnly(target, {
         left: ['10px', '20px']
       }, { composite: composite });
     });
   }
-}, 'composite value is absent if the composite operation specified on the ' +
+}, 'composite value is null if the composite operation specified on the ' +
    'keyframe effect is being used');
 
 for (const subtest of gKeyframesTests) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-001.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-001.html
index e6c5c2a..523019d2 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-001.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-001.html
@@ -180,9 +180,27 @@
     { done: true },
   ]));
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', left: '100px' },
-    { offset: null, computedOffset: 0.5, easing: 'linear', left: '300px' },
-    { offset: null, computedOffset: 1, easing: 'linear', left: '200px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      left: '100px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 0.5,
+      easing: 'linear',
+      left: '300px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      left: '200px',
+      composite: null,
+    },
   ]);
 }, 'Keyframes are read from a custom iterator');
 
@@ -197,9 +215,27 @@
   keyframes.offset = '0.1';
   const effect = new KeyframeEffect(null, keyframes);
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', left: '100px' },
-    { offset: null, computedOffset: 0.5, easing: 'linear', left: '300px' },
-    { offset: null, computedOffset: 1, easing: 'linear', left: '200px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      left: '100px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 0.5,
+      easing: 'linear',
+      left: '300px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      left: '200px',
+      composite: null,
+    },
   ]);
 }, '\'easing\' and \'offset\' are ignored on iterable objects');
 
@@ -211,11 +247,29 @@
     { done: true },
   ]));
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', left: '100px',
-      top: '200px' },
-    { offset: null, computedOffset: 0.5, easing: 'linear', left: '300px' },
-    { offset: null, computedOffset: 1, easing: 'linear', left: '200px',
-      top: '100px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      left: '100px',
+      top: '200px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 0.5,
+      easing: 'linear',
+      left: '300px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      left: '200px',
+      top: '100px',
+      composite: null,
+    },
   ]);
 }, 'Keyframes are read from a custom iterator with multiple properties'
    + ' specified');
@@ -228,9 +282,27 @@
     { done: true },
   ]));
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', left: '100px' },
-    { offset: 0.75, computedOffset: 0.75, easing: 'linear', left: '250px' },
-    { offset: null, computedOffset: 1, easing: 'linear', left: '200px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      left: '100px',
+      composite: null,
+    },
+    {
+      offset: 0.75,
+      computedOffset: 0.75,
+      easing: 'linear',
+      left: '250px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      left: '200px',
+      composite: null,
+    },
   ]);
 }, 'Keyframes are read from a custom iterator with where an offset is'
    + ' specified');
@@ -253,7 +325,7 @@
     { done: true },
   ]));
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 1, easing: 'linear' }
+    { offset: null, computedOffset: 1, easing: 'linear', composite: null }
   ]);
 }, 'A list of values returned from a custom iterator should be ignored');
 
@@ -270,8 +342,20 @@
   const effect = new KeyframeEffect(null, [keyframe, { height: '200px' }]);
 
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', height: '100px' },
-    { offset: null, computedOffset: 1, easing: 'linear', height: '200px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      height: '100px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      height: '200px',
+      composite: null,
+    },
   ]);
 }, 'Only enumerable properties on keyframes are read');
 
@@ -289,8 +373,20 @@
   const effect = new KeyframeEffect(null, [keyframe, { top: '200px' }]);
 
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', top: '100px' },
-    { offset: null, computedOffset: 1, easing: 'linear', top: '200px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      top: '100px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      top: '200px',
+      composite: null,
+    },
   ]);
 }, 'Only properties defined directly on keyframes are read');
 
@@ -305,8 +401,20 @@
   const effect = new KeyframeEffect(null, keyframes);
 
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', height: '100px' },
-    { offset: null, computedOffset: 1, easing: 'linear', height: '200px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      height: '100px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      height: '200px',
+      composite: null,
+    },
   ]);
 }, 'Only enumerable properties on property-indexed keyframes are read');
 
@@ -324,8 +432,20 @@
   const effect = new KeyframeEffect(null, keyframes);
 
   assert_frame_lists_equal(effect.getKeyframes(), [
-    { offset: null, computedOffset: 0, easing: 'linear', top: '100px' },
-    { offset: null, computedOffset: 1, easing: 'linear', top: '200px' },
+    {
+      offset: null,
+      computedOffset: 0,
+      easing: 'linear',
+      top: '100px',
+      composite: null,
+    },
+    {
+      offset: null,
+      computedOffset: 1,
+      easing: 'linear',
+      top: '200px',
+      composite: null,
+    },
   ]);
 }, 'Only properties defined directly on property-indexed keyframes are read');
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/resources/keyframe-tests.js b/third_party/WebKit/LayoutTests/external/wpt/web-animations/resources/keyframe-tests.js
index 3aa1c6d..f32f5ce 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/resources/keyframe-tests.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/resources/keyframe-tests.js
@@ -12,14 +12,18 @@
 // ------------------------------
 
 const gGoodKeyframeCompositeValueTests = [
-  'replace', 'add', 'accumulate', undefined
+  'replace', 'add', 'accumulate', null
+];
+
+const gBadKeyframeCompositeValueTests = [
+  'unrecognised', 'replace ', 'Replace'
 ];
 
 const gGoodOptionsCompositeValueTests = [
   'replace', 'add', 'accumulate'
 ];
 
-const gBadCompositeValueTests = [
+const gBadOptionsCompositeValueTests = [
   'unrecognised', 'replace ', 'Replace', null
 ];
 
@@ -50,9 +54,7 @@
   // Object.assign instead.
   const result = {};
   Object.assign(result, offset, props, { easing });
-  if (composite) {
-    result.composite = composite;
-  }
+  result.composite = composite || null;
   return result;
 };
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/testcommon.js b/third_party/WebKit/LayoutTests/external/wpt/web-animations/testcommon.js
index 51b84dd..be3827f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/testcommon.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/testcommon.js
@@ -21,10 +21,18 @@
 // times based on their precision requirements.
 if (!window.assert_times_equal) {
   window.assert_times_equal = (actual, expected, description) => {
-    assert_approx_equals(actual, expected, TIME_PRECISION, description);
+    assert_approx_equals(actual, expected, TIME_PRECISION * 2, description);
   };
 }
 
+// Allow implementations to substitute an alternative method for comparing
+// a time value based on its precision requirements with a fixed value.
+if (!window.assert_time_equals_literal) {
+  window.assert_time_equals_literal = (actual, expected, description) => {
+    assert_approx_equals(actual, expected, TIME_PRECISION, description);
+  }
+}
+
 // creates div element, appends it to the document body and
 // removes the created element during test cleanup
 function createDiv(test, doc) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/active-time.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/active-time.html
index 3e3b528..a2feb23 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/active-time.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/active-time.html
@@ -25,19 +25,19 @@
 test(t => {
   const anim = createDiv(t).animate(null, 1000);
   anim.currentTime = 500;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
 }, 'Active time in active phase and no start delay is the local time');
 
 test(t => {
   const anim = createDiv(t).animate(null, { duration: 1000, delay: 500 });
   anim.currentTime = 1000;
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
 }, 'Active time in active phase and positive start delay is the local time'
    + ' minus the start delay');
 
 test(t => {
   const anim = createDiv(t).animate(null, { duration: 1000, delay: -500 });
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
 }, 'Active time in active phase and negative start delay is the local time'
    + ' minus the start delay');
 
@@ -58,7 +58,7 @@
                                             fill: 'forwards' });
   anim.finish();
   assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.3);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3);
 }, 'Active time in after phase with forwards fill is the active duration');
 
 test(t => {
@@ -79,7 +79,7 @@
                                             fill: 'forwards' });
   anim.finish();
   assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.3);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3);
 }, 'Active time in after phase with forwards fill and positive end delay'
    + ' is the active duration');
 
@@ -91,7 +91,7 @@
                                             fill: 'forwards' });
   anim.finish();
   assert_equals(anim.effect.getComputedTiming().currentIteration, 1);
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.5);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.5);
 }, 'Active time in after phase with forwards fill and negative end delay'
    + ' is the active duration + end delay');
 
@@ -127,7 +127,7 @@
                                             fill: 'both' });
   anim.finish();
   assert_equals(anim.effect.getComputedTiming().currentIteration, 2);
-  assert_times_equal(anim.effect.getComputedTiming().progress, 0.3);
+  assert_time_equals_literal(anim.effect.getComputedTiming().progress, 0.3);
 }, 'Active time in after phase with \'both\' fill is the active duration');
 
 test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt
index 823352a..9648069 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animation-effects/simple-iteration-progress-expected.txt
@@ -21,7 +21,7 @@
 PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:100 delay:1 fill:both
 PASS Test fractional iterations: iterations:3.5 iterationStart:0 duration:Infinity delay:1 fill:both
 PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:0 delay:1 fill:both
-FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the after phase expected 1 +/- 0.0005 but got 5.551115123125783e-16
+FAIL Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:100 delay:1 fill:both assert_approx_equals: Value of progress in the after phase expected 1 +/- 0.001 but got 5.551115123125783e-16
 PASS Test fractional iterations: iterations:3.5 iterationStart:2.5 duration:Infinity delay:1 fill:both
 PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:0 delay:1 fill:both
 PASS Test fractional iterations: iterations:3.5 iterationStart:3 duration:100 delay:1 fill:both
@@ -29,7 +29,7 @@
 PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:0 delay:1 fill:both
 PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:100 delay:1 fill:both
 PASS Test infinity iterations: iterations:Infinity iterationStart:0 duration:Infinity delay:1 fill:both
-FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the after phase expected 0.5 +/- 0.0005 but got 1
+FAIL Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:0 delay:1 fill:both assert_approx_equals: Value of progress in the after phase expected 0.5 +/- 0.001 but got 1
 PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:100 delay:1 fill:both
 PASS Test infinity iterations: iterations:Infinity iterationStart:2.5 duration:Infinity delay:1 fill:both
 PASS Test infinity iterations: iterations:Infinity iterationStart:3 duration:0 delay:1 fill:both
@@ -40,13 +40,13 @@
 PASS Test end delay: duration:100 delay:1 fill:both endDelay:-100
 PASS Test end delay: duration:100 delay:1 fill:both endDelay:-200
 PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:50
-FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-50 assert_approx_equals: Value of progress in the after phase expected 0 +/- 0.0005 but got 1
+FAIL Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-50 assert_approx_equals: Value of progress in the after phase expected 0 +/- 0.001 but got 1
 PASS Test end delay: iterationStart:0.5 duration:100 delay:1 fill:both endDelay:-100
-FAIL Test end delay: iterations:2 duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the after phase expected 0 +/- 0.0005 but got 1
+FAIL Test end delay: iterations:2 duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the after phase expected 0 +/- 0.001 but got 1
 PASS Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-50
-FAIL Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the after phase expected 0 +/- 0.0005 but got 1
+FAIL Test end delay: iterations:1 iterationStart:2 duration:100 delay:1 fill:both endDelay:-100 assert_approx_equals: Value of progress in the after phase expected 0 +/- 0.001 but got 1
 PASS Test negative playback rate: duration:1 delay:1 fill:both playbackRate:-1
-FAIL Test negative playback rate: duration:0 delay:1 fill:both playbackRate:-1 assert_approx_equals: Value of progress in the before phase expected 0 +/- 0.0005 but got 1
+FAIL Test negative playback rate: duration:0 delay:1 fill:both playbackRate:-1 assert_approx_equals: Value of progress in the before phase expected 0 +/- 0.001 but got 1
 PASS Test negative playback rate: duration:0 iterations:0 delay:1 fill:both playbackRate:-1
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/current-time.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/current-time.html
index d2f5075..08f90d9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/current-time.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/current-time.html
@@ -68,7 +68,7 @@
 
   return animation.ready.then(() => waitForAnimationFrames(1))
   .then(() => {
-    assert_times_equal(animation.currentTime, 0);
+    assert_time_equals_literal(animation.currentTime, 0);
   });
 }, 'The current time does not progress if playback rate is 0');
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/playing-an-animation.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/playing-an-animation.html
index 2beed47..1064192 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/playing-an-animation.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/playing-an-animation.html
@@ -14,26 +14,26 @@
 test(t => {
   const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
   animation.currentTime = 1 * MS_PER_SEC;
-  assert_times_equal(animation.currentTime, 1 * MS_PER_SEC);
+  assert_time_equals_literal(animation.currentTime, 1 * MS_PER_SEC);
   animation.play();
-  assert_times_equal(animation.currentTime, 1 * MS_PER_SEC);
+  assert_time_equals_literal(animation.currentTime, 1 * MS_PER_SEC);
 }, 'Playing a running animation leaves the current time unchanged');
 
 test(t => {
   const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
   animation.finish();
-  assert_times_equal(animation.currentTime, 100 * MS_PER_SEC);
+  assert_time_equals_literal(animation.currentTime, 100 * MS_PER_SEC);
   animation.play();
-  assert_times_equal(animation.currentTime, 0);
+  assert_time_equals_literal(animation.currentTime, 0);
 }, 'Playing a finished animation seeks back to the start');
 
 test(t => {
   const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
   animation.playbackRate = -1;
   animation.currentTime = 0;
-  assert_times_equal(animation.currentTime, 0);
+  assert_time_equals_literal(animation.currentTime, 0);
   animation.play();
-  assert_times_equal(animation.currentTime, 100 * MS_PER_SEC);
+  assert_time_equals_literal(animation.currentTime, 100 * MS_PER_SEC);
 }, 'Playing a finished and reversed animation seeks to end');
 
 test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-animation-start-time.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-animation-start-time.html
index 1526be0..d2a311d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-animation-start-time.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-animation-start-time.html
@@ -80,9 +80,9 @@
 
   // If we set the start time, however, we should clear the hold time.
   animation.startTime = document.timeline.currentTime - 2000;
-  assert_times_equal(animation.currentTime, 2000,
-                     'The current time is calculated from the start time,'
-                     + ' not the hold time');
+  assert_time_equals_literal(animation.currentTime, 2000,
+                             'The current time is calculated from the start'
+                             + ' time, not the hold time');
 
   // Sanity check
   assert_equals(animation.playState, 'running',
@@ -99,13 +99,14 @@
   // are resolved).
   animation.startTime = document.timeline.currentTime - 1000;
   assert_equals(animation.playState, 'running');
-  assert_times_equal(animation.currentTime, 1000,
-                     'Current time is resolved for a running animation')
+  assert_time_equals_literal(animation.currentTime, 1000,
+                             'Current time is resolved for a running animation');
 
   // Clear start time
   animation.startTime = null;
-  assert_times_equal(animation.currentTime, 1000,
-                     'Hold time is set after start time is made unresolved');
+  assert_time_equals_literal(animation.currentTime, 1000,
+                             'Hold time is set after start time is made'
+                             + ' unresolved');
   assert_equals(animation.playState, 'paused',
                 'Animation reports it is paused after setting an unresolved'
                 + ' start time');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html
index 8a44213..24f201d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html
@@ -26,7 +26,7 @@
   animation.timeline = document.timeline;
 
   assert_equals(animation.playState, 'paused');
-  assert_times_equal(animation.currentTime, 50 * MS_PER_SEC);
+  assert_time_equals_literal(animation.currentTime, 50 * MS_PER_SEC);
 }, 'After setting timeline on paused animation it is still paused');
 
 test(t => {
@@ -39,7 +39,7 @@
   animation.timeline = document.timeline;
 
   assert_equals(animation.playState, 'paused');
-  assert_times_equal(animation.currentTime, 200 * MS_PER_SEC);
+  assert_time_equals_literal(animation.currentTime, 200 * MS_PER_SEC);
 }, 'After setting timeline on animation paused outside active interval'
    + ' it is still paused');
 
@@ -141,7 +141,7 @@
 
   assert_false(animation.pending);
   assert_equals(animation.playState, 'paused');
-  assert_times_equal(animation.currentTime, 50 * MS_PER_SEC);
+  assert_time_equals_literal(animation.currentTime, 50 * MS_PER_SEC);
 }, 'After clearing timeline on paused animation it is still paused');
 
 test(t => {
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/incremental-shadow-dom/external/wpt/css/css-scoping/slotted-invalidation-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/incremental-shadow-dom/external/wpt/css/css-scoping/slotted-invalidation-expected.txt
new file mode 100644
index 0000000..94e9117
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/incremental-shadow-dom/external/wpt/css/css-scoping/slotted-invalidation-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL CSS Test: Style invalidation for ::slotted() assert_equals: expected "rgb(255, 0, 0)" but got "rgba(0, 0, 0, 0)"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/incremental-shadow-dom/external/wpt/css/css-scoping/slotted-invalidation-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/incremental-shadow-dom/external/wpt/css/css-scoping/slotted-invalidation-expected.txt
new file mode 100644
index 0000000..94e9117
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/incremental-shadow-dom/external/wpt/css/css-scoping/slotted-invalidation-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL CSS Test: Style invalidation for ::slotted() assert_equals: expected "rgb(255, 0, 0)" but got "rgba(0, 0, 0, 0)"
+Harness: the test ran to completion.
+