Bug 1245460 - Update web-platform-tests to revision af65262f5f3400024279c526117489f1f11d3233, a=testonly
authorJames Graham <james@hoppipolla.co.uk>
Tue, 02 Feb 2016 22:04:13 +0000
changeset 319201 28d8f5fe519746ac6924f974723c6b4381c6466b
parent 319200 b64710d45b2852b6f082411e6a066497aad50182
child 319202 09631223c28e0e4719743f461db32767f70b6f00
push id5913
push userjlund@mozilla.com
push dateMon, 25 Apr 2016 16:57:49 +0000
treeherdermozilla-beta@dcaf0a6fa115 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstestonly
bugs1245460
milestone47.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1245460 - Update web-platform-tests to revision af65262f5f3400024279c526117489f1f11d3233, a=testonly
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/mozilla-sync
testing/web-platform/tests/DOMEvents/OWNERS
testing/web-platform/tests/FileAPI/OWNERS
testing/web-platform/tests/IndexedDB/OWNERS
testing/web-platform/tests/WebCryptoAPI/OWNERS
testing/web-platform/tests/XMLHttpRequest/OWNERS
testing/web-platform/tests/XMLHttpRequest/responsexml-document-properties.htm
testing/web-platform/tests/ambient-light/OWNERS
testing/web-platform/tests/app-uri/OWNERS
testing/web-platform/tests/common/OWNERS
testing/web-platform/tests/conformance-checkers/OWNERS
testing/web-platform/tests/content-security-policy/OWNERS
testing/web-platform/tests/cors/OWNERS
testing/web-platform/tests/cssom-view/OWNERS
testing/web-platform/tests/custom-elements/OWNERS
testing/web-platform/tests/docs/OWNERS
testing/web-platform/tests/dom/OWNERS
testing/web-platform/tests/domparsing/OWNERS
testing/web-platform/tests/domxpath/OWNERS
testing/web-platform/tests/editing/OWNERS
testing/web-platform/tests/encoding/OWNERS
testing/web-platform/tests/eventsource/OWNERS
testing/web-platform/tests/fetch/OWNERS
testing/web-platform/tests/gamepad/OWNERS
testing/web-platform/tests/geolocation-API/OWNERS
testing/web-platform/tests/hr-time/OWNERS
testing/web-platform/tests/html-imports/OWNERS
testing/web-platform/tests/html-longdesc/OWNERS
testing/web-platform/tests/html-media-capture/OWNERS
testing/web-platform/tests/html/OWNERS
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resources/blank1.html
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resources/blank2.html
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resources/page-with-fragment.html
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-basic.html
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-samedoc.html
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html
testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-samedoc.html
testing/web-platform/tests/html/dom/interfaces.html
testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported-ref.html
testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported.html
testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported.xhtml
testing/web-platform/tests/html/semantics/embedded-content/the-embed-element/embed-document.html
testing/web-platform/tests/html/semantics/forms/the-button-element/button-events.html
testing/web-platform/tests/html/semantics/forms/the-input-element/checkbox.html
testing/web-platform/tests/html/semantics/forms/the-input-element/file-manual.html
testing/web-platform/tests/html/semantics/forms/the-input-element/radio.html
testing/web-platform/tests/html/webappapis/scripting/events/event-handler-onresize.html
testing/web-platform/tests/images/OWNERS
testing/web-platform/tests/media-source/OWNERS
testing/web-platform/tests/media/OWNERS
testing/web-platform/tests/mediacapture-streams/OWNERS
testing/web-platform/tests/mixed-content/OWNERS
testing/web-platform/tests/navigation-timing/OWNERS
testing/web-platform/tests/notifications/OWNERS
testing/web-platform/tests/page-visibility/OWNERS
testing/web-platform/tests/performance-timeline/OWNERS
testing/web-platform/tests/pointerevents/OWNERS
testing/web-platform/tests/pointerlock/OWNERS
testing/web-platform/tests/proximity/OWNERS
testing/web-platform/tests/quirks-mode/OWNERS
testing/web-platform/tests/referrer-policy/OWNERS
testing/web-platform/tests/resource-timing/OWNERS
testing/web-platform/tests/screen-orientation/OWNERS
testing/web-platform/tests/selection/OWNERS
testing/web-platform/tests/service-workers/OWNERS
testing/web-platform/tests/service-workers/cache-storage/OWNERS
testing/web-platform/tests/service-workers/cache-storage/resources/test-helpers.js
testing/web-platform/tests/service-workers/cache-storage/resources/testharness-helpers.js
testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-add.js
testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-match.js
testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-matchAll.js
testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-put.js
testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-storage.js
testing/web-platform/tests/service-workers/cache-storage/serviceworker/cache-match.https.html
testing/web-platform/tests/service-workers/cache-storage/serviceworker/cache-matchAll.https.html
testing/web-platform/tests/service-workers/cache-storage/window/cache-match.https.html
testing/web-platform/tests/service-workers/cache-storage/window/cache-matchAll.https.html
testing/web-platform/tests/service-workers/cache-storage/worker/cache-match.https.html
testing/web-platform/tests/service-workers/cache-storage/worker/cache-matchAll.https.html
testing/web-platform/tests/shadow-dom/OWNERS
testing/web-platform/tests/subresource-integrity/OWNERS
testing/web-platform/tests/svg/OWNERS
testing/web-platform/tests/touch-events/OWNERS
testing/web-platform/tests/typedarrays/OWNERS
testing/web-platform/tests/url/OWNERS
testing/web-platform/tests/user-timing/OWNERS
testing/web-platform/tests/vibration/OWNERS
testing/web-platform/tests/web-animations/OWNERS
testing/web-platform/tests/webaudio/OWNERS
testing/web-platform/tests/webdriver/OWNERS
testing/web-platform/tests/webgl/conformance-1.0.3/conformance/programs/program-test.html
testing/web-platform/tests/webmessaging/OWNERS
testing/web-platform/tests/webrtc/OWNERS
testing/web-platform/tests/websockets/Create-Secure-valid-url-protocol-setCorrectly.htm
testing/web-platform/tests/websockets/OWNERS
testing/web-platform/tests/websockets/websocket.js
testing/web-platform/tests/webstorage/OWNERS
testing/web-platform/tests/workers/OWNERS
testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/001.html
testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/001.worker.js
testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/002.html
testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/002.worker.js
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -13579,16 +13579,20 @@
         "path": "cssom-view/elementFromPoint.html",
         "url": "/cssom-view/elementFromPoint.html"
       },
       {
         "path": "cssom-view/elementsFromPoint.html",
         "url": "/cssom-view/elementsFromPoint.html"
       },
       {
+        "path": "cssom-view/negativeMargins.html",
+        "url": "/cssom-view/negativeMargins.html"
+      },
+      {
         "path": "cssom-view/scrollingElement.html",
         "url": "/cssom-view/scrollingElement.html"
       },
       {
         "path": "custom-elements/concepts/custom-elements-type-naming.html",
         "url": "/custom-elements/concepts/custom-elements-type-naming.html"
       },
       {
@@ -15623,16 +15627,28 @@
         "path": "html/browsers/browsing-the-web/history-traversal/events.html",
         "url": "/html/browsers/browsing-the-web/history-traversal/events.html"
       },
       {
         "path": "html/browsers/browsing-the-web/history-traversal/hashchange_event.html",
         "url": "/html/browsers/browsing-the-web/history-traversal/hashchange_event.html"
       },
       {
+        "path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-basic.html",
+        "url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-basic.html"
+      },
+      {
+        "path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-samedoc.html",
+        "url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-samedoc.html"
+      },
+      {
+        "path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-samedoc.html",
+        "url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-samedoc.html"
+      },
+      {
         "path": "html/browsers/browsing-the-web/history-traversal/popstate_event.html",
         "url": "/html/browsers/browsing-the-web/history-traversal/popstate_event.html"
       },
       {
         "path": "html/browsers/browsing-the-web/history-traversal/unset_context_name-1.html",
         "url": "/html/browsers/browsing-the-web/history-traversal/unset_context_name-1.html"
       },
       {
@@ -19511,16 +19527,20 @@
         "path": "html/webappapis/scripting/events/event-handler-attributes-body-window.html",
         "url": "/html/webappapis/scripting/events/event-handler-attributes-body-window.html"
       },
       {
         "path": "html/webappapis/scripting/events/event-handler-javascript.html",
         "url": "/html/webappapis/scripting/events/event-handler-javascript.html"
       },
       {
+        "path": "html/webappapis/scripting/events/event-handler-onresize.html",
+        "url": "/html/webappapis/scripting/events/event-handler-onresize.html"
+      },
+      {
         "path": "html/webappapis/scripting/events/event-handler-spec-example.html",
         "url": "/html/webappapis/scripting/events/event-handler-spec-example.html"
       },
       {
         "path": "html/webappapis/scripting/events/onerroreventhandler.html",
         "url": "/html/webappapis/scripting/events/onerroreventhandler.html"
       },
       {
@@ -31959,22 +31979,22 @@
         "path": "workers/interfaces/WorkerUtils/WindowTimers/003.html",
         "url": "/workers/interfaces/WorkerUtils/WindowTimers/003.html"
       },
       {
         "path": "workers/interfaces/WorkerUtils/WindowTimers/004.html",
         "url": "/workers/interfaces/WorkerUtils/WindowTimers/004.html"
       },
       {
-        "path": "workers/interfaces/WorkerUtils/importScripts/001.html",
-        "url": "/workers/interfaces/WorkerUtils/importScripts/001.html"
-      },
-      {
-        "path": "workers/interfaces/WorkerUtils/importScripts/002.html",
-        "url": "/workers/interfaces/WorkerUtils/importScripts/002.html"
+        "path": "workers/interfaces/WorkerUtils/importScripts/001.worker.js",
+        "url": "/workers/interfaces/WorkerUtils/importScripts/001.worker"
+      },
+      {
+        "path": "workers/interfaces/WorkerUtils/importScripts/002.worker.js",
+        "url": "/workers/interfaces/WorkerUtils/importScripts/002.worker"
       },
       {
         "path": "workers/interfaces/WorkerUtils/importScripts/003.html",
         "url": "/workers/interfaces/WorkerUtils/importScripts/003.html"
       },
       {
         "path": "workers/interfaces/WorkerUtils/importScripts/004.html",
         "url": "/workers/interfaces/WorkerUtils/importScripts/004.html"
@@ -32494,16 +32514,26 @@
         "url": "/eventsource/eventsource-constructor-non-same-origin.htm"
       },
       {
         "path": "eventsource/shared-worker/eventsource-constructor-non-same-origin.htm",
         "timeout": "long",
         "url": "/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm"
       },
       {
+        "path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html",
+        "timeout": "long",
+        "url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html"
+      },
+      {
+        "path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html",
+        "timeout": "long",
+        "url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html"
+      },
+      {
         "path": "html/browsers/browsing-the-web/scroll-to-fragid/007.html",
         "timeout": "long",
         "url": "/html/browsers/browsing-the-web/scroll-to-fragid/007.html"
       },
       {
         "path": "html/browsers/history/the-history-interface/007.html",
         "timeout": "long",
         "url": "/html/browsers/history/the-history-interface/007.html"
@@ -33424,16 +33454,21 @@
         "url": "/service-workers/cache-storage/serviceworker/cache-delete.https.html"
       },
       {
         "path": "service-workers/cache-storage/serviceworker/cache-match.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/serviceworker/cache-match.https.html"
       },
       {
+        "path": "service-workers/cache-storage/serviceworker/cache-matchAll.https.html",
+        "timeout": "long",
+        "url": "/service-workers/cache-storage/serviceworker/cache-matchAll.https.html"
+      },
+      {
         "path": "service-workers/cache-storage/serviceworker/cache-put.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/serviceworker/cache-put.https.html"
       },
       {
         "path": "service-workers/cache-storage/serviceworker/cache-storage-keys.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/serviceworker/cache-storage-keys.https.html"
@@ -33459,16 +33494,21 @@
         "url": "/service-workers/cache-storage/window/cache-delete.https.html"
       },
       {
         "path": "service-workers/cache-storage/window/cache-match.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/window/cache-match.https.html"
       },
       {
+        "path": "service-workers/cache-storage/window/cache-matchAll.https.html",
+        "timeout": "long",
+        "url": "/service-workers/cache-storage/window/cache-matchAll.https.html"
+      },
+      {
         "path": "service-workers/cache-storage/window/cache-put.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/window/cache-put.https.html"
       },
       {
         "path": "service-workers/cache-storage/window/cache-storage-keys.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/window/cache-storage-keys.https.html"
@@ -33499,16 +33539,21 @@
         "url": "/service-workers/cache-storage/worker/cache-delete.https.html"
       },
       {
         "path": "service-workers/cache-storage/worker/cache-match.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/worker/cache-match.https.html"
       },
       {
+        "path": "service-workers/cache-storage/worker/cache-matchAll.https.html",
+        "timeout": "long",
+        "url": "/service-workers/cache-storage/worker/cache-matchAll.https.html"
+      },
+      {
         "path": "service-workers/cache-storage/worker/cache-put.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/worker/cache-put.https.html"
       },
       {
         "path": "service-workers/cache-storage/worker/cache-storage-keys.https.html",
         "timeout": "long",
         "url": "/service-workers/cache-storage/worker/cache-storage-keys.https.html"
@@ -33708,26 +33753,17 @@
       },
       {
         "path": "webdriver/windows/window_manipulation.py"
       }
     ]
   },
   "local_changes": {
     "deleted": [],
-    "items": {
-      "testharness": {
-        "cssom-view/negativeMargins.html": [
-          {
-            "path": "cssom-view/negativeMargins.html",
-            "url": "/cssom-view/negativeMargins.html"
-          }
-        ]
-      }
-    },
+    "items": {},
     "reftest_nodes": {}
   },
   "reftest_nodes": {
     "2dcontext/building-paths/canvas_complexshapes_arcto_001.htm": [
       {
         "path": "2dcontext/building-paths/canvas_complexshapes_arcto_001.htm",
         "references": [
           [
@@ -39830,12 +39866,12 @@
             "/webvtt/rendering/cues-with-video/processing-model/too_many_cues_wrapped-ref.html",
             "=="
           ]
         ],
         "url": "/webvtt/rendering/cues-with-video/processing-model/too_many_cues_wrapped.html"
       }
     ]
   },
-  "rev": "f3f87e1a2cc3845819038a8a6fe435bb6092e213",
+  "rev": "af65262f5f3400024279c526117489f1f11d3233",
   "url_base": "/",
   "version": 2
 }
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,1 +1,1 @@
-a035c3724da7e8235c26a3b6ea567365efda3b15
\ No newline at end of file
+fa876a5774a3178efb42d6ebd8c8df045e03a80b
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/DOMEvents/OWNERS
@@ -0,0 +1,3 @@
+@jdm
+@zqzhang
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/FileAPI/OWNERS
@@ -0,0 +1,6 @@
+@inexorabletash
+@plehegar
+@zqzhang
+@zcorpan
+@jdm
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/IndexedDB/OWNERS
@@ -0,0 +1,8 @@
+@Velmont
+@inexorabletash
+@chunywang
+@dumbmatter
+@zqzhang
+@yunxiaoxie
+@zhaozihao
+@foolip
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/WebCryptoAPI/OWNERS
@@ -0,0 +1,2 @@
+@Wafflespeanut
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/XMLHttpRequest/OWNERS
@@ -0,0 +1,13 @@
+@ecoal95
+@hallvors
+@kangxu
+@caitp
+@Manishearth
+@plehegar
+@foolip
+@jungkees
+@ibelem
+@mathiasbynens
+@ronkorving
+@jdm
+@Ms2ger
--- a/testing/web-platform/tests/XMLHttpRequest/responsexml-document-properties.htm
+++ b/testing/web-platform/tests/XMLHttpRequest/responsexml-document-properties.htm
@@ -38,17 +38,17 @@
 
       function runTest(name, value){
         test(function(){
           assert_equals(client.responseXML[name], value)
         }, name)
       }
 
       test(function() {
-        assert_true((new Date(client.getResponseHeader('Last-Modified'))).getTime() == (new Date(client.responseXML.lastModified)).getTime(), 'responseXML.lastModified time shoud be equal to time in response Last-Modified header')
+        assert_true((new Date(client.getResponseHeader('Last-Modified'))).getTime() == (new Date(client.responseXML.lastModified)).getTime(), 'responseXML.lastModified time should be equal to time in response Last-Modified header')
       }, 'lastModified set according to HTTP header')
 
       test(function() {
         client.responseXML.cookie = "thisshouldbeignored"
         assert_equals(client.responseXML.cookie, "")
       }, 'cookie (after setting it)')
 
       test(function() {
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/ambient-light/OWNERS
@@ -0,0 +1,3 @@
+@zqzhang
+@Volker-E
+@dontcallmedom
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/app-uri/OWNERS
@@ -0,0 +1,1 @@
+@happyoungj
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/common/OWNERS
@@ -0,0 +1,4 @@
+@zqzhang
+@foolip
+@dontcallmedom
+@deniak
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/conformance-checkers/OWNERS
@@ -0,0 +1,1 @@
+@sideshowbarker
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/content-security-policy/OWNERS
@@ -0,0 +1,2 @@
+@sideshowbarker
+@hillbrad
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/cors/OWNERS
@@ -0,0 +1,5 @@
+@sideshowbarker
+@zqzhang
+@Velmont
+@hillbrad
+@jdm
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/cssom-view/OWNERS
@@ -0,0 +1,1 @@
+@AutomatedTester
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/custom-elements/OWNERS
@@ -0,0 +1,3 @@
+@deepak-sa
+@sgrekhov
+@alsemenov
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/docs/OWNERS
@@ -0,0 +1,4 @@
+@sideshowbarker
+@dontcallmedom
+@zcorpan
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/OWNERS
@@ -0,0 +1,6 @@
+@ayg
+@jdm
+@Ms2ger
+@plehegar
+@zcorpan
+@zqzhang
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/domparsing/OWNERS
@@ -0,0 +1,5 @@
+@sideshowbarker
+@ChrisParis
+@deniak
+@jdm
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/domxpath/OWNERS
@@ -0,0 +1,3 @@
+@gsnedders
+@zqzhang
+@deniak
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/editing/OWNERS
@@ -0,0 +1,1 @@
+@ayg
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/encoding/OWNERS
@@ -0,0 +1,2 @@
+@inexorabletash
+@sideshowbarker
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/eventsource/OWNERS
@@ -0,0 +1,5 @@
+@zqzhang
+@sideshowbarker
+@deniak
+@Velmont
+@Yaffle
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fetch/OWNERS
@@ -0,0 +1,2 @@
+@jdm
+@youennf
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/gamepad/OWNERS
@@ -0,0 +1,1 @@
+@luser
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/geolocation-API/OWNERS
@@ -0,0 +1,2 @@
+@zqzhang
+@jdm
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/hr-time/OWNERS
@@ -0,0 +1,2 @@
+@plehegar
+@foolip
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html-imports/OWNERS
@@ -0,0 +1,1 @@
+@omo
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html-longdesc/OWNERS
@@ -0,0 +1,2 @@
+@chaals
+@cptvitamin
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html-media-capture/OWNERS
@@ -0,0 +1,2 @@
+@haoxli
+@zqzhang
--- a/testing/web-platform/tests/html/OWNERS
+++ b/testing/web-platform/tests/html/OWNERS
@@ -1,7 +1,8 @@
 @Ms2ger
 @gsnedders
+@jdm
 @jgraham
 @plehegar
 @sideshowbarker
 @zcorpan
 @zqzhang
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resources/blank1.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<style>
+body {
+    height: 2000px;
+    width: 2000px;
+}
+</style>
+<body> Blank 1 </body>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resources/blank2.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<style>
+body {
+    height: 2000px;
+    width: 2000px;
+}
+</style>
+<body> Blank 2 </body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resources/page-with-fragment.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<style>
+body {
+    height: 2000px;
+    width: 2000px;
+}
+#fragment {
+    position: absolute;
+    top: 800px;
+    background-color: #faa;
+    display: block;
+    height: 100px;
+    width: 100px;
+}
+
+</style>
+<body>
+Page with fragment
+  <a id="fragment" name="fragment" class='box'></a>
+</body>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-basic.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<title>Verify existence and basic read/write function of history.scrollRestoration</title>
+
+<style>
+  body {
+    height: 2000px;
+    width: 2000px;
+  }
+</style>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="text/javascript">
+  'use strict';
+
+  test(function() {
+    assert_equals(history.scrollRestoration, 'auto');
+  }, 'Default value is "auto"');
+
+  test(function() {
+    history.scrollRestoration = 'manual';
+    assert_equals(history.scrollRestoration, 'manual', 'should be able to set "manual"');
+    history.scrollRestoration = 'auto';
+    assert_equals(history.scrollRestoration, 'auto', 'should be able to set "auto"');
+  }, 'It is writable');
+
+  test(function() {
+    history.scrollRestoration = 'auto';
+    for (var v of [3.1415, {}, 'bogus']) {
+      history.scrollRestoration = v;
+      assert_equals(history.scrollRestoration, 'auto', `setting to invalid value (${v}) should be ignored`);
+    }
+  }, 'Invalid values are ignored');
+</script>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<meta name=timeout content=long>
+<title>Precedence of scroll restoration mode over fragment scrolling in cross-origin history traversal</title>
+<style>
+  iframe {
+    height: 300px;
+    width: 300px;
+  }
+</style>
+
+<body>
+  <iframe></iframe>
+</body>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="text/javascript">
+  'use strict';
+
+  // The test does the following navigation steps for iframe
+  // 1. load page-with-fragment.html#fragment
+  // 2. load blank1
+  // 3. go back to page-with-fragment.html
+  async_test(function(t) {
+    var iframe = document.querySelector('iframe');
+    var baseURL = location.href.substring(0, location.href.lastIndexOf('/'));
+
+    var steps = [
+      function() {
+        iframe.src = 'resources/page-with-fragment.html#fragment';
+      }, function() {
+        assert_equals(iframe.contentWindow.location.href, baseURL + '/resources/page-with-fragment.html#fragment', 'should be on page-with-fragment page');
+        // wait one animation frame to ensure layout is run and fragment scrolling is complete
+        iframe.contentWindow.requestAnimationFrame(function() {
+          assert_equals(iframe.contentWindow.scrollY, 800, 'should scroll to fragment');
+
+          iframe.contentWindow.history.scrollRestoration = 'manual';
+          assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual');
+          setTimeout(next, 0);
+        });
+      }, function() {
+        // navigate to a new page from a different origin
+        iframe.src = iframe.src.replace("http://", "http://www.").replace("page-with-fragment.html#fragment", "blank1.html");
+      }, function() {
+        // going back causes the iframe to traverse back
+        history.back();
+      }, function() {
+        // coming back from history, scrollRestoration should be set to manual and respected
+        assert_equals(iframe.contentWindow.location.href, baseURL + '/resources/page-with-fragment.html#fragment', 'should be back on page-with-fragment page');
+        iframe.contentWindow.requestAnimationFrame(function() {
+          assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual', 'navigating back should retain scrollRestoration value');
+          assert_equals(iframe.contentWindow.scrollX, 0, 'should not scroll to fragment');
+          assert_equals(iframe.contentWindow.scrollY, 0, 'should not scroll to fragment');
+          t.done();
+        });
+      }
+    ];
+
+    var stepCount = 0;
+    var next = t.step_func(function() {
+      steps[stepCount++]();
+    });
+
+    iframe.onload = next;
+    next();
+  }, 'Manual scroll restoration should take precedent over scrolling to fragment in cross origin navigation');
+</script>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-samedoc.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<style>
+  body {
+    height: 2000px;
+    width: 2000px;
+  }
+
+  #fragment {
+    position: absolute;
+    top: 800px;
+    background-color: #faa;
+    display: block;
+    height: 100px;
+    width: 100px;
+  }
+</style>
+
+<body>
+  <a id="fragment" name="fragment" class='box'></a>
+</body>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="text/javascript">
+  'use strict';
+
+  async_test(function(t) {
+    history.scrollRestoration = 'manual';
+    assert_equals(history.scrollRestoration, 'manual');
+
+    location.hash = '#fragment';
+    assert_equals(window.scrollY, 800, 'new navigations should scroll to fragment');
+
+    // create a new entry and reset the scroll before verification
+    history.pushState(null, null, '#done');
+    window.scrollTo(0, 0);
+    assert_equals(window.scrollY, 0, 'should reset scroll before verification');
+
+    setTimeout(function() {
+      // setup verification
+      window.addEventListener('hashchange', t.step_func(function() {
+        assert_equals(location.hash, '#fragment');
+        assert_equals(history.scrollRestoration, 'manual');
+        // navigating back should give precedent to history restoration which is 'manual'
+        assert_equals(window.scrollX, 0, 'should not scroll to fragment');
+        assert_equals(window.scrollY, 0, 'should not scroll to fragment');
+        t.done();
+      }));
+      // kick off verification
+      window.history.back();
+    }, 0);
+
+  }, 'Manual scroll restoration should take precedent over scrolling to fragment in cross doc navigation');
+</script>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta name=timeout content=long>
+<title>Correct behaviour of scroll restoration mode is cross origin history traversal</title>
+
+<style>
+  iframe {
+    height: 300px;
+    width: 300px;
+  }
+</style>
+
+<body>
+  <iframe></iframe>
+</body>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="text/javascript">
+  'use strict';
+
+  // The test does the following navigation steps for iframe
+  // 1. load blank1
+  // 2. load blank2
+  // 3. go back to blank1
+  async_test(function(t) {
+    var iframe = document.querySelector('iframe');
+    var baseURL = location.href.substring(0, location.href.lastIndexOf('/'));
+
+    var steps = [
+      function() {
+        iframe.src = 'resources/blank1.html';
+      },
+      function() {
+        assert_equals(iframe.contentWindow.location.href, baseURL + '/resources/blank1.html', 'should be on first blank page');
+        iframe.contentWindow.history.scrollRestoration = 'manual';
+        assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual');
+        iframe.contentWindow.scrollTo(500, 500);
+        assert_equals(iframe.contentWindow.scrollX, 500, 'scripted scrolling should take effect');
+        assert_equals(iframe.contentWindow.scrollY, 500, 'scripted scrolling should take effect');
+        setTimeout(next, 0);
+      },
+      function() {
+        // navigate to new page
+        iframe.src = 'resources/blank2.html';
+      },
+      function() {
+        assert_equals(iframe.contentWindow.location.href, baseURL + '/resources/blank2.html', 'should be on second blank page');
+        assert_equals(iframe.contentWindow.history.scrollRestoration, 'auto', 'new page loads should set scrollRestoration to "auto"');
+        setTimeout(next, 0);
+      }, function() {
+        iframe.contentWindow.history.back();
+      }, function() {
+        // coming back scrollRestoration should be restored to 'manual' and respected
+        assert_equals(iframe.contentWindow.location.href, baseURL + '/resources/blank1.html', 'should be back on first blank page');
+        assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual', 'navigating back should retain scrollRestoration value');
+        assert_equals(iframe.contentWindow.scrollX, 0, 'horizontal scroll offset should not be restored');
+        assert_equals(iframe.contentWindow.scrollY, 0, 'vertical scroll offset should not be restored');
+        t.done();
+      }
+    ];
+
+    var stepCount = 0;
+    var next = t.step_func(function() {
+      steps[stepCount++]();
+    });
+
+    iframe.onload = next;
+    next();
+  }, 'Navigating to new page should reset to "auto" and navigating back should restore and respect scroll restoration mode');
+
+</script>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-samedoc.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<title>Correct behaviour of scroll restoration mode in same document history traversals</title>
+
+<style>
+  body {
+    height: 10000px;
+    width: 10000px;
+  }
+</style>
+
+<body></body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="text/javascript">
+  'use strict';
+
+  async_test(function(t) {
+    history.scrollRestoration = 'auto';
+    window.scrollTo(0, 0);
+
+    // create history entries and then verify the impact of scrollRestoration
+    // when they are popped
+    var entries = {
+      /* For scroll restoration mode 'auto', the spec does not require scroll
+         position to be restored at any particular value. */
+      '#1': {type: 'push',    expectedScroll: null,  scrollRestoration: 'auto'},
+      '#2': {type: 'replace', expectedScroll: null, scrollRestoration: 'auto'},
+      /* For scroll restoration mode 'manual', the spec requires scroll position
+         not to be restored. So we expect [555,555] which is the latest position
+         before navigation. */
+      '#3': {type: 'push',    expectedScroll: [555, 555], scrollRestoration: 'manual'},
+      '#4': {type: 'replace', expectedScroll: [555, 555], scrollRestoration: 'manual'}
+    };
+
+    // setup entries
+    for (var key in entries) {
+      var entry = entries[key],
+        beforeValue = history.scrollRestoration,
+        newValue = entry.scrollRestoration;
+
+      var args = [{key: key}, '', key];
+      if (entry.type == 'push') {
+        history.pushState.apply(history, args);
+      } else {
+        history.pushState(null, '', key);
+        history.replaceState.apply(history, args);
+      }
+      assert_equals(history.scrollRestoration, beforeValue, `history.scrollRestoration value is retained after pushing new state`);
+      history.scrollRestoration = newValue;
+      assert_equals(history.scrollRestoration, newValue, `Setting scrollRestoration to ${newValue} works as expected`);
+      window.scrollBy(50, 100);
+    }
+
+    // setup verification
+    window.addEventListener('hashchange', t.step_func(function() {
+      var key = location.hash,
+        entry = entries[key];
+
+      if (key === '') {
+        t.done();
+        return;
+      }
+      assert_equals(history.state.key, key, `state should have key: ${key}`);
+      assert_equals(history.scrollRestoration, entry.scrollRestoration, 'scrollRestoration is updated correctly');
+      if (entry.expectedScroll) {
+        assert_equals(window.scrollX, entry.expectedScroll[0], `scrollX is correct for ${key}`);
+        assert_equals(window.scrollY, entry.expectedScroll[1], `scrollY is correct for ${key}`);
+      }
+
+      window.history.back();
+    }));
+
+    // reset the scroll and kick off the verification
+    setTimeout(function() {
+      history.pushState(null, null, '#done');
+      window.scrollTo(555, 555);
+      window.history.back();
+    }, 0);
+
+  }, 'history.{push,replace}State retain scroll restoration mode and navigation in the same document respects it');
+</script>
--- a/testing/web-platform/tests/html/dom/interfaces.html
+++ b/testing/web-platform/tests/html/dom/interfaces.html
@@ -2304,18 +2304,21 @@ typedef Window WindowProxy;
 };
 Window implements GlobalEventHandlers;
 Window implements WindowEventHandlers;
 
 interface BarProp {
            attribute boolean visible;
 };
 
+enum ScrollRestoration { "auto", "manual" };
 interface History {
+
   readonly attribute long length;
+  attribute ScrollRestoration scrollRestoration;
   readonly attribute any state;
   void go(optional long delta);
   void back();
   void forward();
   void pushState(any data, DOMString title, optional DOMString? url = null);
   void replaceState(any data, DOMString title, optional DOMString? url = null);
 };
 
--- a/testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported-ref.html
+++ b/testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported-ref.html
@@ -14,32 +14,32 @@
 </style>
 <li class="decimal">first item</li>
 <li class="lower-alpha">second item</li>
 <li class="upper-alpha">third item</li>
 <li class="lower-roman">fourth item</li>
 <li class="upper-roman">fifth item</li>
 <li class="disc">sixth item</li>
 <li class="circle">seventh item</li>
-<li class="square">eigth item</li>
+<li class="square">eighth item</li>
 <li class="none">ninth item</li>
 <ol>
   <li class="decimal">first ordered item</li>
   <li class="lower-alpha">second ordered item</li>
   <li class="upper-alpha">third ordered item</li>
   <li class="lower-roman">fourth ordered item</li>
   <li class="upper-roman">fifth ordered item</li>
   <li class="disc">sixth ordered item</li>
   <li class="circle">seventh ordered item</li>
-  <li class="square">eigth ordered item</li>
+  <li class="square">eighth ordered item</li>
   <li class="none">ninth ordered item</li>
 </ol>
 <ul>
   <li class="decimal">first unordered item</li>
   <li class="lower-alpha">second unordered item</li>
   <li class="upper-alpha">third unordered item</li>
   <li class="lower-roman">fourth unordered item</li>
   <li class="upper-roman">fifth unordered item</li>
   <li class="disc">sixth unordered item</li>
   <li class="circle">seventh unordered item</li>
-  <li class="square">eigth unordered item</li>
+  <li class="square">eighth unordered item</li>
   <li class="none">ninth unordered item</li>
 </ul>
--- a/testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported.html
+++ b/testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported.html
@@ -4,32 +4,32 @@
 <link rel=match href=li-type-supported-ref.html>
 <li type=1>first item</li>
 <li type=a>second item</li>
 <li type=A>third item</li>
 <li type=i>fourth item</li>
 <li type=I>fifth item</li>
 <li type=disc>sixth item</li>
 <li type=circle>seventh item</li>
-<li type=square>eigth item</li>
+<li type=square>eighth item</li>
 <li type=none>ninth item</li>
 <ol>
   <li type=1>first ordered item</li>
   <li type=a>second ordered item</li>
   <li type=A>third ordered item</li>
   <li type=i>fourth ordered item</li>
   <li type=I>fifth ordered item</li>
   <li type=disc>sixth ordered item</li>
   <li type=circle>seventh ordered item</li>
-  <li type=square>eigth ordered item</li>
+  <li type=square>eighth ordered item</li>
   <li type=none>ninth ordered item</li>
 </ol>
 <ul>
   <li type=1>first unordered item</li>
   <li type=a>second unordered item</li>
   <li type=A>third unordered item</li>
   <li type=i>fourth unordered item</li>
   <li type=I>fifth unordered item</li>
   <li type=disc>sixth unordered item</li>
   <li type=circle>seventh unordered item</li>
-  <li type=square>eigth unordered item</li>
+  <li type=square>eighth unordered item</li>
   <li type=none>ninth unordered item</li>
 </ul>
--- a/testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported.xhtml
+++ b/testing/web-platform/tests/html/rendering/non-replaced-elements/lists/li-type-supported.xhtml
@@ -7,34 +7,34 @@
 <body>
 <li type="1">first item</li>
 <li type="a">second item</li>
 <li type="A">third item</li>
 <li type="i">fourth item</li>
 <li type="I">fifth item</li>
 <li type="disc">sixth item</li>
 <li type="circle">seventh item</li>
-<li type="square">eigth item</li>
+<li type="square">eighth item</li>
 <li type="none">ninth item</li>
 <ol>
   <li type="1">first ordered item</li>
   <li type="a">second ordered item</li>
   <li type="A">third ordered item</li>
   <li type="i">fourth ordered item</li>
   <li type="I">fifth ordered item</li>
   <li type="disc">sixth ordered item</li>
   <li type="circle">seventh ordered item</li>
-  <li type="square">eigth ordered item</li>
+  <li type="square">eighth ordered item</li>
   <li type="none">ninth ordered item</li>
 </ol>
 <ul>
   <li type="1">first unordered item</li>
   <li type="a">second unordered item</li>
   <li type="A">third unordered item</li>
   <li type="i">fourth unordered item</li>
   <li type="I">fifth unordered item</li>
   <li type="disc">sixth unordered item</li>
   <li type="circle">seventh unordered item</li>
-  <li type="square">eigth unordered item</li>
+  <li type="square">eighth unordered item</li>
   <li type="none">ninth unordered item</li>
 </ul>
 </body>
 </html>
--- a/testing/web-platform/tests/html/semantics/embedded-content/the-embed-element/embed-document.html
+++ b/testing/web-platform/tests/html/semantics/embedded-content/the-embed-element/embed-document.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <meta charset="utf-8">
 <title>HTML Test: The embed element represents a document</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<link rel="stylesheet" href="/resources/testharness.css">
 <meta name="assert" content="Check if the embed element represents a document when a text/html resource source is used">
 <body>
   <script type="application/javascript">
-   var childLoaded = false;
-   t = async_test("Test document type embedding");
-   addEventListener("load", t.step_func_done(function() { assert_true(childLoaded); }));
+    window.childLoaded = false;
+    async_test(function() {
+      addEventListener("load", this.step_func_done(function() {
+        assert_true(window.childLoaded);
+      }));
+    }, "Test document type embedding");
   </script>
   <embed src="embed-iframe.html">
 </body>
--- a/testing/web-platform/tests/html/semantics/forms/the-button-element/button-events.html
+++ b/testing/web-platform/tests/html/semantics/forms/the-button-element/button-events.html
@@ -18,35 +18,35 @@
 var btn = document.getElementById("btn"),
     menu_btn = document.getElementById("menu_btn"),
     t1 = async_test("The submit event must be fired when click a button in submit status"),
     t2 = async_test("The reset event must be fired when click a button in reset status"),
     t3 = async_test("The show event must be fired when click a button in menu status");
 
 document.forms.fm1.onsubmit = t1.step_func(function (evt) {
   evt.preventDefault();
-  assert_true(evt.isTrusted, "The isTrusted attribute of the submit event shoud be true.");
-  assert_true(evt.bubbles, "The bubbles attribute of the submit event shoud be true.");
-  assert_true(evt.cancelable, "The cancelable attribute of the submit event shoud be true.");
+  assert_true(evt.isTrusted, "The isTrusted attribute of the submit event should be true.");
+  assert_true(evt.bubbles, "The bubbles attribute of the submit event should be true.");
+  assert_true(evt.cancelable, "The cancelable attribute of the submit event should be true.");
   assert_true(evt instanceof Event, "The submit event is an instance of Event interface.");
   t1.done();
 });
 
 document.forms.fm1.onreset = t2.step_func(function (evt) {
-  assert_true(evt.isTrusted, "The isTrusted attribute of the reset event shoud be true.");
-  assert_true(evt.bubbles, "The bubbles attribute of the reset event shoud be true.");
-  assert_true(evt.cancelable, "The cancelable attribute of the reset event shoud be true.");
+  assert_true(evt.isTrusted, "The isTrusted attribute of the reset event should be true.");
+  assert_true(evt.bubbles, "The bubbles attribute of the reset event should be true.");
+  assert_true(evt.cancelable, "The cancelable attribute of the reset event should be true.");
   assert_true(evt instanceof Event, "The reset event is an instance of Event interface.");
   t2.done();
 });
 
 document.getElementById("menu").onshow = t3.step_func(function (evt) {
-  assert_true(evt.isTrusted, "The isTrusted attribute of the show event shoud be true.");
+  assert_true(evt.isTrusted, "The isTrusted attribute of the show event should be true.");
   assert_equals(evt.relatedTarget, menu_btn, "The relatedTarget attribute should be initialized to the related button element.");
-  assert_true(evt.cancelable, "The cancelable attribute of the show event shoud be true.");
+  assert_true(evt.cancelable, "The cancelable attribute of the show event should be true.");
   assert_true(evt instanceof RelatedEvent, "The show event is an instance of RelatedEvent interface.");
   t3.done();
 });
 
 t1.step(function () {
   btn.type = "submit";
   assert_equals(btn.type, "submit", "The button type should be 'submit'.");
   btn.click();
--- a/testing/web-platform/tests/html/semantics/forms/the-input-element/checkbox.html
+++ b/testing/web-platform/tests/html/semantics/forms/the-input-element/checkbox.html
@@ -1,51 +1,63 @@
 <!DOCTYPE html>
 <meta charset=utf-8>
 <title>input type checkbox</title>
 <link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org">
-<link rel=help href="https://html.spec.whatwg.org/multipage/#checkbox-state-(type=checkbox)">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#checkbox-state-(type=checkbox)">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#run-synthetic-click-activation-steps">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
 <input type=checkbox id=checkbox1>
 <input type=checkbox id=checkbox2 disabled>
 <input type=checkbox id=checkbox3>
 <input type=checkbox id=checkbox4 checked>
 <input type=checkbox id=checkbox5>
 <input type=checkbox id=checkbox6>
 <script>
   var checkbox1 = document.getElementById('checkbox1'),
       checkbox2 = document.getElementById('checkbox2'),
       checkbox3 = document.getElementById('checkbox3'),
       checkbox4 = document.getElementById('checkbox4'),
       checkbox5 = document.getElementById('checkbox5'),
       checkbox6 = document.getElementById('checkbox6'),
-      c1_input_fired = false, c1_change_fired = false,
-      t1 = async_test("click on mutable checkbox fires the input and change events"),
+      c1_click_fired = false,
+      c1_input_fired = false,
+      c1_change_fired = false,
+      t1 = async_test("click on mutable checkbox fires a click event, then an input event, then a change event"),
       t2 = async_test("click on non-mutable checkbox doesn't fire the input or change event"),
       t3 = async_test("pre-activation steps on unchecked checkbox"),
       t4 = async_test("pre-activation steps on checked checkbox"),
       t5 = async_test("canceled activation steps on unchecked checkbox"),
       t6 = async_test("canceled activation steps on unchecked checkbox (indeterminate=true in onclick)");
 
-  checkbox1.oninput= t1.step_func(function(e) {
+  checkbox1.onclick = t1.step_func(function () {
+    c1_click_fired = true;
+    assert_false(c1_input_fired, "click event should fire before input event");
+    assert_false(c1_change_fired, "click event should fire before change event");
+  });
+  checkbox1.oninput = t1.step_func(function(e) {
     c1_input_fired = true;
+    assert_true(c1_click_fired, "input event should fire after click event");
+    assert_false(c1_change_fired, "input event should fire before change event");
     assert_true(e.bubbles, "event should bubble");
     assert_true(e.isTrusted, "event should be trusted");
-    assert_false(e.cancelable, "event shoud not be cancelable");
+    assert_false(e.cancelable, "event should not be cancelable");
     assert_true(checkbox1.checked, "checkbox is checked");
     assert_false(checkbox1.indeterminate, "checkbox is not indeterminate");
   });
 
   checkbox1.onchange = t1.step_func(function(e) {
     c1_change_fired = true;
+    assert_true(c1_click_fired, "change event should fire after click event");
+    assert_true(c1_input_fired, "change event should fire after input event");
     assert_true(e.bubbles, "event should bubble")
     assert_true(e.isTrusted, "event should be trusted");
-    assert_false(e.cancelable, "event shoud not be cancelable");
+    assert_false(e.cancelable, "event should not be cancelable");
     assert_true(checkbox1.checked, "checkbox is checked");
     assert_false(checkbox1.indeterminate, "checkbox is not indeterminate");
   });
 
   checkbox2.oninput= t2.step_func(function(e) {
     assert_unreached("event input fired");
   });
 
@@ -78,33 +90,59 @@
     checkbox4.click();
     assert_false(checkbox4.checked);
     assert_false(checkbox4.indeterminate);
     t4.done();
   });
 
   checkbox5.onclick = t5.step_func(function(e) {
     e.preventDefault();
-    assert_false(checkbox5.checked);
+    /*
+    The prevention of the click doesn't have an effect until after all the
+    click event handlers have been run.
+    */
+    assert_true(checkbox5.checked);
     assert_false(checkbox5.indeterminate);
-    t5.done();
+    window.setTimeout(t5.step_func(function(e) {
+      /*
+      The click event has finished being dispatched, so the checkedness and
+      determinateness have been toggled back by now because the event
+      was preventDefault-ed.
+      */
+      assert_false(checkbox5.checked);
+      assert_false(checkbox5.indeterminate);
+      t5.done();
+    }), 0);
   });
 
   t5.step(function(){
     assert_false(checkbox5.checked);
     assert_false(checkbox5.indeterminate);
     checkbox5.click();
   });
 
   checkbox6.onclick = t6.step_func(function(e) {
     checkbox6.indeterminate = true;
     e.preventDefault();
-    assert_false(checkbox6.checked);
-    assert_false(checkbox6.indeterminate);
-    t6.done();
+    /*
+    The prevention of the click doesn't have an effect until after all the
+    click event handlers have been run.
+    */
+    assert_true(checkbox6.checked);
+    assert_true(checkbox6.indeterminate);
+    window.setTimeout(t6.step_func(function(e) {
+      /*
+      The click event has finished being dispatched, so the checkedness and
+      determinateness have been toggled back by now because the event
+      was preventDefault-ed.
+      */
+      assert_false(checkbox6.checked);
+      assert_false(checkbox6.indeterminate);
+      t6.done();
+    }), 0);
   });
 
   t6.step(function(){
     assert_false(checkbox6.checked);
     assert_false(checkbox6.indeterminate);
     checkbox6.click();
   });
 </script>
--- a/testing/web-platform/tests/html/semantics/forms/the-input-element/file-manual.html
+++ b/testing/web-platform/tests/html/semantics/forms/the-input-element/file-manual.html
@@ -13,18 +13,18 @@
 
   var input = document.getElementById('file'),
       t1 = async_test("selecting files should fire the input event at the input element"),
       t2 = async_test("selecting files should fire the change event at the input element");
 
   document.getElementById('file').oninput = t1.step_func_done(function(e) {
     assert_true(e.bubbles, "input event bubbles");
     assert_true(e.isTrusted, "input event should be trusted");
-    assert_false(e.cancelable, "input event shoud not be cancelable");
+    assert_false(e.cancelable, "input event should not be cancelable");
   })
   document.getElementById('file').onchange = t2.step_func_done(function(e) {
     assert_true(e.bubbles, "change event bubbles");
     assert_true(e.isTrusted, "change event should be trusted");
-    assert_false(e.cancelable, "change event shoud not be cancelable");
+    assert_false(e.cancelable, "change event should not be cancelable");
     assert_true(input.files instanceof FileList);
     assert_equals(input.value, "C:\\fakepath\\" + input.files[0].name);
   })
 </script>
--- a/testing/web-platform/tests/html/semantics/forms/the-input-element/radio.html
+++ b/testing/web-platform/tests/html/semantics/forms/the-input-element/radio.html
@@ -10,18 +10,18 @@
 <input type=radio name=group1 id=radio2>
 
 <input type=radio name=groüp2 id=radio3>
 <input type=radio name=groÜp2 id=radio4>
 
 <input type=radio id=radio5>
 <input type=radio id=radio6 disabled>
 
-<input type=radio id=radio71 checked>
-<input type=radio id=radio72>
+<input type=radio name="group5" id=radio71 checked>
+<input type=radio name="group5" id=radio72>
 
 <input type=radio name=group3 id=radio8 checked>
 <input type=radio name=group3 id=radio9>
 <input type=radio name=group4 id=radio10>
 <input type=radio name=group4 id=radio11 checked>
 
 
 <script>
@@ -32,18 +32,17 @@
       radio5 = document.getElementById('radio5'),
       radio6 = document.getElementById('radio6'),
       radio71 = document.getElementById('radio71'),
       radio72 = document.getElementById('radio72'),
       radio8 = document.getElementById('radio8'),
       radio9 = document.getElementById('radio9'),
       radio10 = document.getElementById('radio10'),
       radio11 = document.getElementById('radio11'),
-      t1 = async_test("click on mutable radio fires the input event"),
-      t2 = async_test("click on mutable radio fires the change event"),
+      t1 = async_test("click on mutable radio fires click event, then input event, then change event"),
       t3 = async_test("click on non-mutable radio doesn't fire the input event"),
       t4 = async_test("click on non-mutable radio doesn't fire the change event"),
       t5 = async_test("canceled activation steps on unchecked radio"),
       input_fired = false,
       change_fired = false;
 
   test(function(){
     assert_false(radio1.checked);
@@ -75,63 +74,70 @@
     radio9.name="group4";
     radio9.checked = true;
     assert_true(radio8.checked);
     assert_true(radio9.checked);
     assert_false(radio10.checked);
     assert_false(radio11.checked);
   }, "changing the name of a radio input element and setting its checkedness to true makes all the other elements' checkedness in the same radio button group be set to false");
 
-  radio5.oninput= t1.step_func(function(e) {
-    input_fired = true;
-    assert_true(e.bubbles, "event should bubble")
-    assert_true(e.isTrusted, "event should be trusted");
-    assert_false(e.cancelable, "event shoud not be cancelable");
+  radio5.onclick = t1.step_func(function(e) {
+    click_fired = true;
+    assert_false(input_fired, "click event should fire before input event");
+    assert_false(change_fired, "click event should fire before change event");
   });
 
-  radio5.onchange = t2.step_func(function(e) {
+  radio5.oninput = t1.step_func(function(e) {
+    input_fired = true;
+    assert_true(click_fired, "input event should fire after click event");
+    assert_false(change_fired, "input event should fire before change event");
+    assert_true(e.bubbles, "input event should bubble")
+    assert_true(e.isTrusted, "input event should be trusted");
+    assert_false(e.cancelable, "input event should not be cancelable");
+  });
+
+  radio5.onchange = t1.step_func(function(e) {
     change_fired = true;
-    assert_true(e.bubbles, "event should bubble")
-    assert_true(e.isTrusted, "event should be trusted");
-    assert_false(e.cancelable, "event shoud not be cancelable");
+    assert_true(click_fired, "change event should fire after click event");
+    assert_true(input_fired, "change event should fire after input event");
+    assert_true(e.bubbles, "change event should bubble")
+    assert_true(e.isTrusted, "change event should be trusted");
+    assert_false(e.cancelable, "change event should not be cancelable");
   });
 
   radio6.oninput= t3.step_func_done(function(e) {
     assert_unreached("event input fired");
   });
 
   radio6.onchange = t4.step_func_done(function(e) {
     assert_unreached("event change fired");
   });
 
   t1.step(function() {
     radio5.click();
     assert_true(input_fired);
     t1.done();
   });
 
-  t2.step(function() {
-    assert_true(change_fired);
-    t2.done();
-  })
-
   t3.step(function(){
     radio6.click();
     t3.done();
     t4.done();
   });
 
   radio72.onclick = t5.step_func_done(function(e){
-    assert_false(radio71.checked);
-    assert_true(radio72.checked);
+    assert_false(radio71.checked, "click on radio should uncheck other radio in same group");
+    assert_true(radio72.checked, "click on radio should check that radio");
     e.preventDefault();
-    assert_false(radio71.checked);
-    assert_true(radio72.checked);
+    // The cancelation of the click doesn't have an effect until after all the click event handlers have been run.
+    assert_false(radio71.checked, "radio remains unchecked immediately after click event on other radio in same group is canceled");
+    assert_true(radio72.checked, "clicked radio remains checked immediately after click event is canceled");
   });
 
   t5.step(function(){
-    assert_true(radio71.checked);
-    assert_false(radio72.checked);
+    assert_true(radio71.checked, "initially checked radio should be checked");
+    assert_false(radio72.checked, "other radios in same group as initially-checked radio should be unchecked");
     radio72.click();
-    assert_true(radio71.checked);
-    assert_false(radio72.checked);
+    // Now that the click event has been fully dispatched, its cancelation has taken effect.
+    assert_true(radio71.checked, "canceled click event on radio should leave the previously-checked radio checked");
+    assert_false(radio72.checked, "canceled click event on previously-unchecked radio should leave that radio unchecked");
   });
 </script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-onresize.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>HTMLBodyElement.onresize</title>
+<link rel="author" title="His-Name-Is-Joof" href="mailto:jeffrharrison@gmail.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#handler-window-onresize">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+var t = async_test("body.onresize should set the window.onload handler")
+window.onresize = t.step_func(function() {
+  assert_unreached("This handler should be overwritten.")
+})
+
+var body = document.createElement("body")
+body.onresize = t.step_func(function(e) {
+  assert_equals(e.currentTarget, window,
+                "The event should be fired at the window.")
+  t.done()
+})
+window.dispatchEvent(new Event('resize'));
+
+t = async_test("document.onresize should set the document.onresize handler");
+document.onresize = t.step_func(function(e) {
+    assert_equals(e.currentTarget, document,
+            "The event should be fired at the document")
+    t.done()
+})
+document.dispatchEvent(new Event('resize'));
+
+t = async_test("meta.onresize should set the meta.onresize handler");
+var meta = document.createElement("meta")
+meta.onresize = t.step_func(function(e) {
+    assert_equals(e.currentTarget, meta,
+            "The event should be fired at the <meta> object")
+    t.done()
+})
+meta.dispatchEvent(new Event('resize'));
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/images/OWNERS
@@ -0,0 +1,2 @@
+@zqzhang
+@tagawa
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/media-source/OWNERS
@@ -0,0 +1,4 @@
+@bit
+@acolwell
+@shishimaru
+@sideshowbarker
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/media/OWNERS
@@ -0,0 +1,2 @@
+@hillbrad
+@foolip
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/mediacapture-streams/OWNERS
@@ -0,0 +1,3 @@
+@dontcallmedom
+@alvestrand
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/mixed-content/OWNERS
@@ -0,0 +1,1 @@
+@kristijanburnik
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/navigation-timing/OWNERS
@@ -0,0 +1,2 @@
+@plehegar
+@foolip
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/notifications/OWNERS
@@ -0,0 +1,4 @@
+@chunywang
+@sideshowbarker
+@xinliux
+@ibelem
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/page-visibility/OWNERS
@@ -0,0 +1,2 @@
+@plehegar
+@foolip
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/performance-timeline/OWNERS
@@ -0,0 +1,1 @@
+@plehegar
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/pointerevents/OWNERS
@@ -0,0 +1,7 @@
+@bethge
+@Steditor
+@EvgenyAgafonchikov
+@jacobrossi
+@plehegar
+@scottgonzalez
+@staktrace
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/pointerlock/OWNERS
@@ -0,0 +1,1 @@
+@plehegar
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/proximity/OWNERS
@@ -0,0 +1,2 @@
+@zqzhang
+@dontcallmedom
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/quirks-mode/OWNERS
@@ -0,0 +1,1 @@
+@zcorpan
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/referrer-policy/OWNERS
@@ -0,0 +1,1 @@
+@kristijanburnik
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/resource-timing/OWNERS
@@ -0,0 +1,3 @@
+@haoxli
+@plehegar
+@zqzhang
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/screen-orientation/OWNERS
@@ -0,0 +1,1 @@
+@haoxli
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/selection/OWNERS
@@ -0,0 +1,1 @@
+@ayg
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/service-workers/OWNERS
@@ -0,0 +1,1 @@
+@ehsan
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/service-workers/cache-storage/OWNERS
@@ -0,0 +1,2 @@
+@inexorabletash
+@wanderview
--- a/testing/web-platform/tests/service-workers/cache-storage/resources/test-helpers.js
+++ b/testing/web-platform/tests/service-workers/cache-storage/resources/test-helpers.js
@@ -30,8 +30,208 @@
 //      // Do something with |cache|, which is a Cache object.
 //    }, "Some Cache test");
 function cache_test(test_function, description) {
   promise_test(function(test) {
       return create_temporary_cache(test)
         .then(test_function);
     }, description);
 }
+
+// A set of Request/Response pairs to be used with prepopulated_cache_test().
+var simple_entries = [
+  {
+    name: 'a',
+    request: new Request('http://example.com/a'),
+    response: new Response('')
+  },
+
+  {
+    name: 'b',
+    request: new Request('http://example.com/b'),
+    response: new Response('')
+  },
+
+  {
+    name: 'a_with_query',
+    request: new Request('http://example.com/a?q=r'),
+    response: new Response('')
+  },
+
+  {
+    name: 'A',
+    request: new Request('http://example.com/A'),
+    response: new Response('')
+  },
+
+  {
+    name: 'a_https',
+    request: new Request('https://example.com/a'),
+    response: new Response('')
+  },
+
+  {
+    name: 'a_org',
+    request: new Request('http://example.org/a'),
+    response: new Response('')
+  },
+
+  {
+    name: 'cat',
+    request: new Request('http://example.com/cat'),
+    response: new Response('')
+  },
+
+  {
+    name: 'catmandu',
+    request: new Request('http://example.com/catmandu'),
+    response: new Response('')
+  },
+
+  {
+    name: 'cat_num_lives',
+    request: new Request('http://example.com/cat?lives=9'),
+    response: new Response('')
+  },
+
+  {
+    name: 'cat_in_the_hat',
+    request: new Request('http://example.com/cat/in/the/hat'),
+    response: new Response('')
+  },
+
+  {
+    name: 'non_2xx_response',
+    request: new Request('http://example.com/non2xx'),
+    response: new Response('', {status: 404, statusText: 'nope'})
+  },
+
+  {
+    name: 'error_response',
+    request: new Request('http://example.com/error'),
+    response: Response.error()
+  },
+];
+
+// A set of Request/Response pairs to be used with prepopulated_cache_test().
+// These contain a mix of test cases that use Vary headers.
+var vary_entries = [
+  {
+    name: 'vary_cookie_is_cookie',
+    request: new Request('http://example.com/c',
+                         {headers: {'Cookies': 'is-for-cookie'}}),
+    response: new Response('',
+                           {headers: {'Vary': 'Cookies'}})
+  },
+
+  {
+    name: 'vary_cookie_is_good',
+    request: new Request('http://example.com/c',
+                         {headers: {'Cookies': 'is-good-enough-for-me'}}),
+    response: new Response('',
+                           {headers: {'Vary': 'Cookies'}})
+  },
+
+  {
+    name: 'vary_cookie_absent',
+    request: new Request('http://example.com/c'),
+    response: new Response('',
+                           {headers: {'Vary': 'Cookies'}})
+  }
+];
+
+// Run |test_function| with a Cache object and a map of entries. Prior to the
+// call, the Cache is populated by cache entries from |entries|. The latter is
+// expected to be an Object mapping arbitrary keys to objects of the form
+// {request: <Request object>, response: <Response object>}. There's no
+// guarantee on the order in which entries will be added to the cache.
+//
+// |test_function| should return a Promise that can be used with promise_test.
+function prepopulated_cache_test(entries, test_function, description) {
+  cache_test(function(cache) {
+      var p = Promise.resolve();
+      var hash = {};
+      return Promise.all(entries.map(function(entry) {
+          hash[entry.name] = entry;
+          return cache.put(entry.request.clone(),
+                           entry.response.clone())
+            .catch(function(e) {
+                assert_unreached(
+                  'Test setup failed for entry ' + entry.name + ': ' + e);
+            });
+        }))
+        .then(function() {
+            assert_equals(Object.keys(hash).length, entries.length);
+        })
+        .then(function() {
+            return test_function(cache, hash);
+        });
+    }, description);
+}
+
+// Helper for testing with Headers objects. Compares Headers instances
+// by serializing |expected| and |actual| to arrays and comparing.
+function assert_header_equals(actual, expected, description) {
+    assert_class_string(actual, "Headers", description);
+    var header;
+    var actual_headers = [];
+    var expected_headers = [];
+    for (header of actual)
+        actual_headers.push(header[0] + ": " + header[1]);
+    for (header of expected)
+        expected_headers.push(header[0] + ": " + header[1]);
+    assert_array_equals(actual_headers, expected_headers,
+                        description + " Headers differ.");
+}
+
+// Helper for testing with Response objects. Compares simple
+// attributes defined on the interfaces, as well as the headers. It
+// does not compare the response bodies.
+function assert_response_equals(actual, expected, description) {
+    assert_class_string(actual, "Response", description);
+    ["type", "url", "status", "ok", "statusText"].forEach(function(attribute) {
+        assert_equals(actual[attribute], expected[attribute],
+                      description + " Attributes differ: " + attribute + ".");
+    });
+    assert_header_equals(actual.headers, expected.headers, description);
+}
+
+// Assert that the two arrays |actual| and |expected| contain the same
+// set of Responses as determined by assert_response_equals. The order
+// is not significant.
+//
+// |expected| is assumed to not contain any duplicates.
+function assert_response_array_equivalent(actual, expected, description) {
+    assert_true(Array.isArray(actual), description);
+    assert_equals(actual.length, expected.length, description);
+    expected.forEach(function(expected_element) {
+        // assert_response_in_array treats the first argument as being
+        // 'actual', and the second as being 'expected array'. We are
+        // switching them around because we want to be resilient
+        // against the |actual| array containing duplicates.
+        assert_response_in_array(expected_element, actual, description);
+    });
+}
+
+// Asserts that two arrays |actual| and |expected| contain the same
+// set of Responses as determined by assert_response_equals(). The
+// corresponding elements must occupy corresponding indices in their
+// respective arrays.
+function assert_response_array_equals(actual, expected, description) {
+    assert_true(Array.isArray(actual), description);
+    assert_equals(actual.length, expected.length, description);
+    actual.forEach(function(value, index) {
+        assert_response_equals(value, expected[index],
+                               description + " : object[" + index + "]");
+    });
+}
+
+// Equivalent to assert_in_array, but uses assert_response_equals.
+function assert_response_in_array(actual, expected_array, description) {
+    assert_true(expected_array.some(function(element) {
+        try {
+            assert_response_equals(actual, element);
+            return true;
+        } catch (e) {
+            return false;
+        }
+    }), description);
+}
--- a/testing/web-platform/tests/service-workers/cache-storage/resources/testharness-helpers.js
+++ b/testing/web-platform/tests/service-workers/cache-storage/resources/testharness-helpers.js
@@ -26,75 +26,8 @@ function assert_promise_rejects(promise,
       throw 'assert_promise_rejects: ' + description + ' Promise did not reject.';
     },
     function(e) {
       if (code !== undefined) {
         assert_throws(code, function() { throw e; }, description);
       }
     });
 }
-
-// Helper for testing with Headers objects. Compares Headers instances
-// by serializing |expected| and |actual| to arrays and comparing.
-function assert_header_equals(actual, expected, description) {
-    assert_class_string(actual, "Headers", description);
-    var header, actual_headers = [], expected_headers = [];
-    for (header of actual)
-        actual_headers.push(header[0] + ": " + header[1]);
-    for (header of expected)
-        expected_headers.push(header[0] + ": " + header[1]);
-    assert_array_equals(actual_headers, expected_headers,
-                        description + " Headers differ.");
-}
-
-// Helper for testing with Response objects. Compares simple
-// attributes defined on the interfaces, as well as the headers. It
-// does not compare the response bodies.
-function assert_response_equals(actual, expected, description) {
-    assert_class_string(actual, "Response", description);
-    ["type", "url", "status", "ok", "statusText"].forEach(function(attribute) {
-        assert_equals(actual[attribute], expected[attribute],
-                      description + " Attributes differ: " + attribute + ".");
-    });
-    assert_header_equals(actual.headers, expected.headers, description);
-}
-
-// Assert that the two arrays |actual| and |expected| contain the same
-// set of Responses as determined by assert_response_equals. The order
-// is not significant.
-//
-// |expected| is assumed to not contain any duplicates.
-function assert_response_array_equivalent(actual, expected, description) {
-    assert_true(Array.isArray(actual), description);
-    assert_equals(actual.length, expected.length, description);
-    expected.forEach(function(expected_element) {
-        // assert_response_in_array treats the first argument as being
-        // 'actual', and the second as being 'expected array'. We are
-        // switching them around because we want to be resilient
-        // against the |actual| array containing duplicates.
-        assert_response_in_array(expected_element, actual, description);
-    });
-}
-
-// Asserts that two arrays |actual| and |expected| contain the same
-// set of Responses as determined by assert_response_equals(). The
-// corresponding elements must occupy corresponding indices in their
-// respective arrays.
-function assert_response_array_equals(actual, expected, description) {
-    assert_true(Array.isArray(actual), description);
-    assert_equals(actual.length, expected.length, description);
-    actual.forEach(function(value, index) {
-        assert_response_equals(value, expected[index],
-                               description + " : object[" + index + "]");
-    });
-}
-
-// Equivalent to assert_in_array, but uses assert_response_equals.
-function assert_response_in_array(actual, expected_array, description) {
-    assert_true(expected_array.some(function(element) {
-        try {
-            assert_response_equals(actual, element);
-            return true;
-        } catch (e) {
-            return false;
-        }
-    }), description);
-}
--- a/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-add.js
+++ b/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-add.js
@@ -11,16 +11,26 @@ cache_test(function(cache) {
       'Cache.add should throw a TypeError when no arguments are given.');
   }, 'Cache.add called with no arguments');
 
 cache_test(function(cache) {
     return cache.add('../resources/simple.txt')
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.add should resolve with undefined on success.');
+          return cache.match('../resources/simple.txt');
+        })
+        .then(function(response) {
+          assert_class_string(response, 'Response',
+                              'Cache.add should put a resource in the cache.');
+          return response.text();
+        })
+        .then(function(body) {
+          assert_equals(body, 'a simple text file\n',
+                        'Cache.add should retrieve the correct body.');
         });
   }, 'Cache.add called with relative URL specified as a string');
 
 cache_test(function(cache) {
     return assert_promise_rejects(
       cache.add('javascript://this-is-not-http-mmkay'),
       new TypeError(),
       'Cache.add should throw a TypeError for non-HTTP/HTTPS URLs.');
@@ -31,32 +41,52 @@ cache_test(function(cache) {
     return cache.add(request)
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.add should resolve with undefined on success.');
         });
   }, 'Cache.add called with Request object');
 
 cache_test(function(cache) {
+    var request = new Request('../resources/simple.txt',
+                              {method: 'POST', body: 'This is a body.'});
+    return assert_promise_rejects(
+      cache.add(request),
+      new TypeError(),
+      'Cache.add should throw a TypeError for non-GET requests.');
+  }, 'Cache.add called with POST request');
+
+cache_test(function(cache) {
     var request = new Request('../resources/simple.txt');
     return cache.add(request)
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.add should resolve with undefined on success.');
         })
       .then(function() {
           return cache.add(request);
         })
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.add should resolve with undefined on success.');
         });
   }, 'Cache.add called twice with the same Request object');
 
 cache_test(function(cache) {
+    var request = new Request('../resources/simple.txt');
+    return request.text()
+      .then(function() {
+          assert_false(request.bodyUsed);
+        })
+      .then(function() {
+          return cache.add(request);
+        });
+  }, 'Cache.add with request with null body (not consumed)');
+
+cache_test(function(cache) {
     return cache.add('this-does-not-exist-please-dont-create-it')
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.add should resolve with undefined on success.');
         });
   }, 'Cache.add with request that results in a status of 404');
 
 cache_test(function(cache) {
@@ -79,52 +109,146 @@ cache_test(function(cache) {
     var urls = ['../resources/simple.txt', undefined, '../resources/blank.html'];
     return assert_promise_rejects(
       cache.addAll(),
       new TypeError(),
       'Cache.addAll should throw TypeError for an undefined argument.');
   }, 'Cache.addAll with a mix of valid and undefined arguments');
 
 cache_test(function(cache) {
-    // Assumes the existence of ../resources/simple.txt and ../resources/blank.html
-    var urls = ['../resources/simple.txt', self.location.href, '../resources/blank.html'];
+    return cache.addAll([])
+      .then(function(result) {
+          assert_equals(result, undefined,
+                        'Cache.addAll should resolve with undefined on ' +
+                        'success.');
+          return cache.keys();
+        })
+      .then(function(result) {
+          assert_equals(result.length, 0,
+                        'There should be no entry in the cache.');
+        });
+  }, 'Cache.addAll with an empty array');
+
+cache_test(function(cache) {
+    // Assumes the existence of ../resources/simple.txt and
+    // ../resources/blank.html
+    var urls = ['../resources/simple.txt',
+                self.location.href,
+                '../resources/blank.html'];
     return cache.addAll(urls)
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.addAll should resolve with undefined on ' +
                         'success.');
+          return Promise.all(
+            urls.map(function(url) { return cache.match(url); }));
+        })
+      .then(function(responses) {
+          assert_class_string(
+            responses[0], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          assert_class_string(
+            responses[1], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          assert_class_string(
+            responses[2], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          return Promise.all(
+            responses.map(function(response) { return response.text(); }));
+        })
+      .then(function(bodies) {
+          assert_equals(
+            bodies[0], 'a simple text file\n',
+            'Cache.add should retrieve the correct body.');
+          assert_equals(
+            bodies[2], '<!DOCTYPE html>\n<title>Empty doc</title>\n',
+            'Cache.add should retrieve the correct body.');
         });
   }, 'Cache.addAll with string URL arguments');
 
 cache_test(function(cache) {
-    // Assumes the existence of ../resources/simple.txt and ../resources/blank.html
-    var urls = ['../resources/simple.txt', self.location.href, '../resources/blank.html'];
+    // Assumes the existence of ../resources/simple.txt and
+    // ../resources/blank.html
+    var urls = ['../resources/simple.txt',
+                self.location.href,
+                '../resources/blank.html'];
     var requests = urls.map(function(url) {
         return new Request(url);
       });
     return cache.addAll(requests)
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.addAll should resolve with undefined on ' +
                         'success.');
+          return Promise.all(
+            urls.map(function(url) { return cache.match(url); }));
+        })
+      .then(function(responses) {
+          assert_class_string(
+            responses[0], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          assert_class_string(
+            responses[1], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          assert_class_string(
+            responses[2], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          return Promise.all(
+            responses.map(function(response) { return response.text(); }));
+        })
+      .then(function(bodies) {
+          assert_equals(
+            bodies[0], 'a simple text file\n',
+            'Cache.add should retrieve the correct body.');
+          assert_equals(
+            bodies[2], '<!DOCTYPE html>\n<title>Empty doc</title>\n',
+            'Cache.add should retrieve the correct body.');
         });
   }, 'Cache.addAll with Request arguments');
 
 cache_test(function(cache) {
-    // Assumes that ../resources/simple.txt and ../resources/blank.html exist. The second
-    // resource does not.
-    var urls = ['../resources/simple.txt', 'this-resource-should-not-exist', '../resources/blank.html'];
+    // Assumes that ../resources/simple.txt and ../resources/blank.html exist.
+    // The second resource does not.
+    var urls = ['../resources/simple.txt',
+                'this-resource-should-not-exist',
+                '../resources/blank.html'];
     var requests = urls.map(function(url) {
         return new Request(url);
       });
     return cache.addAll(requests)
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.addAll should resolve with undefined on ' +
                         'success.');
+          return Promise.all(
+            urls.map(function(url) { return cache.match(url); }));
+        })
+      .then(function(responses) {
+          assert_class_string(
+            responses[0], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          assert_class_string(
+            responses[1], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          assert_equals(
+            responses[1].status, 404,
+            'Cache.addAll should put a 404 resource in the cache.');
+          assert_class_string(
+            responses[2], 'Response',
+            'Cache.addAll should put a resource in the cache.');
+          return Promise.all(
+            responses.map(function(response) { return response.text(); }));
+        })
+      .then(function(bodies) {
+          assert_equals(
+            bodies[0], 'a simple text file\n',
+            'Cache.add should retrieve the correct body.');
+          assert_equals(
+            bodies[2], '<!DOCTYPE html>\n<title>Empty doc</title>\n',
+            'Cache.add should retrieve the correct body.');
         });
   }, 'Cache.addAll with a mix of succeeding and failing requests');
 
 cache_test(function(cache) {
     var request = new Request('../resources/simple.txt');
     return assert_promise_rejects(
       cache.addAll([request, request]),
       'InvalidStateError',
--- a/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-match.js
+++ b/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-match.js
@@ -1,189 +1,47 @@
 if (self.importScripts) {
     importScripts('/resources/testharness.js');
     importScripts('../resources/testharness-helpers.js');
     importScripts('../resources/test-helpers.js');
 }
 
-// A set of Request/Response pairs to be used with prepopulated_cache_test().
-var simple_entries = [
-  {
-    name: 'a',
-    request: new Request('http://example.com/a'),
-    response: new Response('')
-  },
-
-  {
-    name: 'b',
-    request: new Request('http://example.com/b'),
-    response: new Response('')
-  },
-
-  {
-    name: 'a_with_query',
-    request: new Request('http://example.com/a?q=r'),
-    response: new Response('')
-  },
-
-  {
-    name: 'A',
-    request: new Request('http://example.com/A'),
-    response: new Response('')
-  },
-
-  {
-    name: 'a_https',
-    request: new Request('https://example.com/a'),
-    response: new Response('')
-  },
-
-  {
-    name: 'a_org',
-    request: new Request('http://example.org/a'),
-    response: new Response('')
-  },
-
-  {
-    name: 'cat',
-    request: new Request('http://example.com/cat'),
-    response: new Response('')
-  },
-
-  {
-    name: 'catmandu',
-    request: new Request('http://example.com/catmandu'),
-    response: new Response('')
-  },
-
-  {
-    name: 'cat_num_lives',
-    request: new Request('http://example.com/cat?lives=9'),
-    response: new Response('')
-  },
-
-  {
-    name: 'cat_in_the_hat',
-    request: new Request('http://example.com/cat/in/the/hat'),
-    response: new Response('')
-  }
-];
-
-// A set of Request/Response pairs to be used with prepopulated_cache_test().
-// These contain a mix of test cases that use Vary headers.
-var vary_entries = [
-  {
-    name: 'vary_cookie_is_cookie',
-    request: new Request('http://example.com/c',
-                         {headers: {'Cookies': 'is-for-cookie'}}),
-    response: new Response('',
-                           {headers: {'Vary': 'Cookies'}})
-  },
-
-  {
-    name: 'vary_cookie_is_good',
-    request: new Request('http://example.com/c',
-                         {headers: {'Cookies': 'is-good-enough-for-me'}}),
-    response: new Response('',
-                           {headers: {'Vary': 'Cookies'}})
-  },
-
-  {
-    name: 'vary_cookie_absent',
-    request: new Request('http://example.com/c'),
-    response: new Response('',
-                           {headers: {'Vary': 'Cookies'}})
-  }
-];
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll('not-present-in-the-cache')
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result, [],
-            'Cache.matchAll should resolve with an empty array on failure.');
-        });
-  }, 'Cache.matchAll with no matching entries');
-
 prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match('not-present-in-the-cache')
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.match failures should resolve with undefined.');
         });
   }, 'Cache.match with no matching entries');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll(entries.a.request.url)
-      .then(function(result) {
-          assert_response_array_equals(result, [entries.a.response],
-                                       'Cache.matchAll should match by URL.');
-        });
-  }, 'Cache.matchAll with URL');
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match(entries.a.request.url)
       .then(function(result) {
           assert_response_equals(result, entries.a.response,
                                  'Cache.match should match by URL.');
         });
   }, 'Cache.match with URL');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll(entries.a.request)
-      .then(function(result) {
-          assert_response_array_equals(
-            result, [entries.a.response],
-            'Cache.matchAll should match by Request.');
-        });
-  }, 'Cache.matchAll with Request');
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match(entries.a.request)
       .then(function(result) {
           assert_response_equals(result, entries.a.response,
                                  'Cache.match should match by Request.');
         });
   }, 'Cache.match with Request');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll(new Request(entries.a.request.url))
-      .then(function(result) {
-          assert_response_array_equals(
-            result, [entries.a.response],
-            'Cache.matchAll should match by Request.');
-        });
-  }, 'Cache.matchAll with new Request');
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match(new Request(entries.a.request.url))
       .then(function(result) {
           assert_response_equals(result, entries.a.response,
                                  'Cache.match should match by Request.');
         });
   }, 'Cache.match with new Request');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll(entries.a.request,
-                          {ignoreSearch: true})
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result,
-            [
-              entries.a.response,
-              entries.a_with_query.response
-            ],
-            'Cache.matchAll with ignoreSearch should ignore the ' +
-            'search parameters of cached request.');
-        });
-  },
-  'Cache.matchAll with ignoreSearch option (request with no search ' +
-  'parameters)');
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match(entries.a.request,
                        {ignoreSearch: true})
       .then(function(result) {
           assert_response_in_array(
             result,
             [
               entries.a.response,
               entries.a_with_query.response
@@ -191,156 +49,61 @@ prepopulated_cache_test(simple_entries, 
             'Cache.match with ignoreSearch should ignore the ' +
             'search parameters of cached request.');
         });
   },
   'Cache.match with ignoreSearch option (request with no search ' +
   'parameters)');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll(entries.a_with_query.request,
-                          {ignoreSearch: true})
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result,
-            [
-              entries.a.response,
-              entries.a_with_query.response
-            ],
-            'Cache.matchAll with ignoreSearch should ignore the ' +
-            'search parameters of request.');
-        });
-  },
-  'Cache.matchAll with ignoreSearch option (request with search parameter)');
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match(entries.a_with_query.request,
                        {ignoreSearch: true})
       .then(function(result) {
           assert_response_in_array(
             result,
             [
               entries.a.response,
               entries.a_with_query.response
             ],
             'Cache.match with ignoreSearch should ignore the ' +
             'search parameters of request.');
         });
   },
   'Cache.match with ignoreSearch option (request with search parameter)');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll(entries.cat.request.url + '#mouse')
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result,
-            [
-              entries.cat.response,
-            ],
-            'Cache.matchAll should ignore URL fragment.');
-        });
-  }, 'Cache.matchAll with URL containing fragment');
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match(entries.cat.request.url + '#mouse')
       .then(function(result) {
           assert_response_equals(result, entries.cat.response,
                                  'Cache.match should ignore URL fragment.');
         });
   }, 'Cache.match with URL containing fragment');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    return cache.matchAll('http')
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result, [],
-            'Cache.matchAll should treat query as a URL and not ' +
-            'just a string fragment.');
-        });
-  }, 'Cache.matchAll with string fragment "http" as query');
-
-prepopulated_cache_test(simple_entries, function(cache, entries) {
     return cache.match('http')
       .then(function(result) {
           assert_equals(
             result, undefined,
             'Cache.match should treat query as a URL and not ' +
             'just a string fragment.');
         });
   }, 'Cache.match with string fragment "http" as query');
 
 prepopulated_cache_test(vary_entries, function(cache, entries) {
-    return cache.matchAll('http://example.com/c')
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result,
-            [
-              entries.vary_cookie_absent.response
-            ],
-            'Cache.matchAll should exclude matches if a vary header is ' +
-            'missing in the query request, but is present in the cached ' +
-            'request.');
-        })
-
-      .then(function() {
-          return cache.matchAll(
-            new Request('http://example.com/c',
-                        {headers: {'Cookies': 'none-of-the-above'}}));
-        })
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result,
-            [
-            ],
-            'Cache.matchAll should exclude matches if a vary header is ' +
-            'missing in the cached request, but is present in the query ' +
-            'request.');
-        })
-
-      .then(function() {
-          return cache.matchAll(
-            new Request('http://example.com/c',
-                        {headers: {'Cookies': 'is-for-cookie'}}));
-        })
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result,
-            [entries.vary_cookie_is_cookie.response],
-            'Cache.matchAll should match the entire header if a vary header ' +
-            'is present in both the query and cached requests.');
-        });
-  }, 'Cache.matchAll with responses containing "Vary" header');
-
-prepopulated_cache_test(vary_entries, function(cache, entries) {
     return cache.match('http://example.com/c')
       .then(function(result) {
           assert_response_in_array(
             result,
             [
               entries.vary_cookie_absent.response
             ],
             'Cache.match should honor "Vary" header.');
         });
   }, 'Cache.match with responses containing "Vary" header');
 
-prepopulated_cache_test(vary_entries, function(cache, entries) {
-    return cache.matchAll('http://example.com/c',
-                          {ignoreVary: true})
-      .then(function(result) {
-          assert_response_array_equivalent(
-            result,
-            [
-              entries.vary_cookie_is_cookie.response,
-              entries.vary_cookie_is_good.response,
-              entries.vary_cookie_absent.response,
-            ],
-            'Cache.matchAll should honor "ignoreVary" parameter.');
-        });
-  }, 'Cache.matchAll with "ignoreVary" parameter');
-
 cache_test(function(cache) {
     var request = new Request('http://example.com');
     var response;
     var request_url = new URL('../resources/simple.txt', location.href).href;
     return fetch(request_url)
       .then(function(fetch_result) {
           response = fetch_result;
           assert_equals(
@@ -392,51 +155,39 @@ cache_test(function(cache) {
       .then(function(body_text) {
           assert_equals(body_text, 'a simple text file\n',
                         'Cache.match should return a Response object with a ' +
                         'valid body each time it is called.');
         });
   }, 'Cache.match invoked multiple times for the same Request/Response');
 
 prepopulated_cache_test(simple_entries, function(cache, entries) {
-    var request = new Request(entries.a.request, { method: 'POST' });
+    var request = new Request(entries.a.request.clone(), {method: 'POST'});
     return cache.match(request)
       .then(function(result) {
           assert_equals(result, undefined,
                         'Cache.match should not find a match');
         });
   }, 'Cache.match with POST Request');
 
-// Helpers ---
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    var response = entries.non_2xx_response.response;
+    return cache.match(entries.non_2xx_response.request.url)
+      .then(function(result) {
+          assert_response_equals(
+              result, entries.non_2xx_response.response,
+              'Cache.match should return a Response object that has the ' +
+                  'same properties as a stored non-2xx response.');
+        });
+  }, 'Cache.match with a non-2xx Response');
 
-// Run |test_function| with a Cache object as its only parameter. Prior to the
-// call, the Cache is populated by cache entries from |entries|. The latter is
-// expected to be an Object mapping arbitrary keys to objects of the form
-// {request: <Request object>, response: <Response object>}. There's no
-// guarantee on the order in which entries will be added to the cache.
-//
-// |test_function| should return a Promise that can be used with promise_test.
-function prepopulated_cache_test(entries, test_function, description) {
-  cache_test(function(cache) {
-      var p = Promise.resolve();
-      var hash = {};
-      entries.forEach(function(entry) {
-          p = p.then(function() {
-              return cache.put(entry.request.clone(),
-                               entry.response.clone())
-                .catch(function(e) {
-                    assert_unreached('Test setup failed for entry ' +
-                                     entry.name + ': ' + e);
-                  });
-            });
-          hash[entry.name] = entry;
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    var response = entries.error_response.response;
+    return cache.match(entries.error_response.request.url)
+      .then(function(result) {
+          assert_response_equals(
+              result, entries.error_response.response,
+              'Cache.match should return a Response object that has the ' +
+                  'same properties as a stored network error response.');
         });
-      p = p.then(function() {
-          assert_equals(Object.keys(hash).length, entries.length);
-        });
-
-      return p.then(function() {
-          return test_function(cache, hash);
-        });
-    }, description);
-}
+  }, 'Cache.match with a network error Response');
 
 done();
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-matchAll.js
@@ -0,0 +1,154 @@
+if (self.importScripts) {
+    importScripts('/resources/testharness.js');
+    importScripts('../resources/testharness-helpers.js');
+    importScripts('../resources/test-helpers.js');
+}
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll('not-present-in-the-cache')
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result, [],
+            'Cache.matchAll should resolve with an empty array on failure.');
+        });
+  }, 'Cache.matchAll with no matching entries');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll(entries.a.request.url)
+      .then(function(result) {
+          assert_response_array_equals(result, [entries.a.response],
+                                       'Cache.matchAll should match by URL.');
+        });
+  }, 'Cache.matchAll with URL');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll(entries.a.request)
+      .then(function(result) {
+          assert_response_array_equals(
+            result, [entries.a.response],
+            'Cache.matchAll should match by Request.');
+        });
+  }, 'Cache.matchAll with Request');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll(new Request(entries.a.request.url))
+      .then(function(result) {
+          assert_response_array_equals(
+            result, [entries.a.response],
+            'Cache.matchAll should match by Request.');
+        });
+  }, 'Cache.matchAll with new Request');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll(entries.a.request,
+                          {ignoreSearch: true})
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result,
+            [
+              entries.a.response,
+              entries.a_with_query.response
+            ],
+            'Cache.matchAll with ignoreSearch should ignore the ' +
+            'search parameters of cached request.');
+        });
+  },
+  'Cache.matchAll with ignoreSearch option (request with no search ' +
+  'parameters)');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll(entries.a_with_query.request,
+                          {ignoreSearch: true})
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result,
+            [
+              entries.a.response,
+              entries.a_with_query.response
+            ],
+            'Cache.matchAll with ignoreSearch should ignore the ' +
+            'search parameters of request.');
+        });
+  },
+  'Cache.matchAll with ignoreSearch option (request with search parameter)');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll(entries.cat.request.url + '#mouse')
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result,
+            [
+              entries.cat.response,
+            ],
+            'Cache.matchAll should ignore URL fragment.');
+        });
+  }, 'Cache.matchAll with URL containing fragment');
+
+prepopulated_cache_test(simple_entries, function(cache, entries) {
+    return cache.matchAll('http')
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result, [],
+            'Cache.matchAll should treat query as a URL and not ' +
+            'just a string fragment.');
+        });
+  }, 'Cache.matchAll with string fragment "http" as query');
+
+prepopulated_cache_test(vary_entries, function(cache, entries) {
+    return cache.matchAll('http://example.com/c')
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result,
+            [
+              entries.vary_cookie_absent.response
+            ],
+            'Cache.matchAll should exclude matches if a vary header is ' +
+            'missing in the query request, but is present in the cached ' +
+            'request.');
+        })
+
+      .then(function() {
+          return cache.matchAll(
+            new Request('http://example.com/c',
+                        {headers: {'Cookies': 'none-of-the-above'}}));
+        })
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result,
+            [
+            ],
+            'Cache.matchAll should exclude matches if a vary header is ' +
+            'missing in the cached request, but is present in the query ' +
+            'request.');
+        })
+
+      .then(function() {
+          return cache.matchAll(
+            new Request('http://example.com/c',
+                        {headers: {'Cookies': 'is-for-cookie'}}));
+        })
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result,
+            [entries.vary_cookie_is_cookie.response],
+            'Cache.matchAll should match the entire header if a vary header ' +
+            'is present in both the query and cached requests.');
+        });
+  }, 'Cache.matchAll with responses containing "Vary" header');
+
+prepopulated_cache_test(vary_entries, function(cache, entries) {
+    return cache.matchAll('http://example.com/c',
+                          {ignoreVary: true})
+      .then(function(result) {
+          assert_response_array_equivalent(
+            result,
+            [
+              entries.vary_cookie_is_cookie.response,
+              entries.vary_cookie_is_good.response,
+              entries.vary_cookie_absent.response
+            ],
+            'Cache.matchAll should honor "ignoreVary" parameter.');
+        });
+  }, 'Cache.matchAll with "ignoreVary" parameter');
+
+done();
--- a/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-put.js
+++ b/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-put.js
@@ -245,25 +245,31 @@ cache_test(function(cache) {
     var response = new Response(test_body);
     assert_false(response.bodyUsed,
                  '[https://fetch.spec.whatwg.org/#dom-body-bodyused] ' +
                  'Response.bodyUsed should be initially false.');
     return response.text().then(function() {
       assert_true(
         response.bodyUsed,
         '[https://fetch.spec.whatwg.org/#concept-body-consume-body] ' +
-          'The text() method should set "body used" flag.');
-      return assert_promise_rejects(
-        cache.put(new Request(test_url), response),
-        new TypeError,
-        '[https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#cache-put] ' +
-        'Cache put should reject with TypeError when Response ' +
-        'body is already used.');
+          'The text() method should make the body disturbed.');
+      var request = new Request(test_url);
+      return cache.put(request, response).then(() => {
+          assert_unreached('cache.put should be rejected');
+        }, () => {});
+    });
+  }, 'Cache.put with a used response body');
+
+cache_test(function(cache) {
+    var response = new Response(test_body);
+    return cache.put(new Request(test_url), response)
+      .then(function() {
+          assert_throws(new TypeError(), () => response.body.getReader());
       });
-  }, 'Cache.put with a used response body');
+  }, 'getReader() after Cache.put');
 
 cache_test(function(cache) {
     return assert_promise_rejects(
       cache.put(new Request(test_url),
                 new Response(test_body, { headers: { VARY: '*' }})),
       new TypeError(),
       'Cache.put should reject VARY:* Responses with a TypeError.');
   }, 'Cache.put with a VARY:* Response');
--- a/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-storage.js
+++ b/testing/web-platform/tests/service-workers/cache-storage/script-tests/cache-storage.js
@@ -101,17 +101,16 @@ promise_test(function(t) {
           assert_false(result,
                        'CacheStorage.has should return false for ' +
                        'nonexistent cache.');
         });
   }, 'CacheStorage.has with nonexistent cache');
 
 promise_test(function(t) {
     var cache_name = 'cache-storage/open';
-    var url = '../resources/simple.txt';
     var cache;
     return self.caches.delete(cache_name)
       .then(function() {
           return self.caches.open(cache_name);
         })
       .then(function(result) {
           cache = result;
         })
@@ -130,17 +129,17 @@ promise_test(function(t) {
           return Promise.all([cache.keys(), result.keys()]);
         })
       .then(function(results) {
           var expected_urls = results[0].map(function(r) { return r.url });
           var actual_urls = results[1].map(function(r) { return r.url });
           assert_array_equals(actual_urls, expected_urls,
                               'CacheStorage.open should return a new Cache ' +
                               'object for the same backing store.');
-        })
+        });
   }, 'CacheStorage.open with existing cache');
 
 promise_test(function(t) {
     var cache_name = 'cache-storage/delete';
 
     return self.caches.delete(cache_name)
       .then(function() {
           return self.caches.open(cache_name);
--- a/testing/web-platform/tests/service-workers/cache-storage/serviceworker/cache-match.https.html
+++ b/testing/web-platform/tests/service-workers/cache-storage/serviceworker/cache-match.https.html
@@ -1,10 +1,10 @@
 <!DOCTYPE html>
-<title>Cache.match and Cache.matchAll</title>
+<title>Cache.match</title>
 <link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-match">
 <meta name="timeout" content="long">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../../service-workers/resources/test-helpers.js"></script>
 <script>
 service_worker_test('../script-tests/cache-match.js');
 </script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/service-workers/cache-storage/serviceworker/cache-matchAll.https.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Cache.matchAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-matchall">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../service-workers/resources/test-helpers.js"></script>
+<script>
+service_worker_test('../script-tests/cache-matchAll.js');
+</script>
--- a/testing/web-platform/tests/service-workers/cache-storage/window/cache-match.https.html
+++ b/testing/web-platform/tests/service-workers/cache-storage/window/cache-match.https.html
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
-<title>Cache Storage: Cache.match and Cache.matchAll</title>
+<title>Cache Storage: Cache.match</title>
 <link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-match">
 <meta name="timeout" content="long">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/test-helpers.js"></script>
 <script src="../script-tests/cache-match.js"></script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/service-workers/cache-storage/window/cache-matchAll.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache.matchAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-matchall">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/testharness-helpers.js"></script>
+<script src="../resources/test-helpers.js"></script>
+<script src="../script-tests/cache-matchAll.js"></script>
--- a/testing/web-platform/tests/service-workers/cache-storage/worker/cache-match.https.html
+++ b/testing/web-platform/tests/service-workers/cache-storage/worker/cache-match.https.html
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
-<title>Cache.match and Cache.matchAll</title>
+<title>Cache.match</title>
 <link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-match">
 <meta name="timeout" content="long">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script>
 fetch_tests_from_worker(new Worker('../script-tests/cache-match.js'));
 </script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/service-workers/cache-storage/worker/cache-matchAll.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Cache.matchAll</title>
+<link rel="help" href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#cache-matchall">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker('../script-tests/cache-matchAll.js'));
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/shadow-dom/OWNERS
@@ -0,0 +1,5 @@
+@kojiishi
+@rniwa
+@sideshowbarker
+@sizuhiko
+@yutak
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/subresource-integrity/OWNERS
@@ -0,0 +1,6 @@
+@metromoxie
+@fmarier
+@jonathanKingston
+@mikewest
+@hillbrad
+@mastahyeti
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/OWNERS
@@ -0,0 +1,2 @@
+@heycam
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/touch-events/OWNERS
@@ -0,0 +1,3 @@
+@jtangelder
+@zqzhang
+@cynthia
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/typedarrays/OWNERS
@@ -0,0 +1,4 @@
+@koustuvsinha
+@zqzhang
+@haoxli
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/url/OWNERS
@@ -0,0 +1,8 @@
+@mikewest
+@frewsxcv
+@tomalec
+@rubys
+@sideshowbarker
+@zcorpan
+@xiaojunwu
+@smola
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/user-timing/OWNERS
@@ -0,0 +1,1 @@
+@plehegar
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/vibration/OWNERS
@@ -0,0 +1,3 @@
+@dontcallmedom
+@zqzhang
+@xinliux
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/web-animations/OWNERS
@@ -0,0 +1,1 @@
+@birtles
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/OWNERS
@@ -0,0 +1,1 @@
+@chrislo
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webdriver/OWNERS
@@ -0,0 +1,4 @@
+@andreastt
+@lukeis
+@AutomatedTester
+@shs96c
--- a/testing/web-platform/tests/webgl/conformance-1.0.3/conformance/programs/program-test.html
+++ b/testing/web-platform/tests/webgl/conformance-1.0.3/conformance/programs/program-test.html
@@ -223,21 +223,21 @@ function go() {
         if(gl.getError() != gl.NO_ERROR)
             assertMsg(false, "unexpected error in detachShader()");
         assertMsg(doArraysHaveSameContents(gl.getAttachedShaders(prog), expected_shaders), errmsg);
     }
     checkGetAttachedShaders([], [], [], "getAttachedShaders should return an empty list by default");
     checkGetAttachedShaders([fs], [], [fs], "attaching a single shader should give the expected list");
     checkGetAttachedShaders([fs, vs], [], [fs, vs],
         "attaching some shaders should give the expected list");
-    checkGetAttachedShaders([fs], [fs], [], "attaching a shader and detaching it shoud leave an empty list");
+    checkGetAttachedShaders([fs], [fs], [], "attaching a shader and detaching it should leave an empty list");
     checkGetAttachedShaders([fs, vs], [fs, vs], [],
-        "attaching some shaders and detaching them in same order shoud leave an empty list");
+        "attaching some shaders and detaching them in same order should leave an empty list");
     checkGetAttachedShaders([fs, vs], [vs, fs], [],
-        "attaching some shaders and detaching them in random order shoud leave an empty list");
+        "attaching some shaders and detaching them in random order should leave an empty list");
     checkGetAttachedShaders([fs, vs], [vs], [fs],
         "attaching and detaching some shaders should leave the difference list");
     checkGetAttachedShaders([fs, vs], [fs], [vs],
         "attaching and detaching some shaders should leave the difference list");
     checkGetAttachedShaders([fsBad], [], [fsBad],
         "attaching a shader that failed to compile should still show it in the list");
     checkGetAttachedShaders([fs, vsBad], [], [fs, vsBad],
         "attaching shaders, including one that failed to compile, should still show the it in the list");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webmessaging/OWNERS
@@ -0,0 +1,6 @@
+@zqzhang
+@sideshowbarker
+@plehegar
+@aogilvie
+@Ms2ger
+@jdm
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webrtc/OWNERS
@@ -0,0 +1,4 @@
+@dontcallmedom
+@tidoust
+@alvestrand
+@phoglund
--- a/testing/web-platform/tests/websockets/Create-Secure-valid-url-protocol-setCorrectly.htm
+++ b/testing/web-platform/tests/websockets/Create-Secure-valid-url-protocol-setCorrectly.htm
@@ -12,17 +12,17 @@
 
             var testOpen = async_test("W3C WebSocket API - Create Secure WebSocket - Pass a valid URL and protocol string - protocol should be set correctly - Connection should be opened");
             var testClose = async_test("W3C WebSocket API - Create Secure WebSocket - Pass a valid URL and protocol string - Connection should be closed");
 
             var wsocket = CreateWebSocket(true, true, false);
             var isOpenCalled = false;
 
             wsocket.addEventListener('open', testOpen.step_func(function (evt) {
-                assert_equals(wsocket.protocol, __PROTOCOL, "protocol should be set to echo");
+                assert_equals(wsocket.protocol, "echo", "protocol should be set to echo");
                 wsocket.close();
                 isOpenCalled = true;
                 testOpen.done();
             }), true);
 
             wsocket.addEventListener('close', testClose.step_func(function (evt) {
                 assert_true(isOpenCalled, "WebSocket connection should be open");
                 assert_equals(evt.wasClean, true, "wasClean should be true");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/websockets/OWNERS
@@ -0,0 +1,9 @@
+@kristijanburnik
+@zcorpan
+@plehegar
+@zqzhang
+@sideshowbarker
+@foolip
+@Jxck
+@jdm
+@Ms2ger
--- a/testing/web-platform/tests/websockets/websocket.js
+++ b/testing/web-platform/tests/websockets/websocket.js
@@ -1,123 +1,107 @@
 var __SERVER__NAME = "{{host}}";
 var __PORT = {{ports[ws][0]}};
 var __SECURE__PORT = {{ports[wss][0]}};
 var __NEW__PORT = __PORT; //All ports are non-default for now
 var __NEW__SECURE__PORT = __SECURE__PORT; //All ports are non-default for now
 var __PATH = "echo";
-var __CONTROLPATH = "control";
-var __PROTOCOL = "echo";
-var __PROTOCOLS = ["echo", "chat"];
-var __REPEATED__PROTOCOLS = ["echo", "echo"];
-var __REPEATED__PROTOCOLS_CASE_INSENSITIVE = ["echo", "eCho"];
-var __URL;
-var __IS__WEBSOCKET;
-var __PASS = "Pass";
-var __FAIL = "Fail";
 var wsocket;
-var csocket;
 var data;
 
-// variables for testing Close Browser/Navigate Away scenarios
-var isAssociated = false;
-var guid;
-var dataReceived;
-var closeCode;
-var urlToOpen;
-
 function IsWebSocket() {
     if (!window.WebSocket) {
         assert_true(false, "Browser does not support WebSocket");
     }
 }
 
 function CreateWebSocketNonAbsolute() {
     IsWebSocket();
-    __URL = __SERVER__NAME;
-    wsocket = new WebSocket(__URL);
+    var url = __SERVER__NAME;
+    wsocket = new WebSocket(url);
 }
 
 function CreateWebSocketNonWsScheme() {
     IsWebSocket();
-    __URL = "http://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
-    wsocket = new WebSocket(__URL);
+    var url = "http://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+    wsocket = new WebSocket(url);
 }
 
 function CreateWebSocketNonAsciiProtocol(nonAsciiProtocol) {
     IsWebSocket();
-    __URL = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
-    wsocket = new WebSocket(__URL, nonAsciiProtocol);
+    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+    wsocket = new WebSocket(url, nonAsciiProtocol);
 }
 
 function CreateWebSocketWithAsciiSep(asciiWithSep) {
     IsWebSocket();
-    __URL = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
-    wsocket = new WebSocket(__URL, asciiWithSep);
+    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+    wsocket = new WebSocket(url, asciiWithSep);
 }
 
 function CreateWebSocketWithBlockedPort(blockedPort) {
     IsWebSocket();
-    __URL = "wss://" + __SERVER__NAME + ":" + blockedPort + "/" + __PATH;
-    wsocket = new WebSocket(__URL);
+    var url = "wss://" + __SERVER__NAME + ":" + blockedPort + "/" + __PATH;
+    wsocket = new WebSocket(url);
 }
 
 function CreateWebSocketWithSpaceInUrl(urlWithSpace) {
     IsWebSocket();
-    __URL = "ws://" + urlWithSpace + ":" + __PORT + "/" + __PATH;
-    wsocket = new WebSocket(__URL);
+    var url = "ws://" + urlWithSpace + ":" + __PORT + "/" + __PATH;
+    wsocket = new WebSocket(url);
 }
 
 function CreateWebSocketWithSpaceInProtocol(protocolWithSpace) {
     IsWebSocket();
-    __URL = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
-    wsocket = new WebSocket(__URL, protocolWithSpace);
+    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+    wsocket = new WebSocket(url, protocolWithSpace);
 }
 
 function CreateWebSocketWithRepeatedProtocols() {
     IsWebSocket();
-    __URL = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
-    wsocket = new WebSocket(__URL, __REPEATED__PROTOCOLS);
+    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+    wsocket = new WebSocket(url, ["echo", "echo"]);
 }
 
 function CreateWebSocketWithRepeatedProtocolsCaseInsensitive() {
     IsWebSocket();
-    __URL = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
-    wsocket = new WebSocket(__URL, __REPEATED__PROTOCOLS_CASE_INSENSITIVE);
+    var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+    wsocket = new WebSocket(url, ["echo", "eCho"]);
 }
 
 function CreateWebSocket(isSecure, isProtocol, isProtocols) {
     IsWebSocket();
+    var url;
     if (isSecure) {
         if (__SECURE__PORT === null) {
             throw new Error("wss not yet supported");
         }
-        __URL = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/" + __PATH;
+        url = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/" + __PATH;
     }
     else {
-        __URL = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+        url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
     }
 
     if (isProtocol) {
-        wsocket = new WebSocket(__URL, __PROTOCOL);
+        wsocket = new WebSocket(url, "echo");
     }
     else if (isProtocols) {
-        wsocket = new WebSocket(__URL, __PROTOCOLS);
+        wsocket = new WebSocket(url, ["echo", "chat"]);
     }
     else {
-        wsocket = new WebSocket(__URL);
+        wsocket = new WebSocket(url);
     }
     return wsocket;
 }
 
 function CreateControlWebSocket(isSecure) {
     IsWebSocket();
+    var url;
     if (isSecure) {
-        __URL = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/" + __CONTROLPATH;
+        url = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/control";
     }
     else {
-        __URL = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __CONTROLPATH;
+        url = "ws://" + __SERVER__NAME + ":" + __PORT + "/control";
     }
 
-    csocket = new WebSocket(__URL);
-    return csocket;
+    return new WebSocket(url);
 }
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webstorage/OWNERS
@@ -0,0 +1,9 @@
+@siusin
+@inexorabletash
+@zqzhang
+@chunywang
+@kangxu
+@plehegar
+@ibelem
+@jdm
+@Ms2ger
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/workers/OWNERS
@@ -0,0 +1,6 @@
+@zqzhang
+@chunywang
+@zcorpan
+@caitp
+@Ms2ger
+@jdm
deleted file mode 100644
--- a/testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/001.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-try {
-  importScripts();
-  postMessage(true);
-} catch(ex) {
-  postMessage(String(ex));
-}
-/*
--->
-<!doctype html>
-<title>importScripts no arguments</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-async_test(function() {
-  var worker = new Worker('#');
-  worker.onmessage = this.step_func(function(e) {
-    assert_true(e.data);
-    this.done();
-  });
-});
-</script>
-<!--
-*/
-//-->
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/001.worker.js
@@ -0,0 +1,7 @@
+importScripts("/resources/testharness.js");
+
+test(function() {
+  importScripts();
+});
+
+done();
deleted file mode 100644
--- a/testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/002.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-var ran = false;
-var threw = false;
-var code = undefined;
-try {
-  importScripts('data:text/javascript,ran=true','http://foo bar');
-} catch(e) {
-  threw = true;
-  code = e.code;
-}
-postMessage([ran, threw, code]);
-/*
--->
-<!doctype html>
-<title>importScripts resolving urls</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-async_test(function() {
-  var worker = new Worker('#');
-  worker.onmessage = this.step_func(function(e) {
-    assert_false(e.data[0], 'first argument to importScripts ran');
-    assert_true(e.data[1], 'space in URL in second argument to importScripts did not throw');
-    assert_equals(e.data[2], 12, 'exception code');
-    this.done();
-  });
-});
-</script>
-<!--
-*/
-//-->
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/workers/interfaces/WorkerUtils/importScripts/002.worker.js
@@ -0,0 +1,11 @@
+importScripts("/resources/testharness.js");
+
+test(function() {
+  var ran = false;
+  assert_throws("SyntaxError", function() {
+    importScripts('data:text/javascript,ran=true','http://foo bar');
+  });
+  assert_false(ran, 'first argument to importScripts ran');
+});
+
+done();