Bug 1257799 - Update web-platform-tests to revision dccaa413ec1107e87b72245aa5ce837ee37ddff7, a=testonly
authorJames Graham <james@hoppipolla.co.uk>
Wed, 16 Mar 2016 13:48:52 +0000
changeset 289288 6ab07b5c4c3eab8e76793e6ff630a94b59442991
parent 289287 7657ca3b8c006615a54e81e5aa7123f8f2f58436
child 289289 8938d99b75bb12ce23edc53f90c87b2d7ba1071d
push id73789
push userjames@hoppipolla.co.uk
push dateFri, 18 Mar 2016 11:39:56 +0000
treeherdermozilla-inbound@95f97693b04f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstestonly
bugs1257799
milestone48.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 1257799 - Update web-platform-tests to revision dccaa413ec1107e87b72245aa5ce837ee37ddff7, a=testonly MozReview-Commit-ID: 4ZwuB5KcI9V
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/mozilla-sync
testing/web-platform/tests/FileAPI/blob/Blob-constructor.html
testing/web-platform/tests/dom/events/Event-dispatch-bubbles-false.html
testing/web-platform/tests/dom/interfaces.html
testing/web-platform/tests/dom/lists/DOMTokenList-value.html
testing/web-platform/tests/dom/nodes/Node-replaceChild.html
testing/web-platform/tests/dom/nodes/attributes.html
testing/web-platform/tests/dom/nodes/rootNode.html
testing/web-platform/tests/dom/ranges/Range-stringifier.html
testing/web-platform/tests/fetch/api/basic/stream-response.js
testing/web-platform/tests/fetch/api/headers/headers-basic.html
testing/web-platform/tests/fetch/api/request/request-consume-empty.html
testing/web-platform/tests/fetch/api/request/request-consume.html
testing/web-platform/tests/fetch/api/resources/utils.js
testing/web-platform/tests/fetch/api/response/response-clone.html
testing/web-platform/tests/fetch/api/response/response-consume-empty.html
testing/web-platform/tests/fetch/api/response/response-consume.html
testing/web-platform/tests/fetch/api/response/response-init-002.html
testing/web-platform/tests/html/browsers/history/the-location-interface/location_assign.html
testing/web-platform/tests/html/browsers/the-window-object/accessing-other-browsing-contexts/iterator.html
testing/web-platform/tests/html/dom/interfaces.html
testing/web-platform/tests/html/rendering/non-replaced-elements/tables/table-cell-width-s.html
testing/web-platform/tests/html/rendering/non-replaced-elements/tables/table-width-s.html
testing/web-platform/tests/html/semantics/forms/constraints/form-validation-validity-badInput.html
testing/web-platform/tests/html/semantics/forms/form-submission-0/getactionurl.html
testing/web-platform/tests/html/semantics/forms/the-input-element/input-textselection-01.html
testing/web-platform/tests/html/semantics/forms/the-input-element/selection.html
testing/web-platform/tests/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/node-document.html
testing/web-platform/tests/html/semantics/scripting-1/the-template-element/template-element/template-as-a-descendant.html
testing/web-platform/tests/html/semantics/selectors/pseudo-classes/focus-autofocus.html
testing/web-platform/tests/html/semantics/selectors/pseudo-classes/focus.html
testing/web-platform/tests/html/syntax/parsing/template/additions-to-the-in-frameset-insertion-mode/end-tag-frameset.html
testing/web-platform/tests/html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html
testing/web-platform/tests/html/webappapis/scripting/events/event-handler-processing-algorithm.html
testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/mediastream-finished-add.html
testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/mediastream-idl.html
testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/stream-ended.html
testing/web-platform/tests/mediacapture-streams/stream-api/mediastreamtrack/mediastreamtrack-end.html
testing/web-platform/tests/uievents/order-of-events/mouse-events/mouseover-out-manual.html
testing/web-platform/tests/url/urltestdata.json
testing/web-platform/tests/webmessaging/MessageEvent.html
testing/web-platform/tests/webmessaging/MessageEvent_properties.htm
testing/web-platform/tests/websockets/opening-handshake/003-sets-origin.worker.js
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -3241,16 +3241,20 @@
         "path": "uievents/order-of-events/mouse-events/click-on-html-manual.html",
         "url": "/uievents/order-of-events/mouse-events/click-on-html-manual.html"
       },
       {
         "path": "uievents/order-of-events/mouse-events/mouseevents-mousemove-manual.htm",
         "url": "/uievents/order-of-events/mouse-events/mouseevents-mousemove-manual.htm"
       },
       {
+        "path": "uievents/order-of-events/mouse-events/mouseover-out-manual.html",
+        "url": "/uievents/order-of-events/mouse-events/mouseover-out-manual.html"
+      },
+      {
         "path": "vibration/cancel-when-hidden-manual.html",
         "url": "/vibration/cancel-when-hidden-manual.html"
       },
       {
         "path": "vibration/cancel-with-0-manual.html",
         "url": "/vibration/cancel-with-0-manual.html"
       },
       {
@@ -4901,16 +4905,26 @@
           [
             "/html/rendering/non-replaced-elements/tables/table-border-2-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/non-replaced-elements/tables/table-border-2.html"
       },
       {
+        "path": "html/rendering/non-replaced-elements/tables/table-cell-width-s.html",
+        "references": [
+          [
+            "/html/rendering/non-replaced-elements/tables/table-cell-width-ref.html",
+            "=="
+          ]
+        ],
+        "url": "/html/rendering/non-replaced-elements/tables/table-cell-width-s.html"
+      },
+      {
         "path": "html/rendering/non-replaced-elements/tables/table-cell-width.html",
         "references": [
           [
             "/html/rendering/non-replaced-elements/tables/table-cell-width-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/non-replaced-elements/tables/table-cell-width.html"
@@ -4931,16 +4945,26 @@
           [
             "/html/rendering/non-replaced-elements/tables/table-width-150percent-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/non-replaced-elements/tables/table-width-150percent.html"
       },
       {
+        "path": "html/rendering/non-replaced-elements/tables/table-width-s.html",
+        "references": [
+          [
+            "/html/rendering/non-replaced-elements/tables/table-width-ref.html",
+            "=="
+          ]
+        ],
+        "url": "/html/rendering/non-replaced-elements/tables/table-width-s.html"
+      },
+      {
         "path": "html/rendering/non-replaced-elements/tables/table-width.html",
         "references": [
           [
             "/html/rendering/non-replaced-elements/tables/table-width-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/non-replaced-elements/tables/table-width.html"
@@ -13917,16 +13941,20 @@
         "path": "custom-elements/registering-custom-elements/unresolved-elements-interface-svg-element.html",
         "url": "/custom-elements/registering-custom-elements/unresolved-elements-interface-svg-element.html"
       },
       {
         "path": "dom/collections/HTMLCollection-empty-name.html",
         "url": "/dom/collections/HTMLCollection-empty-name.html"
       },
       {
+        "path": "dom/collections/HTMLCollection-supported-property-indices.html",
+        "url": "/dom/collections/HTMLCollection-supported-property-indices.html"
+      },
+      {
         "path": "dom/collections/HTMLCollection-supported-property-names.html",
         "url": "/dom/collections/HTMLCollection-supported-property-names.html"
       },
       {
         "path": "dom/collections/domstringmap-supported-property-names.html",
         "url": "/dom/collections/domstringmap-supported-property-names.html"
       },
       {
@@ -14025,16 +14053,20 @@
         "path": "dom/interfaces.html",
         "url": "/dom/interfaces.html"
       },
       {
         "path": "dom/lists/DOMTokenList-stringifier.html",
         "url": "/dom/lists/DOMTokenList-stringifier.html"
       },
       {
+        "path": "dom/lists/DOMTokenList-value.html",
+        "url": "/dom/lists/DOMTokenList-value.html"
+      },
+      {
         "path": "dom/nodes/CharacterData-appendData.html",
         "url": "/dom/nodes/CharacterData-appendData.html"
       },
       {
         "path": "dom/nodes/CharacterData-data.html",
         "url": "/dom/nodes/CharacterData-data.html"
       },
       {
@@ -14721,24 +14753,32 @@
         "path": "dom/nodes/getElementsByClassName-31.htm",
         "url": "/dom/nodes/getElementsByClassName-31.htm"
       },
       {
         "path": "dom/nodes/prepend-on-Document.html",
         "url": "/dom/nodes/prepend-on-Document.html"
       },
       {
+        "path": "dom/nodes/rootNode.html",
+        "url": "/dom/nodes/rootNode.html"
+      },
+      {
         "path": "dom/ranges/Range-commonAncestorContainer-2.html",
         "url": "/dom/ranges/Range-commonAncestorContainer-2.html"
       },
       {
         "path": "dom/ranges/Range-constructor.html",
         "url": "/dom/ranges/Range-constructor.html"
       },
       {
+        "path": "dom/ranges/Range-stringifier.html",
+        "url": "/dom/ranges/Range-stringifier.html"
+      },
+      {
         "path": "dom/traversal/NodeFilter-constants.html",
         "url": "/dom/traversal/NodeFilter-constants.html"
       },
       {
         "path": "dom/traversal/TreeWalker-acceptNode-filter.html",
         "url": "/dom/traversal/TreeWalker-acceptNode-filter.html"
       },
       {
@@ -15525,24 +15565,24 @@
         "path": "fetch/api/redirect/redirect-mode-worker.html",
         "url": "/fetch/api/redirect/redirect-mode-worker.html"
       },
       {
         "path": "fetch/api/redirect/redirect-mode.html",
         "url": "/fetch/api/redirect/redirect-mode.html"
       },
       {
-        "path": "fetch/api/request/request-cache.html",
-        "url": "/fetch/api/request/request-cache.html"
-      },
-      {
         "path": "fetch/api/request/request-clone.sub.html",
         "url": "/fetch/api/request/request-clone.sub.html"
       },
       {
+        "path": "fetch/api/request/request-consume-empty.html",
+        "url": "/fetch/api/request/request-consume-empty.html"
+      },
+      {
         "path": "fetch/api/request/request-consume.html",
         "url": "/fetch/api/request/request-consume.html"
       },
       {
         "path": "fetch/api/request/request-disturbed.html",
         "url": "/fetch/api/request/request-disturbed.html"
       },
       {
@@ -15573,16 +15613,20 @@
         "path": "fetch/api/request/request-structure.html",
         "url": "/fetch/api/request/request-structure.html"
       },
       {
         "path": "fetch/api/response/response-clone.html",
         "url": "/fetch/api/response/response-clone.html"
       },
       {
+        "path": "fetch/api/response/response-consume-empty.html",
+        "url": "/fetch/api/response/response-consume-empty.html"
+      },
+      {
         "path": "fetch/api/response/response-consume.html",
         "url": "/fetch/api/response/response-consume.html"
       },
       {
         "path": "fetch/api/response/response-error.html",
         "url": "/fetch/api/response/response-error.html"
       },
       {
@@ -16317,16 +16361,20 @@
         "path": "html/browsers/the-window-object/accessing-other-browsing-contexts/indexed-browsing-contexts-02.html",
         "url": "/html/browsers/the-window-object/accessing-other-browsing-contexts/indexed-browsing-contexts-02.html"
       },
       {
         "path": "html/browsers/the-window-object/accessing-other-browsing-contexts/indexed-browsing-contexts-03.html",
         "url": "/html/browsers/the-window-object/accessing-other-browsing-contexts/indexed-browsing-contexts-03.html"
       },
       {
+        "path": "html/browsers/the-window-object/accessing-other-browsing-contexts/iterator.html",
+        "url": "/html/browsers/the-window-object/accessing-other-browsing-contexts/iterator.html"
+      },
+      {
         "path": "html/browsers/the-window-object/accessing-other-browsing-contexts/window_length.html",
         "url": "/html/browsers/the-window-object/accessing-other-browsing-contexts/window_length.html"
       },
       {
         "path": "html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/close_beforeunload.html",
         "url": "/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/close_beforeunload.html"
       },
       {
@@ -18753,16 +18801,20 @@
         "path": "html/semantics/forms/constraints/inputwillvalidate.html",
         "url": "/html/semantics/forms/constraints/inputwillvalidate.html"
       },
       {
         "path": "html/semantics/forms/form-control-infrastructure/form.html",
         "url": "/html/semantics/forms/form-control-infrastructure/form.html"
       },
       {
+        "path": "html/semantics/forms/form-submission-0/getactionurl.html",
+        "url": "/html/semantics/forms/form-submission-0/getactionurl.html"
+      },
+      {
         "path": "html/semantics/forms/form-submission-0/url-encoded.html",
         "url": "/html/semantics/forms/form-submission-0/url-encoded.html"
       },
       {
         "path": "html/semantics/forms/resetting-a-form/reset-form.html",
         "url": "/html/semantics/forms/resetting-a-form/reset-form.html"
       },
       {
@@ -18881,20 +18933,16 @@
         "path": "html/semantics/forms/the-input-element/files.html",
         "url": "/html/semantics/forms/the-input-element/files.html"
       },
       {
         "path": "html/semantics/forms/the-input-element/hidden.html",
         "url": "/html/semantics/forms/the-input-element/hidden.html"
       },
       {
-        "path": "html/semantics/forms/the-input-element/input-textselection-01.html",
-        "url": "/html/semantics/forms/the-input-element/input-textselection-01.html"
-      },
-      {
         "path": "html/semantics/forms/the-input-element/input-type-button.html",
         "url": "/html/semantics/forms/the-input-element/input-type-button.html"
       },
       {
         "path": "html/semantics/forms/the-input-element/input-type-checkbox.html",
         "url": "/html/semantics/forms/the-input-element/input-type-checkbox.html"
       },
       {
@@ -18941,16 +18989,20 @@
         "path": "html/semantics/forms/the-input-element/reset.html",
         "url": "/html/semantics/forms/the-input-element/reset.html"
       },
       {
         "path": "html/semantics/forms/the-input-element/search_input.html",
         "url": "/html/semantics/forms/the-input-element/search_input.html"
       },
       {
+        "path": "html/semantics/forms/the-input-element/selection.html",
+        "url": "/html/semantics/forms/the-input-element/selection.html"
+      },
+      {
         "path": "html/semantics/forms/the-input-element/telephone.html",
         "url": "/html/semantics/forms/the-input-element/telephone.html"
       },
       {
         "path": "html/semantics/forms/the-input-element/text.html",
         "url": "/html/semantics/forms/the-input-element/text.html"
       },
       {
@@ -19329,16 +19381,20 @@
         "path": "html/semantics/selectors/pseudo-classes/disabled.html",
         "url": "/html/semantics/selectors/pseudo-classes/disabled.html"
       },
       {
         "path": "html/semantics/selectors/pseudo-classes/enabled.html",
         "url": "/html/semantics/selectors/pseudo-classes/enabled.html"
       },
       {
+        "path": "html/semantics/selectors/pseudo-classes/focus-autofocus.html",
+        "url": "/html/semantics/selectors/pseudo-classes/focus-autofocus.html"
+      },
+      {
         "path": "html/semantics/selectors/pseudo-classes/focus.html",
         "url": "/html/semantics/selectors/pseudo-classes/focus.html"
       },
       {
         "path": "html/semantics/selectors/pseudo-classes/indeterminate-radio.html",
         "url": "/html/semantics/selectors/pseudo-classes/indeterminate-radio.html"
       },
       {
@@ -19673,16 +19729,20 @@
         "path": "html/webappapis/scripting/events/event-handler-javascript.html",
         "url": "/html/webappapis/scripting/events/event-handler-javascript.html"
       },
       {
         "path": "html/webappapis/scripting/events/event-handler-onresize.html",
         "url": "/html/webappapis/scripting/events/event-handler-onresize.html"
       },
       {
+        "path": "html/webappapis/scripting/events/event-handler-processing-algorithm.html",
+        "url": "/html/webappapis/scripting/events/event-handler-processing-algorithm.html"
+      },
+      {
         "path": "html/webappapis/scripting/events/event-handler-spec-example.html",
         "url": "/html/webappapis/scripting/events/event-handler-spec-example.html"
       },
       {
         "path": "html/webappapis/scripting/events/inline-event-handler-ordering.html",
         "url": "/html/webappapis/scripting/events/inline-event-handler-ordering.html"
       },
       {
@@ -20173,20 +20233,16 @@
         "path": "mediacapture-streams/stream-api/mediastream/mediastream-idl.html",
         "url": "/mediacapture-streams/stream-api/mediastream/mediastream-idl.html"
       },
       {
         "path": "mediacapture-streams/stream-api/mediastream/mediastream-removetrack.html",
         "url": "/mediacapture-streams/stream-api/mediastream/mediastream-removetrack.html"
       },
       {
-        "path": "mediacapture-streams/stream-api/mediastream/stream-ended.html",
-        "url": "/mediacapture-streams/stream-api/mediastream/stream-ended.html"
-      },
-      {
         "path": "mediacapture-streams/stream-api/mediastream/video.html",
         "url": "/mediacapture-streams/stream-api/mediastream/video.html"
       },
       {
         "path": "mediacapture-streams/stream-api/mediastreamtrack/mediastreamtrack-end.html",
         "url": "/mediacapture-streams/stream-api/mediastreamtrack/mediastreamtrack-end.html"
       },
       {
@@ -31213,16 +31269,20 @@
         "path": "webmessaging/Channel_postMessage_ports_readonly_array.htm",
         "url": "/webmessaging/Channel_postMessage_ports_readonly_array.htm"
       },
       {
         "path": "webmessaging/Channel_postMessage_target_source.htm",
         "url": "/webmessaging/Channel_postMessage_target_source.htm"
       },
       {
+        "path": "webmessaging/MessageEvent.html",
+        "url": "/webmessaging/MessageEvent.html"
+      },
+      {
         "path": "webmessaging/MessageEvent_properties.htm",
         "url": "/webmessaging/MessageEvent_properties.htm"
       },
       {
         "path": "webmessaging/MessagePort_initial_disabled.htm",
         "url": "/webmessaging/MessagePort_initial_disabled.htm"
       },
       {
@@ -32293,16 +32353,20 @@
         "path": "websockets/interfaces/WebSocket/url/resolve.html",
         "url": "/websockets/interfaces/WebSocket/url/resolve.html"
       },
       {
         "path": "websockets/opening-handshake/001.html",
         "url": "/websockets/opening-handshake/001.html"
       },
       {
+        "path": "websockets/opening-handshake/003-sets-origin.worker.js",
+        "url": "/websockets/opening-handshake/003-sets-origin.worker"
+      },
+      {
         "path": "websockets/opening-handshake/003.html",
         "url": "/websockets/opening-handshake/003.html"
       },
       {
         "path": "websockets/opening-handshake/005.html",
         "url": "/websockets/opening-handshake/005.html"
       },
       {
@@ -33476,16 +33540,21 @@
         "url": "/eventsource/eventsource-constructor-non-same-origin.htm"
       },
       {
         "path": "eventsource/shared-worker/eventsource-constructor-non-same-origin.htm",
         "timeout": "long",
         "url": "/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm"
       },
       {
+        "path": "fetch/api/request/request-cache.html",
+        "timeout": "long",
+        "url": "/fetch/api/request/request-cache.html"
+      },
+      {
         "path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html",
         "timeout": "long",
         "url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html"
       },
       {
         "path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html",
         "timeout": "long",
         "url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-navigation-cross-origin.html"
@@ -37249,16 +37318,28 @@
           [
             "/html/rendering/non-replaced-elements/tables/table-border-2-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/non-replaced-elements/tables/table-border-2.html"
       }
     ],
+    "html/rendering/non-replaced-elements/tables/table-cell-width-s.html": [
+      {
+        "path": "html/rendering/non-replaced-elements/tables/table-cell-width-s.html",
+        "references": [
+          [
+            "/html/rendering/non-replaced-elements/tables/table-cell-width-ref.html",
+            "=="
+          ]
+        ],
+        "url": "/html/rendering/non-replaced-elements/tables/table-cell-width-s.html"
+      }
+    ],
     "html/rendering/non-replaced-elements/tables/table-cell-width.html": [
       {
         "path": "html/rendering/non-replaced-elements/tables/table-cell-width.html",
         "references": [
           [
             "/html/rendering/non-replaced-elements/tables/table-cell-width-ref.html",
             "=="
           ]
@@ -37285,16 +37366,28 @@
           [
             "/html/rendering/non-replaced-elements/tables/table-width-150percent-ref.html",
             "=="
           ]
         ],
         "url": "/html/rendering/non-replaced-elements/tables/table-width-150percent.html"
       }
     ],
+    "html/rendering/non-replaced-elements/tables/table-width-s.html": [
+      {
+        "path": "html/rendering/non-replaced-elements/tables/table-width-s.html",
+        "references": [
+          [
+            "/html/rendering/non-replaced-elements/tables/table-width-ref.html",
+            "=="
+          ]
+        ],
+        "url": "/html/rendering/non-replaced-elements/tables/table-width-s.html"
+      }
+    ],
     "html/rendering/non-replaced-elements/tables/table-width.html": [
       {
         "path": "html/rendering/non-replaced-elements/tables/table-width.html",
         "references": [
           [
             "/html/rendering/non-replaced-elements/tables/table-width-ref.html",
             "=="
           ]
@@ -40886,12 +40979,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": "833a6d13372424758a6e3a770ecc6e8d1ffaae67",
+  "rev": "dccaa413ec1107e87b72245aa5ce837ee37ddff7",
   "url_base": "/",
   "version": 2
 }
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,1 +1,1 @@
-fee9564fbfc4943ffe0437d859394617d5382de4
\ No newline at end of file
+9749b23ced55b8ddcb8d453e52bddf90378bf27a
\ No newline at end of file
--- a/testing/web-platform/tests/FileAPI/blob/Blob-constructor.html
+++ b/testing/web-platform/tests/FileAPI/blob/Blob-constructor.html
@@ -3,21 +3,17 @@
 <title>Blob constructor</title>
 <link rel=help href="http://dev.w3.org/2006/webapi/FileAPI/#constructorBlob">
 <link rel=help href="https://heycam.github.io/webidl/#es-union">
 <link rel=help href="https://heycam.github.io/webidl/#es-dictionary">
 <link rel=help href="https://heycam.github.io/webidl/#es-sequence">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../support/Blob.js"></script>
-<p><strong><a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=23683">Discussion</a>
-is ongoing that will affect a number of the following tests.</strong>
 <div id="log"></div>
-<!-- used by "platform object that supports indexed properties" tests -->
-<iframe style="display:none"></iframe>
 <script>
 test(function() {
   assert_true("Blob" in window, "window should have a Blob property.");
   assert_equals(Blob.length, 0, "Blob.length should be 0.");
   assert_true(Blob instanceof Function, "Blob should be a function.");
 }, "Blob interface object");
 
 // Step 1.
@@ -46,100 +42,118 @@ test(function() {
     true,
     false,
     0,
     1,
     1.5,
     "FAIL",
     new Date(),
     new RegExp(),
+    {},
+    { 0: "FAIL", length: 1 },
+    document.createElement("div"),
+    window,
   ];
   args.forEach(function(arg) {
     assert_throws(new TypeError(), function() {
       new Blob(arg);
     }, "Should throw for argument " + format_value(arg) + ".");
   });
 }, "Passing non-objects, Dates and RegExps for blobParts should throw a TypeError.");
 
 test_blob(function() {
-  return new Blob({});
+  return new Blob({
+    [Symbol.iterator]: Array.prototype[Symbol.iterator],
+  });
 }, {
   expected: "",
   type: "",
-  desc: "A plain object should be treated as a sequence for the blobParts argument."
+  desc: "A plain object with @@iterator should be treated as a sequence for the blobParts argument."
 });
 test_blob(function() {
-  return new Blob({ 0: "PASS", length: 1 });
+  return new Blob({
+    [Symbol.iterator]: Array.prototype[Symbol.iterator],
+    0: "PASS",
+    length: 1
+  });
 }, {
   expected: "PASS",
   type: "",
-  desc: "A plain object with a length property should be treated as a sequence for the blobParts argument."
+  desc: "A plain object with @@iterator and a length property should be treated as a sequence for the blobParts argument."
 });
 test_blob(function() {
   return new Blob(new String("xyz"));
 }, {
   expected: "xyz",
   type: "",
   desc: "A String object should be treated as a sequence for the blobParts argument."
 });
 test_blob(function() {
   return new Blob(new Uint8Array([1, 2, 3]));
 }, {
   expected: "123",
   type: "",
   desc: "A Uint8Array object should be treated as a sequence for the blobParts argument."
 });
 
-var test_error = { name: "test" };
+var test_error = {
+  name: "test",
+  message: "test error",
+};
 
 test(function() {
   var obj = {
+    [Symbol.iterator]: Array.prototype[Symbol.iterator],
     get length() { throw test_error; }
   };
   assert_throws(test_error, function() {
     new Blob(obj);
   });
 }, "The length getter should be invoked and any exceptions should be propagated.");
 
-test_blob(function() {
+test(function() {
   var element = document.createElement("div");
   element.appendChild(document.createElement("div"));
   element.appendChild(document.createElement("p"));
   var list = element.children;
   Object.defineProperty(list, "length", {
     get: function() { throw test_error; }
   });
-  return new Blob(list);
-}, {
-  expected: "[object HTMLDivElement][object HTMLParagraphElement]",
-  type: "",
-  desc: "A platform object that supports indexed properties should be treated as a sequence for the blobParts argument (overwritten 'length'.)"
-});
+  assert_throws(test_error, function() {
+    new Blob(list);
+  });
+}, "A platform object that supports indexed properties should be treated as a sequence for the blobParts argument (overwritten 'length'.)");
 
 test(function() {
   assert_throws(test_error, function() {
     var obj = {
+      [Symbol.iterator]: Array.prototype[Symbol.iterator],
       length: {
         valueOf: null,
         toString: function() { throw test_error; }
       }
     };
     new Blob(obj);
   });
   assert_throws(test_error, function() {
     var obj = {
+      [Symbol.iterator]: Array.prototype[Symbol.iterator],
       length: { valueOf: function() { throw test_error; } }
     };
     new Blob(obj);
   });
 }, "ToUint32 should be applied to the length and any exceptions should be propagated.");
 
 test(function() {
   var received = [];
   var obj = {
+    get [Symbol.iterator]() {
+      received.push("Symbol.iterator");
+      return Array.prototype[Symbol.iterator];
+    },
     get length() {
       received.push("length getter");
       return {
         valueOf: function() {
           received.push("length valueOf");
           return 3;
         }
       };
@@ -161,25 +175,28 @@ test(function() {
       received.push("2 getter");
       assert_unreached("Should not call the getter for 2 if the getter for 1 threw.");
     }
   };
   assert_throws(test_error, function() {
     new Blob(obj);
   });
   assert_array_equals(received, [
+    "Symbol.iterator",
     "length getter",
     "length valueOf",
     "0 getter",
     "0 toString",
-    "1 getter"
+    "length getter",
+    "length valueOf",
+    "1 getter",
   ]);
 }, "Getters and value conversions should happen in order until an exception is thrown.");
 
-// XXX should add tests edge cases of ToUint32(length)
+// XXX should add tests edge cases of ToLength(length)
 
 test(function() {
   assert_throws(test_error, function() {
     new Blob([{ toString: function() { throw test_error; } }]);
   }, "Throwing toString");
   assert_throws(test_error, function() {
     new Blob([{ toString: undefined, valueOf: function() { throw test_error; } }]);
   }, "Throwing valueOf");
@@ -196,39 +213,39 @@ test(function() {
 
 test_blob(function() {
   var arr = [
     { toString: function() { arr.pop(); return "PASS"; } },
     { toString: function() { assert_unreached("Should have removed the second element of the array rather than called toString() on it."); } }
   ];
   return new Blob(arr);
 }, {
-  expected: "PASSundefined",
+  expected: "PASS",
   type: "",
   desc: "Changes to the blobParts array should be reflected in the returned Blob (pop)."
 });
 
 test_blob(function() {
   var arr = [
     {
       toString: function() {
         if (arr.length === 3) {
-          return "SS";
+          return "A";
         }
         arr.unshift({
           toString: function() {
             assert_unreached("Should only access index 0 once.");
           }
         });
-        return "PA";
+        return "P";
       }
     },
     {
       toString: function() {
-        assert_unreached("Should not access the final element.");
+        return "SS";
       }
     }
   ];
   return new Blob(arr);
 }, {
   expected: "PASS",
   type: "",
   desc: "Changes to the blobParts array should be reflected in the returned Blob (unshift)."
@@ -293,39 +310,16 @@ test_blob(function() {
   ]);
 }, {
   expected: "PASSPASS",
   type: "",
   desc: "Passing a Float64Array as element of the blobParts array should work."
 });
 
 test_blob(function() {
-  return new Blob(document.createElement("div"));
-}, {
-  expected: "",
-  type: "",
-  desc: "Passing an element as the blobParts array should work."
-});
-
-test_blob(function() {
-  return new Blob(window);
-}, {
-  expected: "[object Window]",
-  type: "",
-  desc: "Passing an platform object that supports indexed properties as the blobParts array should work (window)."
-});
-test_blob(function() {
-  window[0].toString = function() { return "foo"; };
-  return new Blob(window);
-}, {
-  expected: "foo",
-  type: "",
-  desc: "Passing an platform object that supports indexed properties as the blobParts array should work (window with custom toString)."
-});
-test_blob(function() {
   var select = document.createElement("select");
   select.appendChild(document.createElement("option"));
   return new Blob(select);
 }, {
   expected: "[object HTMLOptionElement]",
   type: "",
   desc: "Passing an platform object that supports indexed properties as the blobParts array should work (select)."
 });
--- a/testing/web-platform/tests/dom/events/Event-dispatch-bubbles-false.html
+++ b/testing/web-platform/tests/dom/events/Event-dispatch-bubbles-false.html
@@ -14,42 +14,31 @@
     </tr>
     <tr id="parent">
         <td id="target">Over the river, Charlie</td>
         <td>Dorian</td>
     </tr>
     </tbody>
 </table>
 <script>
-test(function() {
-    var event_type = "click";
-    var target = document.getElementById("target");
-    var targets = [
-        window,
+function targetsForDocumentChain(document) {
+    return [
         document,
         document.documentElement,
         document.body,
         document.getElementById("table"),
         document.getElementById("table-body"),
-        document.getElementById("parent"),
-        target,
+        document.getElementById("parent")
     ];
+}
+
+function testChain(document, targetParents, phases, event_type) {
+    var target = document.getElementById("target");
+    var targets = targetParents.concat(target);
     var expected_targets = targets.concat(target);
-    var phases = [
-        Event.CAPTURING_PHASE,
-        Event.CAPTURING_PHASE,
-        Event.CAPTURING_PHASE,
-        Event.CAPTURING_PHASE,
-        Event.CAPTURING_PHASE,
-        Event.CAPTURING_PHASE,
-        Event.CAPTURING_PHASE,
-        Event.AT_TARGET,
-        Event.AT_TARGET,
-    ];
-
 
     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++) {
@@ -59,10 +48,51 @@ test(function() {
 
     var evt = document.createEvent("Event");
     evt.initEvent(event_type, false, true);
 
     target.dispatchEvent(evt);
 
     assert_array_equals(actual_targets, expected_targets, "targets");
     assert_array_equals(actual_phases, phases, "phases");
-}, "Event.dispatchEvent with Event.bubbles set to false.");
+}
+
+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,
+];
+
+test(function () {
+    var chainWithWindow = [window].concat(targetsForDocumentChain(document));
+    testChain(
+        document, chainWithWindow, [Event.CAPTURING_PHASE].concat(phasesForDocumentChain), "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>
--- a/testing/web-platform/tests/dom/interfaces.html
+++ b/testing/web-platform/tests/dom/interfaces.html
@@ -175,16 +175,17 @@ interface Node : EventTarget {
   const unsigned short DOCUMENT_FRAGMENT_NODE = 11;
   const unsigned short NOTATION_NODE = 12; // historical
   readonly attribute unsigned short nodeType;
   readonly attribute DOMString nodeName;
 
   readonly attribute DOMString? baseURI;
 
   readonly attribute Document? ownerDocument;
+  readonly attribute Node rootNode;
   readonly attribute Node? parentNode;
   readonly attribute Element? parentElement;
   boolean hasChildNodes();
   [SameObject] readonly attribute NodeList childNodes;
   readonly attribute Node? firstChild;
   readonly attribute Node? lastChild;
   readonly attribute Node? previousSibling;
   readonly attribute Node? nextSibling;
@@ -282,16 +283,17 @@ interface Element : Node {
   readonly attribute DOMString tagName;
 
            attribute DOMString id;
            attribute DOMString className;
   [SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
 
   boolean hasAttributes();
   [SameObject] readonly attribute NamedNodeMap attributes;
+  sequence<DOMString> getAttributeNames();
   DOMString? getAttribute(DOMString name);
   DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
   void setAttribute(DOMString name, DOMString value);
   void setAttributeNS(DOMString? namespace, DOMString name, DOMString value);
   void removeAttribute(DOMString name);
   void removeAttributeNS(DOMString? namespace, DOMString localName);
   boolean hasAttribute(DOMString name);
   boolean hasAttributeNS(DOMString? namespace, DOMString localName);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/lists/DOMTokenList-value.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DOMTokenList value</title>
+<link rel=help href="https://dom.spec.whatwg.org/#dom-domtokenlist-value">
+<link rel=author title=Tangresh href="mailto:dmenzi@tangresh.ch">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<span class="   a  a b "></span>
+<script>
+test(function() {
+  assert_equals(String(document.createElement("span").classList.value), "",
+                "classList.value should return the empty list for an undefined class attribute");
+  var span = document.querySelector("span");
+  assert_equals(span.classList.value, "   a  a b ",
+                "value should return the literal value");
+  span.classList.value = " foo bar foo ";
+  assert_equals(span.classList.value, " foo bar foo ",
+                "assigning value should set the literal value");
+  assert_equals(span.classList.length, 2,
+                "length should be the number of tokens");
+  assert_class_string(span.classList, "DOMTokenList");
+  assert_class_string(span.classList.value, "String");
+});
+</script>
--- a/testing/web-platform/tests/dom/nodes/Node-replaceChild.html
+++ b/testing/web-platform/tests/dom/nodes/Node-replaceChild.html
@@ -32,24 +32,18 @@ test(function() {
   });
 
   var d = document.createElement("div");
   d.appendChild(b);
   assert_throws("NotFoundError", function() {
     a.replaceChild(b, c);
   });
   assert_throws("NotFoundError", function() {
-    a.replaceChild(a, c);
-  });
-  assert_throws("NotFoundError", function() {
     a.replaceChild(b, a);
   });
-  assert_throws("NotFoundError", function() {
-    a.replaceChild(a, a);
-  });
 }, "If child's parent is not the context node, a NotFoundError exception should be thrown")
 test(function() {
   var nodes = [
     document.implementation.createDocumentType("html", "", ""),
     document.createTextNode("text"),
     document.implementation.createDocument(null, "foo", null).createProcessingInstruction("foo", "bar"),
     document.createComment("comment")
   ];
@@ -62,16 +56,21 @@ test(function() {
     });
   });
 }, "If the context node is not a node that can contain children, a NotFoundError exception should be thrown")
 
 // Step 2.
 test(function() {
   var a = document.createElement("div");
   var b = document.createElement("div");
+
+  assert_throws("HierarchyRequestError", function() {
+    a.replaceChild(a, a);
+  });
+
   a.appendChild(b);
   assert_throws("HierarchyRequestError", function() {
     a.replaceChild(a, b);
   });
 
   var c = document.createElement("div");
   c.appendChild(a);
   assert_throws("HierarchyRequestError", function() {
--- a/testing/web-platform/tests/dom/nodes/attributes.html
+++ b/testing/web-platform/tests/dom/nodes/attributes.html
@@ -580,17 +580,17 @@ function getEnumerableOwnProps1(obj) {
       arr.push(prop);
     }
   }
   return arr;
 }
 
 function getEnumerableOwnProps2(obj) {
   return Object.getOwnPropertyNames(obj).filter(
-    (name) => Object.getOwnPropertyDescriptor(obj, name).enumerable)
+    function (name) { return Object.getOwnPropertyDescriptor(obj, name).enumerable; })
 }
 
 test(function() {
   var el = document.createElement("div");
   el.setAttribute("a", "");
   el.setAttribute("b", "");
   assert_array_equals(getEnumerableOwnProps1(el.attributes),
                       ["0", "1"])
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/nodes/rootNode.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8>
+<title>Node.prototype.rootNode</title>
+<link rel="help" href="https://dom.spec.whatwg.org/#dom-node-rootnode">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+
+test(function () {
+    var element = document.createElement('div');
+    assert_equals(element.rootNode, element, 'rootNode on an element without a parent must return the element itself');
+
+    var text = document.createTextNode('');
+    assert_equals(text.rootNode, text, 'rootNode on a text node without a parent must return the text node itself');
+
+    var processingInstruction = document.createProcessingInstruction('target', 'data');
+    assert_equals(processingInstruction.rootNode, processingInstruction, 'rootNode on a processing instruction node without a parent must return the processing instruction node itself');
+
+    assert_equals(document.rootNode, document, 'rootNode on a document node must return the document itself');
+
+}, 'rootNode attribute must return the context object when it does not have any parent');
+
+test(function () {
+    var parent = document.createElement('div');
+
+    var element = document.createElement('div');
+    parent.appendChild(element);
+    assert_equals(element.rootNode, parent, 'rootNode on an element with a single ancestor must return the parent node');
+
+    var text = document.createTextNode('');
+    parent.appendChild(text);
+    assert_equals(text.rootNode, parent, 'rootNode on a text node with a single ancestor must return the parent node');
+
+    var processingInstruction = document.createProcessingInstruction('target', 'data');
+    parent.appendChild(processingInstruction)
+    assert_equals(processingInstruction.rootNode, parent, 'rootNode on a processing instruction node with a single ancestor must return the parent node');
+
+}, 'rootNode attribute must return the parent node of the context object when the context object has a single ancestor not in a document');
+
+test(function () {
+    var parent = document.createElement('div');
+    document.body.appendChild(parent);
+
+    var element = document.createElement('div');
+    parent.appendChild(element);
+    assert_equals(element.rootNode, document, 'rootNode on an element inside a document must return the document');
+
+    var text = document.createTextNode('');
+    parent.appendChild(text);
+    assert_equals(text.rootNode, document, 'rootNode on a text node inside a document must return the document');
+
+    var processingInstruction = document.createProcessingInstruction('target', 'data');
+    parent.appendChild(processingInstruction)
+    assert_equals(processingInstruction.rootNode, document, 'rootNode on a processing instruction node inside a document must return the document');
+}, 'rootNode attribute must return the document when a node is in document');
+
+test(function () {
+    var fragment = document.createDocumentFragment();
+    var parent = document.createElement('div');
+    fragment.appendChild(parent);
+
+    var element = document.createElement('div');
+    parent.appendChild(element);
+    assert_equals(element.rootNode, fragment, 'rootNode on an element inside a document fragment must return the fragment');
+
+    var text = document.createTextNode('');
+    parent.appendChild(text);
+    assert_equals(text.rootNode, fragment, 'rootNode on a text node inside a document fragment must return the fragment');
+
+    var processingInstruction = document.createProcessingInstruction('target', 'data');
+    parent.appendChild(processingInstruction)
+    assert_equals(processingInstruction.rootNode, fragment,
+        'rootNode on a processing instruction node inside a document fragment must return the fragment');
+}, 'rootNode attribute must return a document fragment when a node is in the fragment');
+
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/dom/ranges/Range-stringifier.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Range stringifier</title>
+<link rel="author" title="KiChjang" href="mailto:kungfukeith11@gmail.com">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=test>Test div</div>
+<div id=another>Another div</div>
+<div id=last>Last div</div>
+<div id=log></div>
+<script>
+test(function() {
+  var r = new Range();
+  var testDiv = document.getElementById("test");
+  test(function() {
+    r.selectNodeContents(testDiv);
+    assert_equals(r.collapsed, false);
+    assert_equals(r.toString(), testDiv.textContent);
+  }, "Node contents of a single div");
+
+  var textNode = testDiv.childNodes[0];
+  test(function() {
+    r.setStart(textNode, 5);
+    r.setEnd(textNode, 7);
+    assert_equals(r.collapsed, false);
+    assert_equals(r.toString(), "di");
+  }, "Text node with offsets");
+
+  var anotherDiv = document.getElementById("another");
+  test(function() {
+    r.setStart(testDiv, 0);
+    r.setEnd(anotherDiv, 0);
+    assert_equals(r.toString(), "Test div\n");
+  }, "Two nodes, each with a text node");
+
+  var lastDiv = document.getElementById("last");
+  var lastText = lastDiv.childNodes[0];
+  test(function() {
+    r.setStart(textNode, 5);
+    r.setEnd(lastText, 4);
+    assert_equals(r.toString(), "div\nAnother div\nLast");
+  }, "Three nodes with start offset and end offset on text nodes");
+});
+</script>
--- a/testing/web-platform/tests/fetch/api/basic/stream-response.js
+++ b/testing/web-platform/tests/fetch/api/basic/stream-response.js
@@ -6,32 +6,28 @@ if (this.document === undefined) {
 function streamBody(reader, test, count) {
   return reader.read().then(function(data) {
     if (!data.done && count < 2) {
       count += 1;
       return streamBody(reader, test, count);
     } else {
       test.step(function() {
         assert_true(count >= 2, "Retrieve body progressively");
-        test.done();
-        return;
       });
     }
   });
 }
 
 //simulate streaming:
 //count is large enough to let the UA deliver the body before it is completely retrieved
-async_test(function(test) {
-  fetch(RESOURCES_DIR + "trickle.py?ms=30&count=100").then(function(resp) {
+promise_test(function(test) {
+  return fetch(RESOURCES_DIR + "trickle.py?ms=30&count=100").then(function(resp) {
     var count = 0;
     if (resp.body)
       return streamBody(resp.body.getReader(), test, count);
     else
       test.step(function() {
         assert_unreached( "Body does not exist in response");
-        test.done();
-        return;
       });
   });
 }, "Stream response's body");
 
 done();
--- a/testing/web-platform/tests/fetch/api/headers/headers-basic.html
+++ b/testing/web-platform/tests/fetch/api/headers/headers-basic.html
@@ -20,17 +20,17 @@
 
       test(function() {
         new Headers({});
       }, "Create headers from empty object");
 
       var parameters = [null, 1];
       parameters.forEach(function(parameter) {
         test(function() {
-          assert_throws(new TypeError(), () => new Headers(parameter));
+          assert_throws(new TypeError(), function() { new Headers(parameter) });
         }, "Create headers with " + parameter + " should throw");
       });
 
       var headerDict = {"name1": "value1",
                         "name2": "value2",
                         "name3": "value3",
                         "name4": null,
                         "name5": undefined,
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fetch/api/request/request-consume-empty.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Request consume empty bodies</title>
+    <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+    <meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin">
+    <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
+    <script>
+    function checkBodyText(request) {
+      return request.text().then(function(bodyAsText) {
+        assert_equals(bodyAsText, "", "Resolved value should be empty");
+        assert_false(request.bodyUsed);
+      });
+    }
+
+    function checkBodyBlob(request) {
+      return request.blob().then(function(bodyAsBlob) {
+        var promise = new Promise(function(resolve, reject) {
+          var reader = new FileReader();
+          reader.onload = function(evt) {
+            resolve(reader.result)
+          };
+          reader.onerror = function() {
+            reject("Blob's reader failed");
+          };
+          reader.readAsText(bodyAsBlob);
+        });
+        return promise.then(function(body) {
+          assert_equals(body, "", "Resolved value should be empty");
+          assert_false(request.bodyUsed);
+        });
+      });
+    }
+
+    function checkBodyArrayBuffer(request) {
+      return request.arrayBuffer().then(function(bodyAsArrayBuffer) {
+        assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty");
+        assert_false(request.bodyUsed);
+      });
+    }
+
+    function checkBodyJSON(request) {
+      return request.json().then(
+        function(bodyAsJSON) {
+          assert_unreached("JSON parsing should fail");
+        },
+        function() {
+          assert_false(request.bodyUsed);
+        });
+    }
+
+    function checkBodyFormData(request) {
+      return request.formData().then(function(bodyAsFormData) {
+        assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData");
+        assert_false(request.bodyUsed);
+     });
+    }
+
+    function checkRequestWithNoBody(bodyType, checkFunction) {
+      promise_test(function(test) {
+        var request = new Request("", {"method": "POST"});
+        assert_false(request.bodyUsed);
+        return checkFunction(request);
+      }, "Consume request's body as " + bodyType);
+    }
+
+    var formData = new FormData();
+    checkRequestWithNoBody("text", checkBodyText);
+    checkRequestWithNoBody("blob", checkBodyBlob);
+    checkRequestWithNoBody("arrayBuffer", checkBodyArrayBuffer);
+    checkRequestWithNoBody("json", checkBodyJSON);
+    checkRequestWithNoBody("formData", checkBodyFormData);
+
+    function checkRequestWithEmptyBody(bodyType, body, asText) {
+      promise_test(function(test) {
+        var request = new Request("", {"method": "POST", "body": body});
+        assert_false(request.bodyUsed, "bodyUsed is false at init");
+        if (asText) {
+          return request.text().then(function(bodyAsString) {
+            assert_equals(bodyAsString.length, 0, "Resolved value should be empty");
+            assert_true(request.bodyUsed, "bodyUsed is true after being consumed");
+          });
+        }
+        return request.arrayBuffer().then(function(bodyAsArrayBuffer) {
+          assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty");
+          assert_true(request.bodyUsed, "bodyUsed is true after being consumed");
+        });
+      }, "Consume empty " + bodyType + " request body as " + (asText ? "text" : "arrayBuffer"));
+    }
+
+    // FIXME: Add BufferSource, FormData and URLSearchParams.
+    checkRequestWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), false);
+    checkRequestWithEmptyBody("text", "", false);
+    checkRequestWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), true);
+    checkRequestWithEmptyBody("text", "", true);
+    </script>
+  </body>
+</html>
--- a/testing/web-platform/tests/fetch/api/request/request-consume.html
+++ b/testing/web-platform/tests/fetch/api/request/request-consume.html
@@ -3,16 +3,17 @@
   <head>
     <meta charset="utf-8">
     <title>Request consume</title>
     <meta name="help" href="https://fetch.spec.whatwg.org/#request">
     <meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin">
     <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
+    <script src="../resources/utils.js"></script>
   </head>
   <body>
     <script>
     function checkBodyText(request, expectedBody) {
       return request.text().then( function(bodyAsText) {
         assert_equals(bodyAsText, expectedBody, "Retrieve and verify request's body");
         assert_true(request.bodyUsed, "body as text: bodyUsed turned true");
       });
@@ -32,29 +33,19 @@
         });
         return promise.then(function(body) {
           assert_equals(body, expectedBody, "Retrieve and verify request's body");
           assert_true(request.bodyUsed, "body as blob: bodyUsed turned true");
         });
       });
     }
 
-    <!-- Taken from https://developers.google.com -->
-    function str2ab(str) {
-      var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
-      var bufView = new Uint16Array(buf);
-      for (var i=0, strLen=str.length; i < strLen; i++) {
-        bufView[i] = str.charCodeAt(i);
-      }
-      return buf;
-    }
-
     function checkBodyArrayBuffer(request, expectedBody) {
-      return request.arrayBuffer().then( function(bodyAsArrayBuffer) {
-        assert_array_equals(bodyAsArrayBuffer, str2ab(expectedBody), "Retrieve and verify request's body");
+      return request.arrayBuffer().then(function(bodyAsArrayBuffer) {
+        validateBufferFromString(bodyAsArrayBuffer, expectedBody, "Retrieve and verify request's body");
         assert_true(request.bodyUsed, "body as arrayBuffer: bodyUsed turned true");
       });
     }
 
     function checkBodyJSON(request, expectedBody) {
       return request.json().then(function(bodyAsJSON) {
         var strBody = JSON.stringify(bodyAsJSON)
         assert_equals(strBody, expectedBody, "Retrieve and verify request's body");
@@ -74,22 +65,38 @@
         var request = new Request("", {"method": "POST", "body": body });
         assert_false(request.bodyUsed, "bodyUsed is false at init");
         return checkFunction(request, body);
       }, "Consume request's body as " + bodyType);
     }
 
     var formData = new FormData();
     formData.append("name", "value")
-    checkRequestBody("This is request's body", "text", checkBodyText);
-    checkRequestBody("This is request's body", "blob", checkBodyBlob);
-    checkRequestBody("This is request's body", "arrayBuffer", checkBodyArrayBuffer);
-    checkRequestBody(JSON.stringify("This is request's body"), "json", checkBodyJSON);
+    var textData = JSON.stringify("This is response's body");
+    var blob = new Blob([textData], { "type" : "text/plain" });
+
+    checkRequestBody(textData, "text", checkBodyText);
+    checkRequestBody(textData, "blob", checkBodyBlob);
+    checkRequestBody(textData, "arrayBuffer", checkBodyArrayBuffer);
+    checkRequestBody(textData, "json", checkBodyJSON);
     checkRequestBody(formData, "formData", checkBodyFormData);
 
+    function checkBlobResponseBody(blobBody, blobData, bodyType, checkFunction) {
+      promise_test(function(test) {
+        var response = new Response(blobBody);
+        assert_false(response.bodyUsed, "bodyUsed is false at init");
+        return checkFunction(response, blobData);
+      }, "Consume blob response's body as " + bodyType);
+    }
+
+    checkBlobResponseBody(blob, textData, "blob", checkBodyBlob);
+    checkBlobResponseBody(blob, textData, "text", checkBodyText);
+    checkBlobResponseBody(blob, textData, "json", checkBodyJSON);
+    checkBlobResponseBody(blob, textData, "arrayBuffer", checkBodyArrayBuffer);
+
     var goodJSONValues = ["null", "1", "true", "\"string\""];
     goodJSONValues.forEach(function(value) {
       promise_test(function(test) {
         var request = new Request("", {"method": "POST", "body": value});
         return request.json().then(function(v) {
           assert_equals(v, JSON.parse(value));
         });
       }, "Consume JSON from text: '" + JSON.stringify(value) + "'");
--- a/testing/web-platform/tests/fetch/api/resources/utils.js
+++ b/testing/web-platform/tests/fetch/api/resources/utils.js
@@ -39,30 +39,36 @@ function checkRequest(request, ExpectedV
         break;
 
       default:
         break;
     }
   }
 }
 
-//check reader's text content in an asyncronous test
-function readTextStream(reader, asyncTest, expectedValue, retrievedText) {
-  if (!retrievedText)
-    retrievedText = "";
-  reader.read().then(function(data) {
+function stringToArray(str) {
+  var array = new Uint8Array(str.length);
+  for (var i=0, strLen = str.length; i < strLen; i++)
+    array[i] = str.charCodeAt(i);
+  return array;
+}
+
+function validateBufferFromString(buffer, expectedValue, message)
+{
+  return assert_array_equals(new Uint8Array(buffer), stringToArray(expectedValue), message);
+}
+
+function validateStreamFromString(reader, expectedValue, retrievedArrayBuffer) {
+  return reader.read().then(function(data) {
     if (!data.done) {
-      var decoder = new TextDecoder();
-      retrievedText += decoder.decode(data.value);
-      readTextStream(reader, asyncTest, expectedValue, retrievedText);
-      return;
+      var newBuffer;
+      if (retrievedArrayBuffer) {
+        newBuffer =  new ArrayBuffer(data.value.length + retrievedArrayBuffer.length);
+        newBuffer.set(retrievedArrayBuffer, 0);
+        newBuffer.set(data.value, retrievedArrayBuffer.length);
+      } else {
+        newBuffer = data.value;
+      }
+      return validateStreamFromString(reader, expectedValue, newBuffer);
     }
-    asyncTest.step(function() {
-      assert_equals(retrievedText, expectedValue, "Retrieve and verify stream");
-      asyncTest.done();
-    });
-  }).catch(function(e) {
-    asyncTest.step(function() {
-      assert_unreached("Cannot read stream " + e);
-      asyncTest.done();
-    });
+    validateBufferFromString(retrievedArrayBuffer, expectedValue, "Retrieve and verify stream");
   });
 }
--- a/testing/web-platform/tests/fetch/api/response/response-clone.html
+++ b/testing/web-platform/tests/fetch/api/response/response-clone.html
@@ -40,27 +40,27 @@
         assert_equals(clonedResponse.status, responseInit["status"],
           "Expect response.status is " + responseInit["status"]);
         assert_equals(clonedResponse.statusText, responseInit["statusText"],
           "Expect response.statusText is " + responseInit["statusText"]);
         assert_equals(clonedResponse.headers.get("name"), "value",
           "Expect response.headers has name:value header");
       }, "Check Response's clone has the expected attribute values");
 
-      async_test(function(test) {
-        readTextStream(response.body.getReader(), test, body);
+      promise_test(function(test) {
+        return validateStreamFromString(response.body.getReader(), body);
       }, "Check orginal response's body after cloning");
 
-      async_test(function(test) {
-        readTextStream(clonedResponse.body.getReader(), test, body);
+      promise_test(function(test) {
+        return validateStreamFromString(clonedResponse.body.getReader(), body);
       }, "Check cloned response's body");
 
       promise_test(function(test) {
         var disturbedResponse = new Response();
         return disturbedResponse.text().then(function() {
             assert_true(disturbedResponse.bodyUsed, "response is disturbed");
             assert_throws(new TypeError() , function() { disturbedResponse.clone(); },
               "Expect TypeError exception");
         });
       }, "Cannot clone a disturbed response");
     </script>
   </body>
-</html>
\ No newline at end of file
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fetch/api/response/response-consume-empty.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Response consume empty bodies</title>
+    <meta name="help" href="https://fetch.spec.whatwg.org/#response">
+    <meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin">
+    <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
+    <script>
+    function checkBodyText(response) {
+      return response.text().then(function(bodyAsText) {
+        assert_equals(bodyAsText, "", "Resolved value should be empty");
+        assert_false(response.bodyUsed);
+      });
+    }
+
+    function checkBodyBlob(response) {
+      return response.blob().then(function(bodyAsBlob) {
+        var promise = new Promise(function(resolve, reject) {
+          var reader = new FileReader();
+          reader.onload = function(evt) {
+            resolve(reader.result)
+          };
+          reader.onerror = function() {
+            reject("Blob's reader failed");
+          };
+          reader.readAsText(bodyAsBlob);
+        });
+        return promise.then(function(body) {
+          assert_equals(body, "", "Resolved value should be empty");
+          assert_false(response.bodyUsed);
+        });
+      });
+    }
+
+    function checkBodyArrayBuffer(response) {
+      return response.arrayBuffer().then(function(bodyAsArrayBuffer) {
+        assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty");
+        assert_false(response.bodyUsed);
+      });
+    }
+
+    function checkBodyJSON(response) {
+      return response.json().then(
+        function(bodyAsJSON) {
+          assert_unreached("JSON parsing should fail");
+        },
+        function() {
+          assert_false(response.bodyUsed);
+        });
+    }
+
+    function checkBodyFormData(response) {
+      return response.formData().then(function(bodyAsFormData) {
+        assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData");
+        assert_false(response.bodyUsed);
+     });
+    }
+
+    function checkResponseWithNoBody(bodyType, checkFunction) {
+      promise_test(function(test) {
+        var response = new Response();
+        assert_false(response.bodyUsed);
+        return checkFunction(response);
+      }, "Consume response's body as " + bodyType);
+    }
+
+    var formData = new FormData();
+    checkResponseWithNoBody("text", checkBodyText);
+    checkResponseWithNoBody("blob", checkBodyBlob);
+    checkResponseWithNoBody("arrayBuffer", checkBodyArrayBuffer);
+    checkResponseWithNoBody("json", checkBodyJSON);
+    checkResponseWithNoBody("formData", checkBodyFormData);
+
+    function checkResponseWithEmptyBody(bodyType, body, asText) {
+      promise_test(function(test) {
+        var response = new Response(body);
+        assert_false(response.bodyUsed, "bodyUsed is false at init");
+        if (asText) {
+          return response.text().then(function(bodyAsString) {
+            assert_equals(bodyAsString.length, 0, "Resolved value should be empty");
+            assert_true(response.bodyUsed, "bodyUsed is true after being consumed");
+          });
+        }
+        return response.arrayBuffer().then(function(bodyAsArrayBuffer) {
+          assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty");
+          assert_true(response.bodyUsed, "bodyUsed is true after being consumed");
+        });
+      }, "Consume empty " + bodyType + " response body as " + (asText ? "text" : "arrayBuffer"));
+    }
+
+    // FIXME: Add BufferSource, FormData and URLSearchParams.
+    checkResponseWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), false);
+    checkResponseWithEmptyBody("text", "", false);
+    checkResponseWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), true);
+    checkResponseWithEmptyBody("text", "", true);
+    </script>
+  </body>
+</html>
--- a/testing/web-platform/tests/fetch/api/response/response-consume.html
+++ b/testing/web-platform/tests/fetch/api/response/response-consume.html
@@ -3,16 +3,17 @@
   <head>
     <meta charset="utf-8">
     <title>Response consume</title>
     <meta name="help" href="https://fetch.spec.whatwg.org/#response">
     <meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin">
     <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
+    <script src="../resources/utils.js"></script>
   </head>
   <body>
     <script>
     function checkBodyText(response, expectedBody) {
       return response.text().then( function(bodyAsText) {
         assert_equals(bodyAsText, expectedBody, "Retrieve and verify response's body");
         assert_true(response.bodyUsed, "body as text: bodyUsed turned true");
       });
@@ -34,26 +35,24 @@
           assert_equals(body, expectedBody, "Retrieve and verify response's body");
           assert_true(response.bodyUsed, "body as blob: bodyUsed turned true");
         });
       });
     }
 
     function checkBodyArrayBuffer(response, expectedBody) {
       return response.arrayBuffer().then( function(bodyAsArrayBuffer) {
-        var decoder = new TextDecoder("utf-8");
-        var strBody = decoder.decode(bodyAsArrayBuffer);
-        assert_equals(strBody, expectedBody, "Retrieve and verify response's body");
+        validateBufferFromString(bodyAsArrayBuffer, expectedBody, "Retrieve and verify response's body");
         assert_true(response.bodyUsed, "body as arrayBuffer: bodyUsed turned true");
       });
     }
 
-    function checkBodyJson(response, expectedBody) {
-      return response.json().then(function(bodyAsJson) {
-        var strBody = JSON.stringify(bodyAsJson)
+    function checkBodyJSON(response, expectedBody) {
+      return response.json().then(function(bodyAsJSON) {
+        var strBody = JSON.stringify(bodyAsJSON)
         assert_equals(strBody, expectedBody, "Retrieve and verify response's body");
         assert_true(response.bodyUsed, "body as json: bodyUsed turned true");
       });
     }
 
     function checkBodyFormData(response, expectedBody) {
       return response.formData().then(function(bodyAsFormData) {
         assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData");
@@ -65,17 +64,34 @@
       promise_test(function(test) {
         var response = new Response(body);
         assert_false(response.bodyUsed, "bodyUsed is false at init");
         return checkFunction(response, body);
       }, "Consume response's body as " + bodyType);
     }
 
     var formData = new FormData();
-    formData.append("name", "value")
-    checkResponseBody("This is response's body", "text", checkBodyText);
-    checkResponseBody("This is response's body", "blob", checkBodyBlob);
-    checkResponseBody("This is response's body", "arrayBuffer", checkBodyArrayBuffer);
-    checkResponseBody(JSON.stringify("This is response's body"), "json", checkBodyJson);
+    formData.append("name", "value");
+    var textData = JSON.stringify("This is response's body");
+    var blob = new Blob([textData], { "type" : "text/plain" });
+
+    checkResponseBody(textData, "text", checkBodyText);
+    checkResponseBody(textData, "blob", checkBodyBlob);
+    checkResponseBody(textData, "arrayBuffer", checkBodyArrayBuffer);
+    checkResponseBody(textData, "json", checkBodyJSON);
     checkResponseBody(formData, "formData", checkBodyFormData);
+
+    function checkBlobResponseBody(blobBody, blobData, bodyType, checkFunction) {
+      promise_test(function(test) {
+        var response = new Response(blobBody);
+        assert_false(response.bodyUsed, "bodyUsed is false at init");
+        return checkFunction(response, blobData);
+      }, "Consume blob response's body as " + bodyType);
+    }
+
+    checkBlobResponseBody(blob, textData, "blob", checkBodyBlob);
+    checkBlobResponseBody(blob, textData, "text", checkBodyText);
+    checkBlobResponseBody(blob, textData, "json", checkBodyJSON);
+    checkBlobResponseBody(blob, textData, "arrayBuffer", checkBodyArrayBuffer);
+
     </script>
   </body>
 </html>
--- a/testing/web-platform/tests/fetch/api/response/response-init-002.html
+++ b/testing/web-platform/tests/fetch/api/response/response-init-002.html
@@ -47,16 +47,16 @@
         urlSearchParams = new URLSearchParams("name=value");
       var usvString = "This is a USVString"
 
       checkResponseInit(blob, "application/octet-binary", "This is a blob");
       checkResponseInit(formaData, "multipart/form-data", "name=\"name\"\r\n\r\nvalue");
       checkResponseInit(urlSearchParams, "application/x-www-form-urlencoded;charset=UTF-8", "name=value");
       checkResponseInit(usvString, "text/plain;charset=UTF-8", "This is a USVString");
 
-      async_test(function(test) {
+      promise_test(function(test) {
         var body = "This is response body";
         var response = new Response(body);
-        readTextStream(response.body.getReader(), test, body);
+        return validateStreamFromString(response.body.getReader(), body);
       }, "Read Response's body as readableStream");
     </script>
   </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-location-interface/location_assign.html
+++ b/testing/web-platform/tests/html/browsers/history/the-location-interface/location_assign.html
@@ -13,14 +13,14 @@
       location.assign('#x');
 
       assert_equals((href + "#x"), location.href, "location href");
 
     }, "location assign");
 
     test(function () {
       var href = location.href;
-      location.assign("http://:");
+      assert_throws('SYNTAX_ERR', function() { location.assign("http://:"); });
       assert_equals(location.href, href);
     }, "URL that fails to parse");
     </script>
   </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/the-window-object/accessing-other-browsing-contexts/iterator.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>window[@@iterator]</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+  assert_false(Symbol.iterator in window);
+});
+</script>
--- a/testing/web-platform/tests/html/dom/interfaces.html
+++ b/testing/web-platform/tests/html/dom/interfaces.html
@@ -284,16 +284,17 @@ interface Element : Node {
   readonly attribute DOMString tagName;
 
            attribute DOMString id;
            attribute DOMString className;
   [SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
 
   boolean hasAttributes();
   [SameObject] readonly attribute NamedNodeMap attributes;
+  sequence<DOMString> getAttributeNames();
   DOMString? getAttribute(DOMString name);
   DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
   void setAttribute(DOMString name, DOMString value);
   void setAttributeNS(DOMString? namespace, DOMString name, DOMString value);
   void removeAttribute(DOMString name);
   void removeAttributeNS(DOMString? namespace, DOMString localName);
   boolean hasAttribute(DOMString name);
   boolean hasAttributeNS(DOMString? namespace, DOMString localName);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/rendering/non-replaced-elements/tables/table-cell-width-s.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<link rel="match" href="table-cell-width-ref.html">
+<style>
+body {
+  margin: 0;
+}
+
+table {
+  width: 400px;
+  border-collapse: collapse;
+}
+
+th {
+  font-weight: normal;
+  text-align: left;
+}
+
+td, th {
+  padding: 0;
+}
+
+td:first-child, th:first-child {
+  background-color: red;
+}
+</style>
+
+<!-- width=0 should be treated as 'auto' -->
+<table>
+  <tr>
+    <th width=0>a</th>
+    <th>a</th>
+  </tr>
+</table>
+
+<table>
+  <tr>
+    <td width=0>a</td>
+    <td>a</td>
+  </tr>
+</table>
+
+<!-- test valid width attribute value-->
+<table>
+  <tr>
+    <th width=100>a</th>
+    <th>a</th>
+  </tr>
+</table>
+
+<table>
+  <tr>
+    <td width=100>a</td>
+    <td>a</td>
+  </tr>
+</table>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/rendering/non-replaced-elements/tables/table-width-s.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<link rel="match" href="table-width-ref.html">
+
+<style>
+table {
+  border-collapse: collapse;
+}
+
+td {
+  padding: 0;
+}
+</style>
+
+<!-- width=0 should be treated as 'auto' -->
+<table width=0>
+  <tr>
+    <td>
+      a b
+    </td>
+  </tr>
+</table>
+
+<hr>
+
+<table width=1>
+  <tr>
+    <td>
+      a b
+    </td>
+  </tr>
+</table>
--- a/testing/web-platform/tests/html/semantics/forms/constraints/form-validation-validity-badInput.html
+++ b/testing/web-platform/tests/html/semantics/forms/constraints/form-validation-validity-badInput.html
@@ -19,28 +19,28 @@ var testElements = [
         {conditions: {multiple: true, value: "test1@example.com,test2@eample.com"}, expected: false, name: "[target] The multiple attribute is true and the value contains valid e-mail addresses"},
         {conditions: {multiple: true, value: "test,1@example.com"}, expected: false, name: "[target] The multiple attribute is true and the value attribute contains a ','"}
         //TODO, the value contains characters that cannot be converted to punycode.
         //Can not find a character that cannot be converted to punycode.
       ]
     },
     {
       tag: "input",
-      types: ["datetime"],
+      types: ["datetime-local"],
       testData: [
         {conditions: {value: ""}, expected: false, name: "[target] The value attribute is empty"},
-        {conditions: {value: "2000-01-01T12:00:00Z"}, expected: false, name: "[target] The value attribute is a valid date and time string"},
-        {conditions: {value: "abc"}, expected: true, name: "[target] The value attribute cannot convert to a valid normalized forced-UTC global date and time string"}
+        {conditions: {value: "2000-01-01T12:00:00"}, expected: false, name: "[target] The value attribute is a valid date and time string"},
+        {conditions: {value: "abc"}, expected: false, name: "[target] The value attribute cannot convert to a valid normalized forced-UTC global date and time string"}
       ]
     },
     {
       tag: "input",
       types: ["color"],
       testData: [
-        {conditions: {value: ""}, expected: true, name: "[target] The value attribute is empty"},
+        {conditions: {value: ""}, expected: false, name: "[target] The value attribute is empty"},
         {conditions: {value: "#000000"}, expected: false, name: "[target] The value attribute is a valid sample color"},
         {conditions: {value: "#FFFFFF"}, expected: false, name: "[target] The value attribute is not a valid lowercase sample color"},
-        {conditions: {value: "abc"}, expected: true, name: "[target] The value attribute cannot convert to a valid sample color"}
+        {conditions: {value: "abc"}, expected: false, name: "[target] The value attribute cannot convert to a valid sample color"}
       ]
     },
   ];
   validator.run_test (testElements, "badInput");
 </script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/forms/form-submission-0/getactionurl.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id=testframe src="/common/blank.html"></iframe>
+<script>
+var tests = [
+  {
+    name: "Navigating to URL with a data scheme",
+    action: "data:,hello%20world",
+    output: "hello world"
+  }
+];
+tests.forEach(function(test_obj) {
+  test_obj.test = async_test(test_obj.name);
+});
+
+function run_test() {
+  if (tests.length == 0) {
+    return;
+  }
+  var test_obj = tests.pop();
+  var t = test_obj.test;
+  var testframe = document.getElementById("testframe");
+  var testdocument = testframe.contentWindow.document;
+  testdocument.body.innerHTML =
+    "<form id=testform method=get action=\"" + test_obj.action +"\"></form>";
+  testframe.onload = function() {
+    t.step(function() {
+      var body_text = testframe.contentWindow.document.textContent;
+      assert_equals(body_text, test_obj.output);
+    });
+    t.done();
+    run_test();
+  };
+  testdocument.getElementById("testform").submit();
+};
+document.getElementById("testframe").onload = run_test;
+</script>
deleted file mode 100644
--- a/testing/web-platform/tests/html/semantics/forms/the-input-element/input-textselection-01.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE HTML>
-<title>The selection interface members</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<link rel="help" href="https://html.spec.whatwg.org/multipage/#textFieldSelection">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-test(function() {
-  var valid = ["text", "search", "url", "tel", "password"];
-  var invalid = ["hidden", "datetime", "date", "month", "week", "datetime-local",
-                 "number", "range", "color", "checkbox", "radio", "button",
-                 "file", "email", "submit", "image", "reset"];
-  valid.forEach(function(aType) {
-    test(function() {
-      var input = document.createElement("input");
-      input.type = aType;
-      assert_equals(input.type, aType, "Input type unsupported")
-      input.select();
-      var a = input.selectionStart;
-      input.selectionStart = 0;
-      a = input.selectionEnd;
-      input.selectionEnd = 0;
-      input.setSelectionRange(0, 0);
-    }, "Selection attributes should apply to type " + aType)
-  })
-
-  invalid.forEach(function(aType) {
-    test(function() {
-      var input = document.createElement("input");
-      input.type = aType;
-      assert_equals(input.type, aType, "Input type unsupported")
-      assert_throws("INVALID_STATE_ERR", function() { input.select(); }, "Should throw with type " + aType);
-      assert_throws("INVALID_STATE_ERR", function() { var a = input.selectionStart; });
-      assert_throws("INVALID_STATE_ERR", function() { input.selectionStart = 0; });
-      assert_throws("INVALID_STATE_ERR", function() { var a = input.selectionEnd; });
-      assert_throws("INVALID_STATE_ERR", function() { input.selectionEnd = 0; });
-      assert_throws("INVALID_STATE_ERR", function() { input.setSelectionRange(0, 0); });
-    }, "Selection attributes should not apply to type " + aType)
-  })
-});
-</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/forms/the-input-element/selection.html
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML>
+<title>Input element programmatic selection support</title>
+<link rel="author" title="yaycmyk" href="mailto:evan@yaycmyk.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/forms.html#dom-textarea/input-select">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+
+/* all textual, non-hidden inputs support .select() */
+test(function() {
+  var valid = [
+    "text",
+    "search",
+    "url",
+    "tel",
+    "email",
+    "password",
+    "date",
+    "month",
+    "week",
+    "time",
+    "datetime-local",
+    "number",
+    "color",
+    "file",
+  ];
+
+  var invalid = [
+    "hidden",
+    "range",
+    "checkbox",
+    "radio",
+    "submit",
+    "image",
+    "reset",
+    "button"
+  ];
+
+  valid.forEach(function(type) {
+    test(function() {
+      var input = document.createElement("input");
+      var a;
+
+      input.type = type;
+      assert_equals(input.type, type, "the given input type is not supported");
+
+      input.select();
+
+    }, "input type " + type + " should support the select() method");
+  });
+
+  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() { input.select(); });
+
+    }, "input type " + type + " should not support the select() method");
+  });
+});
+
+/* only certain input types are allowed to have a variable-length selection */
+test(function() {
+  var valid = [
+    "text",
+    "search",
+    "url",
+    "tel",
+    "password"
+  ];
+
+  var invalid = [
+    "hidden",
+    "email",
+    "date",
+    "month",
+    "week",
+    "time",
+    "datetime-local",
+    "number",
+    "range",
+    "color",
+    "checkbox",
+    "radio",
+    "file",
+    "submit",
+    "image",
+    "reset",
+    "button"
+  ];
+
+  valid.forEach(function(type) {
+    test(function() {
+      var input = document.createElement("input");
+      var a;
+
+      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;
+      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_throws("INVALID_STATE_ERR", function() { input.selectionStart = 0; });
+      assert_throws("INVALID_STATE_ERR", function() { var a = input.selectionEnd; });
+      assert_throws("INVALID_STATE_ERR", function() { input.selectionEnd = 0; });
+      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/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/node-document.html
+++ b/testing/web-platform/tests/html/semantics/scripting-1/the-template-element/additions-to-parsing-xhtml-documents/node-document.html
@@ -27,18 +27,21 @@ test(function() {
     assert_not_equals(template, null, 'Template element should not be null');
     assert_not_equals(template.content, undefined,
             'Content attribute of template element should not be undefined');
     assert_not_equals(template.content, null,
             'Content attribute of template element should not be null');
 
     assert_equals(template.ownerDocument, doc.body.ownerDocument,
             'Wrong template node owner document');
-    assert_equals(template.content.ownerDocument, doc,
-            'Wrong template content owner document');
+    var ownerDoc = template.content.ownerDocument;
+    assert_not_equals(ownerDoc, doc, 'Wrong template content owner document');
+    assert_not_equals(ownerDoc, document, 'Wrong template content owner document');
+    assert_equals(ownerDoc.defaultView, null,
+            'Template content owner document should not have a browsing context');
 
 }, 'Parsing XHTML: Node\'s node document must be set to that of the element '
     + 'to which it will be appended. Test empty template');
 
 
 
 test(function() {
     var doc = newXHTMLDocument();
--- a/testing/web-platform/tests/html/semantics/scripting-1/the-template-element/template-element/template-as-a-descendant.html
+++ b/testing/web-platform/tests/html/semantics/scripting-1/the-template-element/template-element/template-as-a-descendant.html
@@ -17,23 +17,37 @@
 
 function templateIsAChild(element) {
     element.innerHTML = '<template>some text</template>';
 
     assert_not_equals(element.querySelector('template'), null,
         'Template element should be a descendant of the ' + element.tagName + ' element');
 }
 
+function templateIsDisallowedAsAChild(element) {
+    element.innerHTML = '<template>some text</template>';
+
+    assert_equals(element.querySelector('template'), null,
+        'Template element should not be allowed as a descendant of the ' + element.tagName + ' element');
+}
+
 function templateIsAnIndirectChild(element) {
     element.innerHTML = '<div><template>some text</template></div>';
 
     assert_not_equals(element.querySelector('template'), null,
         'Template element should be a descendant of the ' + element.tagName + ' element');
 }
 
+function templateIsDisallowedAsAnIndirectChild(element) {
+    element.innerHTML = '<div><template>some text</template></div>';
+
+    assert_equals(element.querySelector('template'), null,
+        'Template element should not be allowed as indirect descendant of the ' + element.tagName + ' element');
+}
+
 function templateIsAnAppendedChild(doc, element) {
     var template = doc.createElement('template');
 
     element.appendChild(template);
 
     assert_not_equals(element.querySelector('template'), null,
         'Template element should be a descendant of the ' + element.tagName + ' element');
 }
@@ -53,38 +67,45 @@ var doc = newHTMLDocument();
 var frameset = doc.createElement('frameset');
 
 var parameters = [['Template element as a descendant of the BODY element. ' +
                    'Template element is created by innerHTML',
                    doc.body],
                   ['Template element as a descendant of the HEAD element. ' +
                    'Template element is created by innerHTML',
                    doc.head],
-                   ['Template element as a descendant of the FRAMESET element. ' +
-                    'Template element is created by innerHTML',
-                    frameset]
                    ];
 generate_tests(templateIsAChild, parameters,
-        'Template element as a descendant of the HEAD, BODY and FRAMESET elements');
+        'Template element as a descendant of the HEAD and BODY elements');
 
+parameters = [['Template element as a descendant of the FRAMESET element. ' +
+               'Template element is created by innerHTML',
+               frameset],
+               ];
+generate_tests(templateIsDisallowedAsAChild, parameters,
+    'Template element should be disallowed as a descendant of the FRAMESET elements');
 
 
 parameters = [['Template element as an indirect descendant of the BODY element. ' +
                'Template element is created by innerHTML',
                doc.body],
               ['Template element as an indirect descendant of the HEAD element. ' +
                'Template element is created by innerHTML',
                doc.head],
-               ['Template element as an indirect descendant of the FRAMESET element. ' +
-                'Template element is created by innerHTML',
-                frameset]
                ];
 generate_tests(templateIsAnIndirectChild, parameters,
         'Template element as an indirect descendant of the HEAD, BODY and FRAMESET elements');
 
+parameters = [['Template element as a descendant of the FRAMESET element. ' +
+               'Template element is created by innerHTML',
+               frameset],
+               ];
+generate_tests(templateIsDisallowedAsAnIndirectChild, parameters,
+    'Template element should be disallowed as an indirect descendant of the FRAMESET elements');
+
 
 
 parameters = [['Template element as a descendant of the BODY element. ' +
                'Template element is appended by appendChild()',
                doc, doc.body],
               ['Template element as a descendant of the HEAD element. ' +
                'Template element is appended by appendChild()',
                doc, doc.head],
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/selectors/pseudo-classes/focus-autofocus.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Selector: pseudo-classes (:focus for autofocus)</title>
+<link rel="author" title="Kent Tamura" href="mailto:tkent@chromium.org">
+<link rel=help href="https://html.spec.whatwg.org/multipage/#pseudo-classes">
+<link rel=help href="https://html.spec.whatwg.org/multipage/forms.html#autofocusing-a-form-control:-the-autofocus-attribute">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+// This test can't be merged to focus.html because element.focus() may affect
+// autofocus behavior.
+var autofocusTest = async_test(":focus selector should work with an autofocused element.");
+var input = document.createElement("input");
+input.autofocus = true;
+input.addEventListener("focus", function() {
+  autofocusTest.step(function() {
+    assert_array_equals(document.querySelectorAll(":focus"), [input])
+    autofocusTest.done();
+  });
+}, false);
+document.body.appendChild(input);
+</script>
+</body>
--- a/testing/web-platform/tests/html/semantics/selectors/pseudo-classes/focus.html
+++ b/testing/web-platform/tests/html/semantics/selectors/pseudo-classes/focus.html
@@ -6,27 +6,24 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="utils.js"></script>
 <body id=body tabindex=0>
   <div id="log"></div>
   <button id=button1 type=submit>button1</button>
   <input id=input1>
   <input id=input2 disabled>
-  <input id=input3 autofocus>
   <textarea id=textarea1>textarea1</textarea>
   <input type=checkbox id=checkbox1 checked>
   <input type=radio id=radio1 checked>
   <div tabindex=0 id=div1>hello</div>
   <div contenteditable id=div2>content</div>
   <iframe src="focus-iframe.html" id=iframe onload="load()"></iframe>
 
   <script>
-    testSelector(":focus", ["input3"], "input3 has the attribute autofocus");
-
     document.getElementById("input1").focus(); // set the focus on input1
     testSelector(":focus", ["input1"], "input1 has the focus");
 
     document.getElementById("div1").focus();
     testSelector(":focus", ["div1"], "tabindex attribute makes the element focusable");
 
     document.getElementById("div2").focus();
     testSelector(":focus", ["div2"], "editable elements are focusable");
--- a/testing/web-platform/tests/html/syntax/parsing/template/additions-to-the-in-frameset-insertion-mode/end-tag-frameset.html
+++ b/testing/web-platform/tests/html/syntax/parsing/template/additions-to-the-in-frameset-insertion-mode/end-tag-frameset.html
@@ -1,33 +1,27 @@
 <!DOCTYPE html>
 <html>
 <head>
 <title>HTML Templates: additions to 'in frameset' insertion mode</title>
 <meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
-<meta name="assert" content="If parser is in 'in frameset' insertion mode and meets frameset end tag then if the stack of open elements has a template element in html scope then this is a parse error; ignore the token">
-<link rel="help" href="http://www.w3.org/TR/2013/WD-html-templates-20130214/#in-head-addition">
+<meta name="assert" content="If parser is in 'in frameset' insertion mode then a start tag or an end tag whose name is 'template' is a parsing error">
+<link rel="help" href="https://www.w3.org/TR/2015/WD-html51-20151008/syntax.html#parsing-main-inframeset">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/html/resources/common.js"></script>
 <link rel="stylesheet" href="/resources/testharness.css">
 </head>
 <body>
 <div id="log"></div>
 <script type="text/javascript">
 
 testInIFrame('/html/semantics/scripting-1/the-template-element/resources/frameset-end-tag.html', function(context) {
     var doc = context.iframes[0].contentDocument;
 
     var frameset = doc.querySelector('frameset');
-    assert_equals(frameset.children.length, 1, 'Wrong number of frameset children elements');
+    assert_equals(frameset.children.length, 0, 'Wrong number of frameset children elements');
 
-    var template = frameset.querySelector('template');
-    assert_equals(template.tagName, 'TEMPLATE', 'FRAMESET should contain template element');
-    assert_equals(template.content.childNodes.length, 0,
-            'Template content should be empty');
-
-}, '</frameset> tag should be ignored if there\'s TEMPLATE element in '
-    + 'the stack of open elements');
+}, '<template> tag should be ignored in "in frameset" insertion mode');
 
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html
+++ b/testing/web-platform/tests/html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html
@@ -63,36 +63,16 @@ test(function () {
 }, 'Test ownerDocument property of the element in a template. '
     + 'Current DOCUMENT has no browsing context. Test template element '
     + 'in the root of the head');
 
 
 
 test(function () {
     var doc = newHTMLDocument();
-
-    doc.open();
-    doc.write('<frameset><template id="tmpl1"><div id="div">DIV</div></template></frameset>');
-    doc.close();
-
-    var template = doc.querySelector('#tmpl1');
-
-    var div = template.content.querySelector('#div');
-
-    assert_equals(div.ownerDocument, template.content.ownerDocument,
-            'Wrong ownerDocument of the element in template');
-
-}, 'Test ownerDocument property of the element in a template. '
-    + 'Current DOCUMENT has no browsing context. Test template element '
-    + 'in the root of the frameset');
-
-
-
-test(function () {
-    var doc = newHTMLDocument();
     doc.body.innerHTML = '<template id="tmpl1">'
         + '<template id="tmpl2"><div id="div">DIV</div></template></template>';
 
     var template = doc.querySelector('#tmpl1');
 
     var nestedTemplate = template.content.querySelector('#tmpl2');
 
     assert_equals(nestedTemplate.ownerDocument, template.content.ownerDocument,
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-processing-algorithm.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>Event handlers processing algorithm</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script
+ <body>
+ <div id="foo" style="width: 100px; height: 100px; background-color: black"></div>
+ <script>
+ async_test(function(t) {
+     var ev = new Event('mouseover', {cancelable: true});
+     document.getElementById("foo").onmouseover = t.step_func(function() { return true });
+     document.getElementById("foo").dispatchEvent(ev);
+     assert_equals(ev.defaultPrevented, true)
+     t.done();
+ }, "mouseover listener returning true cancels event");
+
+ async_test(function(t) {
+     var ev = new Event('mouseover', {cancelable: true});
+     document.getElementById("foo").onmouseover = t.step_func(function() { return false; });
+     document.getElementById("foo").dispatchEvent(ev);
+     assert_equals(ev.defaultPrevented, false);
+     t.done();
+ }, "mouseover listener returning false doesn't cancel event");
+
+ async_test(function(t) {
+     var ev = new Event('beforeunload', {cancelable: true});
+     window.onbeforeunload = t.step_func(function() {return null});
+     window.dispatchEvent(ev);
+     assert_equals(ev.defaultPrevented, true);
+     t.done();
+ }, "beforeunload listener returning null cancels event");
+
+ async_test(function(t) {
+     var ev = new Event('beforeunload', {cancelable: true});
+     window.onbeforeunload = t.step_func(function() {return true});
+     window.dispatchEvent(ev);
+     assert_equals(ev.defaultPrevented, false);
+     t.done();
+ }, "beforeunload listener returning non-null doesn't cancel event");
+
+ async_test(function(t) {
+     var ev = new Event("click", {cancelable: true});
+     document.getElementById("foo").onclick = t.step_func(function() { return false; });
+     document.getElementById("foo").dispatchEvent(ev);
+     assert_equals(ev.defaultPrevented, true);
+     t.done();
+ }, "click listener returning false cancels event");
+
+ async_test(function(t) {
+     var ev = new Event("blur", {cancelable: true});
+     document.getElementById("foo").onblur = t.step_func(function() { return false; });
+     document.getElementById("foo").dispatchEvent(ev);
+     assert_equals(ev.defaultPrevented, true);
+     t.done();
+ }, "blur listener returning false cancels event");
+
+ async_test(function(t) {
+     var ev = new Event("dblclick", {cancelable: true});
+     document.getElementById("foo").ondblclick = t.step_func(function() { return false; });
+     document.getElementById("foo").dispatchEvent(ev);
+     assert_equals(ev.defaultPrevented, true);
+     t.done();
+ }, "dblclick listener returning false cancels event");
+</script>
--- a/testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/mediastream-finished-add.html
+++ b/testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/mediastream-finished-add.html
@@ -1,49 +1,45 @@
 <!doctype html>
 <html>
 <head>
-<title>Adding a track to a finished MediaStream</title>
+<title>Adding a track to an inactive MediaStream</title>
 <link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStreamTrackList-add-void-MediaStreamTrack-track">
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStreamTrack-stop-void">
-<link rel='stylesheet' href='/resources/testharness.css' media='all'/>
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStream-addTrack-void-MediaStreamTrack-track">
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStreamTrack-stop-void">
 </head>
 <body>
 <p class="instructions">When prompted, accept to share your audio stream, then
 your video stream.</p>
 <h1 class="instructions">Description</h1>
-<p class="instructions">This test checks that adding a track to a finished
-MediaStream raises an INVALID_STATE_ERR exception.</p>
+<p class="instructions">This test checks that adding a track to an inactive
+MediaStream is allowed.</p>
 
 <div id='log'></div>
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
 <script>
-var t = async_test("Tests that an addition to a finished MediaStream raises an exception", {timeout:20000});
+var t = async_test("Tests that adding a track to an inactive MediaStream is allowed", {timeout:20000});
 t.step(function () {
   var audio, video;
 
   navigator.getUserMedia({audio:true}, gotAudio, function() {});
   function gotAudio(stream) {
     audio = stream;
     navigator.getUserMedia({video:true}, gotVideo, function() {});
   }
 
   function gotVideo(stream) {
     video = stream;
     t.step(function () {
        audio.getAudioTracks()[0].stop();
-       assert_true(audio.ended, "Audio stream is ended after stopping its only audio track");
-       assert_throws("INVALID_STATE_ERR", function () {
-          video.addTrack(audio.getAudioTracks()[0]);
-          }, "Adding a track from a finished stream raises an INVALID_STATE_ERR exception");
-       assert_throws("INVALID_STATE_ERR", function () {
-          audio.removeTrack(audio.getAudioTracks()[0]);
-          }, "Removing a track from a finished stream raises an INVALID_STATE_ERR exception");
+       assert_false(audio.active, "audio stream is inactive after stopping its only audio track");
+       assert_true(video.active, "video stream is active");
+       audio.addTrack(video.getVideoTracks()[0]);
+       audio.removeTrack(audio.getAudioTracks()[0]);
      });
     t.done();
   }
 });
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/mediastream-idl.html
+++ b/testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/mediastream-idl.html
@@ -1,20 +1,19 @@
 <!doctype html>
 <html>
 <head>
 <title>MediaStream constructor algorithm</title>
 <link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-MediaStream">
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStream-id">
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastream">
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#event-mediastream-ended">
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStreamTrack-stop-void">
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStreamTrack-clone-MediaStreamTrack">
-<link rel='stylesheet' href='/resources/testharness.css' media='all'/>
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#idl-def-MediaStream">
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStream-id">
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#mediastream">
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#event-mediastreamtrack-ended">
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStreamTrack-stop-void">
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#widl-MediaStreamTrack-clone-MediaStreamTrack">
 </head>
 <body>
 <p class="instructions">When prompted, accept to share your video and audio stream.</p>
 <h1 class="instructions">Description</h1>
 <p class="instructions">This test checks that the MediaStream constructor
 follows the algorithm set in the spec.</p>
 
 <div id='log'></div>
@@ -37,17 +36,17 @@ t.step(function() {
     assert_equals(stream4.getTrackById(audioTrack1.id), audioTrack1, "a non-ended track gets added via the MediaStream constructor");
 
     var audioTrack2 = audioTrack1.clone();
     audioTrack2.addEventListener("ended", t.step_func(function () {
       var stream3 = new MediaStream([audioTrack2, videoTrack]);
       assert_equals(stream3.getTrackById(audioTrack2.id), null, "an ended track doesn't get added via the MediaStream constructor");
       assert_equals(stream3.getTrackById(videoTrack.id), videoTrack, "a non-ended track gets added via the MediaStream constructor even if the previous track was ended");
       var stream5 = new MediaStream([audioTrack2]);
-     assert_true(stream5.ended, "a MediaStream created using the MediaStream() constructor whose arguments are lists of MediaStreamTrack objects that are all ended, the MediaStream object MUST be created with its ended attribute set to true");
+     assert_false(stream5.active, "a MediaStream created using the MediaStream() constructor whose arguments are lists of MediaStreamTrack objects that are all ended, the MediaStream object MUST be created with its active attribute set to false");
       t.done();
     }), false);
     audioTrack2.stop();
   }), function(error) {});
 });
 </script>
 </body>
 </html>
deleted file mode 100644
--- a/testing/web-platform/tests/mediacapture-streams/stream-api/mediastream/stream-ended.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<html>
-<head>
-<title>getUserMedia({video:true}) creates a stream with ended set to false</title>
-<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-MediaStream-ended">
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#event-mediastream-ended">
-<link rel='stylesheet' href='/resources/testharness.css' media='all'/>
-</head>
-<body>
-<p class="instructions">When prompted, accept to share your video stream.</p>
-<h1 class="instructions">Description</h1>
-<p class="instructions">This test checks that the MediaStream object returned by
-the success callback in getUserMedia has a ended set to false at start, and
-triggers "onended" when it is set to true.</p>
-
-<div id='log'></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
-<script>
-var t = async_test("Tests that a MediaStream handles ended correctly", {timeout:10000});
-t.step(function () {
-  navigator.getUserMedia({video:true}, t.step_func(function (stream) {
-    assert_true(!stream.ended, "the media stream starts with ended set to false");
-    stream.addEventListener("ended", t.step_func(function() {
-      assert_true(stream.ended, "stream.ended now set to true");
-      t.done();
-      }), false);
-    stream.ended = true;
-    assert_true(!stream.ended, "stream.ended should remain false");
-    stream.getVideoTracks()[0].stop();
-  }), function (error) {});
-});
-</script>
-</body>
-</html>
--- a/testing/web-platform/tests/mediacapture-streams/stream-api/mediastreamtrack/mediastreamtrack-end.html
+++ b/testing/web-platform/tests/mediacapture-streams/stream-api/mediastreamtrack/mediastreamtrack-end.html
@@ -1,40 +1,39 @@
 <!doctype html>
 <html>
 <head>
 <title>Test that mediastreamtrack are properly ended</title>
 <link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
-<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack">
-<link rel='stylesheet' href='/resources/testharness.css' media='all'/>
+<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#mediastreamtrack">
 </head>
 <body>
 <p class="instructions">When prompted, accept to share your video and audio
 stream, and then revoke that permission.</p>
 <h1 class="instructions">Description</h1>
 <p class="instructions">This test checks that the video and audio tracks of
 MediaStream object returned by the success callback in getUserMedia are
-correctly set into ended state when permission is revoked.</p>
+correctly set into inactive state when permission is revoked.</p>
 
 <div id='log'></div>
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
 <script>
 var t = async_test("Tests that the video MediaStreamTrack objects are properly ended on permission revocation", {timeout: 20000}); // longer timeout since requires user interaction
 t.step(function () {
   navigator.getUserMedia({audio: true,video: true}, t.step_func(function (stream) {
     var vidTrack = stream.getVideoTracks()[0];
     assert_equals(vidTrack.readyState, "live", "The video track object is in live state");
     var audTrack = stream.getAudioTracks()[0];
     assert_equals(audTrack.readyState, "live", "The audio track object is in live state");
     vidTrack.onended = t.step_func(function () {
         assert_equals(vidTrack.readyState, "ended", "Video track has been ended as expected");
         assert_equals(audTrack.readyState, "ended", "Audio track has been ended as expected");
-        assert_true(stream.ended, "MediaStream has been ended as expected");
+        assert_false(stream.active, "MediaStream has been inactive as expected");
         t.done();
       });
     }), function (error) {}
   );
 });
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/uievents/order-of-events/mouse-events/mouseover-out-manual.html
@@ -0,0 +1,125 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Mouseover/mouseout handling</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#outer,
+#inner,
+#released {
+  padding: 10px;
+  margin: 10px;
+  height: 15px;
+}
+
+#outer:hover,
+#inner:hover,
+#released:hover {
+  background: red;
+}
+
+#outer {
+  background: blue;
+}
+
+#inner {
+  background: green;
+}
+
+#released {
+  background: yellow;
+}
+</style>
+<p>
+  Steps:
+
+  <ol>
+    <li>Move your mouse over the blue <code>&lt;div&gt;</code> element, later
+      over the green one, later over the yellow one.
+    <li>Move the mouse from the yellow element to the green one, later to the
+      blue one, and later over this paragraph.
+  </ol>
+</p>
+
+
+<div id="outer">
+  <div id="inner"></div>
+</div>
+<div id="released"></div>
+
+<div id="log"></div>
+
+<script>
+var t = async_test("Mouseover/out events");
+var outer = document.getElementById("outer");
+var inner = document.getElementById("inner");
+
+var inner_over = 0;
+var inner_out = 0;
+
+var outer_own_over = 0;
+var outer_own_out = 0;
+var outer_over = 0;
+var outer_out = 0;
+
+
+inner.addEventListener("mouseover", t.step_func(function(e) {
+  assert_true(inner_over == inner_out, "mouseover is received before mouseout");
+
+  switch (inner_over) {
+    case 0:
+      assert_true(outer_own_over == 1, "should have triggered a mouseover in the outer before");
+      break;
+    case 1:
+      assert_true(outer_own_over == 1, "should have not triggered a mouseover in the outer before");
+      break;
+    default:
+      assert_true(false, "should not get more than two mouseovers");
+  }
+
+  inner_over++;
+}), false);
+
+inner.addEventListener("mouseout", t.step_func(function(e) {
+  assert_true(inner_over == inner_out + 1, "mouseout is received after mouseover");
+
+  switch (inner_out) {
+    case 0:
+      assert_true(outer_own_out == 1, "mouseout should have been received in the parent when hovering over this element");
+      break;
+    case 1:
+      break;
+    default:
+      assert_true(false, "should not get more than two mouseouts");
+  }
+
+  inner_out++;
+}), false);
+
+outer.addEventListener("mouseover", t.step_func(function(e) {
+  if (e.target == outer) {
+    assert_true(outer_own_over == outer_own_out, "outer: mouseover is received before mouseout");
+    outer_own_over++;
+  } else {
+    assert_true(outer_over - outer_own_over == inner_over - 1, "mouseover: should only receive this via bubbling");
+  }
+
+  outer_over++;
+}), false);
+
+outer.addEventListener('mouseout', t.step_func(function(e) {
+  if (e.target == outer) {
+    assert_true(outer_own_over == outer_own_out + 1, "outer: mouseout is received after mouseover");
+    if (outer_own_out == 1) {
+      assert_true(inner_out == 2, "inner should be done now");
+      t.done();
+    }
+
+    outer_own_out++;
+  } else {
+    assert_true(outer_out - outer_own_out == inner_out - 1, "mouseout: should only receive this via bubbling");
+  }
+
+  outer_out++;
+}), false);
+</script>
--- a/testing/web-platform/tests/url/urltestdata.json
+++ b/testing/web-platform/tests/url/urltestdata.json
@@ -4203,10 +4203,26 @@
     "username": "",
     "password": "",
     "host": "localhost:3000",
     "hostname": "localhost",
     "port": "3000",
     "pathname": "/jqueryui@1.2.3",
     "search": "",
     "hash": ""
+  },
+  "# tab/LF/CR",
+  {
+    "input": "h\tt\nt\rp://h\to\ns\rt:9\t0\n0\r0/p\ta\nt\rh?q\tu\ne\rry#f\tr\na\rg",
+    "base": "about:blank",
+    "href": "http://host:9000/path?query#frag",
+    "origin": "http://host:9000",
+    "protocol": "http:",
+    "username": "",
+    "password": "",
+    "host": "host:9000",
+    "hostname": "host",
+    "port": "9000",
+    "pathname": "/path",
+    "search": "?query",
+    "hash": "#frag"
   }
 ]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webmessaging/MessageEvent.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>MessageEvent</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<script>
+var prefixes = ['moz', 'ms', 'o', 'webkit'];
+prefixes.forEach(function(prefix) {
+  var name = prefix + "InitMessageEvent";
+
+  test(function() {
+    assert_false(name in MessageEvent.prototype);
+  }, name + " on the prototype");
+
+  test(function() {
+    var event = new MessageEvent("message");
+    assert_false(name in event);
+  }, name + " on the instance");
+});
+</script>
--- a/testing/web-platform/tests/webmessaging/MessageEvent_properties.htm
+++ b/testing/web-platform/tests/webmessaging/MessageEvent_properties.htm
@@ -4,44 +4,29 @@
 <title> MessageEvent interface and properties </title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 </head>
 <body>
 <div id=log></div>
 
 <div style="display:none">
-    <iframe width="70%" onload="PostMessageTest()" src="./support/ChildWindowPostMessage.htm"></iframe>
+    <iframe width="70%" onload="do_test()" src="./support/ChildWindowPostMessage.htm"></iframe>
 </div>
 
 <script>
-
-
-    var description = "Test Description: " +
-            "Create an event that uses the MessageEvent interface, with the event type message, " +
-            "which does not bubble, is not cancelable, and has no default action.";
-
-    var t = async_test(description);
-
-    var DATA = "foo";
-    var TARGET = document.querySelector("iframe");
-    var ExpectedResult = [true, true, false, false, false];
-    var ActualResult = [];
+async_test(function() {
+    window.do_test = this.step_func(function() {
+        document.querySelector("iframe").contentWindow.postMessage("foo", "*");
+    })
 
-    function PostMessageTest()
-    {
-        TARGET.contentWindow.postMessage(DATA, "*");
-    }
-
-    window.addEventListener("message", t.step_func(function(e)
-    {
+    window.addEventListener("message", this.step_func_done(function(e) {
         e.preventDefault();
-
-        ActualResult = [(e instanceof MessageEvent), (e.type == "message"), e.bubbles, e.cancelable, e.defaultPrevented];
-
-        assert_array_equals(ActualResult, ExpectedResult, "ActualResult");
-
-        t.done();
-
+        assert_true(e instanceof MessageEvent, "Should be MessageEvent");
+        assert_equals(e.type, "message");
+        assert_false(e.bubbles, "bubbles");
+        assert_false(e.cancelable, "cancelable");
+        assert_false(e.defaultPrevented, "defaultPrevented");
     }), false);
+});
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/websockets/opening-handshake/003-sets-origin.worker.js
@@ -0,0 +1,19 @@
+importScripts("/resources/testharness.js");
+importScripts('../constants.js?pipe=sub');
+importScripts('../websocket.sub.js');
+
+async_test(function(t) {
+  var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/origin');
+  ws.onmessage = t.step_func(function(e) {
+    assert_equals(e.data, location.protocol+'//'+location.host);
+    ws.onclose = t.step_func(function(e) {
+      assert_equals(e.wasClean, true);
+      ws.onclose = t.step_func(function() {assert_unreached()});
+      setTimeout(t.step_func_done(), 50)
+    })
+    ws.close();
+  })
+  ws.onerror = ws.onclose = t.step_func(function() {assert_unreached()});
+}, "W3C WebSocket API - origin set in a Worker");
+
+done();