Bug 1274534 - Update web-platform-tests to revision e806420984568cd76da78de27c832b0a927d9fc6, a=testonly
authorJames Graham <james@hoppipolla.co.uk>
Wed, 18 May 2016 13:59:19 +0100
changeset 337702 2237bf2fabe9e653638864968333f3e7e5adfeb7
parent 337641 df5daa1095f2d2b0c71c6f50f308dc9e2daa8c13
child 337703 4f5edd9b7e54ac1cbaa86424765fc4f41b1b3264
push id6249
push userjlund@mozilla.com
push dateMon, 01 Aug 2016 13:59:36 +0000
treeherdermozilla-beta@bad9d4f5bf7e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstestonly
bugs1274534
milestone49.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 1274534 - Update web-platform-tests to revision e806420984568cd76da78de27c832b0a927d9fc6, a=testonly MozReview-Commit-ID: 1KVr5OLKI3
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/mozilla-sync
testing/web-platform/tests/DOM-parsing/createContextualFragment.html
testing/web-platform/tests/DOM-parsing/innerhtml-01.xhtml
testing/web-platform/tests/DOM-parsing/innerhtml-03.xhtml
testing/web-platform/tests/DOM-parsing/innerhtml-04.html
testing/web-platform/tests/DOM-parsing/innerhtml-05.xhtml
testing/web-platform/tests/DOM-parsing/innerhtml-06.html
testing/web-platform/tests/DOM-parsing/innerhtml-07.html
testing/web-platform/tests/DOM-parsing/insert_adjacent_html.html
testing/web-platform/tests/DOM-parsing/insert_adjacent_html.js
testing/web-platform/tests/DOM-parsing/insert_adjacent_html.xhtml
testing/web-platform/tests/DOM-parsing/outerhtml-01.html
testing/web-platform/tests/DOM-parsing/outerhtml-02.html
testing/web-platform/tests/DOM-parsing/xml-serialization.xhtml
testing/web-platform/tests/battery-status/battery-promise.html
testing/web-platform/tests/battery-status/support-iframe.html
testing/web-platform/tests/battery-status/support-window-open.html
testing/web-platform/tests/custom-elements/custom-elements-registry/define.html
testing/web-platform/tests/dom/events/Event-dispatch-bubbles-true.html
testing/web-platform/tests/dom/events/Event-dispatch-detached-click.html
testing/web-platform/tests/dom/events/Event-dispatch-multiple-stopPropagation.html
testing/web-platform/tests/dom/events/Event-dispatch-order.html
testing/web-platform/tests/dom/events/Event-dispatch-throwing.html
testing/web-platform/tests/dom/events/Event-init-while-dispatching.html
testing/web-platform/tests/dom/events/Event-subclasses-constructors.html
testing/web-platform/tests/dom/events/EventListener-handleEvent.html
testing/web-platform/tests/dom/events/EventListenerOptions-capture.html
testing/web-platform/tests/dom/lists/DOMTokenList-coverage-for-attributes.html
testing/web-platform/tests/domparsing/createContextualFragment.html
testing/web-platform/tests/domparsing/innerhtml-01.xhtml
testing/web-platform/tests/domparsing/innerhtml-03.xhtml
testing/web-platform/tests/domparsing/innerhtml-04.html
testing/web-platform/tests/domparsing/innerhtml-05.xhtml
testing/web-platform/tests/domparsing/innerhtml-06.html
testing/web-platform/tests/domparsing/innerhtml-07.html
testing/web-platform/tests/domparsing/insert_adjacent_html.html
testing/web-platform/tests/domparsing/insert_adjacent_html.js
testing/web-platform/tests/domparsing/insert_adjacent_html.xhtml
testing/web-platform/tests/domparsing/outerhtml-01.html
testing/web-platform/tests/domparsing/outerhtml-02.html
testing/web-platform/tests/domparsing/xml-serialization.xhtml
testing/web-platform/tests/hr-time/basic.html
testing/web-platform/tests/hr-time/test_cross_frame_start.html
testing/web-platform/tests/html/dom/interfaces.html
testing/web-platform/tests/html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html
testing/web-platform/tests/html/rendering/non-replaced-elements/flow-content-0/div-align.html
testing/web-platform/tests/html/resources/common.js
testing/web-platform/tests/html/semantics/forms/form-control-infrastructure/form.html
testing/web-platform/tests/html/semantics/forms/the-input-element/checkbox.html
testing/web-platform/tests/html/semantics/forms/the-input-element/radio.html
testing/web-platform/tests/html/semantics/forms/the-input-element/selection.html
testing/web-platform/tests/html/semantics/forms/the-label-element/label-attributes.html
testing/web-platform/tests/performance-timeline/po-disconnect.html
testing/web-platform/tests/shadow-dom/leaktests/get-elements.html
testing/web-platform/tests/shadow-dom/leaktests/window-frames.html
testing/web-platform/tests/streams/OWNERS
testing/web-platform/tests/streams/byte-length-queuing-strategy.https.html
testing/web-platform/tests/streams/count-queuing-strategy.https.html
testing/web-platform/tests/uievents/ClickFakeEvent.nondocument.html
testing/web-platform/tests/uievents/constructors/constructors.html
testing/web-platform/tests/uievents/legacy-domevents-tests/approved/DOM.event.flow.html
testing/web-platform/tests/uievents/legacy-domevents-tests/approved/EventListener.eventHandler.html
testing/web-platform/tests/uievents/legacy-domevents-tests/approved/EventObject.multiple.dispatchEvent.html
testing/web-platform/tests/uievents/order-of-events/event-phases-order.html
testing/web-platform/tests/uievents/order-of-events/init-event-while-dispatching.html
testing/web-platform/tests/uievents/throwing-in-listener-and-window-error-event.html
testing/web-platform/tests/uievents/throwing-in-listener-when-all-have-not-run-yet.html
testing/web-platform/tests/url/setters_tests.json
testing/web-platform/tests/url/url-setters.html
testing/web-platform/tests/web-animations/README.md
testing/web-platform/tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html
testing/web-platform/tests/webauthn/OWNERS
testing/web-platform/tests/websockets/interfaces/CloseEvent/historical.html
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -4685,16 +4685,26 @@
           [
             "/html/rendering/bindings/the-textarea-element-0/textarea-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/bindings/the-textarea-element-0/rows-zero.html"
       },
       {
+        "path": "html/rendering/non-replaced-elements/flow-content-0/div-align.html",
+        "references": [
+          [
+            "/html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html",
+            "=="
+          ]
+        ],
+        "url": "/html/rendering/non-replaced-elements/flow-content-0/div-align.html"
+      },
+      {
         "path": "html/rendering/non-replaced-elements/flow-content-0/figure.html",
         "references": [
           [
             "/html/rendering/non-replaced-elements/flow-content-0/figure-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/non-replaced-elements/flow-content-0/figure.html"
@@ -11133,64 +11143,16 @@
         "path": "2dcontext/transformations/2d.transformation.translate.basic.html",
         "url": "/2dcontext/transformations/2d.transformation.translate.basic.html"
       },
       {
         "path": "2dcontext/transformations/2d.transformation.translate.nonfinite.html",
         "url": "/2dcontext/transformations/2d.transformation.translate.nonfinite.html"
       },
       {
-        "path": "DOM-parsing/createContextualFragment.html",
-        "url": "/DOM-parsing/createContextualFragment.html"
-      },
-      {
-        "path": "DOM-parsing/innerhtml-01.xhtml",
-        "url": "/DOM-parsing/innerhtml-01.xhtml"
-      },
-      {
-        "path": "DOM-parsing/innerhtml-03.xhtml",
-        "url": "/DOM-parsing/innerhtml-03.xhtml"
-      },
-      {
-        "path": "DOM-parsing/innerhtml-04.html",
-        "url": "/DOM-parsing/innerhtml-04.html"
-      },
-      {
-        "path": "DOM-parsing/innerhtml-05.xhtml",
-        "url": "/DOM-parsing/innerhtml-05.xhtml"
-      },
-      {
-        "path": "DOM-parsing/innerhtml-06.html",
-        "url": "/DOM-parsing/innerhtml-06.html"
-      },
-      {
-        "path": "DOM-parsing/innerhtml-07.html",
-        "url": "/DOM-parsing/innerhtml-07.html"
-      },
-      {
-        "path": "DOM-parsing/insert_adjacent_html.html",
-        "url": "/DOM-parsing/insert_adjacent_html.html"
-      },
-      {
-        "path": "DOM-parsing/insert_adjacent_html.xhtml",
-        "url": "/DOM-parsing/insert_adjacent_html.xhtml"
-      },
-      {
-        "path": "DOM-parsing/outerhtml-01.html",
-        "url": "/DOM-parsing/outerhtml-01.html"
-      },
-      {
-        "path": "DOM-parsing/outerhtml-02.html",
-        "url": "/DOM-parsing/outerhtml-02.html"
-      },
-      {
-        "path": "DOM-parsing/xml-serialization.xhtml",
-        "url": "/DOM-parsing/xml-serialization.xhtml"
-      },
-      {
         "path": "FileAPI/FileReader/Progress_event_bubbles_cancelable.html",
         "url": "/FileAPI/FileReader/Progress_event_bubbles_cancelable.html"
       },
       {
         "path": "FileAPI/FileReaderSync.worker.js",
         "url": "/FileAPI/FileReaderSync.worker"
       },
       {
@@ -12018,17 +11980,17 @@
         "url": "/IndexedDB/idbobjectstore_createIndex12.htm"
       },
       {
         "path": "IndexedDB/idbobjectstore_createIndex13.htm",
         "url": "/IndexedDB/idbobjectstore_createIndex13.htm"
       },
       {
         "path": "IndexedDB/idbobjectstore_createIndex14-exception_order.htm",
-        "url": "IndexedDB/idbobjectstore_createIndex14-exception_order.htm"
+        "url": "/IndexedDB/idbobjectstore_createIndex14-exception_order.htm"
       },
       {
         "path": "IndexedDB/idbobjectstore_createIndex2.htm",
         "url": "/IndexedDB/idbobjectstore_createIndex2.htm"
       },
       {
         "path": "IndexedDB/idbobjectstore_createIndex4-deleteIndex-event_order.htm",
         "url": "/IndexedDB/idbobjectstore_createIndex4-deleteIndex-event_order.htm"
@@ -13853,16 +13815,20 @@
         "path": "cssom-view/negativeMargins.html",
         "url": "/cssom-view/negativeMargins.html"
       },
       {
         "path": "cssom-view/scrollingElement.html",
         "url": "/cssom-view/scrollingElement.html"
       },
       {
+        "path": "custom-elements/custom-elements-registry/define.html",
+        "url": "/custom-elements/custom-elements-registry/define.html"
+      },
+      {
         "path": "custom-elements/v0/concepts/custom-elements-type-naming.html",
         "url": "/custom-elements/v0/concepts/custom-elements-type-naming.html"
       },
       {
         "path": "custom-elements/v0/creating-and-passing-registries/new-registry-test.html",
         "url": "/custom-elements/v0/creating-and-passing-registries/new-registry-test.html"
       },
       {
@@ -14117,24 +14083,40 @@
         "path": "dom/events/Event-defaultPrevented.html",
         "url": "/dom/events/Event-defaultPrevented.html"
       },
       {
         "path": "dom/events/Event-dispatch-bubbles-false.html",
         "url": "/dom/events/Event-dispatch-bubbles-false.html"
       },
       {
+        "path": "dom/events/Event-dispatch-bubbles-true.html",
+        "url": "/dom/events/Event-dispatch-bubbles-true.html"
+      },
+      {
+        "path": "dom/events/Event-dispatch-detached-click.html",
+        "url": "/dom/events/Event-dispatch-detached-click.html"
+      },
+      {
         "path": "dom/events/Event-dispatch-handlers-changed.html",
         "url": "/dom/events/Event-dispatch-handlers-changed.html"
       },
       {
+        "path": "dom/events/Event-dispatch-multiple-stopPropagation.html",
+        "url": "/dom/events/Event-dispatch-multiple-stopPropagation.html"
+      },
+      {
         "path": "dom/events/Event-dispatch-omitted-capture.html",
         "url": "/dom/events/Event-dispatch-omitted-capture.html"
       },
       {
+        "path": "dom/events/Event-dispatch-order.html",
+        "url": "/dom/events/Event-dispatch-order.html"
+      },
+      {
         "path": "dom/events/Event-dispatch-propagation-stopped.html",
         "url": "/dom/events/Event-dispatch-propagation-stopped.html"
       },
       {
         "path": "dom/events/Event-dispatch-redispatch.html",
         "url": "/dom/events/Event-dispatch-redispatch.html"
       },
       {
@@ -14145,32 +14127,56 @@
         "path": "dom/events/Event-dispatch-target-moved.html",
         "url": "/dom/events/Event-dispatch-target-moved.html"
       },
       {
         "path": "dom/events/Event-dispatch-target-removed.html",
         "url": "/dom/events/Event-dispatch-target-removed.html"
       },
       {
+        "path": "dom/events/Event-dispatch-throwing.html",
+        "url": "/dom/events/Event-dispatch-throwing.html"
+      },
+      {
+        "path": "dom/events/Event-init-while-dispatching.html",
+        "url": "/dom/events/Event-init-while-dispatching.html"
+      },
+      {
         "path": "dom/events/Event-initEvent.html",
         "url": "/dom/events/Event-initEvent.html"
       },
       {
         "path": "dom/events/Event-propagation.html",
         "url": "/dom/events/Event-propagation.html"
       },
       {
+        "path": "dom/events/Event-subclasses-constructors.html",
+        "url": "/dom/events/Event-subclasses-constructors.html"
+      },
+      {
         "path": "dom/events/Event-type-empty.html",
         "url": "/dom/events/Event-type-empty.html"
       },
       {
         "path": "dom/events/Event-type.html",
         "url": "/dom/events/Event-type.html"
       },
       {
+        "path": "dom/events/EventListener-handleEvent.html",
+        "url": "/dom/events/EventListener-handleEvent.html"
+      },
+      {
+        "path": "dom/events/EventListener-incumbent-global.sub.html",
+        "url": "/dom/events/EventListener-incumbent-global.sub.html"
+      },
+      {
+        "path": "dom/events/EventListenerOptions-capture.html",
+        "url": "/dom/events/EventListenerOptions-capture.html"
+      },
+      {
         "path": "dom/events/EventTarget-addEventListener.html",
         "url": "/dom/events/EventTarget-addEventListener.html"
       },
       {
         "path": "dom/events/EventTarget-dispatchEvent-returnvalue.html",
         "url": "/dom/events/EventTarget-dispatchEvent-returnvalue.html"
       },
       {
@@ -14997,20 +15003,68 @@
         "path": "domparsing/DOMParser-parseFromString-xml.html",
         "url": "/domparsing/DOMParser-parseFromString-xml.html"
       },
       {
         "path": "domparsing/XMLSerializer-serializeToString.html",
         "url": "/domparsing/XMLSerializer-serializeToString.html"
       },
       {
+        "path": "domparsing/createContextualFragment.html",
+        "url": "/domparsing/createContextualFragment.html"
+      },
+      {
+        "path": "domparsing/innerhtml-01.xhtml",
+        "url": "/domparsing/innerhtml-01.xhtml"
+      },
+      {
+        "path": "domparsing/innerhtml-03.xhtml",
+        "url": "/domparsing/innerhtml-03.xhtml"
+      },
+      {
+        "path": "domparsing/innerhtml-04.html",
+        "url": "/domparsing/innerhtml-04.html"
+      },
+      {
+        "path": "domparsing/innerhtml-05.xhtml",
+        "url": "/domparsing/innerhtml-05.xhtml"
+      },
+      {
+        "path": "domparsing/innerhtml-06.html",
+        "url": "/domparsing/innerhtml-06.html"
+      },
+      {
+        "path": "domparsing/innerhtml-07.html",
+        "url": "/domparsing/innerhtml-07.html"
+      },
+      {
         "path": "domparsing/insert-adjacent.html",
         "url": "/domparsing/insert-adjacent.html"
       },
       {
+        "path": "domparsing/insert_adjacent_html.html",
+        "url": "/domparsing/insert_adjacent_html.html"
+      },
+      {
+        "path": "domparsing/insert_adjacent_html.xhtml",
+        "url": "/domparsing/insert_adjacent_html.xhtml"
+      },
+      {
+        "path": "domparsing/outerhtml-01.html",
+        "url": "/domparsing/outerhtml-01.html"
+      },
+      {
+        "path": "domparsing/outerhtml-02.html",
+        "url": "/domparsing/outerhtml-02.html"
+      },
+      {
+        "path": "domparsing/xml-serialization.xhtml",
+        "url": "/domparsing/xml-serialization.xhtml"
+      },
+      {
         "path": "domxpath/001.html",
         "url": "/domxpath/001.html"
       },
       {
         "path": "domxpath/002.html",
         "url": "/domxpath/002.html"
       },
       {
@@ -16093,16 +16147,20 @@
         "path": "html/browsers/browsing-the-web/navigating-across-documents/child_navigates_parent_submit.html",
         "url": "/html/browsers/browsing-the-web/navigating-across-documents/child_navigates_parent_submit.html"
       },
       {
         "path": "html/browsers/browsing-the-web/navigating-across-documents/javascript-url-query-fragment-components.html",
         "url": "/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-query-fragment-components.html"
       },
       {
+        "path": "html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html",
+        "url": "/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html"
+      },
+      {
         "path": "html/browsers/browsing-the-web/navigating-across-documents/navigation_unload_data_url.html",
         "url": "/html/browsers/browsing-the-web/navigating-across-documents/navigation_unload_data_url.html"
       },
       {
         "path": "html/browsers/browsing-the-web/navigating-across-documents/navigation_unload_same_origin.html",
         "url": "/html/browsers/browsing-the-web/navigating-across-documents/navigation_unload_same_origin.html"
       },
       {
@@ -18853,28 +18911,40 @@
         "path": "html/semantics/embedded-content/the-embed-element/embed-document.html",
         "url": "/html/semantics/embedded-content/the-embed-element/embed-document.html"
       },
       {
         "path": "html/semantics/embedded-content/the-embed-element/embed-ignored-in-media-element.html",
         "url": "/html/semantics/embedded-content/the-embed-element/embed-ignored-in-media-element.html"
       },
       {
+        "path": "html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html",
+        "url": "/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html"
+      },
+      {
         "path": "html/semantics/embedded-content/the-iframe-element/iframe-load-event.html",
         "url": "/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html"
       },
       {
         "path": "html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_01.htm",
         "url": "/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_01.htm"
       },
       {
         "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html",
         "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html"
       },
       {
+        "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html",
+        "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html"
+      },
+      {
+        "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html",
+        "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html"
+      },
+      {
         "path": "html/semantics/embedded-content/the-iframe-element/move_iframe_in_dom_01.html",
         "url": "/html/semantics/embedded-content/the-iframe-element/move_iframe_in_dom_01.html"
       },
       {
         "path": "html/semantics/embedded-content/the-iframe-element/move_iframe_in_dom_02.html",
         "url": "/html/semantics/embedded-content/the-iframe-element/move_iframe_in_dom_02.html"
       },
       {
@@ -28425,20 +28495,28 @@
         "path": "shadow-dom/Node-prototype-cloneNode.html",
         "url": "/shadow-dom/Node-prototype-cloneNode.html"
       },
       {
         "path": "shadow-dom/ShadowRoot-interface.html",
         "url": "/shadow-dom/ShadowRoot-interface.html"
       },
       {
+        "path": "shadow-dom/leaktests/get-elements.html",
+        "url": "/shadow-dom/leaktests/get-elements.html"
+      },
+      {
         "path": "shadow-dom/leaktests/html-collection.html",
         "url": "/shadow-dom/leaktests/html-collection.html"
       },
       {
+        "path": "shadow-dom/leaktests/window-frames.html",
+        "url": "/shadow-dom/leaktests/window-frames.html"
+      },
+      {
         "path": "shadow-dom/untriaged/elements-and-dom-objects/extensions-to-element-interface/attributes/test-006.html",
         "url": "/shadow-dom/untriaged/elements-and-dom-objects/extensions-to-element-interface/attributes/test-006.html"
       },
       {
         "path": "shadow-dom/untriaged/elements-and-dom-objects/extensions-to-element-interface/methods/test-001.html",
         "url": "/shadow-dom/untriaged/elements-and-dom-objects/extensions-to-element-interface/methods/test-001.html"
       },
       {
@@ -28809,36 +28887,16 @@
         "path": "typedarrays/Uint8ClampedArray_subarray.html",
         "url": "/typedarrays/Uint8ClampedArray_subarray.html"
       },
       {
         "path": "typedarrays/constructors.html",
         "url": "/typedarrays/constructors.html"
       },
       {
-        "path": "uievents/ClickFakeEvent.nondocument.html",
-        "url": "/uievents/ClickFakeEvent.nondocument.html"
-      },
-      {
-        "path": "uievents/constructors/constructors.html",
-        "url": "/uievents/constructors/constructors.html"
-      },
-      {
-        "path": "uievents/legacy-domevents-tests/approved/DOM.event.flow.html",
-        "url": "/uievents/legacy-domevents-tests/approved/DOM.event.flow.html"
-      },
-      {
-        "path": "uievents/legacy-domevents-tests/approved/EventListener.eventHandler.html",
-        "url": "/uievents/legacy-domevents-tests/approved/EventListener.eventHandler.html"
-      },
-      {
-        "path": "uievents/legacy-domevents-tests/approved/EventObject.multiple.dispatchEvent.html",
-        "url": "/uievents/legacy-domevents-tests/approved/EventObject.multiple.dispatchEvent.html"
-      },
-      {
         "path": "uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html",
         "url": "/uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html"
       },
       {
         "path": "uievents/legacy-domevents-tests/approved/dispatchEvent.click.checkbox.html",
         "url": "/uievents/legacy-domevents-tests/approved/dispatchEvent.click.checkbox.html"
       },
       {
@@ -28853,32 +28911,16 @@
         "path": "uievents/legacy-domevents-tests/approved/stopPropagation.deferred.effect.html",
         "url": "/uievents/legacy-domevents-tests/approved/stopPropagation.deferred.effect.html"
       },
       {
         "path": "uievents/legacy-domevents-tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html",
         "url": "/uievents/legacy-domevents-tests/submissions/Microsoft/converted/EventListener.dispatch.new.event.html"
       },
       {
-        "path": "uievents/order-of-events/event-phases-order.html",
-        "url": "/uievents/order-of-events/event-phases-order.html"
-      },
-      {
-        "path": "uievents/order-of-events/init-event-while-dispatching.html",
-        "url": "/uievents/order-of-events/init-event-while-dispatching.html"
-      },
-      {
-        "path": "uievents/throwing-in-listener-and-window-error-event.html",
-        "url": "/uievents/throwing-in-listener-and-window-error-event.html"
-      },
-      {
-        "path": "uievents/throwing-in-listener-when-all-have-not-run-yet.html",
-        "url": "/uievents/throwing-in-listener-when-all-have-not-run-yet.html"
-      },
-      {
         "path": "url/a-element-xhtml.xhtml",
         "url": "/url/a-element-xhtml.xhtml"
       },
       {
         "path": "url/a-element.html",
         "url": "/url/a-element.html"
       },
       {
@@ -28893,16 +28935,20 @@
         "path": "url/interfaces.html",
         "url": "/url/interfaces.html"
       },
       {
         "path": "url/url-constructor.html",
         "url": "/url/url-constructor.html"
       },
       {
+        "path": "url/url-setters.html",
+        "url": "/url/url-setters.html"
+      },
+      {
         "path": "url/urlsearchparams-append.html",
         "url": "/url/urlsearchparams-append.html"
       },
       {
         "path": "url/urlsearchparams-constructor.html",
         "url": "/url/urlsearchparams-constructor.html"
       },
       {
@@ -28989,162 +29035,162 @@
         "path": "vibration/invalid-values.html",
         "url": "/vibration/invalid-values.html"
       },
       {
         "path": "vibration/silent-ignore.html",
         "url": "/vibration/silent-ignore.html"
       },
       {
-        "path": "web-animations/animatable/animate.html",
-        "url": "/web-animations/animatable/animate.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/delay.html",
-        "url": "/web-animations/animation-effect-timing/delay.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/direction.html",
-        "url": "/web-animations/animation-effect-timing/direction.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/duration.html",
-        "url": "/web-animations/animation-effect-timing/duration.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/easing.html",
-        "url": "/web-animations/animation-effect-timing/easing.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/endDelay.html",
-        "url": "/web-animations/animation-effect-timing/endDelay.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/fill.html",
-        "url": "/web-animations/animation-effect-timing/fill.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/getAnimations.html",
-        "url": "/web-animations/animation-effect-timing/getAnimations.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/getComputedStyle.html",
-        "url": "/web-animations/animation-effect-timing/getComputedStyle.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/iterationStart.html",
-        "url": "/web-animations/animation-effect-timing/iterationStart.html"
-      },
-      {
-        "path": "web-animations/animation-effect-timing/iterations.html",
-        "url": "/web-animations/animation-effect-timing/iterations.html"
-      },
-      {
         "path": "web-animations/animation-model/animation-types/discrete-animation.html",
         "url": "/web-animations/animation-model/animation-types/discrete-animation.html"
       },
       {
-        "path": "web-animations/animation-model/animation-types/not-animatable.html",
-        "url": "/web-animations/animation-model/animation-types/not-animatable.html"
-      },
-      {
-        "path": "web-animations/animation-model/keyframes/effect-value-context.html",
-        "url": "/web-animations/animation-model/keyframes/effect-value-context.html"
-      },
-      {
-        "path": "web-animations/animation-timeline/document-timeline.html",
-        "url": "/web-animations/animation-timeline/document-timeline.html"
-      },
-      {
-        "path": "web-animations/animation-timeline/idlharness.html",
-        "url": "/web-animations/animation-timeline/idlharness.html"
-      },
-      {
-        "path": "web-animations/animation/cancel.html",
-        "url": "/web-animations/animation/cancel.html"
-      },
-      {
-        "path": "web-animations/animation/constructor.html",
-        "url": "/web-animations/animation/constructor.html"
-      },
-      {
-        "path": "web-animations/animation/finish.html",
-        "url": "/web-animations/animation/finish.html"
-      },
-      {
-        "path": "web-animations/animation/finished.html",
-        "url": "/web-animations/animation/finished.html"
-      },
-      {
-        "path": "web-animations/animation/id.html",
-        "url": "/web-animations/animation/id.html"
-      },
-      {
-        "path": "web-animations/animation/oncancel.html",
-        "url": "/web-animations/animation/oncancel.html"
-      },
-      {
-        "path": "web-animations/animation/onfinish.html",
-        "url": "/web-animations/animation/onfinish.html"
-      },
-      {
-        "path": "web-animations/animation/pause.html",
-        "url": "/web-animations/animation/pause.html"
-      },
-      {
-        "path": "web-animations/animation/play.html",
-        "url": "/web-animations/animation/play.html"
-      },
-      {
-        "path": "web-animations/animation/playState.html",
-        "url": "/web-animations/animation/playState.html"
-      },
-      {
-        "path": "web-animations/animation/playbackRate.html",
-        "url": "/web-animations/animation/playbackRate.html"
-      },
-      {
-        "path": "web-animations/animation/ready.html",
-        "url": "/web-animations/animation/ready.html"
-      },
-      {
-        "path": "web-animations/animation/reverse.html",
-        "url": "/web-animations/animation/reverse.html"
-      },
-      {
-        "path": "web-animations/animation/startTime.html",
-        "url": "/web-animations/animation/startTime.html"
-      },
-      {
-        "path": "web-animations/document/getAnimations.html",
-        "url": "/web-animations/document/getAnimations.html"
-      },
-      {
-        "path": "web-animations/keyframe-effect/constructor.html",
-        "url": "/web-animations/keyframe-effect/constructor.html"
-      },
-      {
-        "path": "web-animations/keyframe-effect/effect-easing.html",
-        "url": "/web-animations/keyframe-effect/effect-easing.html"
-      },
-      {
-        "path": "web-animations/keyframe-effect/getComputedTiming.html",
-        "url": "/web-animations/keyframe-effect/getComputedTiming.html"
-      },
-      {
-        "path": "web-animations/keyframe-effect/keyframe-handling.html",
-        "url": "/web-animations/keyframe-effect/keyframe-handling.html"
-      },
-      {
-        "path": "web-animations/keyframe-effect/setFrames.html",
-        "url": "/web-animations/keyframe-effect/setFrames.html"
-      },
-      {
-        "path": "web-animations/keyframe-effect/setTarget.html",
-        "url": "/web-animations/keyframe-effect/setTarget.html"
+        "path": "web-animations/animation-model/keyframe-effects/effect-value-context.html",
+        "url": "/web-animations/animation-model/keyframe-effects/effect-value-context.html"
+      },
+      {
+        "path": "web-animations/animation-model/keyframe-effects/the-effect-value-of-a-keyframe-effect.html",
+        "url": "/web-animations/animation-model/keyframe-effects/the-effect-value-of-a-keyframe-effect.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animatable/animate.html",
+        "url": "/web-animations/interfaces/Animatable/animate.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/cancel.html",
+        "url": "/web-animations/interfaces/Animation/cancel.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/constructor.html",
+        "url": "/web-animations/interfaces/Animation/constructor.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/finish.html",
+        "url": "/web-animations/interfaces/Animation/finish.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/finished.html",
+        "url": "/web-animations/interfaces/Animation/finished.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/id.html",
+        "url": "/web-animations/interfaces/Animation/id.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/oncancel.html",
+        "url": "/web-animations/interfaces/Animation/oncancel.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/onfinish.html",
+        "url": "/web-animations/interfaces/Animation/onfinish.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/pause.html",
+        "url": "/web-animations/interfaces/Animation/pause.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/play.html",
+        "url": "/web-animations/interfaces/Animation/play.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/playState.html",
+        "url": "/web-animations/interfaces/Animation/playState.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/playbackRate.html",
+        "url": "/web-animations/interfaces/Animation/playbackRate.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/ready.html",
+        "url": "/web-animations/interfaces/Animation/ready.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/reverse.html",
+        "url": "/web-animations/interfaces/Animation/reverse.html"
+      },
+      {
+        "path": "web-animations/interfaces/Animation/startTime.html",
+        "url": "/web-animations/interfaces/Animation/startTime.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/delay.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/delay.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/direction.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/direction.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/duration.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/duration.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/easing.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/easing.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/endDelay.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/endDelay.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/fill.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/fill.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/getAnimations.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/getAnimations.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/iterationStart.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/iterationStart.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationEffectTiming/iterations.html",
+        "url": "/web-animations/interfaces/AnimationEffectTiming/iterations.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationTimeline/document-timeline.html",
+        "url": "/web-animations/interfaces/AnimationTimeline/document-timeline.html"
+      },
+      {
+        "path": "web-animations/interfaces/AnimationTimeline/idlharness.html",
+        "url": "/web-animations/interfaces/AnimationTimeline/idlharness.html"
+      },
+      {
+        "path": "web-animations/interfaces/Document/getAnimations.html",
+        "url": "/web-animations/interfaces/Document/getAnimations.html"
+      },
+      {
+        "path": "web-animations/interfaces/KeyframeEffect/constructor.html",
+        "url": "/web-animations/interfaces/KeyframeEffect/constructor.html"
+      },
+      {
+        "path": "web-animations/interfaces/KeyframeEffect/effect-easing.html",
+        "url": "/web-animations/interfaces/KeyframeEffect/effect-easing.html"
+      },
+      {
+        "path": "web-animations/interfaces/KeyframeEffect/getComputedTiming.html",
+        "url": "/web-animations/interfaces/KeyframeEffect/getComputedTiming.html"
+      },
+      {
+        "path": "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html",
+        "url": "/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html"
+      },
+      {
+        "path": "web-animations/interfaces/KeyframeEffect/setKeyframes.html",
+        "url": "/web-animations/interfaces/KeyframeEffect/setKeyframes.html"
+      },
+      {
+        "path": "web-animations/interfaces/KeyframeEffect/setTarget.html",
+        "url": "/web-animations/interfaces/KeyframeEffect/setTarget.html"
       },
       {
         "path": "web-animations/timing-model/animation-effects/active-time.html",
         "url": "/web-animations/timing-model/animation-effects/active-time.html"
       },
       {
         "path": "web-animations/timing-model/animation-effects/current-iteration.html",
         "url": "/web-animations/timing-model/animation-effects/current-iteration.html"
@@ -35934,52 +35980,17 @@
       {
         "path": "webdriver/navigation.py",
         "url": "/webdriver/navigation.py"
       }
     ]
   },
   "local_changes": {
     "deleted": [
-      "web-animations/animation/onfinish.html",
-      "web-animations/animation-effect-timing/getComputedStyle.html",
-      "web-animations/animation-model/animation-types/not-animatable.html",
-      "web-animations/animation/ready.html",
-      "web-animations/keyframe-effect/setFrames.html",
-      "web-animations/animation-model/keyframes/effect-value-context.html",
-      "web-animations/keyframe-effect/getComputedTiming.html",
-      "web-animations/keyframe-effect/effect-easing.html",
-      "web-animations/animation/pause.html",
-      "web-animations/animation-effect-timing/delay.html",
-      "web-animations/animation-effect-timing/direction.html",
-      "web-animations/animation-effect-timing/duration.html",
-      "web-animations/animatable/animate.html",
-      "web-animations/document/getAnimations.html",
-      "web-animations/animation/id.html",
-      "web-animations/animation/cancel.html",
-      "web-animations/animation/reverse.html",
-      "web-animations/keyframe-effect/setTarget.html",
-      "web-animations/animation-effect-timing/getAnimations.html",
-      "web-animations/animation/playState.html",
-      "web-animations/animation/constructor.html",
-      "web-animations/animation/play.html",
-      "web-animations/animation-effect-timing/iterationStart.html",
-      "web-animations/animation/startTime.html",
-      "web-animations/animation-timeline/document-timeline.html",
-      "web-animations/animation/finished.html",
-      "web-animations/animation-effect-timing/endDelay.html",
-      "web-animations/animation-effect-timing/iterations.html",
-      "web-animations/animation-effect-timing/fill.html",
-      "web-animations/animation-effect-timing/easing.html",
-      "web-animations/animation/oncancel.html",
-      "web-animations/animation/finish.html",
-      "web-animations/keyframe-effect/constructor.html",
-      "web-animations/animation-timeline/idlharness.html",
-      "web-animations/animation/playbackRate.html",
-      "web-animations/keyframe-effect/keyframe-handling.html"
+      "dom/events/EventListener-incumbent-global.sub.html"
     ],
     "deleted_reftests": {},
     "items": {
       "testharness": {
         "XMLHttpRequest/xmlhttprequest-sync-block-defer-scripts.html": [
           {
             "path": "XMLHttpRequest/xmlhttprequest-sync-block-defer-scripts.html",
             "url": "/XMLHttpRequest/xmlhttprequest-sync-block-defer-scripts.html"
@@ -36004,262 +36015,22 @@
           }
         ],
         "dom/nodes/ProcessingInstruction-escapes-1.xhtml": [
           {
             "path": "dom/nodes/ProcessingInstruction-escapes-1.xhtml",
             "url": "/dom/nodes/ProcessingInstruction-escapes-1.xhtml"
           }
         ],
-        "html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html": [
-          {
-            "path": "html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html",
-            "url": "/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html"
-          }
-        ],
         "html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html": [
           {
             "path": "html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html",
             "url": "/html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html"
           }
         ],
-        "html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html": [
-          {
-            "path": "html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html",
-            "url": "/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html"
-          }
-        ],
-        "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html": [
-          {
-            "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html",
-            "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html"
-          }
-        ],
-        "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html": [
-          {
-            "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html",
-            "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html"
-          }
-        ],
-        "web-animations/animation-model/keyframe-effects/effect-value-context.html": [
-          {
-            "path": "web-animations/animation-model/keyframe-effects/effect-value-context.html",
-            "url": "/web-animations/animation-model/keyframe-effects/effect-value-context.html"
-          }
-        ],
-        "web-animations/animation-model/keyframe-effects/the-effect-value-of-a-keyframe-effect.html": [
-          {
-            "path": "web-animations/animation-model/keyframe-effects/the-effect-value-of-a-keyframe-effect.html",
-            "url": "/web-animations/animation-model/keyframe-effects/the-effect-value-of-a-keyframe-effect.html"
-          }
-        ],
-        "web-animations/interfaces/Animatable/animate.html": [
-          {
-            "path": "web-animations/interfaces/Animatable/animate.html",
-            "url": "/web-animations/interfaces/Animatable/animate.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/cancel.html": [
-          {
-            "path": "web-animations/interfaces/Animation/cancel.html",
-            "url": "/web-animations/interfaces/Animation/cancel.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/constructor.html": [
-          {
-            "path": "web-animations/interfaces/Animation/constructor.html",
-            "url": "/web-animations/interfaces/Animation/constructor.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/finish.html": [
-          {
-            "path": "web-animations/interfaces/Animation/finish.html",
-            "url": "/web-animations/interfaces/Animation/finish.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/finished.html": [
-          {
-            "path": "web-animations/interfaces/Animation/finished.html",
-            "url": "/web-animations/interfaces/Animation/finished.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/id.html": [
-          {
-            "path": "web-animations/interfaces/Animation/id.html",
-            "url": "/web-animations/interfaces/Animation/id.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/oncancel.html": [
-          {
-            "path": "web-animations/interfaces/Animation/oncancel.html",
-            "url": "/web-animations/interfaces/Animation/oncancel.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/onfinish.html": [
-          {
-            "path": "web-animations/interfaces/Animation/onfinish.html",
-            "url": "/web-animations/interfaces/Animation/onfinish.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/pause.html": [
-          {
-            "path": "web-animations/interfaces/Animation/pause.html",
-            "url": "/web-animations/interfaces/Animation/pause.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/play.html": [
-          {
-            "path": "web-animations/interfaces/Animation/play.html",
-            "url": "/web-animations/interfaces/Animation/play.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/playState.html": [
-          {
-            "path": "web-animations/interfaces/Animation/playState.html",
-            "url": "/web-animations/interfaces/Animation/playState.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/playbackRate.html": [
-          {
-            "path": "web-animations/interfaces/Animation/playbackRate.html",
-            "url": "/web-animations/interfaces/Animation/playbackRate.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/ready.html": [
-          {
-            "path": "web-animations/interfaces/Animation/ready.html",
-            "url": "/web-animations/interfaces/Animation/ready.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/reverse.html": [
-          {
-            "path": "web-animations/interfaces/Animation/reverse.html",
-            "url": "/web-animations/interfaces/Animation/reverse.html"
-          }
-        ],
-        "web-animations/interfaces/Animation/startTime.html": [
-          {
-            "path": "web-animations/interfaces/Animation/startTime.html",
-            "url": "/web-animations/interfaces/Animation/startTime.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/delay.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/delay.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/delay.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/direction.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/direction.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/direction.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/duration.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/duration.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/duration.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/easing.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/easing.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/easing.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/endDelay.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/endDelay.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/endDelay.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/fill.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/fill.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/fill.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/getAnimations.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/getAnimations.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/getAnimations.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/iterationStart.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/iterationStart.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/iterationStart.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationEffectTiming/iterations.html": [
-          {
-            "path": "web-animations/interfaces/AnimationEffectTiming/iterations.html",
-            "url": "/web-animations/interfaces/AnimationEffectTiming/iterations.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationTimeline/document-timeline.html": [
-          {
-            "path": "web-animations/interfaces/AnimationTimeline/document-timeline.html",
-            "url": "/web-animations/interfaces/AnimationTimeline/document-timeline.html"
-          }
-        ],
-        "web-animations/interfaces/AnimationTimeline/idlharness.html": [
-          {
-            "path": "web-animations/interfaces/AnimationTimeline/idlharness.html",
-            "url": "/web-animations/interfaces/AnimationTimeline/idlharness.html"
-          }
-        ],
-        "web-animations/interfaces/Document/getAnimations.html": [
-          {
-            "path": "web-animations/interfaces/Document/getAnimations.html",
-            "url": "/web-animations/interfaces/Document/getAnimations.html"
-          }
-        ],
-        "web-animations/interfaces/KeyframeEffect/constructor.html": [
-          {
-            "path": "web-animations/interfaces/KeyframeEffect/constructor.html",
-            "url": "/web-animations/interfaces/KeyframeEffect/constructor.html"
-          }
-        ],
-        "web-animations/interfaces/KeyframeEffect/effect-easing.html": [
-          {
-            "path": "web-animations/interfaces/KeyframeEffect/effect-easing.html",
-            "url": "/web-animations/interfaces/KeyframeEffect/effect-easing.html"
-          }
-        ],
-        "web-animations/interfaces/KeyframeEffect/getComputedTiming.html": [
-          {
-            "path": "web-animations/interfaces/KeyframeEffect/getComputedTiming.html",
-            "url": "/web-animations/interfaces/KeyframeEffect/getComputedTiming.html"
-          }
-        ],
-        "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html": [
-          {
-            "path": "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html",
-            "url": "/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html"
-          }
-        ],
-        "web-animations/interfaces/KeyframeEffect/setKeyframes.html": [
-          {
-            "path": "web-animations/interfaces/KeyframeEffect/setKeyframes.html",
-            "url": "/web-animations/interfaces/KeyframeEffect/setKeyframes.html"
-          }
-        ],
-        "web-animations/interfaces/KeyframeEffect/setTarget.html": [
-          {
-            "path": "web-animations/interfaces/KeyframeEffect/setTarget.html",
-            "url": "/web-animations/interfaces/KeyframeEffect/setTarget.html"
-          }
-        ],
         "web-animations/timing-model/animations/current-time.html": [
           {
             "path": "web-animations/timing-model/animations/current-time.html",
             "url": "/web-animations/timing-model/animations/current-time.html"
           }
         ]
       }
     },
@@ -38445,26 +38216,26 @@
           [
             "/html/rendering/bindings/the-textarea-element-0/textarea-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/bindings/the-textarea-element-0/rows-zero.html"
       }
     ],
-    "html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html": [
-      {
-        "path": "html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html",
+    "html/rendering/non-replaced-elements/flow-content-0/div-align.html": [
+      {
+        "path": "html/rendering/non-replaced-elements/flow-content-0/div-align.html",
         "references": [
           [
             "/html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html",
             "=="
           ]
         ],
-        "url": "/html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html"
+        "url": "/html/rendering/non-replaced-elements/flow-content-0/div-align.html"
       }
     ],
     "html/rendering/non-replaced-elements/flow-content-0/figure.html": [
       {
         "path": "html/rendering/non-replaced-elements/flow-content-0/figure.html",
         "references": [
           [
             "/html/rendering/non-replaced-elements/flow-content-0/figure-ref.html",
@@ -42586,12 +42357,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": "55905788bebbdfacb49c94e579e93c19531e0199",
+  "rev": "e806420984568cd76da78de27c832b0a927d9fc6",
   "url_base": "/",
   "version": 3
 }
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,1 +1,1 @@
-a7be89195297e42f273679bcd2bbfb1518320ce1
\ No newline at end of file
+d8e6e5d0f963ae7d0d4b0388e166c9548c828dcf
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/tests/DOM-parsing/innerhtml-06.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>math in html: innerHTML</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
-<h1>math in html: innerHTML</h1>
-<div id="log"></div>
-<div style="display:none">
-<div id="d1"><math><mi>x</mi></math></div>
-</div>
-<script>
-test(function() {
-  var math = document.getElementById("d1").firstChild;
-  assert_equals(math.innerHTML, "<mi>x</mi>");
-},"innerHTML defined on math.");
-</script>
--- a/testing/web-platform/tests/battery-status/battery-promise.html
+++ b/testing/web-platform/tests/battery-status/battery-promise.html
@@ -1,26 +1,88 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
-<title>Battery Test: navigator.getBattery() returns BatteryManager as a promise</title>
+<title>Battery Test: each Navigator object has a battery promise for BatteryManager</title>
 <link rel="author" title="YuichiNukiyama" href="https://github.com/YuichiNukiyama">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-
+<style>
+  #note {
+    background-color: #fef1b5;
+    border: solid 1px #cdab2d;
+    padding: 5px;
+    margin: 15px;
+    display: block;
+  }
+  iframe {
+    display: none;
+  }
+</style>
+<div id="note">
+  Allow pop-up windows before running the tests.
+</div>
+<div id="log"></div>
+<iframe src="about:blank"></iframe>
 <script>
-    function returnBattery() {
-        return navigator.getBattery();
-    }
+promise_test(function () {
+  return navigator.getBattery().then(function (result) {
+    assert_class_string(result, 'BatteryManager',
+        'getBattery should return BatteryManager Object.');
+  });
+}, 'navigator.getBattery() shall return BatteryManager as a promise');
+
+test(function () {
+  assert_equals(navigator.getBattery(), navigator.getBattery());
+}, 'navigator.getBattery() shall always return the same promise');
+
+promise_test(function(t) {
+  var iframe = document.querySelector('iframe');
+  var originalPromise = navigator.getBattery();
+
+  return originalPromise.then(function(originalManager) {
+    var promise = iframe.contentWindow.navigator.getBattery();
 
-    promise_test(function () {
-        return returnBattery()
-          .then(function (result) {
-              assert_class_string(result, "BatteryManager", "getBattery should return BatteryManager Object.");
-          });
-    }, "navigator.getBattery() return BatteryManager");
+    assert_true(originalManager instanceof BatteryManager);
+    assert_not_equals(iframe.contentWindow.navigator,
+        navigator,
+        'navigator objects shall be different');
+    assert_not_equals(promise,
+        originalPromise,
+        'battery promises in different navigators shall be different');
+    assert_equals(iframe.contentWindow.navigator.getBattery(),
+        promise,
+        'battery promises in same navigator shall be same');
+
+    return promise;
+  }).then(function(manager) {
+    assert_equals(manager.__proto__,
+        iframe.contentWindow.BatteryManager.prototype);
+    assert_true(manager instanceof iframe.contentWindow.BatteryManager);
+  });
+
+}, 'iframe has a different Navigator object thus getting another battery promise');
 
-    test(function () {
-        assert_equals(navigator.getBattery(), navigator.getBattery());
-    }, "navigator.getBattery() shall always return the same promise");
+async_test(function (t) {
+  var iframe = document.querySelector('iframe');
+  var originalNavigator = iframe.contentWindow.navigator;
+  var originalPromise = iframe.contentWindow.navigator.getBattery();
+
+  iframe.onload = t.step_func(function() {
+    assert_not_equals(iframe.contentWindow.navigator,
+        originalNavigator,
+        'navigator objects shall be changed');
+    assert_not_equals(iframe.contentWindow.navigator.getBattery(),
+        originalPromise,
+        'battery status promises shall be different');
+    t.done();
+  });
+  iframe.src = 'support-iframe.html';
+}, 'setting iframe\'s src makes its Navigator object vary thus getting another battery promise');
+
+async_test(function (t) {
+  var win = window.open('support-window-open.html');
+  window.onmessage = t.step_func(function(e) {
+    assert_array_equals(e.data, [false, false, true]);
+    win.close();
+    t.done();
+  });
+}, 'window.open() makes a different Navigator object thus getting another battery promise');
 </script>
-
-<div id="log"></div>
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/battery-status/support-iframe.html
@@ -0,0 +1,5 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<div>
+Hello!
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/battery-status/support-window-open.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<script>
+var data = [
+    navigator === window.opener.navigator,
+    navigator.getBattery() === window.opener.navigator.getBattery(),
+    navigator.getBattery() === navigator.getBattery()
+];
+window.opener.postMessage(data, '*');
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/custom-elements/custom-elements-registry/define.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html>
+<title>Custom Elements: Element definition</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<div id="log"></div>
+<iframe id="iframe"></iframe>
+<script>
+'use strict';
+(() =>  {
+  // Element definition
+  // https://html.spec.whatwg.org/multipage/scripting.html#element-definition
+
+  // Use window from iframe to isolate the test.
+  const testWindow = iframe.contentDocument.defaultView;
+  const customElements = testWindow.customElements;
+
+  let testable = false;
+  test(() =>  {
+    assert_true('customElements' in testWindow, '"window.customElements" exists');
+    assert_true('define' in customElements, '"window.customElements.define" exists');
+    testable = true;
+  }, '"window.customElements.define" should exists');
+  if (!testable)
+    return;
+
+  const expectTypeError = TypeError.prototype;
+  // Following errors are DOMException, not JavaScript errors.
+  const expectSyntaxError = 'SYNTAX_ERR';
+  const expectNotSupportedError = 'NOT_SUPPORTED_ERR';
+
+  // 1. If IsConstructor(constructor) is false,
+  // then throw a TypeError and abort these steps.
+  test(() =>  {
+    assert_throws(expectTypeError, () =>  {
+      customElements.define();
+    });
+  }, 'If no arguments, should throw a TypeError');
+  test(() =>  {
+    assert_throws(expectTypeError, () =>  {
+      customElements.define('test-define-one-arg');
+    });
+  }, 'If one argument, should throw a TypeError');
+  [
+    [ 'undefined', undefined ],
+    [ 'null', null ],
+    [ 'object', {} ],
+    [ 'string', 'string' ],
+    [ 'arrow function', () => {} ], // IsConstructor returns false for arrow functions
+    [ 'method', ({ m() { } }).m ], // IsConstructor returns false for methods
+  ].forEach(t =>  {
+    test(() =>  {
+      assert_throws(expectTypeError, () =>  {
+        customElements.define(`test-define-constructor-${t[0]}`, t[1]);
+      });
+    }, `If constructor is ${t[0]}, should throw a TypeError`);
+  });
+
+  // 2. If name is not a valid custom element name,
+  // then throw a SyntaxError and abort these steps.
+  let validCustomElementNames = [
+    // [a-z] (PCENChar)* '-' (PCENChar)*
+    // https://html.spec.whatwg.org/multipage/scripting.html#valid-custom-element-name
+    'a-',
+    'a-a',
+    'aa-',
+    'aa-a',
+    'a-.-_',
+    'a-0123456789',
+    'a-\u6F22\u5B57', // Two CJK Unified Ideographs
+    'a-\uD840\uDC0B', // Surrogate pair U+2000B
+  ];
+  let invalidCustomElementNames = [
+    undefined,
+    null,
+    '',
+    '-',
+    'a',
+    'input',
+    'mycustomelement',
+    'A',
+    'A-',
+    '0-',
+    'a-A',
+    'a-Z',
+    'A-a',
+    'a-a\u00D7',
+    'a-a\u3000',
+    'a-a\uDB80\uDC00', // Surrogate pair U+F0000
+    // name must not be any of the hyphen-containing element names.
+    'annotation-xml',
+    'color-profile',
+    'font-face',
+    'font-face-src',
+    'font-face-uri',
+    'font-face-format',
+    'font-face-name',
+    'missing-glyph',
+  ];
+  validCustomElementNames.forEach(name =>  {
+    test(() =>  {
+      customElements.define(name, class {});
+    }, `Element names: defining an element named ${name} should succeed`);
+  });
+  invalidCustomElementNames.forEach(name =>  {
+    test(() =>  {
+      assert_throws(expectSyntaxError, () =>  {
+        customElements.define(name, class {});
+      });
+    }, `Element names: defining an element named ${name} should throw a SyntaxError`);
+  });
+
+  // 3. If this CustomElementsRegistry contains an entry with name name,
+  // then throw a NotSupportedError and abort these steps.
+  test(() =>  {
+    customElements.define('test-define-dup-name', class {});
+    assert_throws(expectNotSupportedError, () =>  {
+      customElements.define('test-define-dup-name', class {});
+    });
+  }, 'If the name is already defined, should throw a NotSupportedError');
+
+  // 4. If this CustomElementsRegistry contains an entry with constructor constructor,
+  // then throw a NotSupportedError and abort these steps.
+  test(() =>  {
+    class TestDupConstructor {};
+    customElements.define('test-define-dup-constructor', TestDupConstructor);
+    assert_throws(expectNotSupportedError, () =>  {
+      customElements.define('test-define-dup-ctor2', TestDupConstructor);
+    });
+  }, 'If the constructor is already defined, should throw a NotSupportedError');
+
+  // 7.1. If extends is a valid custom element name,
+  // then throw a NotSupportedError.
+  validCustomElementNames.forEach(name =>  {
+    test(() =>  {
+      assert_throws(expectNotSupportedError, () =>  {
+        customElements.define('test-define-extend-valid-name', class {}, { extends: name });
+      });
+    }, `If extends is ${name}, should throw a NotSupportedError`);
+  });
+
+  // 7.2. If the element interface for extends and the HTML namespace is HTMLUnknownElement
+  // (e.g., if extends does not indicate an element definition in this specification),
+  // then throw a NotSupportedError.
+  [
+    // https://html.spec.whatwg.org/multipage/dom.html#elements-in-the-dom:htmlunknownelement
+    'bgsound',
+    'blink',
+    'isindex',
+    'multicol',
+    'nextid',
+    'spacer',
+    'elementnametobeunknownelement',
+  ].forEach(name =>  {
+    test(() =>  {
+      assert_throws(expectNotSupportedError, () =>  {
+        customElements.define('test-define-extend-' + name, class {}, { extends: name });
+      });
+    }, `If extends is ${name}, should throw a NotSupportedError`);
+  });
+
+  // 8. Let observedAttributesIterable be Get(constructor, "observedAttributes").
+  // Rethrow any exceptions.
+  // See step 12 for rethrow tests.
+
+  // 10. Let prototype be Get(constructor, "prototype"). Rethrow any exceptions.
+  function assert_rethrown(func, description) {
+    assert_throws({ name: 'rethrown' }, func, description);
+  }
+  function throw_rethrown_error() {
+    const e = new Error('check this is rethrown');
+    e.name = 'rethrown';
+    throw e;
+  }
+  test(() =>  {
+    // Hack for prototype to throw while IsConstructor is true.
+    const BadConstructor = (function () { }).bind({});
+    Object.defineProperty(BadConstructor, 'prototype', {
+      get() { throw_rethrown_error(); }
+    });
+    assert_rethrown(() =>  {
+      customElements.define('test-define-constructor-prototype-rethrow', BadConstructor);
+    });
+  }, 'If constructor.prototype throws, should rethrow');
+  // 11. If Type(prototype) is not Object,
+  // then throw a TypeError exception.
+  test(() =>  {
+    const c = (function () { }).bind({}); // prototype is undefined.
+    assert_throws(expectTypeError, () =>  {
+      customElements.define('test-define-constructor-prototype-undefined', c);
+    });
+  }, 'If Type(constructor.prototype) is undefined, should throw a TypeError');
+  test(() =>  {
+    function c() {};
+    c.prototype = 'string';
+    assert_throws(expectTypeError, () =>  {
+      customElements.define('test-define-constructor-prototype-string', c);
+    });
+  }, 'If Type(constructor.prototype) is string, should throw a TypeError');
+
+  // 12. Let connectedCallback be Get(prototype, "connectedCallback"). Rethrow any exceptions.
+  // 13. If connectedCallback is not undefined, and IsCallable(connectedCallback) is false,
+  // then throw a TypeError exception.
+  // 14. Let disconnectedCallback be Get(prototype, "disconnectedCallback"). Rethrow any exceptions.
+  // 15. If disconnectedCallback is not undefined, and IsCallable(disconnectedCallback) is false,
+  // then throw a TypeError exception.
+  // 16. Let attributeChangedCallback be Get(prototype, "attributeChangedCallback"). Rethrow any exceptions.
+  // 17. If attributeChangedCallback is not undefined, and IsCallable(attributeChangedCallback) is false,
+  // then throw a TypeError exception.
+  [
+    'observedAttributes', // See step 8 above.
+    'connectedCallback',
+    'disconnectedCallback',
+    'attributeChangedCallback',
+  ].forEach(name =>  {
+    test(() =>  {
+      class C {
+        get [name]() { throw_rethrown_error(); }
+      }
+      assert_rethrown(() =>  {
+        customElements.define('test-define-constructor-rethrow-prototype-' + name, C);
+      });
+    }, `If constructor.prototype.${name} throws, should rethrow`);
+  });
+  [
+    'connectedCallback',
+    'disconnectedCallback',
+    'attributeChangedCallback',
+  ].forEach(name =>  {
+    test(() =>  {
+      class c {};
+      c.prototype[name] = undefined;
+      customElements.define('test-define-constructor-prototype-' + name, c);
+    }, `If constructor.prototype.${name} is undefined, should success`);
+    [
+      [ 'null', null ],
+      [ 'object', {} ],
+    ].forEach(value =>  {
+      test(() =>  {
+        class c {};
+        c.prototype[name] = value[1];
+        assert_throws(expectTypeError, () =>  {
+          customElements.define('test-define-constructor-prototype-' + name, c);
+        });
+      }, `If constructor.prototype.${name} is ${value[0]}, should throw a TypeError`);
+    })
+  });
+})();
+</script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/events/Event-dispatch-bubbles-true.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title> Event.bubbles attribute is set to false </title>
+<link rel="help" href="https://dom.spec.whatwg.org/#dom-event-initevent">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-dispatch">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<table id="table" border="1" style="display: none">
+    <tbody id="table-body">
+    <tr id="table-row">
+        <td id="table-cell">Shady Grove</td>
+        <td>Aeolian</td>
+    </tr>
+    <tr id="parent">
+        <td id="target">Over the river, Charlie</td>
+        <td>Dorian</td>
+    </tr>
+    </tbody>
+</table>
+<script>
+function concatReverse(a) {
+    return a.concat(a.map(function(x) { return x }).reverse());
+}
+
+function targetsForDocumentChain(document) {
+    return [
+        document,
+        document.documentElement,
+        document.getElementsByTagName("body")[0],
+        document.getElementById("table"),
+        document.getElementById("table-body"),
+        document.getElementById("parent")
+    ];
+}
+
+function testChain(document, targetParents, phases, event_type) {
+    var target = document.getElementById("target");
+    var targets = targetParents.concat(target);
+    var expected_targets = concatReverse(targets);
+
+    var actual_targets = [], actual_phases = [];
+    var test_event = function(evt) {
+        actual_targets.push(evt.currentTarget);
+        actual_phases.push(evt.eventPhase);
+    }
+
+    for (var i = 0; i < targets.length; i++) {
+        targets[i].addEventListener(event_type, test_event, true);
+        targets[i].addEventListener(event_type, test_event, false);
+    }
+
+    var evt = document.createEvent("Event");
+    evt.initEvent(event_type, true, true);
+
+    target.dispatchEvent(evt);
+
+    assert_array_equals(actual_targets, expected_targets, "targets");
+    assert_array_equals(actual_phases, phases, "phases");
+}
+
+var phasesForDocumentChain = [
+    Event.CAPTURING_PHASE,
+    Event.CAPTURING_PHASE,
+    Event.CAPTURING_PHASE,
+    Event.CAPTURING_PHASE,
+    Event.CAPTURING_PHASE,
+    Event.CAPTURING_PHASE,
+    Event.AT_TARGET,
+    Event.AT_TARGET,
+    Event.BUBBLING_PHASE,
+    Event.BUBBLING_PHASE,
+    Event.BUBBLING_PHASE,
+    Event.BUBBLING_PHASE,
+    Event.BUBBLING_PHASE,
+    Event.BUBBLING_PHASE,
+];
+
+test(function () {
+    var chainWithWindow = [window].concat(targetsForDocumentChain(document));
+    var phases = [Event.CAPTURING_PHASE].concat(phasesForDocumentChain, Event.BUBBLING_PHASE);
+    testChain(document, chainWithWindow, phases, "click");
+}, "In window.document with click event");
+
+test(function () {
+    testChain(document, targetsForDocumentChain(document), phasesForDocumentChain, "load");
+}, "In window.document with load event")
+
+test(function () {
+    var documentClone = document.cloneNode(true);
+    testChain(
+        documentClone, targetsForDocumentChain(documentClone), phasesForDocumentChain, "click");
+}, "In window.document.cloneNode(true)");
+
+test(function () {
+    var newDocument = new Document();
+    newDocument.appendChild(document.documentElement.cloneNode(true));
+    testChain(
+        newDocument, targetsForDocumentChain(newDocument), phasesForDocumentChain, "click");
+}, "In new Document()");
+
+test(function () {
+    var HTMLDocument = document.implementation.createHTMLDocument();
+    HTMLDocument.body.appendChild(document.getElementById("table").cloneNode(true));
+    testChain(
+        HTMLDocument, targetsForDocumentChain(HTMLDocument), phasesForDocumentChain, "click");
+}, "In DOMImplementation.createHTMLDocument()");
+</script>
rename from testing/web-platform/tests/uievents/ClickFakeEvent.nondocument.html
rename to testing/web-platform/tests/dom/events/Event-dispatch-detached-click.html
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/events/Event-dispatch-multiple-stopPropagation.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title> Multiple dispatchEvent() and stopPropagation() </title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id=log></div>
+
+<div id="parent" style="display: none">
+    <input id="target" type="hidden" value=""/>
+</div>
+
+<script>
+test(function() {
+    var event_type = "foo";
+    var target = document.getElementById("target");
+    var parent = document.getElementById("parent");
+    var actual_result;
+    var test_event = function(evt) {
+        actual_result.push(evt.currentTarget);
+
+        if (parent == evt.currentTarget) {
+            evt.stopPropagation();
+        }
+    };
+
+    var evt = document.createEvent("Event");
+    evt.initEvent(event_type, true, true);
+
+    target.addEventListener(event_type, test_event, false);
+    parent.addEventListener(event_type, test_event, false);
+    document.addEventListener(event_type, test_event, false);
+    window.addEventListener(event_type, test_event, false);
+
+    actual_result = [];
+    target.dispatchEvent(evt);
+    assert_array_equals(actual_result, [target, parent]);
+
+    actual_result = [];
+    parent.dispatchEvent(evt);
+    assert_array_equals(actual_result, [parent]);
+
+    actual_result = [];
+    document.dispatchEvent(evt);
+    assert_array_equals(actual_result, [document, window]);
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/events/Event-dispatch-order.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Event phases order</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+async_test(function() {
+    document.addEventListener('DOMContentLoaded', this.step_func_done(function() {
+        var parent = document.getElementById('parent');
+        var child = document.getElementById('child');
+
+        var order = [];
+
+        parent.addEventListener('click', this.step_func(function(){ order.push(1) }), true);
+        child.addEventListener('click', this.step_func(function(){ order.push(2) }), false);
+        parent.addEventListener('click', this.step_func(function(){ order.push(3) }), false);
+
+        child.dispatchEvent(new Event('click', {bubbles: true}));
+
+        assert_array_equals(order, [1, 2, 3]);
+    }));
+}, "Event phases order");
+</script>
+<div id="parent">
+    <div id="child"></div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/events/Event-dispatch-throwing.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Throwing in event listeners</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+setup({allow_uncaught_exception:true})
+
+test(function() {
+    var errorEvents = 0;
+    window.onerror = this.step_func(function(e) {
+        assert_equals(typeof e, 'string');
+        ++errorEvents;
+    });
+
+    var element = document.createElement('div');
+
+    element.addEventListener('click', function() {
+        throw new Error('Error from only listener');
+    });
+
+    element.dispatchEvent(new Event('click'));
+
+    assert_equals(errorEvents, 1);
+}, "Throwing in event listener with a single listeners");
+
+test(function() {
+    var errorEvents = 0;
+    window.onerror = this.step_func(function(e) {
+        assert_equals(typeof e, 'string');
+        ++errorEvents;
+    });
+
+    var element = document.createElement('div');
+
+    var secondCalled = false;
+
+    element.addEventListener('click', function() {
+        throw new Error('Error from first listener');
+    });
+    element.addEventListener('click', this.step_func(function() {
+        secondCalled = true;
+    }), false);
+
+    element.dispatchEvent(new Event('click'));
+
+    assert_equals(errorEvents, 1);
+    assert_true(secondCalled);
+}, "Throwing in event listener with multiple listeners");
+</script>
rename from testing/web-platform/tests/uievents/order-of-events/init-event-while-dispatching.html
rename to testing/web-platform/tests/dom/events/Event-init-while-dispatching.html
rename from testing/web-platform/tests/uievents/constructors/constructors.html
rename to testing/web-platform/tests/dom/events/Event-subclasses-constructors.html
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/events/EventListener-handleEvent.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>EventListener::handleEvent()</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<table id="table" border="1" style="display: none">
+    <tbody id="table-body">
+    <tr id="table-row">
+        <td id="table-cell">Shady Grove</td>
+        <td>Aeolian</td>
+    </tr>
+    <tr id="parent">
+        <td id="target">Over the river, Charlie</td>
+        <td>Dorian</td>
+    </tr>
+    </tbody>
+</table>
+<script>
+test(function(t) {
+    var event = "foo";
+    var target = document.getElementById("target");
+
+    var event_listener = {
+        "handleEvent": function(evt) {
+            var that = this;
+            t.step(function() {
+                assert_equals(evt.type, event);
+                assert_equals(evt.target, target);
+                assert_equals(that, event_listener);
+            });
+        }
+    };
+
+    var evt = document.createEvent("Event");
+    evt.initEvent(event, true, true);
+
+    target.addEventListener(event, event_listener, true);
+    target.dispatchEvent(evt);
+});
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/events/EventListenerOptions-capture.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<title>EventListenerOptions.capture</title>
+<link rel="author" title="Rick Byers" href="mailto:rbyers@chromium.org">
+<link rel="help" href="https://dom.spec.whatwg.org/#dom-eventlisteneroptions-capture">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+
+<script>
+
+function testCaptureValue(captureValue, expectedValue) {
+  var handlerPhase = undefined;
+  var handler = function handler(e) {
+    assert_equals(handlerPhase, undefined, "Handler invoked after remove");
+    handlerPhase = e.eventPhase;
+  }
+  document.addEventListener('test', handler, captureValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  document.removeEventListener('test', handler, captureValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  assert_equals(handlerPhase, expectedValue, "Incorrect event phase for value: " + JSON.stringify(captureValue));
+}
+
+test(function() {
+  testCaptureValue(true, Event.CAPTURING_PHASE);
+  testCaptureValue(false, Event.BUBBLING_PHASE);
+  testCaptureValue(null, Event.BUBBLING_PHASE);
+  testCaptureValue(undefined, Event.BUBBLING_PHASE);
+  testCaptureValue(2.3, Event.CAPTURING_PHASE);
+  testCaptureValue(-1000.3, Event.CAPTURING_PHASE);
+  testCaptureValue(NaN, Event.BUBBLING_PHASE);
+  testCaptureValue(+0.0, Event.BUBBLING_PHASE);
+  testCaptureValue(-0.0, Event.BUBBLING_PHASE);
+  testCaptureValue("", Event.BUBBLING_PHASE);
+  testCaptureValue("AAAA", Event.CAPTURING_PHASE);
+}, "Capture boolean should be honored correctly");
+
+test(function() {
+  testCaptureValue({}, Event.BUBBLING_PHASE);
+  testCaptureValue({capture:true}, Event.CAPTURING_PHASE);
+  testCaptureValue({capture:false}, Event.BUBBLING_PHASE);
+  testCaptureValue({capture:2}, Event.CAPTURING_PHASE);
+  testCaptureValue({capture:0}, Event.BUBBLING_PHASE);
+}, "Capture option should be honored correctly");
+
+test(function() {
+  var supportsCapture = false;
+  var query_options = {
+    get capture() {
+      supportsCapture = true;
+      return false;
+    },
+    get dummy() {
+      assert_unreached("dummy value getter invoked");
+      return false;
+    }
+  };
+
+  document.addEventListener('test_event', null, query_options);
+  assert_true(supportsCapture, "addEventListener doesn't support the capture option");
+  supportsCapture = false;
+  document.removeEventListener('test_event', null, query_options);
+  assert_true(supportsCapture, "removeEventListener doesn't support the capture option");
+}, "Supports capture option");
+
+function testOptionEquality(addOptionValue, removeOptionValue, expectedEquality) {
+  var handlerInvoked = false;
+  var handler = function handler(e) {
+    assert_equals(handlerInvoked, false, "Handler invoked multiple times");
+    handlerInvoked = true;
+  }
+  document.addEventListener('test', handler, addOptionValue);
+  document.removeEventListener('test', handler, removeOptionValue);
+  document.body.dispatchEvent(new Event('test', {'bubbles': true}));
+  assert_equals(!handlerInvoked, expectedEquality, "equivalence of options " +
+    JSON.stringify(addOptionValue) + " and " + JSON.stringify(removeOptionValue));
+  if (handlerInvoked)
+    document.removeEventListener('test', handler, addOptionValue);
+}
+
+test(function() {
+  // Option values that should be treated as equivalent
+  testOptionEquality({}, false, true);
+  testOptionEquality({capture: false}, false, true);
+  testOptionEquality(true, {capture: true}, true);
+  testOptionEquality({capture: null}, undefined, true);
+  testOptionEquality({capture: true}, {dummy: false, capture: 1}, true);
+  testOptionEquality({dummy: true}, false, true);
+
+  // Option values that should be treated as distinct
+  testOptionEquality(true, false, false);
+  testOptionEquality(true, {capture:false}, false);
+  testOptionEquality({}, true, false);
+
+}, "Equivalence of option values");
+
+</script>
--- a/testing/web-platform/tests/dom/lists/DOMTokenList-coverage-for-attributes.html
+++ b/testing/web-platform/tests/dom/lists/DOMTokenList-coverage-for-attributes.html
@@ -7,19 +7,17 @@
 <script>
 "use strict";
 
 var pairs = [
   // Defined in DOM
   {attr: "classList", sup: ["anyElement"]},
   // Defined in HTML
   {attr: "dropzone", sup: ["anyHTMLElement"]},
-  {attr: "headers", sup: ["td", "th"]},
   {attr: "htmlFor", sup: ["output"]},
-  {attr: "ping", sup: ["a", "area"]},
   {attr: "relList", sup: ["a", "area", "link"]},
   {attr: "sandbox", sup: ["iframe"]},
   {attr: "sizes", sup: ["link"]}
 ];
 var namespaces = [
   "http://www.w3.org/1999/xhtml",
   "http://www.w3.org/2000/svg",
   "http://www.w3.org/1998/Math/MathML",
rename from testing/web-platform/tests/DOM-parsing/createContextualFragment.html
rename to testing/web-platform/tests/domparsing/createContextualFragment.html
rename from testing/web-platform/tests/DOM-parsing/innerhtml-01.xhtml
rename to testing/web-platform/tests/domparsing/innerhtml-01.xhtml
rename from testing/web-platform/tests/DOM-parsing/innerhtml-03.xhtml
rename to testing/web-platform/tests/domparsing/innerhtml-03.xhtml
rename from testing/web-platform/tests/DOM-parsing/innerhtml-04.html
rename to testing/web-platform/tests/domparsing/innerhtml-04.html
rename from testing/web-platform/tests/DOM-parsing/innerhtml-05.xhtml
rename to testing/web-platform/tests/domparsing/innerhtml-05.xhtml
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/domparsing/innerhtml-06.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>math in html: innerHTML</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<h1>math in html: innerHTML</h1>
+<div id="log"></div>
+<div style="display:none">
+<div id="d1"><math><mi>x</mi></math></div>
+</div>
+<script>
+test(function() {
+  var math = document.getElementById("d1").firstChild;
+  assert_equals(math.innerHTML, "<mi>x</mi>");
+},"innerHTML defined on math.");
+</script>
rename from testing/web-platform/tests/DOM-parsing/innerhtml-07.html
rename to testing/web-platform/tests/domparsing/innerhtml-07.html
rename from testing/web-platform/tests/DOM-parsing/insert_adjacent_html.html
rename to testing/web-platform/tests/domparsing/insert_adjacent_html.html
rename from testing/web-platform/tests/DOM-parsing/insert_adjacent_html.js
rename to testing/web-platform/tests/domparsing/insert_adjacent_html.js
rename from testing/web-platform/tests/DOM-parsing/insert_adjacent_html.xhtml
rename to testing/web-platform/tests/domparsing/insert_adjacent_html.xhtml
rename from testing/web-platform/tests/DOM-parsing/outerhtml-01.html
rename to testing/web-platform/tests/domparsing/outerhtml-01.html
rename from testing/web-platform/tests/DOM-parsing/outerhtml-02.html
rename to testing/web-platform/tests/domparsing/outerhtml-02.html
rename from testing/web-platform/tests/DOM-parsing/xml-serialization.xhtml
rename to testing/web-platform/tests/domparsing/xml-serialization.xhtml
--- a/testing/web-platform/tests/hr-time/basic.html
+++ b/testing/web-platform/tests/hr-time/basic.html
@@ -23,22 +23,22 @@ test(function() {
 test(function() {
   assert_equals(typeof window.performance.now(), "number", "window.performance.now() returns a number");
 }, "window.performance.now() returns a number", {assert: "The now method MUST return a DOMHighResTimeStamp"});
 
 async_test(function() {
   // Check whether the performance.now() method is close to Date() within 30ms (due to inaccuracies)
   var initial_hrt = performance.now();
   var initial_date = Date.now();
-  setTimeout(this.step_func(function() {
+  this.step_timeout(function() {
     var final_hrt = performance.now();
     var final_date = Date.now();
     assert_approx_equals(final_hrt - initial_hrt, final_date - initial_date, 30, 'High resolution time value increased by approximately the same amount as time from date object');
     this.done();
-  }), 2000);
+  }, 2000);
 }, 'High resolution time has approximately the right relative magnitude');
 </script>
 </head>
 <body>
 <h1>Description</h1>
 <p>This test validates that window.performance.now() exist and is a function.</p>
 
 <div id="log"></div>
--- a/testing/web-platform/tests/hr-time/test_cross_frame_start.html
+++ b/testing/web-platform/tests/hr-time/test_cross_frame_start.html
@@ -7,23 +7,26 @@
         <link rel="help" href="http://www.w3.org/TR/hr-time/#sec-extenstions-performance-interface">
 
         <script src="/resources/testharness.js"></script>
         <script src="/resources/testharnessreport.js"></script>
 
         <script type="text/javascript">
             setup({explicit_done: true});
 
+            var setup_frame = async_test("Setup the frame");
+
             function start_test() {
-              setTimeout(function() {
+              setup_frame.step_timeout(function () {
                 var iframe = document.createElement('iframe');
                 iframe.id = 'frameContext';
                 iframe.onload = finish_test;
                 iframe.src = "resources/now_frame.html";
                 document.body.appendChild(iframe);
+                setup_frame.done();
               }, 1000);
             }
 
             function finish_test() {
               var childWindow = document.getElementById('frameContext').contentWindow;
 
               // Verify a positive number is returned for both the frame and parent.
               test(function() { assert_true(window.performance.now() > 0); }, 'parent performance.now() > 0');
--- a/testing/web-platform/tests/html/dom/interfaces.html
+++ b/testing/web-platform/tests/html/dom/interfaces.html
@@ -1106,17 +1106,17 @@ interface HTMLDListElement : HTMLElement
 
 interface HTMLDivElement : HTMLElement {
   // also has obsolete members
 };
 
 interface HTMLAnchorElement : HTMLElement {
   attribute DOMString target;
   attribute DOMString download;
-  [PutForwards=value] readonly attribute DOMTokenList ping;
+  [CEReactions] attribute USVString ping;
   attribute DOMString rel;
   [PutForwards=value] readonly attribute DOMTokenList relList;
   attribute DOMString hreflang;
   attribute DOMString type;
 
   attribute DOMString text;
 };
 HTMLAnchorElement implements HTMLHyperlinkElementUtils;
@@ -1476,17 +1476,17 @@ interface HTMLMapElement : HTMLElement {
 };
 
 interface HTMLAreaElement : HTMLElement {
   attribute DOMString alt;
   attribute DOMString coords;
   attribute DOMString shape;
   attribute DOMString target;
   attribute DOMString download;
-  [PutForwards=value] readonly attribute DOMTokenList ping;
+  [CEReactions] attribute USVString ping;
   attribute DOMString rel;
   [PutForwards=value] readonly attribute DOMTokenList relList;
   // hreflang and type are not reflected
 };
 HTMLAreaElement implements HTMLHyperlinkElementUtils;
 
 interface HTMLTableElement : HTMLElement {
            attribute HTMLTableCaptionElement? caption;
@@ -1535,17 +1535,17 @@ interface HTMLTableRowElement : HTMLElem
   void deleteCell(long index);
 
   // also has obsolete members
 };
 
 interface HTMLTableCellElement : HTMLElement {
   [CEReactions] attribute unsigned long colSpan;
   [CEReactions] attribute unsigned long rowSpan;
-  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList headers;
+  [CEReactions] attribute DOMString headers;
   readonly attribute long cellIndex;
 
   [CEReactions] attribute DOMString scope; // only conforming for th elements
   [CEReactions] attribute DOMString abbr;  // only conforming for th elements
 
   // also has obsolete members
 };
 
@@ -1630,19 +1630,19 @@ interface HTMLInputElement : HTMLElement
   readonly attribute DOMString validationMessage;
   boolean checkValidity();
   boolean reportValidity();
   void setCustomValidity(DOMString error);
 
   readonly attribute NodeList labels;
 
   void select();
-           attribute unsigned long selectionStart;
-           attribute unsigned long selectionEnd;
-           attribute DOMString selectionDirection;
+           attribute unsigned long? selectionStart;
+           attribute unsigned long? selectionEnd;
+           attribute DOMString? selectionDirection;
   void setRangeText(DOMString replacement);
   void setRangeText(DOMString replacement, unsigned long start, unsigned long end, optional SelectionMode selectionMode = "preserve");
   void setSelectionRange(unsigned long start, unsigned long end, optional DOMString direction);
 
   // also has obsolete members
 };
 
 interface HTMLButtonElement : HTMLElement {
@@ -1753,19 +1753,19 @@ interface HTMLTextAreaElement : HTMLElem
   readonly attribute DOMString validationMessage;
   boolean checkValidity();
   boolean reportValidity();
   void setCustomValidity(DOMString error);
 
   readonly attribute NodeList labels;
 
   void select();
-           attribute unsigned long selectionStart;
-           attribute unsigned long selectionEnd;
-           attribute DOMString selectionDirection;
+           attribute unsigned long? selectionStart;
+           attribute unsigned long? selectionEnd;
+           attribute DOMString? selectionDirection;
   void setRangeText(DOMString replacement);
   void setRangeText(DOMString replacement, unsigned long start, unsigned long end, optional SelectionMode selectionMode = "preserve");
   void setSelectionRange(unsigned long start, unsigned long end, optional DOMString direction);
 };
 
 interface HTMLKeygenElement : HTMLElement {
            attribute boolean autofocus;
            attribute DOMString challenge;
@@ -3162,16 +3162,23 @@ setup(function() {
   });
   errorVideo = document.createElement('video');
   errorVideo.src = 'data:,';
   errorVideo.preload = 'auto';
   iframe = document.createElement('iframe');
   iframe.hidden = true;
   document.body.appendChild(iframe);
 }, {explicit_done:true});
+
+function createInput(type) {
+  var input = document.createElement('input');
+  input.type = type;
+  return input;
+}
+
 window.onload = function() {
   idlArray.add_objects({
     NodeList: ['document.getElementsByName("name")'],
     HTMLAllCollection: ['document.all'],
     HTMLFormControlsCollection: ['document.createElement("form").elements'],
     RadioNodeList: [],
     HTMLOptionsCollection: ['document.createElement("select").options'],
     DOMStringMap: ['document.head.dataset'],
@@ -3265,17 +3272,41 @@ window.onload = function() {
     HTMLTableCellElement: [
       'document.createElement("td")',
       'document.createElement("th")',
     ],
     HTMLFormElement: ['document.createElement("form")'],
     HTMLFieldsetElement: ['document.createElement("fieldset")'],
     HTMLLegendElement: ['document.createElement("legend")'],
     HTMLLabelElement: ['document.createElement("label")'],
-    HTMLInputElement: ['document.createElement("input")'],
+    HTMLInputElement: [
+      'document.createElement("input")',
+      'createInput("text")',
+      'createInput("hidden")',
+      'createInput("search")',
+      'createInput("tel")',
+      'createInput("url")',
+      'createInput("email")',
+      'createInput("password")',
+      'createInput("date")',
+      'createInput("month")',
+      'createInput("week")',
+      'createInput("time")',
+      'createInput("datetime-local")',
+      'createInput("number")',
+      'createInput("range")',
+      'createInput("color")',
+      'createInput("checkbox")',
+      'createInput("radio")',
+      'createInput("file")',
+      'createInput("submit")',
+      'createInput("image")',
+      'createInput("reset")',
+      'createInput("button")'
+    ],
     HTMLButtonElement: ['document.createElement("button")'],
     HTMLSelectElement: ['document.createElement("select")'],
     HTMLDataListElement: ['document.createElement("datalist")'],
     HTMLOptGroupElement: ['document.createElement("optgroup")'],
     HTMLOptionElement: ['document.createElement("option")', 'new Option()'],
     HTMLTextAreaElement: ['document.createElement("textarea")'],
     HTMLKeygenElement: ['document.createElement("keygen")'],
     HTMLOutputElement: ['document.createElement("output")'],
--- a/testing/web-platform/tests/html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html
+++ b/testing/web-platform/tests/html/rendering/non-replaced-elements/flow-content-0/div-align-ref.html
@@ -1,13 +1,12 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset=utf-8>
-<link rel="match" href="div-align-ref.html">
 <style>
 .test { width: 50px; background-color: yellow; }
 .center { text-align: center; }
 .center .test { margin: 0 auto; }
 .left { text-align: left; }
 .left .test { margin-right: auto; }
 .right { text-align: right; }
 .right .test { margin-left: auto; }
--- a/testing/web-platform/tests/html/rendering/non-replaced-elements/flow-content-0/div-align.html
+++ b/testing/web-platform/tests/html/rendering/non-replaced-elements/flow-content-0/div-align.html
@@ -1,12 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset=utf-8>
+<link rel="match" href="div-align-ref.html">
 <style>
 .test { width: 50px; background-color: yellow; }
 .rtl { direction: rtl; }
 .ltr { direction: ltr; }
 [align=left] .margin { margin-left: 1em }
 [align=right] .margin { margin-right: 1em }
 </style>
 </head>
--- a/testing/web-platform/tests/html/resources/common.js
+++ b/testing/web-platform/tests/html/resources/common.js
@@ -27,17 +27,17 @@ var HTML5_ELEMENTS = [ 'a', 'abbr', 'add
 
 // only void (without end tag) HTML5 elements
 var HTML5_VOID_ELEMENTS = [ 'area', 'base', 'br', 'col', 'command', 'embed',
         'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source',
         'track', 'wbr' ];
 
 // https://html.spec.whatwg.org/multipage/multipage/forms.html#form-associated-element
 var HTML5_FORM_ASSOCIATED_ELEMENTS = [ 'button', 'fieldset', 'input', 'keygen',
-        'label', 'object', 'output', 'select', 'textarea' ];
+        'object', 'output', 'select', 'textarea' ];
 
 function newDocument() {
     var d = document.implementation.createDocument();
     return d;
 }
 
 function newHTMLDocument() {
     var d = document.implementation.createHTMLDocument('Test Document');
--- a/testing/web-platform/tests/html/semantics/forms/form-control-infrastructure/form.html
+++ b/testing/web-platform/tests/html/semantics/forms/form-control-infrastructure/form.html
@@ -5,42 +5,89 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
 <form id="form">
 <p><button id="button">button</button>
 <p><fieldset id="fieldset">fieldset</fieldset>
 <p><input id="input">
 <p><keygen id="keygen">
-<p><label id="label">label</label>
 <p><object id="object">object</object>
 <p><output id="output">output</output>
 <p><select id="select"><option>select</option></select>
 <p><textarea id="textarea">textarea</textarea>
+
+<!-- label is special: label.form is an alias for label.control.form -->
+<p><label id="label">label</label>
+<p><label id="label-form" form="form">label-form</label>
+<p><label id="label-form-form2" form="form2">label-form-form2</label>
+<p><label id="label-with-control">label-with-control <input></label>
+<p><label id="label-for" for="control-for-label">label-for</label> <input id="control-for-label">
+<p>
+ <input id="input-with-form-attr-in-form" form="form2">
+ <label id="label-for-control-form-in-form" for="input-with-form-attr-in-form">label-for-control-form-in-form</label>
+</p>
 </form>
+<form id="form2"></form>
+<p>
+ <input id="input-with-form-attr" form="form2">
+ <label id="label-for-control-form" for="input-with-form-attr">label-for-control-form</label>
+</p>
+<!-- misnested tags where form-association is set by the HTML parser -->
+<table>
+ <form id="form3"><!-- self-closes but sets the form element pointer -->
+ <tr>
+  <td><label id="label-in-table">label-in-table</label>
+  <td><label id="label-in-table-with-control">label-in-table <input></label>
+  <td><label id="label-in-table-for" for="input-in-table">label-in-table-for</label>
+  <td><input id="input-in-table"><!-- is associated with form3 -->
+ </tr>
+ </form>
+</table>
 <script>
 var form;
 setup(function() {
   form = document.getElementById("form");
-  if (!form) {
-    throw new TypeError("Didn't find form");
+  form2 = document.getElementById("form2");
+  form3 = document.getElementById("form3");
+  if (!form || !form2 || !form3) {
+    throw new TypeError("Didn't find all forms");
   }
 });
 
-var reassociateableElements = [
+var listedElements = [
   "button",
   "fieldset",
   "input",
   "keygen",
-  "label",
   "object",
   "output",
   "select",
   "textarea",
 ];
 
-reassociateableElements.forEach(function(localName) {
+listedElements.forEach(function(localName) {
   test(function() {
-    var button = document.getElementById(localName);
-    assert_equals(button.form, form);
+    var control = document.getElementById(localName);
+    assert_equals(control.form, form);
   }, localName + ".form");
 });
+
+// label
+function testLabel(id, expected) {
+  test(function() {
+    var label = document.getElementById(id);
+    assert_equals(label.control && label.control.form, expected, 'Sanity check: label.control.form');
+    assert_equals(label.form, expected, 'label.form');
+  }, id + ".form");
+}
+
+testLabel("label", null);
+testLabel("label-form", null);
+testLabel("label-form-form2", null);
+testLabel("label-with-control", form);
+testLabel("label-for", form);
+testLabel("label-for-control-form-in-form", form2);
+testLabel("label-for-control-form", form2);
+testLabel("label-in-table", null);
+testLabel("label-in-table-with-control", form3);
+testLabel("label-in-table-for", form3);
 </script>
--- 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
@@ -29,16 +29,17 @@
       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.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");
+    assert_false(e.isTrusted, "click()-initiated click event should not be trusted");
   });
   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, "click()-initiated event should be trusted");
     assert_false(e.cancelable, "event should not be cancelable");
--- 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
@@ -78,33 +78,34 @@
     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.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");
+    assert_false(e.isTrusted, "click()-initiated click event shouldn't be trusted");
   });
 
   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_false(e.isTrusted, "click()-initiated input event shouldn't be trusted");
+    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(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_false(e.isTrusted, "click()-initiated change event shouldn't be trusted");
+    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) {
--- a/testing/web-platform/tests/html/semantics/forms/the-input-element/selection.html
+++ b/testing/web-platform/tests/html/semantics/forms/the-input-element/selection.html
@@ -100,32 +100,36 @@ test(function() {
 
       input.type = type;
       assert_equals(input.type, type, "the given input type is not supported");
 
       a = input.selectionStart;
       input.selectionStart = 0;
       a = input.selectionEnd;
       input.selectionEnd = 0;
+      a = input.selectionDirection;
+      input.selectionDirection = "none";
       input.setSelectionRange(0, 0);
       input.setRangeText('', 0, 0);
 
     }, "input type " + type + " should support all selection attributes and methods");
   });
 
   invalid.forEach(function(type) {
     test(function() {
       var input = document.createElement("input");
 
       input.type = type;
       assert_equals(input.type, type, "the given input type is not supported");
 
-      assert_throws("INVALID_STATE_ERR", function() { var a = input.selectionStart; });
+      assert_equals(input.selectionStart, null, 'getting input.selectionStart');
       assert_throws("INVALID_STATE_ERR", function() { input.selectionStart = 0; });
-      assert_throws("INVALID_STATE_ERR", function() { var a = input.selectionEnd; });
+      assert_equals(input.selectionEnd, null, 'getting input.selectionEnd');
       assert_throws("INVALID_STATE_ERR", function() { input.selectionEnd = 0; });
+      assert_equals(input.selectionDirection, null, 'getting input.selectionDirection');
+      assert_throws("INVALID_STATE_ERR", function() { input.selectionDirection = "none"; });
       assert_throws("INVALID_STATE_ERR", function() { input.setSelectionRange(0, 0); });
       assert_throws("INVALID_STATE_ERR", function() { input.setRangeText('', 0, 0); });
 
     }, "input type " + type + " should not support variable-length selections");
   });
 });
 </script>
--- a/testing/web-platform/tests/html/semantics/forms/the-label-element/label-attributes.html
+++ b/testing/web-platform/tests/html/semantics/forms/the-label-element/label-attributes.html
@@ -116,22 +116,22 @@
     assert_equals(document.getElementById("test5").labels.length, 0,
                   "The number of labels should be 0 if the form control has an ancestor label element that the for attribute points to another control.");
     assert_equals(document.getElementById("lbl2").control, null,
                   "The labeled cotrol should be associated with the control whose ID is equal to the value of the 'for' attribute.");
   }, "A form control has no label 2.");
 
   // form attribute
   test(function () {
-    assert_equals(document.getElementById("lbl0").form, document.getElementById("fm"),
-                  "The 'form' property for a label with a form owner should return the form owner.");
-  }, "A label's form attribute should return its form owner.");
+    assert_equals(document.getElementById("lbl0").form, null,
+                  "The 'form' property for a label should return null if label.control is null.");
+  }, "A label in a form without a control");
 
   test(function () {
-    assert_equals(document.getElementById("lbl6").form, null,
-                  "The 'form' property for a label without a form owner should return null.");
-  }, "Check that the labels property of a form control with no label returns a zero-length NodeList.");
+    assert_equals(document.getElementById("lbl6").form, document.getElementById("fm"),
+                  "The 'form' property for a label should return label.control.form.");
+  }, "A label outside a form with a control inside the form");
 
   // htmlFor attribute
   test(function () {
     assert_equals(document.getElementById("lbl2").htmlFor, "testx");
   }, "A label's htmlFor attribute must reflect the for content attribute");
 </script>
--- a/testing/web-platform/tests/performance-timeline/po-disconnect.html
+++ b/testing/web-platform/tests/performance-timeline/po-disconnect.html
@@ -1,13 +1,14 @@
 <!DOCTYPE HTML>
 <meta charset=utf-8>
 <title>PerformanceObservers: disconnect</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="performanceobservers.js"></script>
 <h1>PerformanceObservers: disconnect</h1>
 <div id="log"></div>
 <script>
   async_test(function (t) {
     var observer = new PerformanceObserver(
         t.step_func(function (entryList, obs) {
           assert_unreached("This callback must not be invoked");
         })
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/shadow-dom/leaktests/get-elements.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name='author' title='Google' href='http://www.google.com'>
+<meta name='assert' content='getElement* API in document should not leak any node in shadow tree.'>
+<link rel='help' href='https://w3c.github.io/webcomponents/spec/shadow/'>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+
+<!-- This template will be filled in '#doc', '#host-open', and '#host-closed' below -->
+<template id='domtree-template'>
+  <span id='foo'></span>
+  <div class='bar'></div>
+  <form name='baz'></form>
+  <my-element></my-element>
+</template>
+
+<div id='doc'>
+  <div id='host-open'></div>
+  <div id='host-closed'></div>
+</div>
+
+</body>
+<script>
+'use strict';
+
+function fillTemplate(root, prefix) {
+    var tmpl = document.getElementById('domtree-template');
+    root.appendChild(document.importNode(tmpl.content, true));
+    for (var i = 0; i < root.childNodes.length; ++i) {
+        var el = root.childNodes[i];
+        if (el.nodeType != 1)
+            continue;
+        el.setAttribute('label', prefix + el.tagName.toLowerCase());
+    }
+
+    root.appendChild(document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient'));
+}
+
+// Construct subtree with 'doc-*' ids.
+var doc = document.getElementById('doc');
+fillTemplate(doc, 'doc-');
+
+// Construct shadow subtree with 'shadow-*' ids.
+var hostOpen = document.getElementById('host-open');
+var shadowOpen = hostOpen.attachShadow({mode: 'open'});
+fillTemplate(shadowOpen, 'shadow-open-');
+
+var hostClosed = document.getElementById('host-closed');
+var shadowClosed = hostClosed.attachShadow({mode: 'closed'});
+fillTemplate(shadowClosed, 'shadow-closed-');
+
+test(function() {
+    // getElementById() (NonElementParentNode)
+    assert_equals(document.querySelectorAll('#foo').length, 1);
+    assert_equals(document.getElementById('foo').getAttribute('label'), 'doc-span');
+    assert_equals(document.querySelector('#foo').getAttribute('label'), 'doc-span');
+
+    assert_equals(doc.querySelectorAll('#foo').length, 1);
+    assert_equals(doc.querySelector('#foo').getAttribute('label'), 'doc-span');
+
+    assert_equals(hostOpen.querySelectorAll('#foo').length, 0);
+
+    assert_equals(shadowOpen.querySelectorAll('#foo').length, 1);
+    assert_equals(shadowOpen.getElementById('foo').getAttribute('label'), 'shadow-open-span');
+    assert_equals(shadowOpen.querySelector('#foo').getAttribute('label'), 'shadow-open-span');
+
+    assert_equals(hostClosed.querySelectorAll('#foo').length, 0);
+
+    assert_equals(shadowClosed.querySelectorAll('#foo').length, 1);
+    assert_equals(shadowClosed.getElementById('foo').getAttribute('label'), 'shadow-closed-span');
+    assert_equals(shadowClosed.querySelector('#foo').getAttribute('label'), 'shadow-closed-span');
+}, 'getElementsById() should not leak nodes in shadow tree');
+
+test(function() {
+    // getElementsByClassName() (Element, Document)
+    assert_equals(document.getElementsByClassName('bar').length, 1);
+    assert_equals(document.getElementsByClassName('bar')[0].getAttribute('label'), 'doc-div');
+    assert_equals(document.getElementsByClassName('bar').length, 1);
+    assert_equals(document.getElementsByClassName('bar')[0].getAttribute('label'), 'doc-div');
+    assert_equals(document.querySelectorAll('.bar').length, 1);
+
+    assert_equals(doc.querySelectorAll('.bar').length, 1);
+    assert_equals(doc.getElementsByClassName('bar')[0].getAttribute('label'), 'doc-div');
+
+    assert_array_equals(hostOpen.querySelectorAll('.bar').length, 0);
+
+    assert_equals(shadowOpen.querySelectorAll('.bar').length, 1);
+    assert_equals(shadowOpen.querySelectorAll('.bar')[0].getAttribute('label'), 'shadow-open-div');
+
+    assert_array_equals(hostClosed.querySelectorAll('.bar').length, 0);
+
+    assert_equals(shadowClosed.querySelectorAll('.bar').length, 1);
+    assert_equals(shadowClosed.querySelectorAll('.bar')[0].getAttribute('label'), 'shadow-closed-div');
+}, 'getElementsByClassName() should not leak nodes in shadow tree');
+
+test(function() {
+    // getElementsByName (Document)
+    assert_equals(document.getElementsByName('baz').length, 1);
+    assert_equals(document.getElementsByName('baz')[0].getAttribute('label'), 'doc-form');
+    assert_equals(document.getElementsByName('baz').length, 1);
+    assert_equals(document.getElementsByName('baz')[0].getAttribute('label'), 'doc-form');
+    assert_equals(document.querySelectorAll('[name=baz]').length, 1);
+
+    assert_equals(doc.querySelectorAll('[name=baz]').length, 1);
+
+    assert_array_equals(hostOpen.querySelectorAll('[name=baz]').length, 0);
+    assert_equals(shadowOpen.querySelectorAll('[name=baz]').length, 1);
+    assert_equals(shadowOpen.querySelectorAll('[name=baz]')[0].getAttribute('label'), 'shadow-open-form');
+
+    assert_array_equals(hostClosed.querySelectorAll('[name=baz]').length, 0);
+    assert_equals(shadowClosed.querySelectorAll('[name=baz]').length, 1);
+    assert_equals(shadowClosed.querySelectorAll('[name=baz]')[0].getAttribute('label'), 'shadow-closed-form');
+}, 'getElementsByName() should not leak nodes in shadow tree');
+
+test(function() {
+    // getElementsByTagName (Element, Document)
+    assert_equals(document.getElementsByTagName('my-element').length, 1);
+    assert_equals(document.getElementsByTagName('my-element')[0].getAttribute('label'), 'doc-my-element');
+    assert_equals(document.getElementsByTagName('my-element').length, 1);
+    assert_equals(document.getElementsByTagName('my-element')[0].getAttribute('label'), 'doc-my-element');
+    assert_equals(document.querySelectorAll('my-element').length, 1);
+
+    assert_equals(doc.querySelectorAll('my-element').length, 1);
+    assert_equals(doc.getElementsByTagName('my-element')[0].getAttribute('label'), 'doc-my-element');
+
+    assert_array_equals(hostOpen.querySelectorAll('my-element').length, 0);
+    // ShadowRoot isn't an Element, does not have getElementsByTagName().
+    assert_equals(shadowOpen.querySelectorAll('my-element').length, 1);
+    assert_equals(shadowOpen.querySelectorAll('my-element')[0].getAttribute('label'), 'shadow-open-my-element');
+
+    assert_array_equals(hostClosed.querySelectorAll('my-element').length, 0);
+    assert_equals(shadowClosed.querySelectorAll('my-element').length, 1);
+    assert_equals(shadowClosed.querySelectorAll('my-element')[0].getAttribute('label'), 'shadow-closed-my-element');
+}, 'getElementsByTagName() should not leak nodes in shadow tree');
+
+test(function() {
+    // getElementsByTagNameNS (Element, Document)
+    assert_equals(document.getElementsByTagName('lineargradient').length, 0);
+    assert_equals(document.getElementsByTagNameNS('*', 'lineargradient').length, 0);
+    assert_equals(document.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'lineargradient').length, 0);
+    assert_equals(document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'lineargradient').length, 0);
+
+    assert_equals(document.getElementsByTagName('linearGradient').length, 1);
+    assert_equals(document.getElementsByTagNameNS('*', 'linearGradient').length, 1);
+    assert_equals(document.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 1);
+    assert_equals(document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0);
+
+    assert_equals(doc.getElementsByTagName('lineargradient').length, 0);
+    assert_equals(doc.getElementsByTagNameNS('*', 'lineargradient').length, 0);
+    assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'lineargradient').length, 0);
+    assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'lineargradient').length, 0);
+
+    assert_equals(doc.getElementsByTagName('linearGradient').length, 1);
+    assert_equals(doc.getElementsByTagNameNS('*', 'linearGradient').length, 1);
+    assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 1);
+    assert_equals(doc.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0);
+
+    assert_equals(hostOpen.getElementsByTagName('linearGradient').length, 0);
+    assert_equals(hostOpen.getElementsByTagNameNS('*', 'linearGradient').length, 0);
+    assert_equals(hostOpen.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 0);
+    assert_equals(hostOpen.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0);
+
+    assert_equals(hostClosed.getElementsByTagName('linearGradient').length, 0);
+    assert_equals(hostClosed.getElementsByTagNameNS('*', 'linearGradient').length, 0);
+    assert_equals(hostClosed.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'linearGradient').length, 0);
+    assert_equals(hostClosed.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'linearGradient').length, 0);
+
+    // ShadowRoot isn't an Element, does not have getElementsByTagNameNS().
+}, 'getElementsByTagNameNS() should not leak nodes in shadow tree');
+</script>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/shadow-dom/leaktests/window-frames.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name='author' title='Google' href='http://www.google.com'>
+<meta name='assert' content='Shadow DOM should not leak via window.frames.'>
+<link rel='help' href='https://w3c.github.io/webcomponents/spec/shadow/'>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+<div id='log'></div>
+<iframe src='about:blank' name='mainFrame1'></iframe>
+<div id='host-open'></div>
+<div id='host-closed'></div>
+</body>
+<script>
+'use strict';
+
+var host_open = document.getElementById('host-open');
+var root_open = host_open.attachShadow({mode: 'open'});
+root_open.innerHTML = '<iframe src="about:blank" name="shadowFrame1"></iframe>';
+
+var host_closed = document.getElementById('host-closed');
+var root_closed = host_closed.attachShadow({mode: 'closed'});
+root_closed.innerHTML = '<iframe src="about:blank" name="shadowFrame2"></iframe>';
+
+test(() => {
+  assert_equals(window.frames.length, 1, 'window.frames should return only frames in document.');
+  assert_equals(window.frames[0].name, 'mainFrame1', 'window.frames[0] should be mainFrame1.');
+  assert_equals(window.frames['mainFrame1'], window.frames[0], 'window.frames[\'mainFrame1\'] should be equal to mainFrame1.');
+  assert_equals(window.frames['shadowFrame1'], undefined, 'shadowFrame1 should not leak.');
+  assert_equals(window.frames['shadowFrame2'], undefined, 'shadowFrame2 should not leak.');
+
+}, 'window.frames should not leak frames in Shadow DOM.');
+</script>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/streams/OWNERS
@@ -0,0 +1,6 @@
+@domenic
+@tyoshino
+@yutakahirano
+@youennf
+@calvaris
+@wanderview
--- a/testing/web-platform/tests/streams/byte-length-queuing-strategy.https.html
+++ b/testing/web-platform/tests/streams/byte-length-queuing-strategy.https.html
@@ -1,12 +1,12 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="/service-workers/service-workers/resources/test-helpers.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
 <script src="resources/test-initializer.js"></script>
 
 <script src="byte-length-queuing-strategy.js"></script>
 <script>
 'use strict';
 worker_test('byte-length-queuing-strategy.js');
 </script>
--- a/testing/web-platform/tests/streams/count-queuing-strategy.https.html
+++ b/testing/web-platform/tests/streams/count-queuing-strategy.https.html
@@ -1,12 +1,12 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="/service-workers/service-workers/resources/test-helpers.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
 <script src="resources/test-initializer.js"></script>
 
 <script src="count-queuing-strategy.js"></script>
 <script>
 'use strict';
 worker_test('count-queuing-strategy.js');
 </script>
deleted file mode 100644
--- a/testing/web-platform/tests/uievents/legacy-domevents-tests/approved/DOM.event.flow.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title> Event dispatch and DOM event flow </title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
-<div id=log></div>
-
-<table id="table" border="1" style="display: none">
-    <tbody id="table-body">
-    <tr id="table-row">
-        <td id="table-cell">Shady Grove</td>
-        <td>Aeolian</td>
-    </tr>
-    <tr id="parent">
-        <td id="target">Over the river, Charlie</td>
-        <td>Dorian</td>
-    </tr>
-    </tbody>
-</table>
-
-<script>
-    var EVENT = "foo";
-    var TARGET = document.getElementById("target");
-    var PARENT = document.getElementById("parent");
-    var TBODY = document.getElementById("table-body");
-    var TABLE = document.getElementById("table");
-    var BODY = document.body;
-    var HTML = document.documentElement;
-    var CurrentTargets = [window, document, HTML, BODY, TABLE, TBODY, PARENT, TARGET];
-    var ExpectResult = CurrentTargets.concat([TARGET, PARENT, TBODY, TABLE, BODY, HTML, document, window]);
-    var ActualResult = [];
-    var ExpectPhases = [1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,];
-    var ActualPhases = [];
-
-    var description = "Test Description: Dispatch an event in a DOM tree using the DOM event flow.";
-
-    test(function()
-    {
-        for (var i=0; i < CurrentTargets.length; i++)
-        {
-            CurrentTargets[i].addEventListener(EVENT, TestEvent, true);
-            CurrentTargets[i].addEventListener(EVENT, TestEvent, false);
-        }
-
-        var evt = document.createEvent("Event");
-        evt.initEvent(EVENT, true, true);
-        TARGET.dispatchEvent(evt);
-
-        assert_array_equals(ActualResult, ExpectResult, "ActualResult");
-        assert_array_equals(ActualPhases, ExpectPhases, "ActualPhases");
-
-    }, description);
-
-    function TestEvent(evt)
-    {
-        ActualResult.push(evt.currentTarget);
-        ActualPhases.push(evt.eventPhase);
-    }
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/uievents/legacy-domevents-tests/approved/EventListener.eventHandler.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title> EventLister member: handleEvent() </title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
-<div id=log></div>
-
-<table id="table" border="1" style="display: none">
-    <tbody id="table-body">
-    <tr id="table-row">
-        <td id="table-cell">Shady Grove</td>
-        <td>Aeolian</td>
-    </tr>
-    <tr id="parent">
-        <td id="target">Over the river, Charlie</td>
-        <td>Dorian</td>
-    </tr>
-    </tbody>
-</table>
-
-<script>
-    var EVENT = "foo";
-    var TARGET = document.getElementById("target");
-    var TestResult = false;
-
-    var description = "Test Description: " +
-                      "handleEvent - This method shall be called whenever an event occurs of the event type for " +
-                      "which the EventListener interface was registered.";
-
-    var EventListener = {};
-    EventListener.handleEvent = function(evt)
-    {
-        if ((EVENT == evt.type) && (TARGET == evt.target) && (this === EventListener))
-        {
-            TestResult = true;
-        }
-        else
-        {
-            TestResult = false;
-        }
-    }
-
-    test(function()
-    {
-        var evt = document.createEvent("Event");
-        evt.initEvent(EVENT, true, true);
-
-        TARGET.addEventListener(EVENT, EventListener, true);
-        TARGET.dispatchEvent(evt);
-        TARGET.removeEventListener(EVENT, EventListener, true);
-
-        assert_true(TestResult);
-
-    }, description);
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/uievents/legacy-domevents-tests/approved/EventObject.multiple.dispatchEvent.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title> Multiple dispatchEvent() and stopPropagation() </title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
-<div id=log></div>
-
-<div id="parent" style="display: none">
-    <input id="target" type="hidden" value=""/>
-</div>
-
-<script>
-    var EVENT = "foo";
-    var TARGET = document.getElementById("target");
-    var PARENT = document.getElementById("parent");
-    var ExpectResult = [TARGET, PARENT, PARENT, document, window];
-    var ActualResult = [];
-
-    var description = "Test Description: " +
-                      "An event object may be properly dispatched multiple times while also allowing to prevent the event objects " +
-                      "propagation prior to the event dispatch.";
-
-    test(function()
-    {
-        var evt = document.createEvent("Event");
-        evt.initEvent(EVENT, true, true);
-
-        TARGET.addEventListener(EVENT, TestEvent, false);
-        PARENT.addEventListener(EVENT, TestEvent, false);
-        document.addEventListener(EVENT, TestEvent, false);
-        window.addEventListener(EVENT, TestEvent, false);
-
-        TARGET.dispatchEvent(evt);
-        PARENT.dispatchEvent(evt);
-        document.dispatchEvent(evt);
-
-        assert_array_equals(ActualResult, ExpectResult);
-
-    }, description);
-
-    function TestEvent(evt)
-    {
-        ActualResult.push(evt.currentTarget);
-
-        if (PARENT == evt.currentTarget)
-        {
-            evt.stopPropagation();
-        }
-    }
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/uievents/order-of-events/event-phases-order.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<!-- Submitted from TestTWF Paris -->
-<title>Event phases order</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-async_test(function() {
-    document.addEventListener('DOMContentLoaded', this.step_func_done(function() {
-        var parent = document.getElementById('parent');
-        var child = document.getElementById('child');
-
-        var order = [];
-
-        parent.addEventListener('click', this.step_func(function(){ order.push(1) }), true);
-        child.addEventListener('click', this.step_func(function(){ order.push(2) }), false);
-        parent.addEventListener('click', this.step_func(function(){ order.push(3) }), false);
-
-        child.click();
-
-        assert_array_equals(order, [1, 2, 3]);
-    }));
-}, "Event phases order");
-</script>
-
-    <div id="parent">
-        <div id="child"></div>
-    </div>
deleted file mode 100644
--- a/testing/web-platform/tests/uievents/throwing-in-listener-and-window-error-event.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<title>Throwing in event listener generates an error event on the window object</title>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-
-<script>
-    var t = async_test("Throwing in event listener generates an error event on the window object");
-
-    var errorEvent = false;
-
-    window.onerror = function(e) {
-        errorEvent = e;
-    }
-
-    document.addEventListener('DOMContentLoaded', t.step_func(function(){
-        var element = document.getElementById('bim');
-
-        element.addEventListener('click', function(){
-            throw new Error('Error from listener');
-        });
-
-        element.click();
-
-        assert_equals(typeof errorEvent, 'string');
-        t.done();
-    }));
-</script>
-
-<div id="bim">
-</div>
deleted file mode 100644
--- a/testing/web-platform/tests/uievents/throwing-in-listener-when-all-have-not-run-yet.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<title>Throwing in event listener</title>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-
-<script>
-    setup({allow_uncaught_exception:true})
-    var t = async_test("Throwing in event listener");
-
-    document.addEventListener('DOMContentLoaded', t.step_func(function(){
-        var element = document.getElementById('bim');
-
-        var secondCalled = false;
-
-        element.addEventListener('click', function(){
-            throw new Error('Error from listener');
-        });
-        element.addEventListener('click', t.step_func(function(){ secondCalled = true; }), false);
-
-        element.click();
-
-        assert_true(secondCalled);
-        t.done();
-    }));
-</script>
-
-<div id="bim">
-</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/url/setters_tests.json
@@ -0,0 +1,1130 @@
+{
+    "comment": [
+        "## Tests for setters of https://url.spec.whatwg.org/#urlutils-members",
+        "",
+        "This file contains a JSON object.",
+        "Other than 'comment', each key is an attribute of the `URL` interface",
+        "defined in WHATWG’s URL Standard.",
+        "The values are arrays of test case objects for that attribute.",
+        "",
+        "To run a test case for the attribute `attr`:",
+        "",
+        "* Create a new `URL` object with the value for the 'href' key",
+        "  the constructor single parameter. (Without a base URL.)",
+        "  This must not throw.",
+        "* Set the attribute `attr` to (invoke its setter with)",
+        "  with the value of for 'new_value' key.",
+        "* The value for the 'expected' key is another object.",
+        "  For each `key` / `value` pair of that object,",
+        "  get the attribute `key` (invoke its getter).",
+        "  The returned string must be equal to `value`.",
+        "",
+        "Note: the 'href' setter is already covered by urltestdata.json."
+    ],
+    "protocol": [
+        {
+            "comment": "The empty string is not a valid scheme. Setter leaves the URL unchanged.",
+            "href": "a://example.net",
+            "new_value": "",
+            "expected": {
+                "href": "a://example.net/",
+                "protocol": "a:"
+            }
+        },
+        {
+            "href": "a://example.net",
+            "new_value": "b",
+            "expected": {
+                "href": "b://example.net/",
+                "protocol": "b:"
+            }
+        },
+        {
+            "comment": "Upper-case ASCII is lower-cased",
+            "href": "a://example.net",
+            "new_value": "B",
+            "expected": {
+                "href": "b://example.net/",
+                "protocol": "b:"
+            }
+        },
+        {
+            "comment": "Non-ASCII is rejected",
+            "href": "a://example.net",
+            "new_value": "é",
+            "expected": {
+                "href": "a://example.net/",
+                "protocol": "a:"
+            }
+        },
+        {
+            "comment": "No leading digit",
+            "href": "a://example.net",
+            "new_value": "0b",
+            "expected": {
+                "href": "a://example.net/",
+                "protocol": "a:"
+            }
+        },
+        {
+            "comment": "No leading punctuation",
+            "href": "a://example.net",
+            "new_value": "+b",
+            "expected": {
+                "href": "a://example.net/",
+                "protocol": "a:"
+            }
+        },
+        {
+            "href": "a://example.net",
+            "new_value": "bC0+-.",
+            "expected": {
+                "href": "bc0+-.://example.net/",
+                "protocol": "bc0+-.:"
+            }
+        },
+        {
+            "comment": "Only some punctuation is acceptable",
+            "href": "a://example.net",
+            "new_value": "b,c",
+            "expected": {
+                "href": "a://example.net/",
+                "protocol": "a:"
+            }
+        },
+        {
+            "comment": "Non-ASCII is rejected",
+            "href": "a://example.net",
+            "new_value": "bé",
+            "expected": {
+                "href": "a://example.net/",
+                "protocol": "a:"
+            }
+        },
+        {
+            "comment": "Can’t switch from special scheme to non-special. Note: this may change, see https://github.com/whatwg/url/issues/104",
+            "href": "http://example.net",
+            "new_value": "b",
+            "expected": {
+                "href": "http://example.net/",
+                "protocol": "http:"
+            }
+        },
+        {
+            "comment": "Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.",
+            "href": "mailto:me@example.net",
+            "new_value": "http",
+            "expected": {
+                "href": "mailto:me@example.net",
+                "protocol": "mailto:"
+            }
+        },
+        {
+            "comment": "Can’t switch from non-special scheme to special. Note: this may change, see https://github.com/whatwg/url/issues/104",
+            "href": "ssh://me@example.net",
+            "new_value": "http",
+            "expected": {
+                "href": "ssh://me@example.net/",
+                "protocol": "ssh:"
+            }
+        },
+        {
+            "comment": "Stuff after the first ':' is ignored",
+            "href": "http://example.net",
+            "new_value": "https:foo : bar",
+            "expected": {
+                "href": "https://example.net/",
+                "protocol": "https:"
+            }
+        },
+        {
+            "comment": "Stuff after the first ':' is ignored",
+            "href": "data:text/html,<p>Test",
+            "new_value": "view-source+data:foo : bar",
+            "expected": {
+                "href": "view-source+data:text/html,<p>Test",
+                "protocol": "view-source+data:"
+            }
+        }
+    ],
+    "username": [
+        {
+            "comment": "No host means no username",
+            "href": "file:///home/you/index.html",
+            "new_value": "me",
+            "expected": {
+                "href": "file:///home/you/index.html",
+                "username": ""
+            }
+        },
+        {
+            "comment": "No host means no username",
+            "href": "unix:/run/foo.socket",
+            "new_value": "me",
+            "expected": {
+                "href": "unix:/run/foo.socket",
+                "username": ""
+            }
+        },
+        {
+            "comment": "Cannot-be-a-base means no username",
+            "href": "mailto:you@example.net",
+            "new_value": "me",
+            "expected": {
+                "href": "mailto:you@example.net",
+                "username": ""
+            }
+        },
+        {
+            "href": "http://example.net",
+            "new_value": "me",
+            "expected": {
+                "href": "http://me@example.net/",
+                "username": "me"
+            }
+        },
+        {
+            "href": "http://:secret@example.net",
+            "new_value": "me",
+            "expected": {
+                "href": "http://me:secret@example.net/",
+                "username": "me"
+            }
+        },
+        {
+            "href": "http://me@example.net",
+            "new_value": "",
+            "expected": {
+                "href": "http://example.net/",
+                "username": ""
+            }
+        },
+        {
+            "href": "http://me:secret@example.net",
+            "new_value": "",
+            "expected": {
+                "href": "http://:secret@example.net/",
+                "username": ""
+            }
+        },
+        {
+            "comment": "UTF-8 percent encoding with the userinfo encode set.",
+            "href": "http://example.net",
+            "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
+            "expected": {
+                "href": "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/",
+                "username": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9"
+            }
+        },
+        {
+            "comment": "Bytes already percent-encoded are left as-is.",
+            "href": "http://example.net",
+            "new_value": "%c3%89té",
+            "expected": {
+                "href": "http://%c3%89t%C3%A9@example.net/",
+                "username": "%c3%89t%C3%A9"
+            }
+        }
+    ],
+    "password": [
+        {
+            "comment": "No host means no password",
+            "href": "file:///home/me/index.html",
+            "new_value": "secret",
+            "expected": {
+                "href": "file:///home/me/index.html",
+                "password": ""
+            }
+        },
+        {
+            "comment": "No host means no password",
+            "href": "unix:/run/foo.socket",
+            "new_value": "secret",
+            "expected": {
+                "href": "unix:/run/foo.socket",
+                "password": ""
+            }
+        },
+        {
+            "comment": "Cannot-be-a-base means no password",
+            "href": "mailto:me@example.net",
+            "new_value": "secret",
+            "expected": {
+                "href": "mailto:me@example.net",
+                "password": ""
+            }
+        },
+        {
+            "href": "http://example.net",
+            "new_value": "secret",
+            "expected": {
+                "href": "http://:secret@example.net/",
+                "password": "secret"
+            }
+        },
+        {
+            "href": "http://me@example.net",
+            "new_value": "secret",
+            "expected": {
+                "href": "http://me:secret@example.net/",
+                "password": "secret"
+            }
+        },
+        {
+            "href": "http://:secret@example.net",
+            "new_value": "",
+            "expected": {
+                "href": "http://example.net/",
+                "password": ""
+            }
+        },
+        {
+            "href": "http://me:secret@example.net",
+            "new_value": "",
+            "expected": {
+                "href": "http://me@example.net/",
+                "password": ""
+            }
+        },
+        {
+            "comment": "UTF-8 percent encoding with the userinfo encode set.",
+            "href": "http://example.net",
+            "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
+            "expected": {
+                "href": "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/",
+                "password": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9"
+            }
+        },
+        {
+            "comment": "Bytes already percent-encoded are left as-is.",
+            "href": "http://example.net",
+            "new_value": "%c3%89té",
+            "expected": {
+                "href": "http://:%c3%89t%C3%A9@example.net/",
+                "password": "%c3%89t%C3%A9"
+            }
+        }
+    ],
+    "host": [
+        {
+            "comment": "Cannot-be-a-base means no host",
+            "href": "mailto:me@example.net",
+            "new_value": "example.com",
+            "expected": {
+                "href": "mailto:me@example.net",
+                "host": ""
+            }
+        },
+        {
+            "comment": "Cannot-be-a-base means no password",
+            "href": "data:text/plain,Stuff",
+            "new_value": "example.net",
+            "expected": {
+                "href": "data:text/plain,Stuff",
+                "host": ""
+            }
+        },
+        {
+            "href": "http://example.net",
+            "new_value": "example.com:8080",
+            "expected": {
+                "href": "http://example.com:8080/",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Port number is unchanged if not specified in the new value",
+            "href": "http://example.net:8080",
+            "new_value": "example.com",
+            "expected": {
+                "href": "http://example.com:8080/",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Port number is unchanges if empty in the new value. Note: this may change, see https://github.com/whatwg/url/pull/113",
+            "href": "http://example.net:8080",
+            "new_value": "example.com:",
+            "expected": {
+                "href": "http://example.com:8080/",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "The empty host is not valid for special schemes",
+            "href": "http://example.net",
+            "new_value": "",
+            "expected": {
+                "href": "http://example.net/",
+                "host": "example.net"
+            }
+        },
+        {
+            "comment": "The empty host is OK for non-special schemes",
+            "href": "view-source+http://example.net/foo",
+            "new_value": "",
+            "expected": {
+                "href": "view-source+http:///foo",
+                "host": ""
+            }
+        },
+        {
+            "comment": "Path-only URLs can gain a host",
+            "href": "a:/foo",
+            "new_value": "example.net",
+            "expected": {
+                "href": "a://example.net/foo",
+                "host": "example.net"
+            }
+        },
+        {
+            "comment": "IPv4 address syntax is normalized",
+            "href": "http://example.net",
+            "new_value": "0x7F000001:8080",
+            "expected": {
+                "href": "http://127.0.0.1:8080/",
+                "host": "127.0.0.1:8080",
+                "hostname": "127.0.0.1",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "IPv6 address syntax is normalized",
+            "href": "http://example.net",
+            "new_value": "[::0:01]:2",
+            "expected": {
+                "href": "http://[::1]:2/",
+                "host": "[::1]:2",
+                "hostname": "[::1]",
+                "port": "2"
+            }
+        },
+        {
+            "comment": "Default port number is removed",
+            "href": "http://example.net",
+            "new_value": "example.com:80",
+            "expected": {
+                "href": "http://example.com/",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Default port number is removed",
+            "href": "https://example.net",
+            "new_value": "example.com:443",
+            "expected": {
+                "href": "https://example.com/",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Default port number is only removed for the relevant scheme",
+            "href": "https://example.net",
+            "new_value": "example.com:80",
+            "expected": {
+                "href": "https://example.com:80/",
+                "host": "example.com:80",
+                "hostname": "example.com",
+                "port": "80"
+            }
+        },
+        {
+            "comment": "Stuff after a / delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com/stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a / delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com:8080/stuff",
+            "expected": {
+                "href": "http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Stuff after a ? delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com?stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a ? delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com:8080?stuff",
+            "expected": {
+                "href": "http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Stuff after a # delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com#stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a # delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com:8080#stuff",
+            "expected": {
+                "href": "http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
+            "href": "http://example.net/path",
+            "new_value": "example.com\\stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
+            "href": "http://example.net/path",
+            "new_value": "example.com:8080\\stuff",
+            "expected": {
+                "href": "http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "\\ is not a delimiter for non-special schemes, and it’s invalid in a domain",
+            "href": "view-source+http://example.net/path",
+            "new_value": "example.com\\stuff",
+            "expected": {
+                "href": "view-source+http://example.net/path",
+                "host": "example.net",
+                "hostname": "example.net",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
+            "href": "view-source+http://example.net/path",
+            "new_value": "example.com:8080stuff2",
+            "expected": {
+                "href": "view-source+http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
+            "href": "http://example.net/path",
+            "new_value": "example.com:8080stuff2",
+            "expected": {
+                "href": "http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
+            "href": "http://example.net/path",
+            "new_value": "example.com:8080+2",
+            "expected": {
+                "href": "http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Port numbers are 16 bit integers",
+            "href": "http://example.net/path",
+            "new_value": "example.com:65535",
+            "expected": {
+                "href": "http://example.com:65535/path",
+                "host": "example.com:65535",
+                "hostname": "example.com",
+                "port": "65535"
+            }
+        },
+        {
+            "comment": "Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.",
+            "href": "http://example.net/path",
+            "new_value": "example.com:65536",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        }
+    ],
+    "hostname": [
+        {
+            "comment": "Cannot-be-a-base means no host",
+            "href": "mailto:me@example.net",
+            "new_value": "example.com",
+            "expected": {
+                "href": "mailto:me@example.net",
+                "host": ""
+            }
+        },
+        {
+            "comment": "Cannot-be-a-base means no password",
+            "href": "data:text/plain,Stuff",
+            "new_value": "example.net",
+            "expected": {
+                "href": "data:text/plain,Stuff",
+                "host": ""
+            }
+        },
+        {
+            "href": "http://example.net:8080",
+            "new_value": "example.com",
+            "expected": {
+                "href": "http://example.com:8080/",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "The empty host is not valid for special schemes",
+            "href": "http://example.net",
+            "new_value": "",
+            "expected": {
+                "href": "http://example.net/",
+                "host": "example.net"
+            }
+        },
+        {
+            "comment": "The empty host is OK for non-special schemes",
+            "href": "view-source+http://example.net/foo",
+            "new_value": "",
+            "expected": {
+                "href": "view-source+http:///foo",
+                "host": ""
+            }
+        },
+        {
+            "comment": "Path-only URLs can gain a host",
+            "href": "a:/foo",
+            "new_value": "example.net",
+            "expected": {
+                "href": "a://example.net/foo",
+                "host": "example.net"
+            }
+        },
+        {
+            "comment": "IPv4 address syntax is normalized",
+            "href": "http://example.net:8080",
+            "new_value": "0x7F000001",
+            "expected": {
+                "href": "http://127.0.0.1:8080/",
+                "host": "127.0.0.1:8080",
+                "hostname": "127.0.0.1",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "IPv6 address syntax is normalized",
+            "href": "http://example.net",
+            "new_value": "[::0:01]",
+            "expected": {
+                "href": "http://[::1]/",
+                "host": "[::1]",
+                "hostname": "[::1]",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a : delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com:8080",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a : delimiter is ignored",
+            "href": "http://example.net:8080/path",
+            "new_value": "example.com:",
+            "expected": {
+                "href": "http://example.com:8080/path",
+                "host": "example.com:8080",
+                "hostname": "example.com",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Stuff after a / delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com/stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a ? delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com?stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a # delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "example.com#stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
+            "href": "http://example.net/path",
+            "new_value": "example.com\\stuff",
+            "expected": {
+                "href": "http://example.com/path",
+                "host": "example.com",
+                "hostname": "example.com",
+                "port": ""
+            }
+        },
+        {
+            "comment": "\\ is not a delimiter for non-special schemes, and it’s invalid in a domain",
+            "href": "view-source+http://example.net/path",
+            "new_value": "example.com\\stuff",
+            "expected": {
+                "href": "view-source+http://example.net/path",
+                "host": "example.net",
+                "hostname": "example.net",
+                "port": ""
+            }
+        }
+    ],
+    "port": [
+        {
+            "href": "http://example.net",
+            "new_value": "8080",
+            "expected": {
+                "href": "http://example.net:8080/",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Port number is unchanged if empty in the new value. Note: this may change, see https://github.com/whatwg/url/pull/113",
+            "href": "http://example.net:8080",
+            "new_value": "",
+            "expected": {
+                "href": "http://example.net:8080/",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Default port number is removed",
+            "href": "http://example.net:8080",
+            "new_value": "80",
+            "expected": {
+                "href": "http://example.net/",
+                "host": "example.net",
+                "hostname": "example.net",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Default port number is removed",
+            "href": "https://example.net:4433",
+            "new_value": "443",
+            "expected": {
+                "href": "https://example.net/",
+                "host": "example.net",
+                "hostname": "example.net",
+                "port": ""
+            }
+        },
+        {
+            "comment": "Default port number is only removed for the relevant scheme",
+            "href": "https://example.net",
+            "new_value": "80",
+            "expected": {
+                "href": "https://example.net:80/",
+                "host": "example.net:80",
+                "hostname": "example.net",
+                "port": "80"
+            }
+        },
+        {
+            "comment": "Stuff after a / delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "8080/stuff",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Stuff after a ? delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "8080?stuff",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Stuff after a # delimiter is ignored",
+            "href": "http://example.net/path",
+            "new_value": "8080#stuff",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
+            "href": "http://example.net/path",
+            "new_value": "8080\\stuff",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
+            "href": "view-source+http://example.net/path",
+            "new_value": "8080stuff2",
+            "expected": {
+                "href": "view-source+http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
+            "href": "http://example.net/path",
+            "new_value": "8080stuff2",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
+            "href": "http://example.net/path",
+            "new_value": "8080+2",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        },
+        {
+            "comment": "Port numbers are 16 bit integers",
+            "href": "http://example.net/path",
+            "new_value": "65535",
+            "expected": {
+                "href": "http://example.net:65535/path",
+                "host": "example.net:65535",
+                "hostname": "example.net",
+                "port": "65535"
+            }
+        },
+        {
+            "comment": "Port numbers are 16 bit integers, overflowing is an error",
+            "href": "http://example.net:8080/path",
+            "new_value": "65536",
+            "expected": {
+                "href": "http://example.net:8080/path",
+                "host": "example.net:8080",
+                "hostname": "example.net",
+                "port": "8080"
+            }
+        }
+    ],
+    "pathname": [
+        {
+            "comment": "Cannot-be-a-base don’t have a path",
+            "href": "mailto:me@example.net",
+            "new_value": "/foo",
+            "expected": {
+                "href": "mailto:me@example.net",
+                "pathname": "me@example.net"
+            }
+        },
+        {
+            "href": "unix:/run/foo.socket?timeout=10",
+            "new_value": "/var/log/../run/bar.socket",
+            "expected": {
+                "href": "unix:/var/run/bar.socket?timeout=10",
+                "pathname": "/var/run/bar.socket"
+            }
+        },
+        {
+            "href": "https://example.net#nav",
+            "new_value": "home",
+            "expected": {
+                "href": "https://example.net/home#nav",
+                "pathname": "/home"
+            }
+        },
+        {
+            "href": "https://example.net#nav",
+            "new_value": "../home",
+            "expected": {
+                "href": "https://example.net/home#nav",
+                "pathname": "/home"
+            }
+        },
+        {
+            "comment": "\\ is a segment delimiter for 'special' URLs",
+            "href": "http://example.net/home?lang=fr#nav",
+            "new_value": "\\a\\%2E\\b\\%2e.\\c",
+            "expected": {
+                "href": "http://example.net/a/c?lang=fr#nav",
+                "pathname": "/a/c"
+            }
+        },
+        {
+            "comment": "\\ is *not* a segment delimiter for non-'special' URLs",
+            "href": "view-source+http://example.net/home?lang=fr#nav",
+            "new_value": "\\a\\%2E\\b\\%2e.\\c",
+            "expected": {
+                "href": "view-source+http://example.net/\\a\\.\\b\\..\\c?lang=fr#nav",
+                "pathname": "/\\a\\.\\b\\..\\c"
+            }
+        },
+        {
+            "comment": "UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.",
+            "href": "a:/",
+            "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
+            "expected": {
+                "href": "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9",
+                "pathname": "/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9"
+            }
+        },
+        {
+            "comment": "Bytes already percent-encoded are left as-is, except %2E.",
+            "href": "http://example.net",
+            "new_value": "%2e%2E%c3%89té",
+            "expected": {
+                "href": "http://example.net/..%c3%89t%C3%A9",
+                "pathname": "/..%c3%89t%C3%A9"
+            }
+        }
+    ],
+    "search": [
+        {
+            "href": "https://example.net#nav",
+            "new_value": "lang=fr",
+            "expected": {
+                "href": "https://example.net/?lang=fr#nav",
+                "search": "?lang=fr"
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "lang=fr",
+            "expected": {
+                "href": "https://example.net/?lang=fr#nav",
+                "search": "?lang=fr"
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "?lang=fr",
+            "expected": {
+                "href": "https://example.net/?lang=fr#nav",
+                "search": "?lang=fr"
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "??lang=fr",
+            "expected": {
+                "href": "https://example.net/??lang=fr#nav",
+                "search": "??lang=fr"
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "?",
+            "expected": {
+                "href": "https://example.net/?#nav",
+                "search": ""
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "",
+            "expected": {
+                "href": "https://example.net/#nav",
+                "search": ""
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US",
+            "new_value": "",
+            "expected": {
+                "href": "https://example.net/",
+                "search": ""
+            }
+        },
+        {
+            "href": "https://example.net",
+            "new_value": "",
+            "expected": {
+                "href": "https://example.net/",
+                "search": ""
+            }
+        },
+        {
+            "comment": "UTF-8 percent encoding with the query encode set. Tabs and newlines are removed.",
+            "href": "a:/",
+            "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
+            "expected": {
+                "href": "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9",
+                "search": "?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
+            }
+        },
+        {
+            "comment": "Bytes already percent-encoded are left as-is",
+            "href": "http://example.net",
+            "new_value": "%c3%89té",
+            "expected": {
+                "href": "http://example.net/?%c3%89t%C3%A9",
+                "search": "?%c3%89t%C3%A9"
+            }
+        }
+    ],
+    "hash": [
+        {
+            "href": "https://example.net",
+            "new_value": "main",
+            "expected": {
+                "href": "https://example.net/#main",
+                "hash": "#main"
+            }
+        },
+        {
+            "href": "https://example.net#nav",
+            "new_value": "main",
+            "expected": {
+                "href": "https://example.net/#main",
+                "hash": "#main"
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US",
+            "new_value": "##nav",
+            "expected": {
+                "href": "https://example.net/?lang=en-US##nav",
+                "hash": "##nav"
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "#main",
+            "expected": {
+                "href": "https://example.net/?lang=en-US#main",
+                "hash": "#main"
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "#",
+            "expected": {
+                "href": "https://example.net/?lang=en-US#",
+                "hash": ""
+            }
+        },
+        {
+            "href": "https://example.net?lang=en-US#nav",
+            "new_value": "",
+            "expected": {
+                "href": "https://example.net/?lang=en-US",
+                "hash": ""
+            }
+        },
+        {
+            "comment": "No percent-encoding at all (!); nuls, tabs, and newlines are removed",
+            "href": "a:/",
+            "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
+            "expected": {
+                "href": "a:/#\u0001\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
+                "hash": "#\u0001\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé"
+            }
+        },
+        {
+            "comment": "Bytes already percent-encoded are left as-is",
+            "href": "http://example.net",
+            "new_value": "%c3%89té",
+            "expected": {
+                "href": "http://example.net/#%c3%89té",
+                "hash": "#%c3%89té"
+            }
+        }
+    ]
+}
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/url/url-setters.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<meta charset=utf-8>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<script>
+function startURLSettersTests() {
+  var setup = async_test("Loading data…")
+  setup.step(function() {
+    var request = new XMLHttpRequest()
+    request.open("GET", "setters_tests.json")
+    request.send()
+    request.responseType = "json"
+    request.onload = setup.step_func(function() {
+      runURLSettersTests(request.response)
+      setup.done()
+    })
+  })
+}
+
+function runURLSettersTests(all_test_cases) {
+  for (var attribute_to_be_set in all_test_cases) {
+    if (attribute_to_be_set == "comment") {
+      continue;
+    }
+    var test_cases = all_test_cases[attribute_to_be_set];
+    for(var i = 0, l = test_cases.length; i < l; i++) {
+      var test_case = test_cases[i];
+      var name = "Setting <" + test_case.href + ">." + attribute_to_be_set +
+                 " = '" + test_case.new_value + "'";
+      if ("comment" in test_case) {
+        name += " " + test_case.comment;
+      }
+      test(function() {
+        var url = new URL(test_case.href);
+        url[attribute_to_be_set] = test_case.new_value;
+        for (var attribute in test_case.expected) {
+          assert_equals(url[attribute], test_case.expected[attribute])
+        }
+      }, name)
+    }
+  }
+}
+
+startURLSettersTests()
+</script>
--- a/testing/web-platform/tests/web-animations/README.md
+++ b/testing/web-platform/tests/web-animations/README.md
@@ -1,4 +1,107 @@
-Web Animations Tests
-====================
+Web Animations Test Suite
+=========================
+
+Specification: https://w3c.github.io/web-animations/
+
+
+Guidelines for writing tests
+----------------------------
+
+*   Try to follow the spec outline where possible.
+
+    For example, if you want to test setting the start time, you might be
+    tempted to put all the tests in:
+
+    > `/web-animations/Animation/startTime.html`
+
+    However, in the spec most of the logic is in the &ldquo;Set the animation
+    start time&ldquo; procedure in the &ldquo;Timing model&rdquo; section.
+
+    Instead, try something like:
+
+    > *   `/web-animations/timing-model/animation/set-the-animation-start-time.html`<br>
+    >     Tests all the branches and inputs to the procedure as defined in the
+    >     spec (using the `Animation.startTime` API).
+    > *   `/web-animations/Animation/startTime.html`<br>
+    >     Tests API-layer specific issues like mapping unresolved values to
+    >      null, etc.
+
+    On that note, two levels of subdirectories is enough even if the spec has
+    deeper nesting.
+
+    Note that most of the existing tests in the suite _don't_ do this well yet.
+    That's the direction we're heading, however.
+
+*   Test the spec.
+
+    *   If the spec defines a timing calculation that is directly
+        reflected in the iteration progress
+        (i.e. `anim.effect.getComputedTiming().progress`), test that instead
+        of calling `getComputedStyle(elem).marginLeft`.
+
+    *   Likewise, don't add needless tests for `anim.playbackState`.
+        The playback state is a calculated value based on other values.
+        It's rarely necessary to test directly unless you need, for example,
+        to check that a pending task is scheduled (which isn't observable
+        elsewhere other than waiting for the corresponding promise to
+        complete).
+
+*   Try to keep tests as simple and focused as possible.
+
+    e.g.
 
-Specification: http://w3c.github.io/web-animations/
+    ```javascript
+  test(function(t) {
+    var anim = createDiv(t).animate(null);
+    assert_class_string(anim, 'Animation', 'Returned object is an Animation');
+  }, 'Element.animate() creates an Animation object');
+    ```
+
+    ```javascript
+  test(function(t) {
+    assert_throws({ name: 'TypeError' }, function() {
+      createDiv(t).animate(null, -1);
+    });
+  }, 'Setting a negative duration throws a TypeError');
+    ```
+
+    ```javascript
+  promise_test(function(t) {
+    var animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
+    return animation.ready.then(function() {
+      assert_greater_than(animation.startTime, 0, 'startTime when running');
+    });
+  }, 'startTime is resolved when running');
+    ```
+
+    If you're generating complex test loops and factoring out utility functions
+    that affect the logic of the test (other than, say, simple assertion utility
+    functions), you're probably doing it wrong.
+
+    It should be possible to understand exactly what the test is doing at a
+    glance without having to scroll up and down the test file and refer to
+    other files.
+
+    See Justin Searls' presentation, [&ldquo;How to stop hating your
+    tests&rdquo;](http://blog.testdouble.com/posts/2015-11-16-how-to-stop-hating-your-tests.html)
+    for some tips on making your tests simpler.
+
+*   Assume tests will run on under-performing hardware where the time between
+    animation frames might run into 10s of seconds.
+    As a result, animations that are expected to still be running during
+    the test should be at least 100s in length.
+
+*   Avoid using `GLOBAL_CONSTS` that make the test harder to read.
+    It's fine to repeat the the same parameter values like `100 * MS_PER_SEC`
+    over and over again since it makes it easy to read and debug a test in
+    isolation.
+    Remember, even if we do need to make all tests take, say 200s each, text
+    editors are very good at search and replace.
+
+*   Use the `assert_times_equal` assertion for comparing calculated times.
+    It tests times are equal using the precision recommended in the spec whilst
+    allowing implementations to override the function to meet their own
+    precision requirements.
+
+*   There are quite a few bad tests in the repository. We're learning as
+    we go. Don't just copy them blindly&mdash;please fix them!
--- a/testing/web-platform/tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html
+++ b/testing/web-platform/tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html
@@ -136,19 +136,16 @@ var gActiveDurationTests = [
     input:    { duration: Infinity, iterations: 0 },
     expected: 0 },
   { desc:     "an infinite duration and fractional iteration count",
     input:    { duration: Infinity, iterations: 2.5 },
     expected: Infinity },
   { desc:     "an infinite duration and infinite iteration count",
     input:    { duration: Infinity, iterations: Infinity },
     expected: Infinity },
-  { desc:     "an infinite duration and zero iteration count",
-    input:    { duration: Infinity, iterations: 0 },
-    expected: 0 }
 ];
 
 gActiveDurationTests.forEach(function(stest) {
   test(function(t) {
     var effect = new KeyframeEffectReadOnly(target,
                                             { left: ["10px", "20px"] },
                                             stest.input);
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webauthn/OWNERS
@@ -0,0 +1,1 @@
+@apowers313
--- a/testing/web-platform/tests/websockets/interfaces/CloseEvent/historical.html
+++ b/testing/web-platform/tests/websockets/interfaces/CloseEvent/historical.html
@@ -1,18 +1,12 @@
 <!doctype html>
 <meta charset=utf-8>
 <title>CloseEvent: historical initialization</title>
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <div id=log></div>
 <script>
 test(function() {
-  assert_throws("NotSupportedError", function() {
-    document.createEvent("CloseEvent")
-  });
-}, "createEvent(\"CloseEvent\")");
-
-test(function() {
   assert_false("initCloseEvent" in CloseEvent.prototype);
   assert_false("initCloseEvent" in new CloseEvent('close'));
 }, "initCloseEvent");
 </script>