Bug 1146321 - Update web-platform-tests to revision 1defdd7213b52589e4b7a259e53f4fff359c301a, a=testonly
authorJames Graham <james@hoppipolla.co.uk>
Mon, 23 Mar 2015 08:51:34 +0000
changeset 265368 f8de9b743d15a6a50f54230fe3b2e0a475abcadb
parent 265367 948262aa93347e3aa3db143e26d435257c776d00
child 265369 69f2c5d5e2b2fad118e8a69ab2ddc0dbbcf2a777
push id830
push userraliiev@mozilla.com
push dateFri, 19 Jun 2015 19:24:37 +0000
treeherdermozilla-release@932614382a68 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstestonly
bugs1146321
milestone39.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 1146321 - Update web-platform-tests to revision 1defdd7213b52589e4b7a259e53f4fff359c301a, a=testonly
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/mozilla-sync
testing/web-platform/tests/DOMEvents/constructors.html
testing/web-platform/tests/DOMEvents/tests/approved/EventListener.dispatch.new.event.html
testing/web-platform/tests/FileAPI/FileReader/Progress_event_bubbles_cancelable.html
testing/web-platform/tests/IndexedDB/interfaces.html
testing/web-platform/tests/XMLHttpRequest/open-during-abort.htm
testing/web-platform/tests/XMLHttpRequest/open-method-bogus.htm
testing/web-platform/tests/XMLHttpRequest/resources/utf16.txt
testing/web-platform/tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js
testing/web-platform/tests/XMLHttpRequest/send-entity-body-none.htm
testing/web-platform/tests/XMLHttpRequest/send-receive-utf16.htm
testing/web-platform/tests/XMLHttpRequest/send-timeout-events.htm
testing/web-platform/tests/battery-status/battery-charging-manual.html
testing/web-platform/tests/battery-status/battery-created-manual.html
testing/web-platform/tests/battery-status/battery-discharging-manual.html
testing/web-platform/tests/battery-status/battery-full-manual.html
testing/web-platform/tests/battery-status/battery-plugging-in-manual.html
testing/web-platform/tests/battery-status/battery-promise.html
testing/web-platform/tests/battery-status/battery-unplugging-manual.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-empty-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-leading-bom-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-leading-whitespace-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-rejected-cache-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-rejected-no-email-collection-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-trailing-pile-of-poo-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-trailing-whitespace-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-turkish-lowercase-dotless-i-novalid.html
testing/web-platform/tests/conformance-checkers/html/elements/meta/name-turkish-uppercase-dotted-i-novalid.html
testing/web-platform/tests/conformance-checkers/messages.json
testing/web-platform/tests/conformance-checkers/tools/meta-extensions
testing/web-platform/tests/conformance-checkers/tools/meta-name.py
testing/web-platform/tests/dom/events/Event-dispatch-reenter.html
testing/web-platform/tests/html/browsers/history/the-history-interface/004.html
testing/web-platform/tests/html/browsers/history/the-history-interface/005.html
testing/web-platform/tests/html/browsers/history/the-history-interface/006.html
testing/web-platform/tests/html/browsers/history/the-history-interface/007.html
testing/web-platform/tests/html/browsers/history/the-history-interface/008.html
testing/web-platform/tests/html/browsers/history/the-history-interface/009-1.html
testing/web-platform/tests/html/browsers/history/the-history-interface/009.html
testing/web-platform/tests/html/browsers/history/the-history-interface/010-1.html
testing/web-platform/tests/html/browsers/history/the-history-interface/010.html
testing/web-platform/tests/html/browsers/history/the-history-interface/011.html
testing/web-platform/tests/html/browsers/history/the-history-interface/012.html
testing/web-platform/tests/html/browsers/history/the-history-interface/blank.html
testing/web-platform/tests/html/browsers/history/the-history-interface/blank2.html
testing/web-platform/tests/html/browsers/history/the-history-interface/blank3.html
testing/web-platform/tests/html/browsers/offline/resources/css/result.css
testing/web-platform/tests/html/dom/elements-embedded.js
testing/web-platform/tests/html/dom/elements-forms.js
testing/web-platform/tests/html/dom/elements-grouping.js
testing/web-platform/tests/html/dom/elements-metadata.js
testing/web-platform/tests/html/dom/elements-microdata.js
testing/web-platform/tests/html/dom/elements-misc.js
testing/web-platform/tests/html/dom/elements-obsolete.js
testing/web-platform/tests/html/dom/elements-sections.js
testing/web-platform/tests/html/dom/elements-tabular.js
testing/web-platform/tests/html/dom/elements-text.js
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-001.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-002.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-003.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-004.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-005.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-006.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-007.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-008.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-009.html
testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-010.html
testing/web-platform/tests/html/dom/interfaces.html
testing/web-platform/tests/html/dom/new-harness.js
testing/web-platform/tests/html/dom/original-harness.js
testing/web-platform/tests/html/dom/reflection-original.html
testing/web-platform/tests/html/dom/reflection.js
testing/web-platform/tests/html/editing/dnd/resources/crossorigin.sub.js
testing/web-platform/tests/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html
testing/web-platform/tests/html/semantics/embedded-content/the-img-element/sizes/sizes-iframed.sub.html
testing/web-platform/tests/html/semantics/grouping-content/the-li-element/grouping-li-novalue-MANUAL.html
testing/web-platform/tests/html/semantics/grouping-content/the-li-element/grouping-li-novalue-manual.html
testing/web-platform/tests/html/semantics/interactive-elements/the-details-element/details.html
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/script-before-after-events.html
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/script-for-event.html
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/script-for-onload.html
testing/web-platform/tests/html/syntax/parsing/html5lib_adoption01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_adoption02.html
testing/web-platform/tests/html/syntax/parsing/html5lib_comments01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_doctype01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_domjs-unsafe.html
testing/web-platform/tests/html/syntax/parsing/html5lib_entities01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_entities02.html
testing/web-platform/tests/html/syntax/parsing/html5lib_html5test-com.html
testing/web-platform/tests/html/syntax/parsing/html5lib_inbody01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_isindex.html
testing/web-platform/tests/html/syntax/parsing/html5lib_main-element.html
testing/web-platform/tests/html/syntax/parsing/html5lib_pending-spec-changes-plain-text-unsafe.html
testing/web-platform/tests/html/syntax/parsing/html5lib_pending-spec-changes.html
testing/web-platform/tests/html/syntax/parsing/html5lib_plain-text-unsafe.html
testing/web-platform/tests/html/syntax/parsing/html5lib_scriptdata01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_adoption01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_ark.html
testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_webkit01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tables01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_template.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests1.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests10.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests11.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests12.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests14.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests15.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests16.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests17.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests18.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests19.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests2.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests20.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests21.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests22.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests23.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests24.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests25.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests26.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests3.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests5.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests6.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests7.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests8.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tests9.html
testing/web-platform/tests/html/syntax/parsing/html5lib_tricky01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_webkit01.html
testing/web-platform/tests/html/syntax/parsing/html5lib_webkit02.html
testing/web-platform/tests/html/tools/html5lib_test.xml
testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js
testing/web-platform/tests/old-tests/submission/Opera/script_scheduling/079.html
testing/web-platform/tests/resources/docs/api.md
testing/web-platform/tests/resources/idlharness.js
testing/web-platform/tests/resources/testharness.css
testing/web-platform/tests/resources/testharness.js
testing/web-platform/tests/resources/testharnessreport.js
testing/web-platform/tests/selectors/attribute-selectors/attribute-case/syntax.html
testing/web-platform/tests/serve
testing/web-platform/tests/serve.py
testing/web-platform/tests/service-workers/stub-4.6.2-cache.html
testing/web-platform/tests/tools/lint/lint.py
testing/web-platform/tests/tools/lint/lint.whitelist
testing/web-platform/tests/tools/manifest/item.py
testing/web-platform/tests/tools/manifest/sourcefile.py
testing/web-platform/tests/tools/runner/update_manifest.py
testing/web-platform/tests/tools/serve/serve.py
testing/web-platform/tests/tools/sslutils/base.py
testing/web-platform/tests/tools/wptserve/wptserve/handlers.py
testing/web-platform/tests/tools/wptserve/wptserve/router.py
testing/web-platform/tests/tools/wptserve/wptserve/server.py
testing/web-platform/tests/webstorage/builtins.html
testing/web-platform/tests/webstorage/clear.html
testing/web-platform/tests/webstorage/getitem.html
testing/web-platform/tests/webstorage/in.html
testing/web-platform/tests/webstorage/indexing.html
testing/web-platform/tests/webstorage/key.html
testing/web-platform/tests/webstorage/length.html
testing/web-platform/tests/webstorage/removeitem.html
testing/web-platform/tests/webstorage/setitem.html
testing/web-platform/tests/webstorage/storage_builtins.js
testing/web-platform/tests/webstorage/storage_local_builtins.html
testing/web-platform/tests/webstorage/storage_local_clear.html
testing/web-platform/tests/webstorage/storage_local_clear_js.html
testing/web-platform/tests/webstorage/storage_local_getitem.html
testing/web-platform/tests/webstorage/storage_local_getitem_js.html
testing/web-platform/tests/webstorage/storage_local_in_js.html
testing/web-platform/tests/webstorage/storage_local_index_js.html
testing/web-platform/tests/webstorage/storage_local_key.html
testing/web-platform/tests/webstorage/storage_local_length.html
testing/web-platform/tests/webstorage/storage_local_length_js.html
testing/web-platform/tests/webstorage/storage_local_removeitem.html
testing/web-platform/tests/webstorage/storage_local_removeitem_js.html
testing/web-platform/tests/webstorage/storage_local_setitem.html
testing/web-platform/tests/webstorage/storage_local_setitem_js.html
testing/web-platform/tests/webstorage/storage_session_builtins.html
testing/web-platform/tests/webstorage/storage_session_clear.html
testing/web-platform/tests/webstorage/storage_session_clear_js.html
testing/web-platform/tests/webstorage/storage_session_getitem.html
testing/web-platform/tests/webstorage/storage_session_getitem_js.html
testing/web-platform/tests/webstorage/storage_session_in_js.html
testing/web-platform/tests/webstorage/storage_session_index_js.html
testing/web-platform/tests/webstorage/storage_session_key.html
testing/web-platform/tests/webstorage/storage_session_length.html
testing/web-platform/tests/webstorage/storage_session_length_js.html
testing/web-platform/tests/webstorage/storage_session_removeitem.html
testing/web-platform/tests/webstorage/storage_session_removeitem_js.html
testing/web-platform/tests/webstorage/storage_session_setitem.html
testing/web-platform/tests/webstorage/storage_session_setitem_js.html
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -705,16 +705,20 @@
         "path": "html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-manual.html",
         "url": "/html/semantics/forms/attributes-common-to-form-controls/dirname-rtl-manual.html"
       },
       {
         "path": "html/semantics/forms/the-input-element/file-manual.html",
         "url": "/html/semantics/forms/the-input-element/file-manual.html"
       },
       {
+        "path": "html/semantics/grouping-content/the-li-element/grouping-li-novalue-manual.html",
+        "url": "/html/semantics/grouping-content/the-li-element/grouping-li-novalue-manual.html"
+      },
+      {
         "path": "mediacapture-streams/mediastreams-as-media-elements/video-assignment-manual.html",
         "url": "/mediacapture-streams/mediastreams-as-media-elements/video-assignment-manual.html"
       },
       {
         "path": "mediacapture-streams/stream-api/mediastream/mediastream-id-manual.html",
         "url": "/mediacapture-streams/stream-api/mediastream/mediastream-id-manual.html"
       },
       {
@@ -7851,32 +7855,32 @@
         "path": "2dcontext/transformations/2d.transformation.translate.nonfinite.html",
         "url": "/2dcontext/transformations/2d.transformation.translate.nonfinite.html"
       },
       {
         "path": "DOMEvents/ClickFakeEvent.nondocument.html",
         "url": "/DOMEvents/ClickFakeEvent.nondocument.html"
       },
       {
+        "path": "DOMEvents/constructors.html",
+        "url": "/DOMEvents/constructors.html"
+      },
+      {
         "path": "DOMEvents/event-phases-order.html",
         "url": "/DOMEvents/event-phases-order.html"
       },
       {
         "path": "DOMEvents/init-event-while-dispatching.html",
         "url": "/DOMEvents/init-event-while-dispatching.html"
       },
       {
         "path": "DOMEvents/tests/approved/DOM.event.flow.html",
         "url": "/DOMEvents/tests/approved/DOM.event.flow.html"
       },
       {
-        "path": "DOMEvents/tests/approved/EventListener.dispatch.new.event.html",
-        "url": "/DOMEvents/tests/approved/EventListener.dispatch.new.event.html"
-      },
-      {
         "path": "DOMEvents/tests/approved/EventListener.eventHandler.html",
         "url": "/DOMEvents/tests/approved/EventListener.eventHandler.html"
       },
       {
         "path": "DOMEvents/tests/approved/EventObject.after.dispatchEvent.html",
         "url": "/DOMEvents/tests/approved/EventObject.after.dispatchEvent.html"
       },
       {
@@ -7955,16 +7959,20 @@
         "path": "DOMEvents/throwing-in-listener-and-window-error-event.html",
         "url": "/DOMEvents/throwing-in-listener-and-window-error-event.html"
       },
       {
         "path": "DOMEvents/throwing-in-listener-when-all-have-not-run-yet.html",
         "url": "/DOMEvents/throwing-in-listener-when-all-have-not-run-yet.html"
       },
       {
+        "path": "FileAPI/FileReader/Progress_event_bubbles_cancelable.html",
+        "url": "/FileAPI/FileReader/Progress_event_bubbles_cancelable.html"
+      },
+      {
         "path": "FileAPI/FileReaderSync.worker.js",
         "url": "/FileAPI/FileReaderSync.worker"
       },
       {
         "path": "FileAPI/blob/Blob-XHR-revoke.html",
         "url": "/FileAPI/blob/Blob-XHR-revoke.html"
       },
       {
@@ -9207,16 +9215,20 @@
         "path": "XMLHttpRequest/open-after-abort.htm",
         "url": "/XMLHttpRequest/open-after-abort.htm"
       },
       {
         "path": "XMLHttpRequest/open-after-setrequestheader.htm",
         "url": "/XMLHttpRequest/open-after-setrequestheader.htm"
       },
       {
+        "path": "XMLHttpRequest/open-during-abort.htm",
+        "url": "/XMLHttpRequest/open-during-abort.htm"
+      },
+      {
         "path": "XMLHttpRequest/open-method-bogus.htm",
         "url": "/XMLHttpRequest/open-method-bogus.htm"
       },
       {
         "path": "XMLHttpRequest/open-method-case-insensitive.htm",
         "url": "/XMLHttpRequest/open-method-case-insensitive.htm"
       },
       {
@@ -9531,16 +9543,20 @@
         "path": "XMLHttpRequest/send-no-response-event-order.htm",
         "url": "/XMLHttpRequest/send-no-response-event-order.htm"
       },
       {
         "path": "XMLHttpRequest/send-non-same-origin.sub.htm",
         "url": "/XMLHttpRequest/send-non-same-origin.sub.htm"
       },
       {
+        "path": "XMLHttpRequest/send-receive-utf16.htm",
+        "url": "/XMLHttpRequest/send-receive-utf16.htm"
+      },
+      {
         "path": "XMLHttpRequest/send-redirect-bogus-sync.htm",
         "url": "/XMLHttpRequest/send-redirect-bogus-sync.htm"
       },
       {
         "path": "XMLHttpRequest/send-redirect-infinite-sync.htm",
         "url": "/XMLHttpRequest/send-redirect-infinite-sync.htm"
       },
       {
@@ -10207,16 +10223,20 @@
         "path": "dom/events/Event-dispatch-omitted-capture.html",
         "url": "/dom/events/Event-dispatch-omitted-capture.html"
       },
       {
         "path": "dom/events/Event-dispatch-redispatch.html",
         "url": "/dom/events/Event-dispatch-redispatch.html"
       },
       {
+        "path": "dom/events/Event-dispatch-reenter.html",
+        "url": "/dom/events/Event-dispatch-reenter.html"
+      },
+      {
         "path": "dom/events/Event-dispatch-target-moved.html",
         "url": "/dom/events/Event-dispatch-target-moved.html"
       },
       {
         "path": "dom/events/Event-dispatch-target-removed.html",
         "url": "/dom/events/Event-dispatch-target-removed.html"
       },
       {
@@ -13779,20 +13799,16 @@
         "path": "html/semantics/embedded-content/the-img-element/img.complete.html",
         "url": "/html/semantics/embedded-content/the-img-element/img.complete.html"
       },
       {
         "path": "html/semantics/embedded-content/the-img-element/relevant-mutations.html",
         "url": "/html/semantics/embedded-content/the-img-element/relevant-mutations.html"
       },
       {
-        "path": "html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html",
-        "url": "/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html"
-      },
-      {
         "path": "html/semantics/embedded-content/the-img-element/srcset/parse-a-srcset-attribute.html",
         "url": "/html/semantics/embedded-content/the-img-element/srcset/parse-a-srcset-attribute.html"
       },
       {
         "path": "html/semantics/embedded-content/the-img-element/srcset/select-an-image-source.html",
         "url": "/html/semantics/embedded-content/the-img-element/srcset/select-an-image-source.html"
       },
       {
@@ -14203,20 +14219,16 @@
         "path": "html/semantics/grouping-content/the-figure-element/grouping-figure.html",
         "url": "/html/semantics/grouping-content/the-figure-element/grouping-figure.html"
       },
       {
         "path": "html/semantics/grouping-content/the-hr-element/grouping-hr.html",
         "url": "/html/semantics/grouping-content/the-hr-element/grouping-hr.html"
       },
       {
-        "path": "html/semantics/grouping-content/the-li-element/grouping-li-novalue-MANUAL.html",
-        "url": "/html/semantics/grouping-content/the-li-element/grouping-li-novalue-MANUAL.html"
-      },
-      {
         "path": "html/semantics/grouping-content/the-li-element/grouping-li.html",
         "url": "/html/semantics/grouping-content/the-li-element/grouping-li.html"
       },
       {
         "path": "html/semantics/grouping-content/the-ol-element/grouping-ol.html",
         "url": "/html/semantics/grouping-content/the-ol-element/grouping-ol.html"
       },
       {
@@ -14235,16 +14247,20 @@
         "path": "html/semantics/grouping-content/the-pre-element/grouping-pre.html",
         "url": "/html/semantics/grouping-content/the-pre-element/grouping-pre.html"
       },
       {
         "path": "html/semantics/grouping-content/the-ul-element/grouping-ul.html",
         "url": "/html/semantics/grouping-content/the-ul-element/grouping-ul.html"
       },
       {
+        "path": "html/semantics/interactive-elements/the-details-element/details.html",
+        "url": "/html/semantics/interactive-elements/the-details-element/details.html"
+      },
+      {
         "path": "html/semantics/interactive-elements/the-details-element/toggleEvent.html",
         "url": "/html/semantics/interactive-elements/the-details-element/toggleEvent.html"
       },
       {
         "path": "html/semantics/interactive-elements/the-dialog-element/dialog-close.html",
         "url": "/html/semantics/interactive-elements/the-dialog-element/dialog-close.html"
       },
       {
@@ -14307,20 +14323,16 @@
         "path": "html/semantics/scripting-1/the-script-element/script-for-event.html",
         "url": "/html/semantics/scripting-1/the-script-element/script-for-event.html"
       },
       {
         "path": "html/semantics/scripting-1/the-script-element/script-for-event.xhtml",
         "url": "/html/semantics/scripting-1/the-script-element/script-for-event.xhtml"
       },
       {
-        "path": "html/semantics/scripting-1/the-script-element/script-for-onload.html",
-        "url": "/html/semantics/scripting-1/the-script-element/script-for-onload.html"
-      },
-      {
         "path": "html/semantics/scripting-1/the-script-element/script-language-type.html",
         "url": "/html/semantics/scripting-1/the-script-element/script-language-type.html"
       },
       {
         "path": "html/semantics/scripting-1/the-script-element/script-languages-01.html",
         "url": "/html/semantics/scripting-1/the-script-element/script-languages-01.html"
       },
       {
@@ -17975,16 +17987,24 @@
         "path": "websockets/unload-a-document/001.html",
         "url": "/websockets/unload-a-document/001.html"
       },
       {
         "path": "websockets/unload-a-document/003.html",
         "url": "/websockets/unload-a-document/003.html"
       },
       {
+        "path": "webstorage/builtins.html",
+        "url": "/webstorage/builtins.html"
+      },
+      {
+        "path": "webstorage/clear.html",
+        "url": "/webstorage/clear.html"
+      },
+      {
         "path": "webstorage/event_constructor.html",
         "url": "/webstorage/event_constructor.html"
       },
       {
         "path": "webstorage/event_constructor_js.html",
         "url": "/webstorage/event_constructor_js.html"
       },
       {
@@ -18031,134 +18051,50 @@
         "path": "webstorage/event_session_storageeventinit.html",
         "url": "/webstorage/event_session_storageeventinit.html"
       },
       {
         "path": "webstorage/event_session_url.html",
         "url": "/webstorage/event_session_url.html"
       },
       {
+        "path": "webstorage/getitem.html",
+        "url": "/webstorage/getitem.html"
+      },
+      {
         "path": "webstorage/idlharness.html",
         "url": "/webstorage/idlharness.html"
       },
       {
+        "path": "webstorage/in.html",
+        "url": "/webstorage/in.html"
+      },
+      {
+        "path": "webstorage/indexing.html",
+        "url": "/webstorage/indexing.html"
+      },
+      {
+        "path": "webstorage/key.html",
+        "url": "/webstorage/key.html"
+      },
+      {
+        "path": "webstorage/length.html",
+        "url": "/webstorage/length.html"
+      },
+      {
         "path": "webstorage/missing_arguments.html",
         "url": "/webstorage/missing_arguments.html"
       },
       {
-        "path": "webstorage/storage_local_builtins.html",
-        "url": "/webstorage/storage_local_builtins.html"
-      },
-      {
-        "path": "webstorage/storage_local_clear.html",
-        "url": "/webstorage/storage_local_clear.html"
-      },
-      {
-        "path": "webstorage/storage_local_clear_js.html",
-        "url": "/webstorage/storage_local_clear_js.html"
-      },
-      {
-        "path": "webstorage/storage_local_getitem.html",
-        "url": "/webstorage/storage_local_getitem.html"
-      },
-      {
-        "path": "webstorage/storage_local_getitem_js.html",
-        "url": "/webstorage/storage_local_getitem_js.html"
-      },
-      {
-        "path": "webstorage/storage_local_in_js.html",
-        "url": "/webstorage/storage_local_in_js.html"
-      },
-      {
-        "path": "webstorage/storage_local_index_js.html",
-        "url": "/webstorage/storage_local_index_js.html"
-      },
-      {
-        "path": "webstorage/storage_local_key.html",
-        "url": "/webstorage/storage_local_key.html"
-      },
-      {
-        "path": "webstorage/storage_local_length.html",
-        "url": "/webstorage/storage_local_length.html"
-      },
-      {
-        "path": "webstorage/storage_local_length_js.html",
-        "url": "/webstorage/storage_local_length_js.html"
-      },
-      {
-        "path": "webstorage/storage_local_removeitem.html",
-        "url": "/webstorage/storage_local_removeitem.html"
-      },
-      {
-        "path": "webstorage/storage_local_removeitem_js.html",
-        "url": "/webstorage/storage_local_removeitem_js.html"
-      },
-      {
-        "path": "webstorage/storage_local_setitem.html",
-        "url": "/webstorage/storage_local_setitem.html"
-      },
-      {
-        "path": "webstorage/storage_local_setitem_js.html",
-        "url": "/webstorage/storage_local_setitem_js.html"
-      },
-      {
-        "path": "webstorage/storage_session_builtins.html",
-        "url": "/webstorage/storage_session_builtins.html"
-      },
-      {
-        "path": "webstorage/storage_session_clear.html",
-        "url": "/webstorage/storage_session_clear.html"
-      },
-      {
-        "path": "webstorage/storage_session_clear_js.html",
-        "url": "/webstorage/storage_session_clear_js.html"
-      },
-      {
-        "path": "webstorage/storage_session_getitem.html",
-        "url": "/webstorage/storage_session_getitem.html"
-      },
-      {
-        "path": "webstorage/storage_session_getitem_js.html",
-        "url": "/webstorage/storage_session_getitem_js.html"
-      },
-      {
-        "path": "webstorage/storage_session_in_js.html",
-        "url": "/webstorage/storage_session_in_js.html"
-      },
-      {
-        "path": "webstorage/storage_session_index_js.html",
-        "url": "/webstorage/storage_session_index_js.html"
-      },
-      {
-        "path": "webstorage/storage_session_key.html",
-        "url": "/webstorage/storage_session_key.html"
-      },
-      {
-        "path": "webstorage/storage_session_length.html",
-        "url": "/webstorage/storage_session_length.html"
-      },
-      {
-        "path": "webstorage/storage_session_length_js.html",
-        "url": "/webstorage/storage_session_length_js.html"
-      },
-      {
-        "path": "webstorage/storage_session_removeitem.html",
-        "url": "/webstorage/storage_session_removeitem.html"
-      },
-      {
-        "path": "webstorage/storage_session_removeitem_js.html",
-        "url": "/webstorage/storage_session_removeitem_js.html"
-      },
-      {
-        "path": "webstorage/storage_session_setitem.html",
-        "url": "/webstorage/storage_session_setitem.html"
-      },
-      {
-        "path": "webstorage/storage_session_setitem_js.html",
-        "url": "/webstorage/storage_session_setitem_js.html"
+        "path": "webstorage/removeitem.html",
+        "url": "/webstorage/removeitem.html"
+      },
+      {
+        "path": "webstorage/setitem.html",
+        "url": "/webstorage/setitem.html"
       },
       {
         "path": "webvtt/interfaces.html",
         "url": "/webvtt/interfaces.html"
       },
       {
         "path": "webvtt/webvtt-api-for-browsers/vttcue-interface/align.html",
         "url": "/webvtt/webvtt-api-for-browsers/vttcue-interface/align.html"
@@ -19162,16 +19098,21 @@
         "url": "/html/semantics/embedded-content/media-elements/audio_loop_base.html"
       },
       {
         "path": "html/semantics/embedded-content/media-elements/video_loop_base.html",
         "timeout": "long",
         "url": "/html/semantics/embedded-content/media-elements/video_loop_base.html"
       },
       {
+        "path": "html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html",
+        "timeout": "long",
+        "url": "/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html"
+      },
+      {
         "path": "html/syntax/parsing/html5lib_adoption01.html",
         "timeout": "long",
         "url": "/html/syntax/parsing/html5lib_adoption01.html"
       },
       {
         "path": "html/syntax/parsing/html5lib_adoption02.html",
         "timeout": "long",
         "url": "/html/syntax/parsing/html5lib_adoption02.html"
@@ -24622,12 +24563,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": "9a2c04e06cb4e63b13b803722d345d085bf0debf",
+  "rev": "1defdd7213b52589e4b7a259e53f4fff359c301a",
   "url_base": "/",
   "version": 2
 }
\ No newline at end of file
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,1 +1,1 @@
-78d32759890c7d43d1da887c104bddc32ea6e1aa
\ No newline at end of file
+26a547de76bfb10335b5a3ba5dfd88a77088da84
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/DOMEvents/constructors.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Event constructors</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+function assert_props(iface, event, defaults) {
+  assert_true(event instanceof self[iface]);
+  expected[iface].properties.forEach(function(p) {
+    var property = p[0], value = p[defaults ? 1 : 2];
+    assert_true(property in event,
+                "Event " + format_value(event) + " should have a " +
+                property + " property");
+    assert_equals(event[property], value,
+                  "The value of the " + property + " property should be " +
+                  format_value(value));
+  });
+  if ("parent" in expected[iface]) {
+    assert_props(expected[iface].parent, event, defaults);
+  }
+}
+
+var EventModifierInit = [
+  ["ctrlKey", false, true],
+  ["shiftKey", false, true],
+  ["altKey", false, true],
+  ["metaKey", false, true],
+];
+var expected = {
+  "Event": {
+    "properties": [
+      ["bubbles", false, true],
+      ["cancelable", false, true],
+    ],
+  },
+
+  "UIEvent": {
+    "parent": "Event",
+    "properties": [
+      ["view", null, window],
+      ["detail", 0, 7],
+    ],
+  },
+
+  "FocusEvent": {
+    "parent": "UIEvent",
+    "properties": [
+      ["relatedTarget", null, document],
+    ],
+  },
+
+  "MouseEvent": {
+    "parent": "UIEvent",
+    "properties": EventModifierInit.concat([
+      ["screenX", 0, 40],
+      ["screenY", 0, 40],
+      ["clientX", 0, 40],
+      ["clientY", 0, 40],
+      ["button", 0, 40],
+      ["buttons", 0, 40],
+      ["relatedTarget", null, document],
+    ]),
+  },
+
+  "WheelEvent": {
+    "parent": "MouseEvent",
+    "properties": [
+      ["deltaX", 0.0, 3.1],
+      ["deltaY", 0.0, 3.1],
+      ["deltaZ", 0.0, 3.1],
+      ["deltaMode", 0, 40],
+    ],
+  },
+
+  "KeyboardEvent": {
+    "parent": "UIEvent",
+    "properties": EventModifierInit.concat([
+      ["key", "", "string"],
+      ["code", "", "string"],
+      ["location", 0, 7],
+      ["repeat", false, true],
+      ["isComposing", false, true],
+      ["charCode", 0, 7],
+      ["keyCode", 0, 7],
+      ["which", 0, 7],
+    ]),
+  },
+
+  "CompositionEvent": {
+    "parent": "UIEvent",
+    "properties": [
+      ["data", "", "string"],
+    ],
+  },
+};
+
+Object.keys(expected).forEach(function(iface) {
+  test(function() {
+    var event = new self[iface]("type");
+    assert_props(iface, event, true);
+  }, iface + " constructor (no argument)");
+
+  test(function() {
+    var event = new self[iface]("type", undefined);
+    assert_props(iface, event, true);
+  }, iface + " constructor (undefined argument)");
+
+  test(function() {
+    var event = new self[iface]("type", null);
+    assert_props(iface, event, true);
+  }, iface + " constructor (null argument)");
+
+  test(function() {
+    var event = new self[iface]("type", {});
+    assert_props(iface, event, true);
+  }, iface + " constructor (empty argument)");
+
+  test(function() {
+    var dictionary = {};
+    expected[iface].properties.forEach(function(p) {
+      var property = p[0], value = p[1];
+      dictionary[property] = value;
+    });
+    var event = new self[iface]("type", dictionary);
+    assert_props(iface, event, true);
+  }, iface + " constructor (argument with default values)");
+
+  test(function() {
+    function fill_in(iface, dictionary) {
+      if ("parent" in expected[iface]) {
+        fill_in(expected[iface].parent, dictionary)
+      }
+      expected[iface].properties.forEach(function(p) {
+        var property = p[0], value = p[2];
+        dictionary[property] = value;
+      });
+    }
+
+    var dictionary = {};
+    fill_in(iface, dictionary);
+
+    var event = new self[iface]("type", dictionary);
+    assert_props(iface, event, false);
+  }, iface + " constructor (argument with non-default values)");
+});
+</script>
copy from testing/web-platform/tests/battery-status/battery-full-manual.html
copy to testing/web-platform/tests/FileAPI/FileReader/Progress_event_bubbles_cancelable.html
--- a/testing/web-platform/tests/battery-status/battery-full-manual.html
+++ b/testing/web-platform/tests/FileAPI/FileReader/Progress_event_bubbles_cancelable.html
@@ -1,42 +1,33 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
-<title>Battery Test: battery full, charger plugged in</title>
-<meta name="flags" content="interact">
+<title>File API Test: Progress Event - bubbles, cancelable</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<link rel="help" href="http://www.w3.org/TR/FileAPI/#events">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-
-<h2>Description</h2>
-<p>
-  This test validates that all of the navigator.battery attributes exist and are set to their correct values when battery is full.
-</p>
+<div id="log"></div>
+<script>
+  async_test(function(){
+    var blob = new Blob(["TEST"]);
+    var reader = new FileReader();
 
-<h2>Preconditions</h2>
-<ol>
-  <li>
-    The device is plugged in to the charger before this test is run.
-  </li>
-  <li>
-    The battery is full.
-  </li>
-</ol>
-
-<script>
+    reader.onloadstart = this.step_func(function(evt) {
+      assert_false(evt.bubbles, "The bubbles must be false when the event is dispatched");
+      assert_false(evt.cancelable, "The cancelable must be false when the event is dispatched");
+    });
 
-async_test(function (t) {
-  navigator.getBattery().then(function (battery) {
-    t.step(function () {
-      assert_true(battery.charging, 'charging must be set to true');
-      assert_equals(battery.chargingTime, 0, 'chargingTime must be set to 0');
-      assert_equals(battery.dischargingTime, Infinity, 'dischargingTime must be set to Infinity');
-      assert_equals(battery.level, 1.0, 'level must be set to 1.0');
+    reader.onload = this.step_func(function(evt) {
+      assert_false(evt.bubbles, "The bubbles must be false when the event is dispatched");
+      assert_false(evt.cancelable, "The cancelable must be false when the event is dispatched");
     });
-    t.done();
-  }, function (error) {
-    t.step(function () {
-      assert_unreached(error.message);
+
+    reader.onloadend = this.step_func(function(evt) {
+      assert_false(evt.bubbles, "The bubbles must be false when the event is dispatched");
+      assert_false(evt.cancelable, "The cancelable must be false when the event is dispatched");
+      this.done();
     });
-    t.done();
-  });
-}, document.title);
 
+    reader.readAsText(blob);
+  }, "Check the values of bubbles and cancelable are false when the progress event is dispatched");
 </script>
+
--- a/testing/web-platform/tests/IndexedDB/interfaces.html
+++ b/testing/web-platform/tests/IndexedDB/interfaces.html
@@ -15,17 +15,17 @@ setup(function() {
   var idlArray = new IdlArray();
 
   var request = new XMLHttpRequest();
   request.open("GET", "interfaces.idl");
   request.send();
   request.onload = function() {
     var idls = request.responseText;
 
-    idlArray.add_untested_idls("interface Window { };");
+    idlArray.add_untested_idls("[PrimaryGlobal] interface Window { };");
     idlArray.add_untested_idls("interface Event { };");
     idlArray.add_untested_idls("interface EventTarget { };");
 
     // From Indexed DB:
     idlArray.add_idls(idls);
     idlArray.add_idls("Window implements IDBEnvironment;");
 
     idlArray.add_objects({
old mode 100644
new mode 100755
copy from testing/web-platform/tests/XMLHttpRequest/send-entity-body-none.htm
copy to testing/web-platform/tests/XMLHttpRequest/open-during-abort.htm
--- a/testing/web-platform/tests/XMLHttpRequest/send-entity-body-none.htm
+++ b/testing/web-platform/tests/XMLHttpRequest/open-during-abort.htm
@@ -1,22 +1,32 @@
 <!doctype html>
 <html>
   <head>
-    <title>XMLHttpRequest: send(null) - no entity body</title>
+    <title>XMLHttpRequest: open() during abort()</title>
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
-    <link rel="help" href="https://xhr.spec.whatwg.org/#the-send()-method" data-tested-assertations="following::ol[1]/li[4] following::ol[1]/li[7]" />
   </head>
   <body>
     <div id="log"></div>
     <script>
       test(function() {
-        var client = new XMLHttpRequest()
-        client.open("POST", "resources/content.py", false)
-        client.upload.onloadstart = function(){assert_unreached('this event should not fire for null')}
+        var client = new XMLHttpRequest(),
+            abort_flag = false,
+            result = [],
+            expected = [1, 4, 1] // open() => 1, abort() => 4, open() => 1
+
+        client.onreadystatechange = this.step_func(function() {
+          result.push(client.readyState)
+          if (abort_flag) {
+            abort_flag = false
+            client.open("GET", "...")
+          }
+        })
+        client.open("GET", "resources/well-formed.xml")
         client.send(null)
-        assert_equals(client.getResponseHeader("x-request-content-length"), "0")
-        assert_equals(client.getResponseHeader("x-request-content-type"), "NO")
+        abort_flag = true
+        client.abort()
+        assert_array_equals(result, expected)
       })
     </script>
   </body>
 </html>
--- a/testing/web-platform/tests/XMLHttpRequest/open-method-bogus.htm
+++ b/testing/web-platform/tests/XMLHttpRequest/open-method-bogus.htm
@@ -14,11 +14,15 @@
           var client = new XMLHttpRequest()
           assert_throws("SyntaxError", function() { client.open(method, "...") })
         }, document.title + " (" + method + ")")
       }
       method("")
       method(">")
       method(" GET")
       method("G T")
+      method("@GET")
+      method("G:ET")
+      method("GET?")
+      method("GET\n")
     </script>
   </body>
 </html>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0085dfaee8dc157a5b8e289d9bb42b06e24145f0
GIT binary patch
literal 18
ac%1wH?-|1nhNlc%495(18k{iTVgLYIcn7Qi
--- a/testing/web-platform/tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js
+++ b/testing/web-platform/tests/XMLHttpRequest/resources/xmlhttprequest-timeout-overrides.js
@@ -3,9 +3,9 @@ if (this.document === undefined)
 /*
 Sets up three requests to a resource that will take 0.6 seconds to load:
 1) timeout first set to 1000ms, after 400ms timeout is set to 0, asserts load fires
 2) timeout first set to 1000ms, after 200ms timeout is set to 400, asserts load fires (race condition..?!?)
 3) timeout first set to 0, after 400ms it is set to 1000, asserts load fires
 */
 runTestRequests([ new RequestTracker(true, "timeout disabled after initially set", TIME_NORMAL_LOAD, TIME_REGULAR_TIMEOUT, 0),
 		  new RequestTracker(true, "timeout overrides load after a delay", TIME_NORMAL_LOAD, TIME_DELAY, TIME_REGULAR_TIMEOUT),
-		  new RequestTracker(true, "timeout enabled after initially disabled", 0, TIME_REGULAR_TIMEOUT, TIME_NORMAL_LOAD) ]);
+		  new RequestTracker(true, "timeout enabled after initially disabled", 0, TIME_REGULAR_TIMEOUT, TIME_NORMAL_LOAD * 10) ]);
--- a/testing/web-platform/tests/XMLHttpRequest/send-entity-body-none.htm
+++ b/testing/web-platform/tests/XMLHttpRequest/send-entity-body-none.htm
@@ -11,12 +11,22 @@
     <script>
       test(function() {
         var client = new XMLHttpRequest()
         client.open("POST", "resources/content.py", false)
         client.upload.onloadstart = function(){assert_unreached('this event should not fire for null')}
         client.send(null)
         assert_equals(client.getResponseHeader("x-request-content-length"), "0")
         assert_equals(client.getResponseHeader("x-request-content-type"), "NO")
-      })
+      }, "No content type")
+
+      test(function() {
+        var client = new XMLHttpRequest()
+        client.open("POST", "resources/content.py", false)
+        var content_type = 'application/x-foo'
+        client.setRequestHeader('Content-Type', content_type)
+        client.send(null)
+        assert_equals(client.getResponseHeader("x-request-content-length"), "0")
+        assert_equals(client.getResponseHeader("x-request-content-type"), content_type)
+      }, "Explicit content type")
     </script>
   </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/XMLHttpRequest/send-receive-utf16.htm
@@ -0,0 +1,37 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>XMLHttpRequest: The send() method: receive data which is UTF-16 encoded</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+    <link rel="help" href="https://xhr.spec.whatwg.org/#text-response" data-tested-assertations="following::ol/li[9]" />
+<div id="log"></div>
+
+<script>
+  async_test(function() {
+    var client = new XMLHttpRequest();
+    client.onload = this.step_func_done(function(e) {
+      assert_equals(client.responseText, 'æøå\nテスト\n')
+    });
+    client.open("GET", "resources/utf16.txt");
+    client.send(null);
+  }, 'UTF-16 with BOM, no encoding in content-type');
+
+  async_test(function() {
+    var client = new XMLHttpRequest();
+    client.onload = this.step_func_done(function(e) {
+      assert_equals(client.responseText, 'æøå\nテスト\n')
+    });
+    client.open("GET", "resources/status.py?code=200&type=text%2Fplain%3Bcharset%3DUTF-16&content=%E6%00%F8%00%E5%00%0A%00%C6%30%B9%30%C8%30%0A%00");
+    client.send(null);
+  }, 'UTF-16 without BOM, with charset label in content-type');
+
+  async_test(function() {
+    var client = new XMLHttpRequest();
+    client.onload = this.step_func_done(function(e) {
+      // plenty of EF BF BD Replacement Character in this invalid input..
+      assert_equals(client.responseText, "\ufffd\u0000\ufffd\u0000\ufffd\u0000\u000a\u0000\ufffd\u0030\ufffd\u0030\ufffd\u0030\u000a\u0000")
+    });
+    client.open("GET", "resources/status.py?code=200&type=text%2Fplain%3Bcharset%3DUTF-8&content=%E6%00%F8%00%E5%00%0A%00%C6%30%B9%30%C8%30%0A%00");
+    client.send(null);
+  }, 'UTF-16 without BOM, mislabelled as UTF-8 in content-type');
+</script>
--- a/testing/web-platform/tests/XMLHttpRequest/send-timeout-events.htm
+++ b/testing/web-platform/tests/XMLHttpRequest/send-timeout-events.htm
@@ -17,41 +17,54 @@
         var test = async_test();
 
         test.step(function()
         {
             var xhr = new XMLHttpRequest();
             var expect = [4, "", "upload.timeout", "upload.loadend", "timeout", "loadend"];
             var actual = [];
 
-            xhr.onreadystatechange = function()
+            xhr.onreadystatechange = test.step_func(function()
             {
-                test.step(function()
+                if (xhr.readyState == 4)
                 {
-                    if (xhr.readyState == 4)
-                    {
-                        actual.push(xhr.readyState, xhr.response);
-                    }
-                });
-            };
+                    actual.push(xhr.readyState, xhr.response);
+                }
+            });
+
+            xhr.onloadend = test.step_func_done(function(e)
+            {
+                assert_equals(e.loaded, 0);
+                assert_equals(e.total, 0);
+                actual.push(e.type);
+                assert_array_equals(actual, expect);
+            });
 
-            xhr.onloadend          = function(e){ actual.push(e.type); VerifyResult()};
-            xhr.ontimeout          = function(e){ actual.push(e.type); };
+            xhr.ontimeout = test.step_func(function(e)
+            {
+                assert_equals(e.loaded, 0);
+                assert_equals(e.total, 0);
+                actual.push(e.type);
+            });
 
-            xhr.upload.onloadend   = function(e){ actual.push("upload." + e.type);};
-            xhr.upload.ontimeout   = function(e){ actual.push("upload." + e.type); };
 
-            function VerifyResult()
+            xhr.upload.onloadend = test.step_func(function(e)
             {
-                test.step(function()
-                {
-                    assert_array_equals(actual, expect);
-                    test.done();
-                });
-            };
+                assert_equals(e.loaded, 0);
+                assert_equals(e.total, 0);
+                actual.push("upload." + e.type);
+            });
+
+            xhr.upload.ontimeout = test.step_func(function(e)
+            {
+                assert_equals(e.loaded, 0);
+                assert_equals(e.total, 0);
+                actual.push("upload." + e.type);
+            });
+
 
             var content = "";
             for (var i = 0; i < 121026; i++)
             {
                 content += "[" + i + "]";
             }
 
             xhr.open("POST", "./resources/trickle.py", true);
--- a/testing/web-platform/tests/battery-status/battery-charging-manual.html
+++ b/testing/web-platform/tests/battery-status/battery-charging-manual.html
@@ -2,17 +2,17 @@
 <meta charset="utf-8">
 <title>Battery Test: battery neither empty or full, charger plugged in</title>
 <meta name="flags" content="interact">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
 <h2>Description</h2>
 <p>
-  This test validates that all of the navigator.battery attributes exist and are set to their correct values when battery is charging.
+  This test validates that all of the BatteryManager attributes exist and are set to their correct values when battery is charging.
 </p>
 
 <h2>Preconditions</h2>
 <ol>
   <li>
     The device is plugged in to the charger before this test is run.
   </li>
   <li>
--- a/testing/web-platform/tests/battery-status/battery-created-manual.html
+++ b/testing/web-platform/tests/battery-status/battery-created-manual.html
@@ -8,17 +8,17 @@
 <h2>Description</h2>
 <p>
   <strong>
     This test is only useful on devices that expose the BatteryManager interface,
     but lack a backend implementation.
   </strong>
 </p>
 <p>
-  This test validates that all of the navigator.battery attributes exist and are set to their default values.
+  This test validates that all of the BatteryManager attributes exist and are set to their default values.
 </p>
 
 <h2>Preconditions</h2>
 <ol>
   <li>
     The implementation is unable to report the battery's charging state,
     charging time, level or remaining time respectively.
   </li>
--- a/testing/web-platform/tests/battery-status/battery-discharging-manual.html
+++ b/testing/web-platform/tests/battery-status/battery-discharging-manual.html
@@ -2,17 +2,17 @@
 <meta charset="utf-8">
 <title>Battery Test: battery neither empty or full, charger unplugged in</title>
 <meta name="flags" content="interact">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
 <h2>Description</h2>
 <p>
-  This test validates that all of the navigator.battery attributes exist and are set to their correct values when battery is discharging.
+  This test validates that all of the BatteryManager attributes exist and are set to their correct values when battery is discharging.
 </p>
 
 <h2>Preconditions</h2>
 <ol>
   <li>
     The device is unplugged from the charger before this test is run.
   </li>
   <li>
--- a/testing/web-platform/tests/battery-status/battery-full-manual.html
+++ b/testing/web-platform/tests/battery-status/battery-full-manual.html
@@ -2,17 +2,17 @@
 <meta charset="utf-8">
 <title>Battery Test: battery full, charger plugged in</title>
 <meta name="flags" content="interact">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
 <h2>Description</h2>
 <p>
-  This test validates that all of the navigator.battery attributes exist and are set to their correct values when battery is full.
+  This test validates that all of the BatteryManager attributes exist and are set to their correct values when battery is full.
 </p>
 
 <h2>Preconditions</h2>
 <ol>
   <li>
     The device is plugged in to the charger before this test is run.
   </li>
   <li>
--- a/testing/web-platform/tests/battery-status/battery-plugging-in-manual.html
+++ b/testing/web-platform/tests/battery-status/battery-plugging-in-manual.html
@@ -11,17 +11,17 @@
     padding: 5px;
     margin: 15px;
     display: block;
   }
 </style>
 
 <h2>Description</h2>
 <p>
-  This test validates that all of the navigator.battery attributes exist and are set to correct values, with corresponding events fired, when the charger is plugged in.
+  This test validates that all of the BatteryManager attributes exist and are set to correct values, with corresponding events fired, when the charger is plugged in.
 </p>
 
 <h2>Preconditions</h2>
 <ol>
   <li>
     The device is unplugged from the charger before this test is run.
   </li>
   <li>
--- a/testing/web-platform/tests/battery-status/battery-promise.html
+++ b/testing/web-platform/tests/battery-status/battery-promise.html
@@ -1,21 +1,26 @@
 <!DOCTYPE html>
-<title>navigator.getBattery() - navigator.getBattery()'s returnvalue is Promise<BatteryManager>. </title>
+<meta charset="utf-8">
+<title>Battery Test: navigator.getBattery() returns BatteryManager as a promise</title>
 <link rel="author" title="YuichiNukiyama" href="https://github.com/YuichiNukiyama">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
 <script>
     function returnBattery() {
         return navigator.getBattery();
     }
 
     promise_test(function () {
         return returnBattery()
           .then(function (result) {
               assert_class_string(result, "BatteryManager", "getBattery should return BatteryManager Object.");
           });
     }, "navigator.getBattery() return BatteryManager");
 
+    test(function () {
+        assert_equals(navigator.getBattery(), navigator.getBattery());
+    }, "navigator.getBattery() shall always return the same promise");
 </script>
 
 <div id="log"></div>
+
--- a/testing/web-platform/tests/battery-status/battery-unplugging-manual.html
+++ b/testing/web-platform/tests/battery-status/battery-unplugging-manual.html
@@ -11,17 +11,17 @@
     padding: 5px;
     margin: 15px;
     display: block;
   }
 </style>
 
 <h2>Description</h2>
 <p>
-  This test validates that all of the navigator.battery attributes exist and are set to correct values, with corresponding events fired, when the charger is unplugged.
+  This test validates that all of the BatteryManager attributes exist and are set to correct values, with corresponding events fired, when the charger is unplugged.
 </p>
 
 <h2>Preconditions</h2>
 <ol>
   <li>
     The device is plugged in to the charger before this test is run.
   </li>
   <li>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-empty-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-empty</title><meta name="" content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-leading-bom-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-leading-bom</title><meta name="generator" content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-leading-whitespace-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-leading-whitespace</title><meta name=" keywords" content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-rejected-cache-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-rejected-cache</title><meta name="cache" content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-rejected-no-email-collection-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-rejected-no-email-collection</title><meta name="no-email-collection" content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-trailing-pile-of-poo-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-trailing-pile-of-poo</title><meta name="description💩" content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-trailing-whitespace-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-trailing-whitespace</title><meta name="keywords " content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-turkish-lowercase-dotless-i-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-turkish-lowercase-dotless-i</title><meta name="applıcatıon-name" content>
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/html/elements/meta/name-turkish-uppercase-dotted-i-novalid.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>name-turkish-uppercase-dotted-i</title><meta name="APPLİCATİON-NAME" content>
--- a/testing/web-platform/tests/conformance-checkers/messages.json
+++ b/testing/web-platform/tests/conformance-checkers/messages.json
@@ -508,105 +508,105 @@
     "html/elements/del/cite/scheme-trailing-space-novalid.html": "Bad value \u201ca: foo.com\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in scheme data: not a URL code point.",
     "html/elements/del/cite/scheme-trailing-tab-novalid.html": "Bad value \u201ca:\tfoo.com\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in scheme data: not a URL code point.",
     "html/elements/del/cite/userinfo-backslash-novalid.html": "Bad value \u201chttp://a\\b:c\\d@foo.com\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.",
     "html/elements/del/cite/userinfo-password-bad-chars-novalid.html": "\u201c&\u201d did not start a character reference. (\u201c&\u201d probably should have been escaped as \u201c&amp;\u201d.)",
     "html/elements/del/cite/userinfo-password-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://foo:\ud83d\udca9@example.com\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in user or password: not a URL code point.",
     "html/elements/del/cite/userinfo-username-contains-at-sign-novalid.html": "Bad value \u201chttp://::@c@d:2\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: User or password contains an at symbol (\"@\") not percent-encoded.",
     "html/elements/del/cite/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in user or password: not a URL code point.",
     "html/elements/del/date-0004-02-29-haswarn.html": "Bad value \u201c0004-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-0005-02-29-novalid.html": "Bad value \u201c0005-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/date-0005-02-29-novalid.html": "Bad value \u201c0005-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
     "html/elements/del/date-0214-09-29-haswarn.html": "Bad value \u201c0214-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-1900-02-29-novalid.html": "Bad value \u201c1900-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-1969-02-29-novalid.html": "Bad value \u201c1969-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/date-1900-02-29-novalid.html": "Bad value \u201c1900-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-1969-02-29-novalid.html": "Bad value \u201c1969-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
     "html/elements/del/date-20014-09-29-haswarn.html": "Bad value \u201c20014-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-2014-02-29-novalid.html": "Bad value \u201c2014-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-2100-02-29-novalid.html": "Bad value \u201c2100-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-2200-02-29-novalid.html": "Bad value \u201c2200-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-01-32-novalid.html": "Bad value \u201c2002-01-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-03-32-novalid.html": "Bad value \u201c2002-03-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-04-31-novalid.html": "Bad value \u201c2002-04-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-05-32-novalid.html": "Bad value \u201c2002-05-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-06-31-novalid.html": "Bad value \u201c2002-06-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-07-32-novalid.html": "Bad value \u201c2002-07-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-08-32-novalid.html": "Bad value \u201c2002-08-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-09-31-novalid.html": "Bad value \u201c2002-09-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-10-32-novalid.html": "Bad value \u201c2002-10-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-11-31-novalid.html": "Bad value \u201c2002-11-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-12-32-novalid.html": "Bad value \u201c2002-12-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-missing-separator-novalid.html": "Bad value \u201c2014-0220\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-one-digit-novalid.html": "Bad value \u201c2002-09-9\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-day-three-digits-novalid.html": "Bad value \u201c2002-11-009\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-iso8601-YYYYMMDD-no-hyphen-novalid.html": "Bad value \u201c20020929\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-leading-bom-novalid.html": "Bad value \u201c\ufeff2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-leading-whitespace-novalid.html": "Bad value \u201c 2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-month-00-novalid.html": "Bad value \u201c2002-00-15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Month cannot be less than 1.",
-    "html/elements/del/date-month-13-novalid.html": "Bad value \u201c2002-13-15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Month cannot be greater than 12. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-month-missing-separator-novalid.html": "Bad value \u201c201402-20\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-month-one-digit-novalid.html": "Bad value \u201c2002-9-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-month-three-digits-novalid.html": "Bad value \u201c2002-011-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-non-ascii-digit-novalid.html": "Bad value \u201c2002-09-2\uff19\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/date-2014-02-29-novalid.html": "Bad value \u201c2014-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-2100-02-29-novalid.html": "Bad value \u201c2100-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-2200-02-29-novalid.html": "Bad value \u201c2200-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-01-32-novalid.html": "Bad value \u201c2002-01-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-03-32-novalid.html": "Bad value \u201c2002-03-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-04-31-novalid.html": "Bad value \u201c2002-04-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-05-32-novalid.html": "Bad value \u201c2002-05-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-06-31-novalid.html": "Bad value \u201c2002-06-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-07-32-novalid.html": "Bad value \u201c2002-07-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-08-32-novalid.html": "Bad value \u201c2002-08-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-09-31-novalid.html": "Bad value \u201c2002-09-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-10-32-novalid.html": "Bad value \u201c2002-10-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-11-31-novalid.html": "Bad value \u201c2002-11-31\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-12-32-novalid.html": "Bad value \u201c2002-12-32\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/del/date-day-missing-separator-novalid.html": "Bad value \u201c2014-0220\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-day-one-digit-novalid.html": "Bad value \u201c2002-09-9\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-day-three-digits-novalid.html": "Bad value \u201c2002-11-009\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-iso8601-YYYYMMDD-no-hyphen-novalid.html": "Bad value \u201c20020929\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-leading-bom-novalid.html": "Bad value \u201c\ufeff2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-leading-whitespace-novalid.html": "Bad value \u201c 2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-month-00-novalid.html": "Bad value \u201c2002-00-15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Month cannot be less than 1. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/date-month-13-novalid.html": "Bad value \u201c2002-13-15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Month cannot be greater than 12.",
+    "html/elements/del/date-month-missing-separator-novalid.html": "Bad value \u201c201402-20\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-month-one-digit-novalid.html": "Bad value \u201c2002-9-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-month-three-digits-novalid.html": "Bad value \u201c2002-011-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-non-ascii-digit-novalid.html": "Bad value \u201c2002-09-2\uff19\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/del/date-trailing-U+0000-novalid.html": "Character reference expands to zero.",
-    "html/elements/del/date-trailing-pile-of-poo-novalid.html": "Bad value \u201c2002-09-29\ud83d\udca9\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-trailing-whitespace-novalid.html": "Bad value \u201c2002-09-29 \u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-wrong-day-separator-novalid.html": "Bad value \u201c2014-02:20\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-wrong-month-separator-novalid.html": "Bad value \u201c2014:02-20\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-year-0000-novalid.html": "Bad value \u201c0000-12-09\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Year cannot be less than 1. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/date-trailing-pile-of-poo-novalid.html": "Bad value \u201c2002-09-29\ud83d\udca9\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-trailing-whitespace-novalid.html": "Bad value \u201c2002-09-29 \u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-wrong-day-separator-novalid.html": "Bad value \u201c2014-02:20\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-wrong-month-separator-novalid.html": "Bad value \u201c2014:02-20\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-year-0000-novalid.html": "Bad value \u201c0000-12-09\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Year cannot be less than 1.",
     "html/elements/del/date-year-five-digits-haswarn.html": "Bad value \u201c12014-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-year-negative-novalid.html": "Bad value \u201c-2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/date-year-three-digits-novalid.html": "Bad value \u201c782-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/duration-P-form-novalid.html": "Bad value \u201cPT4H18M3S\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/duration-time-component-novalid.html": "Bad value \u201c4h 18m 3s\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/date-year-negative-novalid.html": "Bad value \u201c-2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/date-year-three-digits-novalid.html": "Bad value \u201c782-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/duration-P-form-novalid.html": "Bad value \u201cPT4H18M3S\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/duration-time-component-novalid.html": "Bad value \u201c4h 18m 3s\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/del/global-date-and-time-2400-novalid.html": "Bad value \u201c2011-11-12T24:00:00+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Hour cannot be greater than 23. Bad date: The literal did not satisfy the date format.",
-    "html/elements/del/global-date-and-time-60-minutes-novalid.html": "Bad value \u201c2011-11-12T00:60:00+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Minute cannot be greater than 59.",
-    "html/elements/del/global-date-and-time-60-seconds-novalid.html": "Bad value \u201c2011-11-12T00:00:60+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Second cannot be greater than 59.",
-    "html/elements/del/global-date-and-time-bad-fraction-separator-novalid.html": "Bad value \u201c2011-11-12T14:54:39,929+0000\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/global-date-and-time-60-minutes-novalid.html": "Bad value \u201c2011-11-12T00:60:00+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Minute cannot be greater than 59. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-60-seconds-novalid.html": "Bad value \u201c2011-11-12T00:00:60+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Second cannot be greater than 59. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-bad-fraction-separator-novalid.html": "Bad value \u201c2011-11-12T14:54:39,929+0000\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/del/global-date-and-time-four-digit-fraction-novalid.html": "Bad value \u201c2011-11-12T06:54:39.9291-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: A fraction of a second must be one, two, or three digits.",
-    "html/elements/del/global-date-and-time-hour-one-digit-novalid.html": "Bad value \u201c2011-11-12T6:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-hour-three-digits-novalid.html": "Bad value \u201c2011-11-12T016:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-iso8601-hh-novalid.html": "Bad value \u201c2011-11-12T14Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-iso8601-hhmm-no-colon-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-iso8601-hhmmss-no-colon-novalid.html": "Bad value \u201c2011-11-12T145439Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-lowercase-z-novalid.html": "Bad value \u201c2011-11-12T14:54z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-minutes-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:4:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-minutes-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:354:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-missing-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-missing-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:5439Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-nbsp-novalid.html": "Bad value \u201c2011-11-12\u00a014:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-seconds-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:54:9-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-seconds-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:54:039-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-space-before-timezone-novalid.html": "Bad value \u201c2011-11-12T06:54:39 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-60-minutes-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:60\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Minutes out of range in time zone designator. Bad date: The literal did not satisfy the date format.",
-    "html/elements/del/global-date-and-time-timezone-iso8601-two-digit-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-lowercase-t-novalid.html": "Bad value \u201c2011-11-12t14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-minus-1300-haswarn.html": "Bad value \u201c2011-11-12T00:00:00-1300\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d",
+    "html/elements/del/global-date-and-time-hour-one-digit-novalid.html": "Bad value \u201c2011-11-12T6:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-hour-three-digits-novalid.html": "Bad value \u201c2011-11-12T016:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-iso8601-hh-novalid.html": "Bad value \u201c2011-11-12T14Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-iso8601-hhmm-no-colon-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-iso8601-hhmmss-no-colon-novalid.html": "Bad value \u201c2011-11-12T145439Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-lowercase-z-novalid.html": "Bad value \u201c2011-11-12T14:54z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-minutes-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:4:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-minutes-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:354:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-missing-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-missing-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:5439Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-nbsp-novalid.html": "Bad value \u201c2011-11-12\u00a014:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-seconds-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:54:9-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-seconds-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:54:039-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-space-before-timezone-novalid.html": "Bad value \u201c2011-11-12T06:54:39 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-60-minutes-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:60\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Minutes out of range in time zone designator.",
+    "html/elements/del/global-date-and-time-timezone-iso8601-two-digit-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-lowercase-t-novalid.html": "Bad value \u201c2011-11-12t14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-minus-1300-haswarn.html": "Bad value \u201c2011-11-12T00:00:00-1300\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d Bad date: The literal did not satisfy the date format.",
     "html/elements/del/global-date-and-time-timezone-minus-2400-novalid.html": "Bad value \u201c2011-11-12T06:54:39-24:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Hours out of range in time zone designator. Bad date: The literal did not satisfy the date format.",
     "html/elements/del/global-date-and-time-timezone-minutes-15-haswarn.html": "Bad value \u201c2011-11-12T00:00:00+08:15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Minutes in time zone designator should be either \u201c00\u201d, \u201c30\u201d, or \u201c45\u201d. Bad date: The literal did not satisfy the date format.",
-    "html/elements/del/global-date-and-time-timezone-multiple-spaces-novalid.html": "Bad value \u201c2011-11-12  14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-non-T-character-novalid.html": "Bad value \u201c2011-11-12+14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-offset-colon-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929:08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-offset-space-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-one-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-5:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-one-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:0\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-plus-1500-haswarn.html": "Bad value \u201c2011-11-12T00:00:00+1500\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d",
+    "html/elements/del/global-date-and-time-timezone-multiple-spaces-novalid.html": "Bad value \u201c2011-11-12  14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-non-T-character-novalid.html": "Bad value \u201c2011-11-12+14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-offset-colon-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929:08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-offset-space-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-one-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-5:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-one-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:0\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-plus-1500-haswarn.html": "Bad value \u201c2011-11-12T00:00:00+1500\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d Bad date: The literal did not satisfy the date format.",
     "html/elements/del/global-date-and-time-timezone-plus-2400-novalid.html": "Bad value \u201c2011-11-12T06:54:39-24:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: Hours out of range in time zone designator. Bad date: The literal did not satisfy the date format.",
-    "html/elements/del/global-date-and-time-timezone-three-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-005:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-three-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:000\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-timezone-with-seconds-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:00:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-with-both-T-and-space-novalid.html": "Bad value \u201c2011-11-12T 14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-wrong-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T14-54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-wrong-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:54-39Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/global-date-and-time-zero-digit-fraction-novalid.html": "Bad value \u201c2011-11-12T06:54:39.-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/local-date-and-time-novalid.html": "Bad value \u201c2011-11-12T14:54\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/global-date-and-time-timezone-three-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-005:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-three-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:000\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-timezone-with-seconds-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:00:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-with-both-T-and-space-novalid.html": "Bad value \u201c2011-11-12T 14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-wrong-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T14-54Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-wrong-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:54-39Z\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/global-date-and-time-zero-digit-fraction-novalid.html": "Bad value \u201c2011-11-12T06:54:39.-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/local-date-and-time-novalid.html": "Bad value \u201c2011-11-12T14:54\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/del/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
-    "html/elements/del/month-novalid.html": "Bad value \u201c2011-11\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/time-novalid.html": "Bad value \u201c14:54:39\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/week-novalid.html": "Bad value \u201c2011-W46\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/year-novalid.html": "Bad value \u201c2006\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/del/yearless-date-novalid.html": "Bad value \u201c07-15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/del/month-novalid.html": "Bad value \u201c2011-11\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/time-novalid.html": "Bad value \u201c14:54:39\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/week-novalid.html": "Bad value \u201c2011-W46\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/year-novalid.html": "Bad value \u201c2006\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/del/yearless-date-novalid.html": "Bad value \u201c07-15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/dfn/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
     "html/elements/dialog/model-novalid.html": "Element \u201cdt\u201d not allowed in this context. (The parent was element \u201cdialog\u201d.) Suppressing further errors from this subtree.",
     "html/elements/div/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
     "html/elements/dl/model-novalid.html": "Duplicate ID \u201cid\u201d.",
     "html/elements/em/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
     "html/elements/embed/height-novalid.html": "Bad value \u201c20%\u201d for attribute \u201cheight\u201d on element \u201cembed\u201d: Bad non-negative integer: Expected a digit but saw \u201c%\u201d instead.",
     "html/elements/embed/src-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Must be non-empty.",
     "html/elements/embed/src-whitespace-only-novalid.html": "Bad value \u201c\t \n\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Must be non-empty.",
@@ -1291,105 +1291,105 @@
     "html/elements/ins/cite/scheme-trailing-space-novalid.html": "Bad value \u201ca: foo.com\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Illegal character in scheme data: not a URL code point.",
     "html/elements/ins/cite/scheme-trailing-tab-novalid.html": "Bad value \u201ca:\tfoo.com\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Illegal character in scheme data: not a URL code point.",
     "html/elements/ins/cite/userinfo-backslash-novalid.html": "Bad value \u201chttp://a\\b:c\\d@foo.com\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.",
     "html/elements/ins/cite/userinfo-password-bad-chars-novalid.html": "\u201c&\u201d did not start a character reference. (\u201c&\u201d probably should have been escaped as \u201c&amp;\u201d.)",
     "html/elements/ins/cite/userinfo-password-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://foo:\ud83d\udca9@example.com\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Illegal character in user or password: not a URL code point.",
     "html/elements/ins/cite/userinfo-username-contains-at-sign-novalid.html": "Bad value \u201chttp://::@c@d:2\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: User or password contains an at symbol (\"@\") not percent-encoded.",
     "html/elements/ins/cite/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201ccite\u201d on element \u201cins\u201d: Bad URL: Illegal character in user or password: not a URL code point.",
     "html/elements/ins/date-0004-02-29-haswarn.html": "Bad value \u201c0004-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-0005-02-29-novalid.html": "Bad value \u201c0005-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/date-0005-02-29-novalid.html": "Bad value \u201c0005-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
     "html/elements/ins/date-0214-09-29-haswarn.html": "Bad value \u201c0214-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-1900-02-29-novalid.html": "Bad value \u201c1900-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-1969-02-29-novalid.html": "Bad value \u201c1969-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/date-1900-02-29-novalid.html": "Bad value \u201c1900-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-1969-02-29-novalid.html": "Bad value \u201c1969-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
     "html/elements/ins/date-20014-09-29-haswarn.html": "Bad value \u201c20014-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-2014-02-29-novalid.html": "Bad value \u201c2014-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-2100-02-29-novalid.html": "Bad value \u201c2100-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-2200-02-29-novalid.html": "Bad value \u201c2200-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-01-32-novalid.html": "Bad value \u201c2002-01-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-03-32-novalid.html": "Bad value \u201c2002-03-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-04-31-novalid.html": "Bad value \u201c2002-04-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-05-32-novalid.html": "Bad value \u201c2002-05-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-06-31-novalid.html": "Bad value \u201c2002-06-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-07-32-novalid.html": "Bad value \u201c2002-07-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-08-32-novalid.html": "Bad value \u201c2002-08-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-09-31-novalid.html": "Bad value \u201c2002-09-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-10-32-novalid.html": "Bad value \u201c2002-10-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-11-31-novalid.html": "Bad value \u201c2002-11-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-12-32-novalid.html": "Bad value \u201c2002-12-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Day out of range. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-missing-separator-novalid.html": "Bad value \u201c2014-0220\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-one-digit-novalid.html": "Bad value \u201c2002-09-9\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-day-three-digits-novalid.html": "Bad value \u201c2002-11-009\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-iso8601-YYYYMMDD-no-hyphen-novalid.html": "Bad value \u201c20020929\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-leading-bom-novalid.html": "Bad value \u201c\ufeff2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-leading-whitespace-novalid.html": "Bad value \u201c 2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-month-00-novalid.html": "Bad value \u201c2002-00-15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Month cannot be less than 1.",
-    "html/elements/ins/date-month-13-novalid.html": "Bad value \u201c2002-13-15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Month cannot be greater than 12. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-month-missing-separator-novalid.html": "Bad value \u201c201402-20\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-month-one-digit-novalid.html": "Bad value \u201c2002-9-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-month-three-digits-novalid.html": "Bad value \u201c2002-011-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-non-ascii-digit-novalid.html": "Bad value \u201c2002-09-2\uff19\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/date-2014-02-29-novalid.html": "Bad value \u201c2014-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-2100-02-29-novalid.html": "Bad value \u201c2100-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-2200-02-29-novalid.html": "Bad value \u201c2200-02-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-01-32-novalid.html": "Bad value \u201c2002-01-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-03-32-novalid.html": "Bad value \u201c2002-03-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-04-31-novalid.html": "Bad value \u201c2002-04-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-05-32-novalid.html": "Bad value \u201c2002-05-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-06-31-novalid.html": "Bad value \u201c2002-06-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-07-32-novalid.html": "Bad value \u201c2002-07-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-08-32-novalid.html": "Bad value \u201c2002-08-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-09-31-novalid.html": "Bad value \u201c2002-09-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-10-32-novalid.html": "Bad value \u201c2002-10-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-11-31-novalid.html": "Bad value \u201c2002-11-31\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-12-32-novalid.html": "Bad value \u201c2002-12-32\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Day out of range.",
+    "html/elements/ins/date-day-missing-separator-novalid.html": "Bad value \u201c2014-0220\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-day-one-digit-novalid.html": "Bad value \u201c2002-09-9\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-day-three-digits-novalid.html": "Bad value \u201c2002-11-009\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-iso8601-YYYYMMDD-no-hyphen-novalid.html": "Bad value \u201c20020929\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-leading-bom-novalid.html": "Bad value \u201c\ufeff2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-leading-whitespace-novalid.html": "Bad value \u201c 2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-month-00-novalid.html": "Bad value \u201c2002-00-15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Month cannot be less than 1. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/date-month-13-novalid.html": "Bad value \u201c2002-13-15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Month cannot be greater than 12.",
+    "html/elements/ins/date-month-missing-separator-novalid.html": "Bad value \u201c201402-20\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-month-one-digit-novalid.html": "Bad value \u201c2002-9-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-month-three-digits-novalid.html": "Bad value \u201c2002-011-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-non-ascii-digit-novalid.html": "Bad value \u201c2002-09-2\uff19\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/ins/date-trailing-U+0000-novalid.html": "Character reference expands to zero.",
-    "html/elements/ins/date-trailing-pile-of-poo-novalid.html": "Bad value \u201c2002-09-29\ud83d\udca9\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-trailing-whitespace-novalid.html": "Bad value \u201c2002-09-29 \u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-wrong-day-separator-novalid.html": "Bad value \u201c2014-02:20\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-wrong-month-separator-novalid.html": "Bad value \u201c2014:02-20\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-year-0000-novalid.html": "Bad value \u201c0000-12-09\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Year cannot be less than 1. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/date-trailing-pile-of-poo-novalid.html": "Bad value \u201c2002-09-29\ud83d\udca9\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-trailing-whitespace-novalid.html": "Bad value \u201c2002-09-29 \u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-wrong-day-separator-novalid.html": "Bad value \u201c2014-02:20\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-wrong-month-separator-novalid.html": "Bad value \u201c2014:02-20\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-year-0000-novalid.html": "Bad value \u201c0000-12-09\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: Year cannot be less than 1.",
     "html/elements/ins/date-year-five-digits-haswarn.html": "Bad value \u201c12014-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: Year may be mistyped. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-year-negative-novalid.html": "Bad value \u201c-2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/date-year-three-digits-novalid.html": "Bad value \u201c782-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/duration-P-form-novalid.html": "Bad value \u201cPT4H18M3S\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/duration-time-component-novalid.html": "Bad value \u201c4h 18m 3s\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/date-year-negative-novalid.html": "Bad value \u201c-2002-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/date-year-three-digits-novalid.html": "Bad value \u201c782-09-29\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/duration-P-form-novalid.html": "Bad value \u201cPT4H18M3S\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/duration-time-component-novalid.html": "Bad value \u201c4h 18m 3s\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/ins/global-date-and-time-2400-novalid.html": "Bad value \u201c2011-11-12T24:00:00+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Hour cannot be greater than 23. Bad date: The literal did not satisfy the date format.",
-    "html/elements/ins/global-date-and-time-60-minutes-novalid.html": "Bad value \u201c2011-11-12T00:60:00+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Minute cannot be greater than 59.",
-    "html/elements/ins/global-date-and-time-60-seconds-novalid.html": "Bad value \u201c2011-11-12T00:00:60+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Second cannot be greater than 59.",
-    "html/elements/ins/global-date-and-time-bad-fraction-separator-novalid.html": "Bad value \u201c2011-11-12T14:54:39,929+0000\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/global-date-and-time-60-minutes-novalid.html": "Bad value \u201c2011-11-12T00:60:00+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Minute cannot be greater than 59. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-60-seconds-novalid.html": "Bad value \u201c2011-11-12T00:00:60+08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Second cannot be greater than 59. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-bad-fraction-separator-novalid.html": "Bad value \u201c2011-11-12T14:54:39,929+0000\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/ins/global-date-and-time-four-digit-fraction-novalid.html": "Bad value \u201c2011-11-12T06:54:39.9291-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: A fraction of a second must be one, two, or three digits.",
-    "html/elements/ins/global-date-and-time-hour-one-digit-novalid.html": "Bad value \u201c2011-11-12T6:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-hour-three-digits-novalid.html": "Bad value \u201c2011-11-12T016:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-iso8601-hh-novalid.html": "Bad value \u201c2011-11-12T14Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-iso8601-hhmm-no-colon-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-iso8601-hhmmss-no-colon-novalid.html": "Bad value \u201c2011-11-12T145439Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-lowercase-z-novalid.html": "Bad value \u201c2011-11-12T14:54z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-minutes-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:4:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-minutes-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:354:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-missing-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-missing-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:5439Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-nbsp-novalid.html": "Bad value \u201c2011-11-12\u00a014:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-seconds-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:54:9-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-seconds-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:54:039-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-space-before-timezone-novalid.html": "Bad value \u201c2011-11-12T06:54:39 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-60-minutes-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:60\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Minutes out of range in time zone designator. Bad date: The literal did not satisfy the date format.",
-    "html/elements/ins/global-date-and-time-timezone-iso8601-two-digit-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-lowercase-t-novalid.html": "Bad value \u201c2011-11-12t14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-minus-1300-haswarn.html": "Bad value \u201c2011-11-12T00:00:00-1300\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d",
+    "html/elements/ins/global-date-and-time-hour-one-digit-novalid.html": "Bad value \u201c2011-11-12T6:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-hour-three-digits-novalid.html": "Bad value \u201c2011-11-12T016:54:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-iso8601-hh-novalid.html": "Bad value \u201c2011-11-12T14Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-iso8601-hhmm-no-colon-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-iso8601-hhmmss-no-colon-novalid.html": "Bad value \u201c2011-11-12T145439Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-lowercase-z-novalid.html": "Bad value \u201c2011-11-12T14:54z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-minutes-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:4:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-minutes-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:354:39-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-missing-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T1454Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-missing-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:5439Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-nbsp-novalid.html": "Bad value \u201c2011-11-12\u00a014:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-seconds-one-digit-novalid.html": "Bad value \u201c2011-11-12T16:54:9-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-seconds-three-digits-novalid.html": "Bad value \u201c2011-11-12T16:54:039-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-space-before-timezone-novalid.html": "Bad value \u201c2011-11-12T06:54:39 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-60-minutes-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:60\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Minutes out of range in time zone designator.",
+    "html/elements/ins/global-date-and-time-timezone-iso8601-two-digit-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-lowercase-t-novalid.html": "Bad value \u201c2011-11-12t14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-minus-1300-haswarn.html": "Bad value \u201c2011-11-12T00:00:00-1300\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d Bad date: The literal did not satisfy the date format.",
     "html/elements/ins/global-date-and-time-timezone-minus-2400-novalid.html": "Bad value \u201c2011-11-12T06:54:39-24:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Hours out of range in time zone designator. Bad date: The literal did not satisfy the date format.",
     "html/elements/ins/global-date-and-time-timezone-minutes-15-haswarn.html": "Bad value \u201c2011-11-12T00:00:00+08:15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Minutes in time zone designator should be either \u201c00\u201d, \u201c30\u201d, or \u201c45\u201d. Bad date: The literal did not satisfy the date format.",
-    "html/elements/ins/global-date-and-time-timezone-multiple-spaces-novalid.html": "Bad value \u201c2011-11-12  14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-non-T-character-novalid.html": "Bad value \u201c2011-11-12+14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-offset-colon-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929:08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-offset-space-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-one-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-5:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-one-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:0\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-plus-1500-haswarn.html": "Bad value \u201c2011-11-12T00:00:00+1500\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d",
+    "html/elements/ins/global-date-and-time-timezone-multiple-spaces-novalid.html": "Bad value \u201c2011-11-12  14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-non-T-character-novalid.html": "Bad value \u201c2011-11-12+14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-offset-colon-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929:08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-offset-space-start-novalid.html": "Bad value \u201c2011-11-12T06:54:39.929 08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-one-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-5:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-one-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:0\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-plus-1500-haswarn.html": "Bad value \u201c2011-11-12T00:00:00+1500\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Hours in time zone designator should be from \u201c-12:00\u201d to \u201d+14:00\u201d Bad date: The literal did not satisfy the date format.",
     "html/elements/ins/global-date-and-time-timezone-plus-2400-novalid.html": "Bad value \u201c2011-11-12T06:54:39-24:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: Hours out of range in time zone designator. Bad date: The literal did not satisfy the date format.",
-    "html/elements/ins/global-date-and-time-timezone-three-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-005:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-three-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:000\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-timezone-with-seconds-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:00:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-with-both-T-and-space-novalid.html": "Bad value \u201c2011-11-12T 14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-wrong-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T14-54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-wrong-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:54-39Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/global-date-and-time-zero-digit-fraction-novalid.html": "Bad value \u201c2011-11-12T06:54:39.-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/local-date-and-time-novalid.html": "Bad value \u201c2011-11-12T14:54\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/global-date-and-time-timezone-three-digit-hour-novalid.html": "Bad value \u201c2011-11-12T06:54:39-005:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-three-digit-minute-novalid.html": "Bad value \u201c2011-11-12T06:54:39-05:000\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-timezone-with-seconds-novalid.html": "Bad value \u201c2011-11-12T06:54:39-08:00:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-with-both-T-and-space-novalid.html": "Bad value \u201c2011-11-12T 14:54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-wrong-minutes-separator-novalid.html": "Bad value \u201c2011-11-12T14-54Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-wrong-seconds-separator-novalid.html": "Bad value \u201c2011-11-12T14:54-39Z\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/global-date-and-time-zero-digit-fraction-novalid.html": "Bad value \u201c2011-11-12T06:54:39.-08:00\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/local-date-and-time-novalid.html": "Bad value \u201c2011-11-12T14:54\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/ins/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
-    "html/elements/ins/month-novalid.html": "Bad value \u201c2011-11\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/time-novalid.html": "Bad value \u201c14:54:39\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/week-novalid.html": "Bad value \u201c2011-W46\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/year-novalid.html": "Bad value \u201c2006\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
-    "html/elements/ins/yearless-date-novalid.html": "Bad value \u201c07-15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad date: The literal did not satisfy the date format. Bad datetime with timezone: The literal did not satisfy the datetime with timezone format.",
+    "html/elements/ins/month-novalid.html": "Bad value \u201c2011-11\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/time-novalid.html": "Bad value \u201c14:54:39\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/week-novalid.html": "Bad value \u201c2011-W46\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/year-novalid.html": "Bad value \u201c2006\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
+    "html/elements/ins/yearless-date-novalid.html": "Bad value \u201c07-15\u201d for attribute \u201cdatetime\u201d on element \u201cins\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
     "html/elements/kbd/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
     "html/elements/keygen/id-bad-novalid.html": "Any \u201ckeygen\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.",
     "html/elements/keygen/id-missing-novalid.html": "Any \u201ckeygen\u201d descendant of a \u201clabel\u201d element with a \u201cfor\u201d attribute must have an ID value that matches that \u201cfor\u201d attribute.",
     "html/elements/keygen/id-redundant-novalid.html": "The \u201clabel\u201d element may contain at most one \u201cinput\u201d, \u201cbutton\u201d, \u201cselect\u201d, \u201ctextarea\u201d, or \u201ckeygen\u201d descendant.",
     "html/elements/keygen/keytype-bad-value-novalid.html": "Bad value \u201cdsa\u201d for attribute \u201ckeytype\u201d on element \u201ckeygen\u201d.",
     "html/elements/keygen/keytype-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201ckeytype\u201d on element \u201ckeygen\u201d.",
     "html/elements/keygen/model-novalid.html": "The element \u201ckeygen\u201d must not appear as a descendant of the \u201ca\u201d element.",
     "html/elements/keygen/non-void-novalid.html": "Stray end tag \u201ckeygen\u201d.",
@@ -1458,25 +1458,16 @@
     "html/elements/link/href/scheme-trailing-space-novalid.html": "Bad value \u201ca: foo.com\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Illegal character in scheme data: not a URL code point.",
     "html/elements/link/href/scheme-trailing-tab-novalid.html": "Bad value \u201ca:\tfoo.com\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Illegal character in scheme data: not a URL code point.",
     "html/elements/link/href/userinfo-backslash-novalid.html": "Bad value \u201chttp://a\\b:c\\d@foo.com\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Backslash (\"\\\") used as path segment delimiter.",
     "html/elements/link/href/userinfo-password-bad-chars-novalid.html": "\u201c&\u201d did not start a character reference. (\u201c&\u201d probably should have been escaped as \u201c&amp;\u201d.)",
     "html/elements/link/href/userinfo-password-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://foo:\ud83d\udca9@example.com\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Illegal character in user or password: not a URL code point.",
     "html/elements/link/href/userinfo-username-contains-at-sign-novalid.html": "Bad value \u201chttp://::@c@d:2\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: User or password contains an at symbol (\"@\") not percent-encoded.",
     "html/elements/link/href/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201chref\u201d on element \u201clink\u201d: Bad URL: Illegal character in user or password: not a URL code point.",
     "html/elements/map/model-novalid.html": "The \u201cid\u201d attribute on a \u201cmap\u201d element must have an the same value as the \u201cname\u201d attribute.",
-    "html/elements/meta/name-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: The empty string is not a valid keyword.",
-    "html/elements/meta/name-leading-bom-novalid.html": "Bad value \u201c\ufeffgenerator\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201c\ufeffgenerator\u201d is not registered.",
-    "html/elements/meta/name-leading-whitespace-novalid.html": "Bad value \u201c keywords\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201c keywords\u201d is not registered.",
-    "html/elements/meta/name-rejected-cache-novalid.html": "Bad value \u201ccache\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201ccache\u201d is not registered.",
-    "html/elements/meta/name-rejected-no-email-collection-novalid.html": "Bad value \u201cno-email-collection\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201cno-email-collection\u201d is not registered.",
-    "html/elements/meta/name-trailing-pile-of-poo-novalid.html": "Bad value \u201cdescription\ud83d\udca9\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201cdescription\ud83d\udca9\u201d is not registered.",
-    "html/elements/meta/name-trailing-whitespace-novalid.html": "Bad value \u201ckeywords \u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201ckeywords \u201d is not registered.",
-    "html/elements/meta/name-turkish-lowercase-dotless-i-novalid.html": "Bad value \u201cappl\u0131cat\u0131on-name\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201cappl\u0131cat\u0131on-name\u201d is not registered.",
-    "html/elements/meta/name-turkish-uppercase-dotted-i-novalid.html": "Bad value \u201cAPPL\u0130CAT\u0130ON-NAME\u201d for attribute \u201cname\u201d on element \u201cmeta\u201d: Bad metadata name: Keyword \u201cappl\u0130cat\u0130on-name\u201d is not registered.",
     "html/elements/object/data-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Must be non-empty.",
     "html/elements/object/data-type-missing-novalid.html": "Element \u201cobject\u201d is missing one or more of the following attributes: [data, type].",
     "html/elements/object/data-whitespace-only-novalid.html": "Bad value \u201c\t \n\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Must be non-empty.",
     "html/elements/object/data/fragment-backslash-novalid.html": "Bad value \u201c#\\\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Illegal character in fragment: not a URL code point.",
     "html/elements/object/data/fragment-contains-hash-novalid.html": "Bad value \u201chttp://foo/path#f#g\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Illegal character in fragment: not a URL code point.",
     "html/elements/object/data/fragment-leading-space-novalid.html": "Bad value \u201chttp://f:21/b# e\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Illegal character in fragment: not a URL code point.",
     "html/elements/object/data/host-cr-novalid.html": "Bad value \u201chttp://example.\norg\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Tab, new line or carriage return found.",
     "html/elements/object/data/host-double-percent-encoded-novalid.html": "Bad value \u201chttp://\uff05\uff14\uff11.com\u201d for attribute \u201cdata\u201d on element \u201cobject\u201d: Bad URL: Invalid host: Domain contains invalid character: %.",
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/tools/meta-extensions
+++ /dev/null
@@ -1,255 +0,0 @@
-aglsterms.accessibility
-aglsterms.accessmode
-aglsterms.act
-aglsterms.aggregationlevel
-aglsterms.availability
-aglsterms.case
-aglsterms.category
-aglsterms.datelicensed
-aglsterms.documenttype
-aglsterms.function
-aglsterms.isbasedon
-aglsterms.isbasisfor
-aglsterms.jurisdiction
-aglsterms.mandate
-aglsterms.protectivemarking
-aglsterms.regulation
-aglsterms.servicetype
-alexaverifyid
-apple-itunes-app
-apple-mobile-web-app-capable
-apple-mobile-web-app-status-bar-style
-apple-mobile-web-app-title
-apple-touch-fullscreen
-application-url
-baiduspider
-bitcoin
-blazerr-secure
-blazerr-seo
-blazerr-ssl
-blazerr-support-id-noncookies
-blazerr-support-identifier
-cfia.gdr.activity
-cfia.gdr.commodity
-cfia.gdr.include
-cfia.gdr.program
-citeseerxbot
-collection
-csrf-param
-csrf-token
-da_anonymiseip
-da_contactcompany
-da_contactemail
-da_contactfirstname
-da_contactlastname
-da_contactname
-da_contacttelephone
-da_conversioncurrency
-da_conversionid
-da_conversionvalue
-da_goalcurrency
-da_goalid
-da_goalvalue
-da_interactionselector
-da_pagerole
-da_pagetaxonomy
-da_pagetitle
-da_pageversion
-da_sessionid
-da_userid
-dc.date.issued
-dc.language
-dcterms.abstract
-dcterms.accessrights
-dcterms.accrualmethod
-dcterms.accrualperiodicity
-dcterms.accrualpolicy
-dcterms.alternative
-dcterms.audience
-dcterms.available
-dcterms.bibliographiccitation
-dcterms.collection
-dcterms.conformsto
-dcterms.contributor
-dcterms.coverage
-dcterms.created
-dcterms.creator
-dcterms.date
-dcterms.dateaccepted
-dcterms.datecopyrighted
-dcterms.datesubmitted
-dcterms.description
-dcterms.educationlevel
-dcterms.extent
-dcterms.format
-dcterms.hasformat
-dcterms.haspart
-dcterms.hasversion
-dcterms.identifier
-dcterms.instructionalmethod
-dcterms.isformatof
-dcterms.ispartof
-dcterms.isreferencedby
-dcterms.isreplacedby
-dcterms.isrequiredby
-dcterms.issued
-dcterms.isversionof
-dcterms.language
-dcterms.license
-dcterms.mediator
-dcterms.medium
-dcterms.modified
-dcterms.provenance
-dcterms.publisher
-dcterms.references
-dcterms.relation
-dcterms.replaces
-dcterms.requires
-dcterms.rights
-dcterms.rightsholder
-dcterms.source
-dcterms.spatial
-dcterms.subject
-dcterms.tableofcontents
-dcterms.temporal
-dcterms.title
-dcterms.type
-dcterms.valid
-designer
-entity
-essaydirectory
-fdse-description
-fdse-index-as
-fdse-keywords
-fdse-refresh
-fdse-robots
-format-detection
-fragment
-gcterms.topictaxonomy
-geo.a1
-geo.a2
-geo.a3
-geo.country
-geo.lmk
-geo.placename
-geo.position
-geo.region
-globrix.bathrooms
-globrix.bedrooms
-globrix.condition
-globrix.features
-globrix.instruction
-globrix.latitude
-globrix.longitude
-globrix.outsidespace
-globrix.parking
-globrix.period
-globrix.poa
-globrix.postcode
-globrix.price
-globrix.priceproximity
-globrix.tenure
-globrix.type
-globrix.underoffer
-go-import
-google
-google-site-verification
-googlebot
-googlebot-mobile
-gwt:property
-handheldfriendly
-icas.datetime
-icas.datetime.abbr
-icas.datetime.day
-icas.datetime.long
-icbm
-itemsperpage
-meta_date
-mobile-agent
-mobile-web-app-capable
-mobileoptimized
-msapplication-config
-msapplication-navbutton-color
-msapplication-square150x150logo
-msapplication-square310x310logo
-msapplication-square70x70logo
-msapplication-starturl
-msapplication-tap-highlight
-msapplication-task
-msapplication-tilecolor
-msapplication-tileimage
-msapplication-tooltip
-msapplication-wide310x150logo
-msapplication-window
-msvalidate.01
-norton-safeweb-site-verification
-p:domain_verify
-pingdom
-pinterest
-rating
-referrer
-repostusapikey
-resourceloaderdynamicstyles
-review_date
-revision
-revisit-after
-rights-standard
-robots
-rpuplugin
-rqid
-signet:authors
-signet:links
-skype_toolbar
-slurp
-startindex
-startver
-teoma
-totalresults
-twitter:app:country
-twitter:app:id:googleplay
-twitter:app:id:ipad
-twitter:app:id:iphone
-twitter:app:url:googleplay
-twitter:app:url:ipad
-twitter:app:url:iphone
-twitter:card
-twitter:creator
-twitter:creator:id
-twitter:description
-twitter:domain
-twitter:image
-twitter:image0
-twitter:image1
-twitter:image2
-twitter:image3
-twitter:image:height
-twitter:image:src
-twitter:image:width
-twitter:site
-twitter:site:id
-twitter:title
-twitter:url
-typemetal.formatprefs
-verify-v1
-vfb-version
-viewport
-web_author
-wot-verification
-wt.ac
-wt.ad
-wt.cg_n
-wt.cg_s
-wt.mc_id
-wt.si_n
-wt.si_p
-wt.si_x
-wt.sv
-wt.ti
-y_key
-yandex-verification
-zoomcategory
-zoomdescription
-zoomimage
-zoompageboost
-zoomtitle
-zoomwords
deleted file mode 100644
--- a/testing/web-platform/tests/conformance-checkers/tools/meta-name.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-ccdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-template = """<!DOCTYPE html>
-<meta charset=utf-8>
-<title>Registered extensions to the predefined set of metadata names</title>
-"""
-f = open(os.path.join(ccdir, "tools/meta-extensions"), 'r')
-for line in f:
-    template += '<meta name="%s" content>\n' % line.rstrip('\n')
-    template += '<meta name="%s" content>\n' % line.upper().rstrip('\n')
-    odd = True
-    mixed = ""
-    for c in line.rstrip('\n'):
-        if odd:
-            mixed += c.upper()
-        else:
-            mixed += c
-        odd = not odd
-    template += '<meta name="%s" content>\n' % mixed
-o = open(os.path.join(ccdir, "html/elements/meta/names-registered-isvalid.html"), 'wb')
-o.write(template)
-o.close()
-
-errors = {
-    "turkish-lowercase-dotless-i": "applıcatıon-name",
-    "turkish-uppercase-dotted-i": "APPLİCATİON-NAME",
-    "leading-whitespace": " keywords",
-    "trailing-whitespace": "keywords ",
-    "trailing-pile-of-poo": "description💩",
-    "leading-bom": "generator",
-    "empty": "",
-    "rejected-cache": "cache",
-    "rejected-no-email-collection": "no-email-collection",
-}
-for key in errors.keys():
-    template = "<!DOCTYPE html>\n<meta charset=utf-8>\n"
-    template += "<title>name-%s</title>" % key
-    template += '<meta name="%s" content>\n' % errors[key]
-    o = open(os.path.join(ccdir, "html/elements/meta/name-%s-novalid.html" % key), 'wb')
-    o.write(template)
-    o.close()
-# vim: ts=4:sw=4
rename from testing/web-platform/tests/DOMEvents/tests/approved/EventListener.dispatch.new.event.html
rename to testing/web-platform/tests/dom/events/Event-dispatch-reenter.html
--- a/testing/web-platform/tests/DOMEvents/tests/approved/EventListener.dispatch.new.event.html
+++ b/testing/web-platform/tests/dom/events/Event-dispatch-reenter.html
@@ -1,76 +1,66 @@
 <!DOCTYPE html>
-<html>
-<head>
+<meta charset=utf-8>
 <title> Dispatch additional events inside an event listener </title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
 <div id=log></div>
-
 <table id="table" border="1" style="display: none">
     <tbody id="table-body">
     <tr id="table-row">
         <td id="table-cell">Shady Grove</td>
         <td>Aeolian</td>
     </tr>
-    <tr id="parent">    
+    <tr id="parent">
         <td id="target">Over the river, Charlie</td>
         <td>Dorian</td>
     </tr>
     </tbody>
 </table>
-        
 <script>
-    var EVENT = "foo";    
-    var TARGET = document.getElementById("target");
-    var PARENT = document.getElementById("parent"); 
-    var TBODY = document.getElementById("table-body");
-    var TABLE = document.getElementById("table");
-    var BODY = document.body;
-    var HTML = document.documentElement;                
-    var CurrentTargets = [window, document, HTML, BODY, TABLE, TBODY, PARENT, TARGET];
-    var ExpectResult = [window, document, HTML, BODY, TABLE, TARGET, PARENT, TBODY, 
-                        TABLE, BODY, HTML, document, window, TBODY, PARENT, TARGET];
-    var ActualResult = [];
-    var ExpectTypes = "foo,foo,foo,foo,foo,bar,bar,bar,bar,bar,bar,bar,bar,foo,foo,foo,";
-    var ActualTypes = "";
-    
-    var description = "Test Description: " + 
-                      "Implementations of the DOM event model must be reentrant. Event listeners may perform actions that " + 
-                      "cause additional events to be dispatched. Such events are handled in a synchronous manner, the event " + 
-                      "propagation that causes the event listener to be triggered must resume only after the event dispatch " + 
-                      "of the new event is completed.";
+test(function() {
+    var event_type = "foo";
+    var target = document.getElementById("target");
+    var parent = document.getElementById("parent");
+    var tbody = document.getElementById("table-body");
+    var table = document.getElementById("table");
+    var body = document.body;
+    var html = document.documentElement;
+    var targets = [window, document, html, body, table, tbody, parent, target];
+    var expected_targets = [
+        window, document, html, body, table,
+        target, parent, tbody,
+        table, body, html, document, window,
+        tbody, parent, target];
+    var actual_targets = [];
+    var expected_types = [
+        "foo", "foo", "foo", "foo", "foo",
+        "bar", "bar", "bar",
+        "bar", "bar", "bar", "bar", "bar",
+        "foo", "foo", "foo"
+    ];
 
-    test(function()
-    {
-        for (var i=0; i < CurrentTargets.length; i++)
-        {
-            CurrentTargets[i].addEventListener(EVENT, TestEvent, true);
-            CurrentTargets[i].addEventListener("bar", TestEvent, false);
-        }
-       
-        var evt = document.createEvent("Event");
-        evt.initEvent(EVENT, false, true);               
-        TARGET.dispatchEvent(evt);
+    var actual_targets = [], actual_types = [];
+    var test_event = this.step_func(function(evt) {
+        actual_targets.push(evt.currentTarget);
+        actual_types.push(evt.type);
 
-        assert_array_equals(ActualResult, ExpectResult, "ActualResult");
-        assert_equals(ActualTypes, ExpectTypes, "ActualTypes");
-        
-    }, description);
-         
-    function TestEvent(evt)
-    {
-        ActualResult.push(evt.currentTarget);         
-        ActualTypes += evt.type + ",";
-        
-        if (TABLE == evt.currentTarget && EVENT == evt.type)
-        {
+        if (table == evt.currentTarget && event_type == evt.type) {
             var e = document.createEvent("Event");
             e.initEvent("bar", true, true);
-            TARGET.dispatchEvent(e);
-        }                
+            target.dispatchEvent(e);
+        }
+    });
+
+    for (var i = 0; i < targets.length; ++i) {
+        targets[i].addEventListener(event_type, test_event, true);
+        targets[i].addEventListener("bar", test_event, false);
     }
+
+    var evt = document.createEvent("Event");
+    evt.initEvent(event_type, false, true);
+    target.dispatchEvent(evt);
+
+    assert_array_equals(actual_targets, expected_targets, "actual_targets");
+    assert_array_equals(actual_types, expected_types, "actual_types");
+});
 </script>
-</body>
-</html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/004.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/004.html
@@ -1,62 +1,62 @@
 <!doctype html>
 <html>
-	<head>
-		<title>Final history position for history.go should be calculated when executing the task</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-		<script type="text/javascript">
+  <head>
+    <title>Final history position for history.go should be calculated when executing the task</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+    <script type="text/javascript">
 setup({explicit_done:true});
 window.onload = function () {
-	var hashcount = 0;
-	if( location.hash && location.hash != '#' ) {
-		location.href = location.href.replace(/#.*$/,'');
-		return;
-	}
-	setTimeout(add1,100);
-	function add1() {
-		location.hash = '#foo';
-		setTimeout(add2,100);
-	}
-	function add2() {
-		location.hash = '#bar';
-		setTimeout(add3,100);
-	}
-	function add3() {
-		location.hash = '#baz';
-		setTimeout(dojumps,100);
-	}
-	function dojumps() {
-		window.onhashchange = function () {
-			hashcount++;
-		};
-		history.go(-2);
-		test(function () {
-			//many browsers special-case jumps that only imply hash changes and will do them synchronously - the spec does allow this
-			assert_equals( hashcount, 0, 'hashchange fired even though the location should not have changed' );
-			assert_equals( location.hash.replace(/^#/,''), 'baz', 'the browser navigated synchronously' );
-		}, '.go commands should be queued until the thread has ended');
-		history.go(-1);
-		setTimeout(checkjumps,100);
-	}
-	function checkjumps() {
-		test(function () {
-			assert_true( !!hashcount, 'this testcase requires haschange support; the test cannot be used in this browser' );
-		}, 'browser needs to support hashchange events for this testcase');
-		test(function () {
-			assert_equals( hashcount, 2, 'the wrong number of queued commands were executed' );
-		}, 'queued .go commands should all be executed when the queue is processed');
-		test(function () {
-			assert_equals( location.hash.replace(/^#/,''), '' );
-		}, 'history position should be calculated when executing, not when calling the .go command');
-		done();
-	}
+  var hashcount = 0;
+  if( location.hash && location.hash != '#' ) {
+    location.href = location.href.replace(/#.*$/,'');
+    return;
+  }
+  setTimeout(add1,100);
+  function add1() {
+    location.hash = '#foo';
+    setTimeout(add2,100);
+  }
+  function add2() {
+    location.hash = '#bar';
+    setTimeout(add3,100);
+  }
+  function add3() {
+    location.hash = '#baz';
+    setTimeout(dojumps,100);
+  }
+  function dojumps() {
+    window.onhashchange = function () {
+      hashcount++;
+    };
+    history.go(-2);
+    test(function () {
+      //many browsers special-case jumps that only imply hash changes and will do them synchronously - the spec does allow this
+      assert_equals( hashcount, 0, 'hashchange fired even though the location should not have changed' );
+      assert_equals( location.hash.replace(/^#/,''), 'baz', 'the browser navigated synchronously' );
+    }, '.go commands should be queued until the thread has ended');
+    history.go(-1);
+    setTimeout(checkjumps,100);
+  }
+  function checkjumps() {
+    test(function () {
+      assert_true( !!hashcount, 'this testcase requires haschange support; the test cannot be used in this browser' );
+    }, 'browser needs to support hashchange events for this testcase');
+    test(function () {
+      assert_equals( hashcount, 2, 'the wrong number of queued commands were executed' );
+    }, 'queued .go commands should all be executed when the queue is processed');
+    test(function () {
+      assert_equals( location.hash.replace(/^#/,''), '' );
+    }, 'history position should be calculated when executing, not when calling the .go command');
+    done();
+  }
 };
-		</script>
-	</head>
-	<body>
+    </script>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/005.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/005.html
@@ -1,47 +1,47 @@
 <!doctype html>
 <html>
-	<head>
-		<title>Popstate event listener registration</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-		<script type="text/javascript">
+  <head>
+    <title>Popstate event listener registration</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+    <script type="text/javascript">
 
 //this test checks that onpopstate works on the body element
 
 var readyForPop = false, bodypop = false, inlinepop = false;
 setup({explicit_done:true});
 
 //use a timeout to avoid "popstate fires onload" from setting the variables too early
 setTimeout(step1,1000);
 function step1() {
-	readyForPop = true;
-	test(function () {
-		history.pushState('','');
-		history.pushState('','');
-	}, 'history.pushState support is needed for this testcase');
-	history.go(-1);
-	setTimeout(step2,50); //.go is queued to end of thread
+  readyForPop = true;
+  test(function () {
+    history.pushState('','');
+    history.pushState('','');
+  }, 'history.pushState support is needed for this testcase');
+  history.go(-1);
+  setTimeout(step2,50); //.go is queued to end of thread
 }
 function step2() {
-	test(function () {
-		assert_true( bodypop );
-	}, '<body onpopstate="..."> should register a listener for the popstate event');
-	window.onpopstate = function () { inlinepop = true; };
-	history.go(-1);
-	setTimeout(step3,50); //.go is queued to end of thread
+  test(function () {
+    assert_true( bodypop );
+  }, '<body onpopstate="..."> should register a listener for the popstate event');
+  window.onpopstate = function () { inlinepop = true; };
+  history.go(-1);
+  setTimeout(step3,50); //.go is queued to end of thread
 }
 function step3() {
-	test(function () {
-		assert_true( inlinepop );
-	}, 'window.onpopstate should register a listener for the popstate event');
-	done();
+  test(function () {
+    assert_true( inlinepop );
+  }, 'window.onpopstate should register a listener for the popstate event');
+  done();
 }
-		</script>
-	</head>
-	<body onpopstate="if( readyForPop ) { bodypop = true; }">
+    </script>
+  </head>
+  <body onpopstate="if( readyForPop ) { bodypop = true; }">
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/006.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/006.html
@@ -1,53 +1,53 @@
 <!doctype html>
 <html>
-	<head>
-		<title>Firing popstate after onload, even if there is no pushed/replaced state</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-		<script type="text/javascript">
+  <head>
+    <title>Firing popstate after onload, even if there is no pushed/replaced state</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+    <script type="text/javascript">
 
 //spec (25 March 2011 draft) states that popstate must not fire after onload unless there is a pushed/replaced state that is navigated
 var popfired = false;
 setup({explicit_done:true});
 window.addEventListener('popstate',function (e) { popfired = true; },false);
 test(function () {
-	assert_equals( history.state, null );
+  assert_equals( history.state, null );
 }, 'history.state should initially be null');
 window.onload = function () {
-	test(function () {
-		assert_false( popfired );
-	}, 'popstate event should not fire before onload fires');
-	test(function () {
-		assert_equals( history.state, null );
-	}, 'history.state should still be null onload');
-	popfired = false;
-	setTimeout(function () {
-		test(function () {
-			assert_false( popfired );
-		}, 'popstate event should not fire after onload fires');
-		test(function () {
-			assert_equals( history.state, null );
-		}, 'history.state should still be null after onload');
-		test(function () {
-			var failed = false, realstate = history.state;
-			try {
-				history.state = '';
-			} catch(e) {
-				failed = e;
-			}
-			assert_equals(history.state,realstate,'property was read/write');
-			assert_false(failed);
-		}, 'writing to history.state should be silently ignored and not throw an error');
-		done();
-	},100);
+  test(function () {
+    assert_false( popfired );
+  }, 'popstate event should not fire before onload fires');
+  test(function () {
+    assert_equals( history.state, null );
+  }, 'history.state should still be null onload');
+  popfired = false;
+  setTimeout(function () {
+    test(function () {
+      assert_false( popfired );
+    }, 'popstate event should not fire after onload fires');
+    test(function () {
+      assert_equals( history.state, null );
+    }, 'history.state should still be null after onload');
+    test(function () {
+      var failed = false, realstate = history.state;
+      try {
+        history.state = '';
+      } catch(e) {
+        failed = e;
+      }
+      assert_equals(history.state,realstate,'property was read/write');
+      assert_false(failed);
+    }, 'writing to history.state should be silently ignored and not throw an error');
+    done();
+  },100);
 };
 
-		</script>
-	</head>
-	<body>
+    </script>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/007.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/007.html
@@ -1,56 +1,56 @@
 <!doctype html>
 <html>
-	<head>
-		<title>Firing popstate after onload with pushed state</title>
+  <head>
+    <title>Firing popstate after onload with pushed state</title>
                 <meta name=timeout content=long>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-	</head>
-	<body>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log">It looks like the browser stopped loading the page when encountering a .go(-1) command pointing to a pushed state. This will break the tests.</div>
-		<script type="text/javascript">
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log">It looks like the browser stopped loading the page when encountering a .go(-1) command pointing to a pushed state. This will break the tests.</div>
+    <script type="text/javascript">
 
 //spec (25 March 2011 draft) states that popstate must fire before onload if there is a pushed/replaced state that is navigated
 var popfired = false;
 setup({explicit_done:true});
 test(function () {
-	assert_equals( history.state, null );
+  assert_equals( history.state, null );
 }, 'history.state should initially be null');
 window.addEventListener('popstate',function (e) { popfired = e.state; },false);
 test(function () {
-	history.pushState('state1','');
-	history.pushState('state2','');
+  history.pushState('state1','');
+  history.pushState('state2','');
 }, 'history.pushState support is needed for this testcase');
 test(function () {
-	assert_equals( history.state, 'state2' );
+  assert_equals( history.state, 'state2' );
 }, 'history.state should reflect pushed state');
 if( history.pushState ) { history.go(-1); }
 window.onload = function () {
-	test(function () {
-		assert_true( !!popfired );
-	}, 'popstate event should fire before onload fires');
-	test(function () {
-		assert_equals( popfired, 'state1' );
-	}, 'the correct state should be restored when navigating during initial load');
-	test(function () {
-		assert_equals( history.state, 'state1' );
-	}, 'history.state should reflect the navigated state onload');
-	popfired = false;
-	setTimeout(function () {
-		test(function () {
-			assert_false( !!popfired );
-		}, 'popstate event should not fire after onload fires');
-		test(function () {
-			assert_equals( history.state, 'state1' );
-		}, 'history.state should reflect the navigated state after onload');
-		done();
-		if( history.pushState ) { history.go(-1); } //go back to the start to avoid state recovery when reloading
-	},100);
+  test(function () {
+    assert_true( !!popfired );
+  }, 'popstate event should fire before onload fires');
+  test(function () {
+    assert_equals( popfired, 'state1' );
+  }, 'the correct state should be restored when navigating during initial load');
+  test(function () {
+    assert_equals( history.state, 'state1' );
+  }, 'history.state should reflect the navigated state onload');
+  popfired = false;
+  setTimeout(function () {
+    test(function () {
+      assert_false( !!popfired );
+    }, 'popstate event should not fire after onload fires');
+    test(function () {
+      assert_equals( history.state, 'state1' );
+    }, 'history.state should reflect the navigated state after onload');
+    done();
+    if( history.pushState ) { history.go(-1); } //go back to the start to avoid state recovery when reloading
+  },100);
 };
 
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/008.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/008.html
@@ -1,40 +1,40 @@
 <!doctype html>
 <html>
 
 <!-- configure this test below to point to the script -->
 
-	<head>
-		<title>history.pushState/replaceState resolving</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-	</head>
-	<body>
+  <head>
+    <title>history.pushState/replaceState resolving</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
 
-		<p></p>
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
-		<script type="text/javascript">
+    <p></p>
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
+    <script type="text/javascript">
 
 /*
 Location of the script (which must be hosted on a separate domain from this test) containing the test code:
 var beforehref = location.href;
 test(function () {
-	history.pushState('','','/testing_ignore_me_404');
-	assert_equals(location.href,beforehref.replace(/^(\w*:\/\/[^\/]*\/)[\w\W]*$/,'$1testing_ignore_me_404'));
+  history.pushState('','','/testing_ignore_me_404');
+  assert_equals(location.href,beforehref.replace(/^(\w*:\/\/[^\/]*\/)[\w\W]*$/,'$1testing_ignore_me_404'));
 }, 'history.pushState URL resolving should be done relative to the document, not the script');
 test(function () {
-	history.replaceState('','','/testing_ignore_me_404_2');
-	assert_equals(location.href,beforehref.replace(/^(\w*:\/\/[^\/]*\/)[\w\W]*$/,'$1testing_ignore_me_404_2'));
+  history.replaceState('','','/testing_ignore_me_404_2');
+  assert_equals(location.href,beforehref.replace(/^(\w*:\/\/[^\/]*\/)[\w\W]*$/,'$1testing_ignore_me_404_2'));
 }, 'history.replaceState URL resolving should be done relative to the document, not the script');
 */
 var scriptlocation = 'http://www.' + location.host + location.pathname.split("/").slice(0,-1).join("/") + "/008.js";
 
 if( location.protocol == 'file:' ) {
-	document.getElementsByTagName('p')[0].innerHTML = 'ERROR: This test cannot be run from file: (URL resolving will not work). It must be loaded over HTTP.';
+  document.getElementsByTagName('p')[0].innerHTML = 'ERROR: This test cannot be run from file: (URL resolving will not work). It must be loaded over HTTP.';
 } else {
-	document.write('<script type="text\/javascript" src="'+scriptlocation+'"><\/script>');
+  document.write('<script type="text\/javascript" src="'+scriptlocation+'"><\/script>');
 }
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/009-1.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/009-1.html
@@ -1,20 +1,20 @@
 <!doctype html>
 <html>
-	<head>
-		<title>history.pushState/replaceState and referer headers</title>
-	</head>
-	<body>
+  <head>
+    <title>history.pushState/replaceState and referer headers</title>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
-		<script type="text/javascript">
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
+    <script type="text/javascript">
 window.onload = function () {
-	setTimeout(function () {
-		try { history.pushState('','','009-2.html?1234'); } catch(e) {}
-		location.href = '009-3.html?pipe=sub';
-	},10);
+  setTimeout(function () {
+    try { history.pushState('','','009-2.html?1234'); } catch(e) {}
+    location.href = '009-3.html?pipe=sub';
+  },10);
 };
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/009.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/009.html
@@ -1,22 +1,22 @@
 <!doctype html>
 <html>
-	<head>
-		<title>history.pushState/replaceState and referer headers</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-	</head>
-	<body>
+  <head>
+    <title>history.pushState/replaceState and referer headers</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
-		<script type="text/javascript">
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
+    <script type="text/javascript">
 setup({explicit_done:true});
 var iframe = document.createElement('iframe');
 window.onload = function () {
-	iframe.setAttribute('src','009-1.html');
-	document.body.appendChild(iframe)
+  iframe.setAttribute('src','009-1.html');
+  document.body.appendChild(iframe)
 };
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/010-1.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/010-1.html
@@ -1,16 +1,16 @@
 <!doctype html>
 <html>
-	<head>
-		<title>history.pushState/replaceState and referer headers (before onload)</title>
-	</head>
-	<body>
+  <head>
+    <title>history.pushState/replaceState and referer headers (before onload)</title>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
-		<script type="text/javascript">
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
+    <script type="text/javascript">
 try { history.pushState('','','010-2.html?1234'); } catch(e) {}
 location.href = '010-3.html?pipe=sub';
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/010.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/010.html
@@ -1,22 +1,22 @@
 <!doctype html>
 <html>
-	<head>
-		<title>history.pushState/replaceState and referer headers (before onload)</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-	</head>
-	<body>
+  <head>
+    <title>history.pushState/replaceState and referer headers (before onload)</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
-		<script type="text/javascript">
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
+    <script type="text/javascript">
 setup({explicit_done:true});
 var iframe = document.createElement('iframe');
 window.onload = function () {
-	iframe.setAttribute('src','010-1.html');
-	document.body.appendChild(iframe)
+  iframe.setAttribute('src','010-1.html');
+  document.body.appendChild(iframe)
 };
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/011.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/011.html
@@ -1,32 +1,32 @@
 <!doctype html>
 <html>
-	<head>
-		<title>history.pushState before onload</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-	</head>
-	<body>
+  <head>
+    <title>history.pushState before onload</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
-		<script type="text/javascript">
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
+    <script type="text/javascript">
 var newUrl = location.href.replace(/\/[^\/]*$/,'\/011-1.html');
 setup({explicit_done:true});
 test(function () {
-	history.pushState('','','011-1.html');
+  history.pushState('','','011-1.html');
 }, 'pushState should be able to set the location state');
 test(function () {
-	assert_equals( location.href, newUrl );
+  assert_equals( location.href, newUrl );
 }, 'pushed location should be reflected immediately');
 window.onload = function () {
-	setTimeout(function () {
-		test(function () {
-			assert_equals( location.href, newUrl );
-		}, 'pushed location should be retained after the page has loaded');
-		done();
-	},10);
+  setTimeout(function () {
+    test(function () {
+      assert_equals( location.href, newUrl );
+    }, 'pushed location should be retained after the page has loaded');
+    done();
+  },10);
 };
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/012.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/012.html
@@ -1,32 +1,32 @@
 <!doctype html>
 <html>
-	<head>
-		<title>history.replaceState before onload</title>
-		<script type="text/javascript" src="/resources/testharness.js"></script>
-		<script type="text/javascript" src="/resources/testharnessreport.js"></script>
-	</head>
-	<body>
+  <head>
+    <title>history.replaceState before onload</title>
+    <script type="text/javascript" src="/resources/testharness.js"></script>
+    <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
 
-		<noscript><p>Enable JavaScript and reload</p></noscript>
-		<div id="log"></div>
-		<script type="text/javascript">
+    <noscript><p>Enable JavaScript and reload</p></noscript>
+    <div id="log"></div>
+    <script type="text/javascript">
 var newUrl = location.href.replace(/\/[^\/]*$/,'\/011-1.html');
 setup({explicit_done:true});
 test(function () {
-	history.replaceState('','','011-1.html');
+  history.replaceState('','','011-1.html');
 }, 'replaceState should be able to set the location state');
 test(function () {
-	assert_equals( location.href, newUrl );
+  assert_equals( location.href, newUrl );
 }, 'replaced location should be reflected immediately');
 window.onload = function () {
-	setTimeout(function () {
-		test(function () {
-			assert_equals( location.href, newUrl );
-		}, 'replaced location should be retained after the page has loaded');
-		done();
-	},10);
+  setTimeout(function () {
+    test(function () {
+      assert_equals( location.href, newUrl );
+    }, 'replaced location should be retained after the page has loaded');
+    done();
+  },10);
 };
-		</script>
+    </script>
 
-	</body>
+  </body>
 </html>
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/blank.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/blank.html
@@ -1,8 +1,8 @@
 <!doctype html>
 <html>
-	<head>
-		<title>Dummy page 1</title>
-	</head>
-	<body>
-	</body>
+  <head>
+    <title>Dummy page 1</title>
+  </head>
+  <body>
+  </body>
 </html>
\ No newline at end of file
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/blank2.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/blank2.html
@@ -1,13 +1,13 @@
 <!doctype html>
 <html>
-	<head>
-		<title>Dummy page 2</title>
-	</head>
-	<body>
-		<script type="text/javascript">
+  <head>
+    <title>Dummy page 2</title>
+  </head>
+  <body>
+    <script type="text/javascript">
 if( self == top || !parent.reportload ) {
-	document.write("<p>FAIL. Browser got confused when navigating forwards, and navigated the whole window to the iframe's location, instead of just navigating the iframe. It is not possible to run the testsuite.<\/p>");
+  document.write("<p>FAIL. Browser got confused when navigating forwards, and navigated the whole window to the iframe's location, instead of just navigating the iframe. It is not possible to run the testsuite.<\/p>");
 }
-		</script>
-	</body>
+    </script>
+  </body>
 </html>
\ No newline at end of file
--- a/testing/web-platform/tests/html/browsers/history/the-history-interface/blank3.html
+++ b/testing/web-platform/tests/html/browsers/history/the-history-interface/blank3.html
@@ -1,11 +1,11 @@
 <!doctype html>
 <html>
-	<head>
-		<title>Dummy page 3</title>
-		<script type="text/javascript">
+  <head>
+    <title>Dummy page 3</title>
+    <script type="text/javascript">
 var forreal = true;
-		</script>
-	</head>
-	<body>
-	</body>
+    </script>
+  </head>
+  <body>
+  </body>
 </html>
\ No newline at end of file
--- a/testing/web-platform/tests/html/browsers/offline/resources/css/result.css
+++ b/testing/web-platform/tests/html/browsers/offline/resources/css/result.css
@@ -1,11 +1,11 @@
 .manualpass {
-	color: green;
+  color: green;
 }
 .manualfail {
-	color: red;
+  color: red;
 }.pass {
-	color: green;
+  color: green;
 }
 .fail {
-	color: red;
-}
\ No newline at end of file
+  color: red;
+}
--- a/testing/web-platform/tests/html/dom/elements-embedded.js
+++ b/testing/web-platform/tests/html/dom/elements-embedded.js
@@ -1,152 +1,152 @@
 // Up-to-date as of 2013-04-06.
 var embeddedElements = {
-	img: {
-		// Conforming
-		alt: "string",
-		src: "url",
-		srcset: "string",
-		crossOrigin: {type: "enum", keywords: ["", "anonymous", "use-credentials"]},
-		useMap: "string",
-		isMap: "boolean",
-		width: {type: "unsigned long", customGetter: true},
-		height: {type: "unsigned long", customGetter: true},
+  img: {
+    // Conforming
+    alt: "string",
+    src: "url",
+    srcset: "string",
+    crossOrigin: {type: "enum", keywords: ["", "anonymous", "use-credentials"]},
+    useMap: "string",
+    isMap: "boolean",
+    width: {type: "unsigned long", customGetter: true},
+    height: {type: "unsigned long", customGetter: true},
 
-		// Obsolete
-		name: "string",
-		lowsrc: {type: "url"},
-		align: "string",
-		hspace: "unsigned long",
-		vspace: "unsigned long",
-		longDesc: "url",
-		border: {type: "string", treatNullAsEmptyString: true},
-	},
-	iframe: {
-		// Conforming
-		src: "url",
-		srcdoc: "string",
-		name: "string",
-		sandbox: "settable tokenlist",
-		seamless: "boolean",
-		allowFullscreen: "boolean",
-		width: "string",
-		height: "string",
+    // Obsolete
+    name: "string",
+    lowsrc: {type: "url"},
+    align: "string",
+    hspace: "unsigned long",
+    vspace: "unsigned long",
+    longDesc: "url",
+    border: {type: "string", treatNullAsEmptyString: true},
+  },
+  iframe: {
+    // Conforming
+    src: "url",
+    srcdoc: "string",
+    name: "string",
+    sandbox: "settable tokenlist",
+    seamless: "boolean",
+    allowFullscreen: "boolean",
+    width: "string",
+    height: "string",
 
-		// Obsolete
-		align: "string",
-		scrolling: "string",
-		frameBorder: "string",
-		longDesc: "url",
-		marginHeight: {type: "string", treatNullAsEmptyString: true},
-		marginWidth: {type: "string", treatNullAsEmptyString: true}
-	},
-	embed: {
-		// Conforming
-		src: "url",
-		type: "string",
-		width: "string",
-		height: "string",
+    // Obsolete
+    align: "string",
+    scrolling: "string",
+    frameBorder: "string",
+    longDesc: "url",
+    marginHeight: {type: "string", treatNullAsEmptyString: true},
+    marginWidth: {type: "string", treatNullAsEmptyString: true}
+  },
+  embed: {
+    // Conforming
+    src: "url",
+    type: "string",
+    width: "string",
+    height: "string",
 
-		// Obsolete
-		align: "string",
-		name: "string"
-	},
-	object: {
-		// Conforming
-		data: "url",
-		type: "string",
-		typeMustMatch: "boolean",
-		name: "string",
-		useMap: "string",
-		width: "string",
-		height: "string",
+    // Obsolete
+    align: "string",
+    name: "string"
+  },
+  object: {
+    // Conforming
+    data: "url",
+    type: "string",
+    typeMustMatch: "boolean",
+    name: "string",
+    useMap: "string",
+    width: "string",
+    height: "string",
 
-		// Obsolete
-		align: "string",
-		archive: "string",
-		code: "string",
-		declare: "boolean",
-		hspace: "unsigned long",
-		standby: "string",
-		vspace: "unsigned long",
-		codeBase: "url",
-		codeType: "string",
-		border: {type: "string", treatNullAsEmptyString: true}
-	},
-	param: {
-		// Conforming
-		name: "string",
-		value: "string",
+    // Obsolete
+    align: "string",
+    archive: "string",
+    code: "string",
+    declare: "boolean",
+    hspace: "unsigned long",
+    standby: "string",
+    vspace: "unsigned long",
+    codeBase: "url",
+    codeType: "string",
+    border: {type: "string", treatNullAsEmptyString: true}
+  },
+  param: {
+    // Conforming
+    name: "string",
+    value: "string",
 
-		// Obsolete
-		type: "string",
-		valueType: "string"
-	},
-	video: {
-		// HTMLMediaElement
-		src: "url",
-		crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
-		// As with "keytype", we have no missing value default defined here.
-		preload: {type: "enum", keywords: ["none", "metadata", "auto"], nonCanon: {"": "auto"}, defaultVal: null},
-		autoplay: "boolean",
-		loop: "boolean",
-		mediaGroup: "string",
-		controls: "boolean",
-		defaultMuted: {type: "boolean", domAttrName: "muted"},
+    // Obsolete
+    type: "string",
+    valueType: "string"
+  },
+  video: {
+    // HTMLMediaElement
+    src: "url",
+    crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
+    // As with "keytype", we have no missing value default defined here.
+    preload: {type: "enum", keywords: ["none", "metadata", "auto"], nonCanon: {"": "auto"}, defaultVal: null},
+    autoplay: "boolean",
+    loop: "boolean",
+    mediaGroup: "string",
+    controls: "boolean",
+    defaultMuted: {type: "boolean", domAttrName: "muted"},
 
-		width: "unsigned long",
-		height: "unsigned long",
-		poster: "url"
-	},
-	audio: {
-		// HTMLMediaElement
-		src: "url",
-		crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
-		// As with "keytype", we have no missing value default defined here.
-		preload: {type: "enum", keywords: ["none", "metadata", "auto"], nonCanon: {"": "auto"}, defaultVal: null},
-		autoplay: "boolean",
-		loop: "boolean",
-		mediaGroup: "string",
-		controls: "boolean",
-		defaultMuted: {type: "boolean", domAttrName: "muted"}
-	},
-	source: {
-		src: "url",
-		type: "string",
-		media: "string"
-	},
-	track: {
-		kind: {type: "enum", keywords: ["subtitles", "captions", "descriptions", "chapters", "metadata"], defaultVal: "captions"},
-		src: "url",
-		srclang: "string",
-		label: "string",
-		"default": "boolean"
-	},
-	canvas: {
-		width: {type: "unsigned long", defaultVal: 300},
-		height: {type: "unsigned long", defaultVal: 150}
-	},
-	map: {
-		name: "string"
-	},
-	area: {
-		// Conforming
-		alt: "string",
-		coords: "string",
-		shape: "string",
-		target: "string",
-		download: "string",
-		ping: "urls",
-		rel: "string",
-		relList: {type: "tokenlist", domAttrName: "rel"},
-		hreflang: "string",
-		type: "string",
+    width: "unsigned long",
+    height: "unsigned long",
+    poster: "url"
+  },
+  audio: {
+    // HTMLMediaElement
+    src: "url",
+    crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
+    // As with "keytype", we have no missing value default defined here.
+    preload: {type: "enum", keywords: ["none", "metadata", "auto"], nonCanon: {"": "auto"}, defaultVal: null},
+    autoplay: "boolean",
+    loop: "boolean",
+    mediaGroup: "string",
+    controls: "boolean",
+    defaultMuted: {type: "boolean", domAttrName: "muted"}
+  },
+  source: {
+    src: "url",
+    type: "string",
+    media: "string"
+  },
+  track: {
+    kind: {type: "enum", keywords: ["subtitles", "captions", "descriptions", "chapters", "metadata"], defaultVal: "captions"},
+    src: "url",
+    srclang: "string",
+    label: "string",
+    "default": "boolean"
+  },
+  canvas: {
+    width: {type: "unsigned long", defaultVal: 300},
+    height: {type: "unsigned long", defaultVal: 150}
+  },
+  map: {
+    name: "string"
+  },
+  area: {
+    // Conforming
+    alt: "string",
+    coords: "string",
+    shape: "string",
+    target: "string",
+    download: "string",
+    ping: "urls",
+    rel: "string",
+    relList: {type: "tokenlist", domAttrName: "rel"},
+    hreflang: "string",
+    type: "string",
 
-	        //URLUtils
-		href: "url",
+          //URLUtils
+    href: "url",
 
-		// Obsolete
-		noHref: "boolean"
-	},
+    // Obsolete
+    noHref: "boolean"
+  },
 };
 
 mergeElements(embeddedElements);
--- a/testing/web-platform/tests/html/dom/elements-forms.js
+++ b/testing/web-platform/tests/html/dom/elements-forms.js
@@ -1,143 +1,143 @@
 // Up-to-date as of 2013-04-07.
 var formElements = {
-	form: {
-		acceptCharset: {type: "string", domAttrName: "accept-charset"},
-		// TODO: action is special
-		// action: "url",
-		autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
-		enctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded"},
-		encoding: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded", domAttrName: "enctype"},
-		method: {type: "enum", keywords: ["get", "post", "dialog"], defaultVal: "get"},
-		name: "string",
-		noValidate: "boolean",
-		target: "string",
-	},
-	fieldset: {
-		disabled: "boolean",
-		name: "string",
-	},
-	legend: {
-		// Obsolete
-		align: "string",
-	},
-	label: {
-		htmlFor: {type: "string", domAttrName: "for"},
-	},
-	input: {
-		// Conforming
-		accept: "string",
-		alt: "string",
-		// TODO: autocomplete is special.
-		// autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
-		autofocus: "boolean",
-		defaultChecked: {type: "boolean", domAttrName: "checked"},
-		dirName: "string",
-		disabled: "boolean",
-		// TODO: formAction is special
-		// formAction: "url",
-		formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
-		formMethod: {type: "enum", keywords: ["get", "post"], invalidVal: "get"},
-		formNoValidate: "boolean",
-		formTarget: "string",
-		//TODO: only reflected on setting
-		//height: "unsigned long",
-		inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
-		max: "string",
-		maxLength: "limited long",
-		min: "string",
-		multiple: "boolean",
-		name: "string",
-		pattern: "string",
-		placeholder: "string",
-		readOnly: "boolean",
-		required: "boolean",
-		// https://html.spec.whatwg.org/multipage/#attr-input-size
-		size: {type: "limited unsigned long", defaultVal: 20},
-		src: "url",
-		step: "string",
-		type: {type: "enum", keywords: ["hidden", "text", "search", "tel",
-			"url", "email", "password", "datetime", "date", "month", "week",
-			"time", "datetime-local", "number", "range", "color", "checkbox",
-			"radio", "file", "submit", "image", "reset", "button"], defaultVal:
-			"text"},
-		//TODO: only reflected on setting
-		//width: "unsigned long",
-		defaultValue: {type: "string", domAttrName: "value"},
+  form: {
+    acceptCharset: {type: "string", domAttrName: "accept-charset"},
+    // TODO: action is special
+    // action: "url",
+    autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
+    enctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded"},
+    encoding: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded", domAttrName: "enctype"},
+    method: {type: "enum", keywords: ["get", "post", "dialog"], defaultVal: "get"},
+    name: "string",
+    noValidate: "boolean",
+    target: "string",
+  },
+  fieldset: {
+    disabled: "boolean",
+    name: "string",
+  },
+  legend: {
+    // Obsolete
+    align: "string",
+  },
+  label: {
+    htmlFor: {type: "string", domAttrName: "for"},
+  },
+  input: {
+    // Conforming
+    accept: "string",
+    alt: "string",
+    // TODO: autocomplete is special.
+    // autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
+    autofocus: "boolean",
+    defaultChecked: {type: "boolean", domAttrName: "checked"},
+    dirName: "string",
+    disabled: "boolean",
+    // TODO: formAction is special
+    // formAction: "url",
+    formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
+    formMethod: {type: "enum", keywords: ["get", "post"], invalidVal: "get"},
+    formNoValidate: "boolean",
+    formTarget: "string",
+    //TODO: only reflected on setting
+    //height: "unsigned long",
+    inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
+    max: "string",
+    maxLength: "limited long",
+    min: "string",
+    multiple: "boolean",
+    name: "string",
+    pattern: "string",
+    placeholder: "string",
+    readOnly: "boolean",
+    required: "boolean",
+    // https://html.spec.whatwg.org/multipage/#attr-input-size
+    size: {type: "limited unsigned long", defaultVal: 20},
+    src: "url",
+    step: "string",
+    type: {type: "enum", keywords: ["hidden", "text", "search", "tel",
+      "url", "email", "password", "datetime", "date", "month", "week",
+      "time", "datetime-local", "number", "range", "color", "checkbox",
+      "radio", "file", "submit", "image", "reset", "button"], defaultVal:
+      "text"},
+    //TODO: only reflected on setting
+    //width: "unsigned long",
+    defaultValue: {type: "string", domAttrName: "value"},
 
-		// Obsolete
-		align: "string",
-		useMap: "string",
-	},
-	button: {
-		autofocus: "boolean",
-		disabled: "boolean",
-		// TODO: formAction is special
-		// formAction: "url",
-		formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
-		formMethod: {type: "enum", keywords: ["get", "post", "dialog"], invalidVal: "get"},
-		formNoValidate: "boolean",
-		formTarget: "string",
-		name: "string",
-		type: {type: "enum", keywords: ["submit", "reset", "button"], defaultVal: "submit"},
-		value: "string",
-		// TODO: menu
-	},
-	select: {
-		autofocus: "boolean",
-		disabled: "boolean",
-		multiple: "boolean",
-		name: "string",
-		required: "boolean",
-		size: {type: "unsigned long", defaultVal: 0},
-	},
-	datalist: {},
-	optgroup: {
-		disabled: "boolean",
-		label: "string",
-	},
-	option: {
-		disabled: "boolean",
-		label: {type: "string", customGetter: true},
-		defaultSelected: {type: "boolean", domAttrName: "selected"},
-		value: {type: "string", customGetter: true},
-	},
-	textarea: {
-		// TODO: autocomplete is special.
-		// autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
-		autofocus: "boolean",
-		cols: {type: "limited unsigned long", defaultVal: 20},
-		dirName: "string",
-		disabled: "boolean",
-		inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
-		maxLength: "limited long",
-		name: "string",
-		placeholder: "string",
-		readOnly: "boolean",
-		required: "boolean",
-		rows: {type: "limited unsigned long", defaultVal: 2},
-		wrap: "string",
-	},
-	keygen: {
-		autofocus: "boolean",
-		challenge: "string",
-		disabled: "boolean",
-		// The invalid value default is the "unknown" state, which for our
-		// purposes  seems to be the same as having no invalid value default.
-		// The missing  value default depends on whether "rsa" is implemented,
-		// so we use null,  which is magically reserved for "don't try testing
-		// this", since no one  default is required.  (TODO: we could test that
-		// it's either the RSA  state or the unknown state.)
-		keytype: {type: "enum", keywords: ["rsa"], defaultVal: null},
-		name: "string",
-	},
-	output: {
-		htmlFor: {type: "settable tokenlist", domAttrName: "for" },
-		name: "string",
-	},
-	progress: {
-		max: {type: "limited double", defaultVal: 1.0},
-	},
-	meter: {},
+    // Obsolete
+    align: "string",
+    useMap: "string",
+  },
+  button: {
+    autofocus: "boolean",
+    disabled: "boolean",
+    // TODO: formAction is special
+    // formAction: "url",
+    formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
+    formMethod: {type: "enum", keywords: ["get", "post", "dialog"], invalidVal: "get"},
+    formNoValidate: "boolean",
+    formTarget: "string",
+    name: "string",
+    type: {type: "enum", keywords: ["submit", "reset", "button"], defaultVal: "submit"},
+    value: "string",
+    // TODO: menu
+  },
+  select: {
+    autofocus: "boolean",
+    disabled: "boolean",
+    multiple: "boolean",
+    name: "string",
+    required: "boolean",
+    size: {type: "unsigned long", defaultVal: 0},
+  },
+  datalist: {},
+  optgroup: {
+    disabled: "boolean",
+    label: "string",
+  },
+  option: {
+    disabled: "boolean",
+    label: {type: "string", customGetter: true},
+    defaultSelected: {type: "boolean", domAttrName: "selected"},
+    value: {type: "string", customGetter: true},
+  },
+  textarea: {
+    // TODO: autocomplete is special.
+    // autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
+    autofocus: "boolean",
+    cols: {type: "limited unsigned long", defaultVal: 20},
+    dirName: "string",
+    disabled: "boolean",
+    inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
+    maxLength: "limited long",
+    name: "string",
+    placeholder: "string",
+    readOnly: "boolean",
+    required: "boolean",
+    rows: {type: "limited unsigned long", defaultVal: 2},
+    wrap: "string",
+  },
+  keygen: {
+    autofocus: "boolean",
+    challenge: "string",
+    disabled: "boolean",
+    // The invalid value default is the "unknown" state, which for our
+    // purposes  seems to be the same as having no invalid value default.
+    // The missing  value default depends on whether "rsa" is implemented,
+    // so we use null,  which is magically reserved for "don't try testing
+    // this", since no one  default is required.  (TODO: we could test that
+    // it's either the RSA  state or the unknown state.)
+    keytype: {type: "enum", keywords: ["rsa"], defaultVal: null},
+    name: "string",
+  },
+  output: {
+    htmlFor: {type: "settable tokenlist", domAttrName: "for" },
+    name: "string",
+  },
+  progress: {
+    max: {type: "limited double", defaultVal: 1.0},
+  },
+  meter: {},
 };
 
 mergeElements(formElements);
--- a/testing/web-platform/tests/html/dom/elements-grouping.js
+++ b/testing/web-platform/tests/html/dom/elements-grouping.js
@@ -1,60 +1,60 @@
 // Up-to-date as of 2013-04-08.
 var groupingElements = {
-	p: {
-		// Obsolete
-		align: "string",
-	},
-	hr: {
-		// Obsolete
-		align: "string",
-		color: "string",
-		noShade: "boolean",
-		size: "string",
-		width: "string",
-	},
-	pre: {
-		// Obsolete
-		width: "long",
-	},
-	blockquote: {
-		cite: "url",
-	},
-	ol: {
-		// Conforming
-		reversed: "boolean",
-		// TODO: This should have a default value of the list's length if the
-		// reversed attribute is set.
-		start: {type: "long", defaultVal: 1},
-		type: "string",
+  p: {
+    // Obsolete
+    align: "string",
+  },
+  hr: {
+    // Obsolete
+    align: "string",
+    color: "string",
+    noShade: "boolean",
+    size: "string",
+    width: "string",
+  },
+  pre: {
+    // Obsolete
+    width: "long",
+  },
+  blockquote: {
+    cite: "url",
+  },
+  ol: {
+    // Conforming
+    reversed: "boolean",
+    // TODO: This should have a default value of the list's length if the
+    // reversed attribute is set.
+    start: {type: "long", defaultVal: 1},
+    type: "string",
 
-		// Obsolete
-		compact: "boolean",
-	},
-	ul: {
-		// Obsolete
-		compact: "boolean",
-		type: "string",
-	},
-	li: {
-		// Conforming
-		value: "long",
+    // Obsolete
+    compact: "boolean",
+  },
+  ul: {
+    // Obsolete
+    compact: "boolean",
+    type: "string",
+  },
+  li: {
+    // Conforming
+    value: "long",
 
-		// Obsolete
-		type: "string",
-	},
-	dl: {
-		// Obsolete
-		compact: "boolean",
-	},
-	dt: {},
-	dd: {},
-	figure: {},
-	figcaption: {},
-	main: {},
-	div: {
-		// Obsolete
-		align: "string",
-	},
+    // Obsolete
+    type: "string",
+  },
+  dl: {
+    // Obsolete
+    compact: "boolean",
+  },
+  dt: {},
+  dd: {},
+  figure: {},
+  figcaption: {},
+  main: {},
+  div: {
+    // Obsolete
+    align: "string",
+  },
 };
 
 mergeElements(groupingElements);
--- a/testing/web-platform/tests/html/dom/elements-metadata.js
+++ b/testing/web-platform/tests/html/dom/elements-metadata.js
@@ -1,41 +1,41 @@
 // Up-to-date as of 2013-04-08.
 var metadataElements = {
-	head: {},
-	title: {},
-	base: {
-		// XXX href is weird. href: "url",
-		target: "string",
-	},
-	link: {
-		// Conforming
-		href: "url",
-		crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
-		rel: "string",
-		relList: {type: "tokenlist", domAttrName: "rel"},
-		media: "string",
-		hreflang: "string",
-		type: "string",
-		sizes: "settable tokenlist",
+  head: {},
+  title: {},
+  base: {
+    // XXX href is weird. href: "url",
+    target: "string",
+  },
+  link: {
+    // Conforming
+    href: "url",
+    crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
+    rel: "string",
+    relList: {type: "tokenlist", domAttrName: "rel"},
+    media: "string",
+    hreflang: "string",
+    type: "string",
+    sizes: "settable tokenlist",
 
-		// Obsolete
-		charset: "string",
-		rev: "string",
-		target: "string",
-	},
-	meta: {
-		// Conforming
-		name: "string",
-		httpEquiv: {type: "string", domAttrName: "http-equiv"},
-		content: "string",
+    // Obsolete
+    charset: "string",
+    rev: "string",
+    target: "string",
+  },
+  meta: {
+    // Conforming
+    name: "string",
+    httpEquiv: {type: "string", domAttrName: "http-equiv"},
+    content: "string",
 
-		// Obsolete
-		scheme: "string",
-	},
-	style: {
-		media: "string",
-		type: "string",
-		scoped: "boolean",
-	},
+    // Obsolete
+    scheme: "string",
+  },
+  style: {
+    media: "string",
+    type: "string",
+    scoped: "boolean",
+  },
 };
 
 mergeElements(metadataElements);
--- a/testing/web-platform/tests/html/dom/elements-microdata.js
+++ b/testing/web-platform/tests/html/dom/elements-microdata.js
@@ -1,35 +1,35 @@
 // Up-to-date as of 2013-04-19.
 // Things defined in the W3C's microdata draft, not the main HTML5 draft.
 // Note: must be included last so that it hits all elements.
 
 for (var element in elements) {
-	elements[element].itemScope = "boolean";
-	elements[element].itemType = "settable tokenlist";
-	elements[element].itemId = "url";
-	elements[element].itemRef = "settable tokenlist";
-	elements[element].itemProp = "settable tokenlist";
+  elements[element].itemScope = "boolean";
+  elements[element].itemType = "settable tokenlist";
+  elements[element].itemId = "url";
+  elements[element].itemRef = "settable tokenlist";
+  elements[element].itemProp = "settable tokenlist";
 }
 extraTests.push(function() {
-	// itemValue only reflects in certain circumstances.  The syntax for our big
-	// array thing above doesn't currently support one IDL attribute that reflects
-	// different content attributes, so just do this explicitly until that's fixed.
-	var reflectItemValue = function(data, localName, attribute) {
-		var element = document.createElement(localName);
-		element.setAttribute("itemprop", "");
-		ReflectionTests.reflects(data, "itemValue", element, attribute);
-	}
-	reflectItemValue("string", "meta", "content");
-	reflectItemValue("url", "audio", "src");
-	reflectItemValue("url", "embed", "src");
-	reflectItemValue("url", "iframe", "src");
-	reflectItemValue("url", "img", "src");
-	reflectItemValue("url", "source", "src");
-	reflectItemValue("url", "track", "src");
-	reflectItemValue("url", "video", "src");
-	reflectItemValue("url", "a", "href");
-	reflectItemValue("url", "area", "href");
-	reflectItemValue("url", "link", "href");
-	reflectItemValue("url", "object", "data");
-	reflectItemValue("string", "data", "value");
-	//TODO: time is more complex
+  // itemValue only reflects in certain circumstances.  The syntax for our big
+  // array thing above doesn't currently support one IDL attribute that reflects
+  // different content attributes, so just do this explicitly until that's fixed.
+  var reflectItemValue = function(data, localName, attribute) {
+    var element = document.createElement(localName);
+    element.setAttribute("itemprop", "");
+    ReflectionTests.reflects(data, "itemValue", element, attribute);
+  }
+  reflectItemValue("string", "meta", "content");
+  reflectItemValue("url", "audio", "src");
+  reflectItemValue("url", "embed", "src");
+  reflectItemValue("url", "iframe", "src");
+  reflectItemValue("url", "img", "src");
+  reflectItemValue("url", "source", "src");
+  reflectItemValue("url", "track", "src");
+  reflectItemValue("url", "video", "src");
+  reflectItemValue("url", "a", "href");
+  reflectItemValue("url", "area", "href");
+  reflectItemValue("url", "link", "href");
+  reflectItemValue("url", "object", "data");
+  reflectItemValue("string", "data", "value");
+  //TODO: time is more complex
 });
--- a/testing/web-platform/tests/html/dom/elements-misc.js
+++ b/testing/web-platform/tests/html/dom/elements-misc.js
@@ -1,58 +1,58 @@
 // Up-to-date as of 2013-04-09.
 var miscElements = {
-	// "The root element" section
-	html: {
-		// Obsolete
-		version: "string",
-	},
+  // "The root element" section
+  html: {
+    // Obsolete
+    version: "string",
+  },
 
-	// "Scripting" section
-	script: {
-		src: "url",
-		type: "string",
-		charset: "string",
-		// TODO: async attribute (complicated).
-		defer: "boolean",
-		crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
-	},
-	noscript: {},
+  // "Scripting" section
+  script: {
+    src: "url",
+    type: "string",
+    charset: "string",
+    // TODO: async attribute (complicated).
+    defer: "boolean",
+    crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}},
+  },
+  noscript: {},
 
-	// "Edits" section
-	ins: {
-		cite: "url",
-		dateTime: "string",
-	},
-	del: {
-		cite: "url",
-		dateTime: "string",
-	},
+  // "Edits" section
+  ins: {
+    cite: "url",
+    dateTime: "string",
+  },
+  del: {
+    cite: "url",
+    dateTime: "string",
+  },
 
-	// "Interactive elements" section
-	details: {
-		open: "boolean",
-	},
-	summary: {},
-	menu: {
-		// Conforming
-		//TODO: check that missing value default is popup if parent's type is popup
-		type: {type: "enum", keywords:["popup", "toolbar"], defaultVal: "toolbar"},
-		label: "string",
+  // "Interactive elements" section
+  details: {
+    open: "boolean",
+  },
+  summary: {},
+  menu: {
+    // Conforming
+    //TODO: check that missing value default is popup if parent's type is popup
+    type: {type: "enum", keywords:["popup", "toolbar"], defaultVal: "toolbar"},
+    label: "string",
 
-		// Obsolete
-		compact: "boolean",
-	},
-	menuitem: {
-		type: {type: "enum", keywords: ["command", "checkbox", "radio"], defaultVal: "command"},
-		label: "string",
-		icon: "url",
-		disabled: "boolean",
-		checked: "boolean",
-		radiogroup: "string",
-		"default": "boolean",
-	},
+    // Obsolete
+    compact: "boolean",
+  },
+  menuitem: {
+    type: {type: "enum", keywords: ["command", "checkbox", "radio"], defaultVal: "command"},
+    label: "string",
+    icon: "url",
+    disabled: "boolean",
+    checked: "boolean",
+    radiogroup: "string",
+    "default": "boolean",
+  },
 
-	// Global attributes should exist even on unknown elements
-	undefinedelement: {},
+  // Global attributes should exist even on unknown elements
+  undefinedelement: {},
 };
 
 mergeElements(miscElements);
--- a/testing/web-platform/tests/html/dom/elements-obsolete.js
+++ b/testing/web-platform/tests/html/dom/elements-obsolete.js
@@ -1,52 +1,52 @@
 // Up-to-date as of 2013-04-13.
 var obsoleteElements = {
-	applet: {
-		align: "string",
-		alt: "string",
-		archive: "string",
-		code: "string",
-		codeBase: "url",
-		height: "string",
-		hspace: "unsigned long",
-		name: "string",
-		object: "url",
-		vspace: "unsigned long",
-		width: "string",
-	},
-	marquee: {
-		behavior: "string",
-		bgColor: "string",
-		direction: "string",
-		height: "string",
-		hspace: "unsigned long",
-		scrollAmount: {type: "unsigned long", defaultVal: 6},
-		scrollDelay: {type: "unsigned long", defaultVal: 85},
-		trueSpeed: "boolean",
-		vspace: "unsigned long",
-		width: "string",
-	},
-	frameset: {
-		cols: "string",
-		rows: "string",
-	},
-	frame: {
-		name: "string",
-		scrolling: "string",
-		src: "url",
-		frameBorder: "string",
-		longDesc: "url",
-		noResize: "boolean",
-		marginHeight: {type: "string", treatNullAsEmptyString: true},
-		marginWidth: {type: "string", treatNullAsEmptyString: true},
-	},
-	dir: {
-		compact: "boolean",
-	},
-	font: {
-		color: {type: "string", treatNullAsEmptyString: true},
-		face: "string",
-		size: "string",
-	},
+  applet: {
+    align: "string",
+    alt: "string",
+    archive: "string",
+    code: "string",
+    codeBase: "url",
+    height: "string",
+    hspace: "unsigned long",
+    name: "string",
+    object: "url",
+    vspace: "unsigned long",
+    width: "string",
+  },
+  marquee: {
+    behavior: "string",
+    bgColor: "string",
+    direction: "string",
+    height: "string",
+    hspace: "unsigned long",
+    scrollAmount: {type: "unsigned long", defaultVal: 6},
+    scrollDelay: {type: "unsigned long", defaultVal: 85},
+    trueSpeed: "boolean",
+    vspace: "unsigned long",
+    width: "string",
+  },
+  frameset: {
+    cols: "string",
+    rows: "string",
+  },
+  frame: {
+    name: "string",
+    scrolling: "string",
+    src: "url",
+    frameBorder: "string",
+    longDesc: "url",
+    noResize: "boolean",
+    marginHeight: {type: "string", treatNullAsEmptyString: true},
+    marginWidth: {type: "string", treatNullAsEmptyString: true},
+  },
+  dir: {
+    compact: "boolean",
+  },
+  font: {
+    color: {type: "string", treatNullAsEmptyString: true},
+    face: "string",
+    size: "string",
+  },
 };
 
 mergeElements(obsoleteElements);
--- a/testing/web-platform/tests/html/dom/elements-sections.js
+++ b/testing/web-platform/tests/html/dom/elements-sections.js
@@ -1,63 +1,63 @@
 // Up-to-date as of 2013-04-12.
 var sectionElements = {
-	body: {
-		// Obsolete
-		text: {type: "string", treatNullAsEmptyString: true},
-		link: {type: "string", treatNullAsEmptyString: true},
-		vLink: {type: "string", treatNullAsEmptyString: true},
-		aLink: {type: "string", treatNullAsEmptyString: true},
-		bgColor: {type: "string", treatNullAsEmptyString: true},
-		background: "string",
-	},
-	article: {},
-	section: {},
-	nav: {},
-	aside: {},
-	h1: {
-		// Obsolete
-		align: "string",
-	},
-	h2: {
-		// Obsolete
-		align: "string",
-	},
-	h3: {
-		// Obsolete
-		align: "string",
-	},
-	h4: {
-		// Obsolete
-		align: "string",
-	},
-	h5: {
-		// Obsolete
-		align: "string",
-	},
-	h6: {
-		// Obsolete
-		align: "string",
-	},
-	hgroup: {},
-	header: {},
-	footer: {},
-	address: {},
+  body: {
+    // Obsolete
+    text: {type: "string", treatNullAsEmptyString: true},
+    link: {type: "string", treatNullAsEmptyString: true},
+    vLink: {type: "string", treatNullAsEmptyString: true},
+    aLink: {type: "string", treatNullAsEmptyString: true},
+    bgColor: {type: "string", treatNullAsEmptyString: true},
+    background: "string",
+  },
+  article: {},
+  section: {},
+  nav: {},
+  aside: {},
+  h1: {
+    // Obsolete
+    align: "string",
+  },
+  h2: {
+    // Obsolete
+    align: "string",
+  },
+  h3: {
+    // Obsolete
+    align: "string",
+  },
+  h4: {
+    // Obsolete
+    align: "string",
+  },
+  h5: {
+    // Obsolete
+    align: "string",
+  },
+  h6: {
+    // Obsolete
+    align: "string",
+  },
+  hgroup: {},
+  header: {},
+  footer: {},
+  address: {},
 };
 
 mergeElements(sectionElements);
 
 extraTests.push(function() {
-	ReflectionTests.reflects({type: "enum", keywords: ["ltr", "rtl", "auto"]}, "dir", document, "dir", document.documentElement);
-	// TODO: these behave differently if the body element is a frameset.  Also
-	// should probably test with multiple bodies.
-	ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "fgColor", document, "text", document.body);
-	ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "linkColor", document, "link", document.body);
-	ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "vlinkColor", document, "vlink", document.body);
-	ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "alinkColor", document, "alink", document.body);
-	ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "bgColor", document, "bgcolor", document.body);
-	// Don't mess up the colors :)
-	document.documentElement.removeAttribute("dir");
-	var attrs = ["text", "bgcolor", "link", "alink", "vlink"];
-	for (var i = 0; i < attrs.length; i++) {
-		document.body.removeAttribute(attrs[i]);
-	}
+  ReflectionTests.reflects({type: "enum", keywords: ["ltr", "rtl", "auto"]}, "dir", document, "dir", document.documentElement);
+  // TODO: these behave differently if the body element is a frameset.  Also
+  // should probably test with multiple bodies.
+  ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "fgColor", document, "text", document.body);
+  ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "linkColor", document, "link", document.body);
+  ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "vlinkColor", document, "vlink", document.body);
+  ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "alinkColor", document, "alink", document.body);
+  ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "bgColor", document, "bgcolor", document.body);
+  // Don't mess up the colors :)
+  document.documentElement.removeAttribute("dir");
+  var attrs = ["text", "bgcolor", "link", "alink", "vlink"];
+  for (var i = 0; i < attrs.length; i++) {
+    document.body.removeAttribute(attrs[i]);
+  }
 });
--- a/testing/web-platform/tests/html/dom/elements-tabular.js
+++ b/testing/web-platform/tests/html/dom/elements-tabular.js
@@ -1,120 +1,120 @@
 // Up-to-date as of 2013-04-12.
 var tabularElements = {
-	table: {
-		// Conforming
-		sortable: "boolean",
+  table: {
+    // Conforming
+    sortable: "boolean",
 
-		// Obsolete
-		align: "string",
-		border: "string",
-		frame: "string",
-		rules: "string",
-		summary: "string",
-		width: "string",
-		bgColor: {type: "string", treatNullAsEmptyString: true},
-		cellPadding: {type: "string", treatNullAsEmptyString: true},
-		cellSpacing: {type: "string", treatNullAsEmptyString: true},
-	},
-	caption: {
-		// Obsolete
-		align: "string",
-	},
-	colgroup: {
-		span: "limited unsigned long",
+    // Obsolete
+    align: "string",
+    border: "string",
+    frame: "string",
+    rules: "string",
+    summary: "string",
+    width: "string",
+    bgColor: {type: "string", treatNullAsEmptyString: true},
+    cellPadding: {type: "string", treatNullAsEmptyString: true},
+    cellSpacing: {type: "string", treatNullAsEmptyString: true},
+  },
+  caption: {
+    // Obsolete
+    align: "string",
+  },
+  colgroup: {
+    span: "limited unsigned long",
 
-		// Obsolete
-		align: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		vAlign: "string",
-		width: "string",
-	},
-	col: {
-		// Conforming
-		span: "limited unsigned long",
+    // Obsolete
+    align: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    vAlign: "string",
+    width: "string",
+  },
+  col: {
+    // Conforming
+    span: "limited unsigned long",
 
-		// Obsolete
-		align: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		vAlign: "string",
-		width: "string",
-	},
-	tbody: {
-		// Obsolete
-		align: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		vAlign: "string",
-	},
-	thead: {
-		// Obsolete
-		align: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		vAlign: "string",
-	},
-	tfoot: {
-		// Obsolete
-		align: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		vAlign: "string",
-	},
-	tr: {
-		// Obsolete
-		align: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		vAlign: "string",
-		bgColor: {type: "string", treatNullAsEmptyString: true},
-	},
-	td: {
-		// HTMLTableCellElement (Conforming)
-		colSpan: {type: "unsigned long", defaultVal: 1},
-		rowSpan: {type: "unsigned long", defaultVal: 1},
-		headers: "settable tokenlist",
+    // Obsolete
+    align: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    vAlign: "string",
+    width: "string",
+  },
+  tbody: {
+    // Obsolete
+    align: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    vAlign: "string",
+  },
+  thead: {
+    // Obsolete
+    align: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    vAlign: "string",
+  },
+  tfoot: {
+    // Obsolete
+    align: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    vAlign: "string",
+  },
+  tr: {
+    // Obsolete
+    align: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    vAlign: "string",
+    bgColor: {type: "string", treatNullAsEmptyString: true},
+  },
+  td: {
+    // HTMLTableCellElement (Conforming)
+    colSpan: {type: "unsigned long", defaultVal: 1},
+    rowSpan: {type: "unsigned long", defaultVal: 1},
+    headers: "settable tokenlist",
 
-		// HTMLTableCellElement (Obsolete)
-		align: "string",
-		axis: "string",
-		height: "string",
-		width: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		noWrap: "boolean",
-		vAlign: "string",
-		bgColor: {type: "string", treatNullAsEmptyString: true},
+    // HTMLTableCellElement (Obsolete)
+    align: "string",
+    axis: "string",
+    height: "string",
+    width: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    noWrap: "boolean",
+    vAlign: "string",
+    bgColor: {type: "string", treatNullAsEmptyString: true},
 
-		// HTMLTableDataCellElement (Obsolete)
-		abbr: "string",
-	},
-	th: {
-		// HTMLTableCellElement (Conforming)
-		colSpan: {type: "unsigned long", defaultVal: 1},
-		rowSpan: {type: "unsigned long", defaultVal: 1},
-		headers: "settable tokenlist",
+    // HTMLTableDataCellElement (Obsolete)
+    abbr: "string",
+  },
+  th: {
+    // HTMLTableCellElement (Conforming)
+    colSpan: {type: "unsigned long", defaultVal: 1},
+    rowSpan: {type: "unsigned long", defaultVal: 1},
+    headers: "settable tokenlist",
 
-		// HTMLTableCellElement (Obsolete)
-		align: "string",
-		axis: "string",
-		height: "string",
-		width: "string",
-		ch: {type: "string", domAttrName: "char"},
-		chOff: {type: "string", domAttrName: "charoff"},
-		noWrap: "boolean",
-		vAlign: "string",
-		bgColor: {type: "string", treatNullAsEmptyString: true},
+    // HTMLTableCellElement (Obsolete)
+    align: "string",
+    axis: "string",
+    height: "string",
+    width: "string",
+    ch: {type: "string", domAttrName: "char"},
+    chOff: {type: "string", domAttrName: "charoff"},
+    noWrap: "boolean",
+    vAlign: "string",
+    bgColor: {type: "string", treatNullAsEmptyString: true},
 
-		// HTMLTableHeaderCellElement (Conforming)
-		// TODO: double-check that the way we're treating missing value
-		// defaults is consistent here.  scope has an auto state with no
-		// associated keyword, which is the missing value default -- is this
-		// the right syntax for that?
-		scope: {type: "enum", keywords: ["row", "col", "rowgroup", "colgroup"]},
-		abbr: "string",
-		sorted: "string",
-	},
+    // HTMLTableHeaderCellElement (Conforming)
+    // TODO: double-check that the way we're treating missing value
+    // defaults is consistent here.  scope has an auto state with no
+    // associated keyword, which is the missing value default -- is this
+    // the right syntax for that?
+    scope: {type: "enum", keywords: ["row", "col", "rowgroup", "colgroup"]},
+    abbr: "string",
+    sorted: "string",
+  },
 };
 
 mergeElements(tabularElements);
--- a/testing/web-platform/tests/html/dom/elements-text.js
+++ b/testing/web-platform/tests/html/dom/elements-text.js
@@ -1,64 +1,64 @@
 // Up-to-date as of 2013-04-19.
 var textElements = {
-	a: {
-		// Conforming
-		target: "string",
-		download: "string",
-		ping: "urls",
-		rel: "string",
-		relList: {type: "tokenlist", domAttrName: "rel"},
-		hreflang: "string",
-		type: "string",
+  a: {
+    // Conforming
+    target: "string",
+    download: "string",
+    ping: "urls",
+    rel: "string",
+    relList: {type: "tokenlist", domAttrName: "rel"},
+    hreflang: "string",
+    type: "string",
 
-		// URLUtils
-		href: "url",
+    // URLUtils
+    href: "url",
 
-		// Obsolete
-		coords: "string",
-		charset: "string",
-		name: "string",
-		rev: "string",
-		shape: "string",
-	},
-	em: {},
-	strong: {},
-	small: {},
-	s: {},
-	cite: {},
-	q: {
-		cite: "url",
-	},
-	dfn: {},
-	abbr: {},
-	data: {
-		value: "string",
-	},
-	time: {
-		dateTime: "string",
-	},
-	code: {},
-	// Opera 11.50 doesn't allow unquoted "var" here, although ES5 does and
-	// other browsers support it.
-	"var": {},
-	samp: {},
-	kbd: {},
-	sub: {},
-	sup: {},
-	i: {},
-	b: {},
-	u: {},
-	mark: {},
-	ruby: {},
-	rt: {},
-	rp: {},
-	bdi: {},
-	bdo: {},
-	span: {},
-	br: {
-		// Obsolete
-		clear: "string",
-	},
-	wbr: {},
+    // Obsolete
+    coords: "string",
+    charset: "string",
+    name: "string",
+    rev: "string",
+    shape: "string",
+  },
+  em: {},
+  strong: {},
+  small: {},
+  s: {},
+  cite: {},
+  q: {
+    cite: "url",
+  },
+  dfn: {},
+  abbr: {},
+  data: {
+    value: "string",
+  },
+  time: {
+    dateTime: "string",
+  },
+  code: {},
+  // Opera 11.50 doesn't allow unquoted "var" here, although ES5 does and
+  // other browsers support it.
+  "var": {},
+  samp: {},
+  kbd: {},
+  sub: {},
+  sup: {},
+  i: {},
+  b: {},
+  u: {},
+  mark: {},
+  ruby: {},
+  rt: {},
+  rp: {},
+  bdi: {},
+  bdo: {},
+  span: {},
+  br: {
+    // Obsolete
+    clear: "string",
+  },
+  wbr: {},
 };
 
 mergeElements(textElements);
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-001.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-001.html
@@ -4,18 +4,18 @@
 <meta charset="utf-8"/>
 <title>lang attribute in html tag</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-002.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-002.html
@@ -4,18 +4,18 @@
 <meta charset="utf-8"/>
 <title>xml:lang attribute in html tag</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-003.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-003.html
@@ -4,18 +4,18 @@
 <meta charset="utf-8"/>
 <title>HTTP header</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='http dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-004.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-004.html
@@ -5,18 +5,18 @@
  <meta http-equiv="Content-Language" content="ko" >
 <title>pragma-set default</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-005.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-005.html
@@ -4,18 +4,18 @@
 <meta charset="utf-8"/>
 <title>HTTP header and html lang</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='http dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-006.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-006.html
@@ -5,18 +5,18 @@
  <meta http-equiv="Content-Language" content="ko" >
 <title>HTTP header and meta element</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='http dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-007.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-007.html
@@ -5,18 +5,18 @@
  <meta http-equiv="Content-Language" content="zh" >
 <title>html lang and meta elements</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-008.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-008.html
@@ -4,18 +4,18 @@
 <meta charset="utf-8"/>
 <title>lang="..." vs lang=""</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-009.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-009.html
@@ -4,18 +4,18 @@
 <meta charset="utf-8"/>
 <title>lang="" vs HTTP</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='http dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-010.html
+++ b/testing/web-platform/tests/html/dom/elements/global-attributes/the-lang-attribute-010.html
@@ -5,18 +5,18 @@
  <meta http-equiv="Content-Language" content="ko" >
 <title>lang="" vs meta Content-Language</title>
 <link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'>
 <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-lang-and-xml:lang-attributes'>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <meta name='flags' content='dom'>
 <style type='text/css'>
-		#colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
-		#colonlangcontroltest:lang(xx) { display:none; }
+    #colonlangcontroltest { color: red; font-weight: bold; width: 400px; }
+    #colonlangcontroltest:lang(xx) { display:none; }
 .test div { width: 50px; }
 #box:lang(ko) { width: 100px; }
 </style>
 </head>
 <body>
 
 
 
--- a/testing/web-platform/tests/html/dom/interfaces.html
+++ b/testing/web-platform/tests/html/dom/interfaces.html
@@ -3143,240 +3143,240 @@ partial interface Window {
 
 </script>
 <script>
 "use strict";
 var idlArray;
 var errorVideo; // used to get a MediaError object
 var iframe; // used to get a Document object (can't use `document` because some test clears the page)
 setup(function() {
-	idlArray = new IdlArray();
-	[].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
-		if (node.className == "untested") {
-			idlArray.add_untested_idls(node.textContent);
-		} else {
-			idlArray.add_idls(node.textContent);
-		}
-	});
-	errorVideo = document.createElement('video');
-	errorVideo.src = 'data:,';
-	errorVideo.preload = 'auto';
-	iframe = document.createElement('iframe');
-	iframe.hidden = true;
-	document.body.appendChild(iframe);
+  idlArray = new IdlArray();
+  [].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
+    if (node.className == "untested") {
+      idlArray.add_untested_idls(node.textContent);
+    } else {
+      idlArray.add_idls(node.textContent);
+    }
+  });
+  errorVideo = document.createElement('video');
+  errorVideo.src = 'data:,';
+  errorVideo.preload = 'auto';
+  iframe = document.createElement('iframe');
+  iframe.hidden = true;
+  document.body.appendChild(iframe);
 }, {explicit_done:true});
 window.onload = function() {
-	idlArray.add_objects({
-		NodeList: ['document.getElementsByName("name")'],
-		HTMLAllCollection: ['document.all'],
-		HTMLFormControlsCollection: ['document.createElement("form").elements'],
-		RadioNodeList: [],
-		HTMLOptionsCollection: ['document.createElement("select").options'],
-		HTMLPropertiesCollection: ['document.head.properties'],
-		PropertyNodeList: [],
-		DOMStringMap: ['document.head.dataset'],
-		DOMElementMap: ['document.cssElementMap'],
-		Transferable: [],
-		Document: ['iframe.contentDocument'],
-		XMLDocument: ['document.implementation.createDocument(null, "", null)'],
-		HTMLElement: [
-			'document.createElement("noscript")',
-			'document.createElement("section")',
-			'document.createElement("nav")',
-			'document.createElement("article")',
-			'document.createElement("aside")',
-			'document.createElement("hgroup")',
-			'document.createElement("header")',
-			'document.createElement("footer")',
-			'document.createElement("address")',
-			'document.createElement("dt")',
-			'document.createElement("dd")',
-			'document.createElement("figure")',
-			'document.createElement("figcaption")',
-			'document.createElement("em")',
-			'document.createElement("strong")',
-			'document.createElement("small")',
-			'document.createElement("s")',
-			'document.createElement("cite")',
-			'document.createElement("dfn")',
-			'document.createElement("abbr")',
-			'document.createElement("code")',
-			'document.createElement("var")',
-			'document.createElement("samp")',
-			'document.createElement("kbd")',
-			'document.createElement("sub")',
-			'document.createElement("sup")',
-			'document.createElement("i")',
-			'document.createElement("b")',
-			'document.createElement("u")',
-			'document.createElement("mark")',
-			'document.createElement("ruby")',
-			'document.createElement("rt")',
-			'document.createElement("rp")',
-			'document.createElement("bdi")',
-			'document.createElement("bdo")',
-			'document.createElement("wbr")',
-			'document.createElement("summary")',
-			'document.createElement("acronym")',
-		],
-		HTMLUnknownElement: [
-			'document.createElement("quasit")',
-			'document.createElement("bgsound")',
-			'document.createElement("isindex")',
-			'document.createElement("multicol")',
-			'document.createElement("nextid")',
-			'document.createElement("rb")',
-			'document.createElement("spacer")',
-			'document.createElement("basefont")',
-			'document.createElement("directory")',
-			'document.createElement("mod")',
-		],
-		HTMLHtmlElement: ['document.createElement("html")'],
-		HTMLHeadElement: ['document.createElement("head")'],
-		HTMLTitleElement: ['document.createElement("title")'],
-		HTMLBaseElement: ['document.createElement("base")'],
-		HTMLLinkElement: ['document.createElement("link")'],
-		HTMLMetaElement: ['document.createElement("meta")'],
-		HTMLStyleElement: ['document.createElement("style")'],
-		HTMLScriptElement: ['document.createElement("script")'],
-		HTMLBodyElement: ['document.createElement("body")'],
-		HTMLHeadingElement: [
-			'document.createElement("h1")',
-			'document.createElement("h2")',
-			'document.createElement("h3")',
-			'document.createElement("h4")',
-			'document.createElement("h5")',
-			'document.createElement("h6")',
-		],
-		HTMLParagraphElement: ['document.createElement("p")'],
-		HTMLHRElement: ['document.createElement("hr")'],
-		HTMLPreElement: [
-			'document.createElement("pre")',
-			'document.createElement("listing")',
-			'document.createElement("plaintext")',
-			'document.createElement("xmp")',
-		],
-		HTMLQuoteElement: [
-			'document.createElement("blockquote")',
-			'document.createElement("q")',
-		],
-		HTMLOlistElement: ['document.createElement("ol")'],
-		HTMLUlistElement: ['document.createElement("ul")'],
-		HTMLLIElement: ['document.createElement("li")'],
-		HTMLDlistElement: ['document.createElement("dl")'],
-		HTMLDivElement: ['document.createElement("div")'],
-		HTMLAnchorElement: ['document.createElement("a")'],
-		HTMLDataElement: ['document.createElement("data")'],
-		HTMLTimeElement: ['document.createElement("time")'],
-		HTMLSpanElement: ['document.createElement("span")'],
-		HTMLBRElement: ['document.createElement("br")'],
-		HTMLModElement: [
-			'document.createElement("ins")',
-			'document.createElement("del")',
-		],
-		HTMLPictureElement: ['document.createElement("picture")'],
-		HTMLImageElement: ['document.createElement("img")', 'new Image()'],
-		HTMLIframeElement: ['document.createElement("iframe")'],
-		HTMLEmbedElement: ['document.createElement("embed")'],
-		HTMLObjectElement: ['document.createElement("object")'],
-		HTMLParamElement: ['document.createElement("param")'],
-		HTMLVideoElement: ['document.createElement("video")'],
-		HTMLAudioElement: ['document.createElement("audio")', 'new Audio()'],
-		HTMLSourceElement: ['document.createElement("source")'],
-		HTMLTrackElement: ['document.createElement("track")'],
-		HTMLMediaElement: [],
-		MediaError: ['errorVideo.error'],
-		AudioTrackList: [],
-		AudioTrack: [],
-		VideoTrackList: [],
-		VideoTrack: [],
-		MediaController: ['new MediaController()'],
-		TextTrackList: ['document.createElement("video").textTracks'],
-		TextTrack: ['document.createElement("track").track'],
-		TextTrackCueList: ['document.createElement("video").addTextTrack("subtitles").cues'],
-		TextTrackCue: [],
-		DataCue: [],
-		TimeRanges: ['document.createElement("video").buffered'],
-		TrackEvent: ['new TrackEvent("addtrack"; {track:document.createElement("track").track})'],
-		HTMLCanvasElement: ['document.createElement("canvas")'],
-		CanvasRenderingContext2D: ['document.createElement("canvas").getContext("2d")'],
-		CanvasGradient: [],
-		CanvasPattern: [],
-		TextMetrics: [],
-		ImageData: [],
-		HTMLMapElement: ['document.createElement("map")'],
-		HTMLAreaElement: ['document.createElement("area")'],
-		HTMLTableElement: ['document.createElement("table")'],
-		HTMLTableCaptionElement: ['document.createElement("caption")'],
-		HTMLTableColElement: [
-			'document.createElement("colgroup")',
-			'document.createElement("col")',
-		],
-		HTMLTableSectionElement: [
-			'document.createElement("tbody")',
-			'document.createElement("thead")',
-			'document.createElement("tfoot")',
-		],
-		HTMLTableRowElement: ['document.createElement("tr")'],
-		HTMLTableDataCellElement: ['document.createElement("td")'],
-		HTMLTableHeaderCellElement: ['document.createElement("th")'],
-		HTMLTableCellElement: [],
-		HTMLFormElement: ['document.createElement("form")'],
-		HTMLFieldsetElement: ['document.createElement("fieldset")'],
-		HTMLLegendElement: ['document.createElement("legend")'],
-		HTMLLabelElement: ['document.createElement("label")'],
-		HTMLInputElement: ['document.createElement("input")'],
-		HTMLButtonElement: ['document.createElement("button")'],
-		HTMLSelectElement: ['document.createElement("select")'],
-		HTMLDataListElement: ['document.createElement("datalist")'],
-		HTMLOptGroupElement: ['document.createElement("optgroup")'],
-		HTMLOptionElement: ['document.createElement("option")'],
-		HTMLTextAreaElement: ['document.createElement("textarea")'],
-		HTMLKeygenElement: ['document.createElement("keygen")'],
-		HTMLOutputElement: ['document.createElement("output")'],
-		HTMLProgressElement: ['document.createElement("progress")'],
-		HTMLMeterElement: ['document.createElement("meter")'],
-		ValidityState: ['document.createElement("input").validity'],
-		HTMLDetailsElement: ['document.createElement("details")'],
-		HTMLCommandElement: ['document.createElement("command")'],
-		HTMLMenuElement: ['document.createElement("menu")'],
-		Window: ['window'],
-		BarProp: [],
-		History: ['window.history'],
-		Location: ['window.location'],
-		PopStateEvent: ['new PopStateEvent("popstate", { data: {} })'],
-		HashChangeEvent: [],
-		PageTransitionEvent: [],
-		BeforeUnloadEvent: [],
-		ApplicationCache: ['window.applicationCache'],
-		WindowModal: [],
-		Navigator: ['window.navigator'],
-		External: ['window.external'],
-		DataTransfer: [],
-		DataTransferItemList: [],
-		DataTransferItem: [],
-		DragEvent: [],
-		NavigatorUserMediaError: [],
-		MediaStream: [],
-		LocalMediaStream: [],
-		MediaStreamTrack: [],
-		MediaStreamRecorder: [],
-		PeerConnection: [],
-		MediaStreamEvent: [],
-		ErrorEvent: [],
-		AbstractWorker: [],
-		Worker: [],
-		SharedWorker: [],
-		MessageEvent: [],
-		MessageChannel: [],
-		MessagePort: [],
-		HTMLAppletElement: ['document.createElement("applet")'],
-		HTMLMarqueeElement: ['document.createElement("marquee")'],
-		HTMLFrameSetElement: ['document.createElement("frameset")'],
-		HTMLFrameElement: ['document.createElement("frame")'],
-		HTMLDirectoryElement: ['document.createElement("dir")'],
-		HTMLFontElement: ['document.createElement("font")'],
-	});
-	idlArray.prevent_multiple_testing("HTMLElement");
-	idlArray.test();
-	done();
+  idlArray.add_objects({
+    NodeList: ['document.getElementsByName("name")'],
+    HTMLAllCollection: ['document.all'],
+    HTMLFormControlsCollection: ['document.createElement("form").elements'],
+    RadioNodeList: [],
+    HTMLOptionsCollection: ['document.createElement("select").options'],
+    HTMLPropertiesCollection: ['document.head.properties'],
+    PropertyNodeList: [],
+    DOMStringMap: ['document.head.dataset'],
+    DOMElementMap: ['document.cssElementMap'],
+    Transferable: [],
+    Document: ['iframe.contentDocument'],
+    XMLDocument: ['document.implementation.createDocument(null, "", null)'],
+    HTMLElement: [
+      'document.createElement("noscript")',
+      'document.createElement("section")',
+      'document.createElement("nav")',
+      'document.createElement("article")',
+      'document.createElement("aside")',
+      'document.createElement("hgroup")',
+      'document.createElement("header")',
+      'document.createElement("footer")',
+      'document.createElement("address")',
+      'document.createElement("dt")',
+      'document.createElement("dd")',
+      'document.createElement("figure")',
+      'document.createElement("figcaption")',
+      'document.createElement("em")',
+      'document.createElement("strong")',
+      'document.createElement("small")',
+      'document.createElement("s")',
+      'document.createElement("cite")',
+      'document.createElement("dfn")',
+      'document.createElement("abbr")',
+      'document.createElement("code")',
+      'document.createElement("var")',
+      'document.createElement("samp")',
+      'document.createElement("kbd")',
+      'document.createElement("sub")',
+      'document.createElement("sup")',
+      'document.createElement("i")',
+      'document.createElement("b")',
+      'document.createElement("u")',
+      'document.createElement("mark")',
+      'document.createElement("ruby")',
+      'document.createElement("rt")',
+      'document.createElement("rp")',
+      'document.createElement("bdi")',
+      'document.createElement("bdo")',
+      'document.createElement("wbr")',
+      'document.createElement("summary")',
+      'document.createElement("acronym")',
+    ],
+    HTMLUnknownElement: [
+      'document.createElement("quasit")',
+      'document.createElement("bgsound")',
+      'document.createElement("isindex")',
+      'document.createElement("multicol")',
+      'document.createElement("nextid")',
+      'document.createElement("rb")',
+      'document.createElement("spacer")',
+      'document.createElement("basefont")',
+      'document.createElement("directory")',
+      'document.createElement("mod")',
+    ],
+    HTMLHtmlElement: ['document.createElement("html")'],
+    HTMLHeadElement: ['document.createElement("head")'],
+    HTMLTitleElement: ['document.createElement("title")'],
+    HTMLBaseElement: ['document.createElement("base")'],
+    HTMLLinkElement: ['document.createElement("link")'],
+    HTMLMetaElement: ['document.createElement("meta")'],
+    HTMLStyleElement: ['document.createElement("style")'],
+    HTMLScriptElement: ['document.createElement("script")'],
+    HTMLBodyElement: ['document.createElement("body")'],
+    HTMLHeadingElement: [
+      'document.createElement("h1")',
+      'document.createElement("h2")',
+      'document.createElement("h3")',
+      'document.createElement("h4")',
+      'document.createElement("h5")',
+      'document.createElement("h6")',
+    ],
+    HTMLParagraphElement: ['document.createElement("p")'],
+    HTMLHRElement: ['document.createElement("hr")'],
+    HTMLPreElement: [
+      'document.createElement("pre")',
+      'document.createElement("listing")',
+      'document.createElement("plaintext")',
+      'document.createElement("xmp")',
+    ],
+    HTMLQuoteElement: [
+      'document.createElement("blockquote")',
+      'document.createElement("q")',
+    ],
+    HTMLOlistElement: ['document.createElement("ol")'],
+    HTMLUlistElement: ['document.createElement("ul")'],
+    HTMLLIElement: ['document.createElement("li")'],
+    HTMLDlistElement: ['document.createElement("dl")'],
+    HTMLDivElement: ['document.createElement("div")'],
+    HTMLAnchorElement: ['document.createElement("a")'],
+    HTMLDataElement: ['document.createElement("data")'],
+    HTMLTimeElement: ['document.createElement("time")'],
+    HTMLSpanElement: ['document.createElement("span")'],
+    HTMLBRElement: ['document.createElement("br")'],
+    HTMLModElement: [
+      'document.createElement("ins")',
+      'document.createElement("del")',
+    ],
+    HTMLPictureElement: ['document.createElement("picture")'],
+    HTMLImageElement: ['document.createElement("img")', 'new Image()'],
+    HTMLIframeElement: ['document.createElement("iframe")'],
+    HTMLEmbedElement: ['document.createElement("embed")'],
+    HTMLObjectElement: ['document.createElement("object")'],
+    HTMLParamElement: ['document.createElement("param")'],
+    HTMLVideoElement: ['document.createElement("video")'],
+    HTMLAudioElement: ['document.createElement("audio")', 'new Audio()'],
+    HTMLSourceElement: ['document.createElement("source")'],
+    HTMLTrackElement: ['document.createElement("track")'],
+    HTMLMediaElement: [],
+    MediaError: ['errorVideo.error'],
+    AudioTrackList: [],
+    AudioTrack: [],
+    VideoTrackList: [],
+    VideoTrack: [],
+    MediaController: ['new MediaController()'],
+    TextTrackList: ['document.createElement("video").textTracks'],
+    TextTrack: ['document.createElement("track").track'],
+    TextTrackCueList: ['document.createElement("video").addTextTrack("subtitles").cues'],
+    TextTrackCue: [],
+    DataCue: [],
+    TimeRanges: ['document.createElement("video").buffered'],
+    TrackEvent: ['new TrackEvent("addtrack"; {track:document.createElement("track").track})'],
+    HTMLCanvasElement: ['document.createElement("canvas")'],
+    CanvasRenderingContext2D: ['document.createElement("canvas").getContext("2d")'],
+    CanvasGradient: [],
+    CanvasPattern: [],
+    TextMetrics: [],
+    ImageData: [],
+    HTMLMapElement: ['document.createElement("map")'],
+    HTMLAreaElement: ['document.createElement("area")'],
+    HTMLTableElement: ['document.createElement("table")'],
+    HTMLTableCaptionElement: ['document.createElement("caption")'],
+    HTMLTableColElement: [
+      'document.createElement("colgroup")',
+      'document.createElement("col")',
+    ],
+    HTMLTableSectionElement: [
+      'document.createElement("tbody")',
+      'document.createElement("thead")',
+      'document.createElement("tfoot")',
+    ],
+    HTMLTableRowElement: ['document.createElement("tr")'],
+    HTMLTableDataCellElement: ['document.createElement("td")'],
+    HTMLTableHeaderCellElement: ['document.createElement("th")'],
+    HTMLTableCellElement: [],
+    HTMLFormElement: ['document.createElement("form")'],
+    HTMLFieldsetElement: ['document.createElement("fieldset")'],
+    HTMLLegendElement: ['document.createElement("legend")'],
+    HTMLLabelElement: ['document.createElement("label")'],
+    HTMLInputElement: ['document.createElement("input")'],
+    HTMLButtonElement: ['document.createElement("button")'],
+    HTMLSelectElement: ['document.createElement("select")'],
+    HTMLDataListElement: ['document.createElement("datalist")'],
+    HTMLOptGroupElement: ['document.createElement("optgroup")'],
+    HTMLOptionElement: ['document.createElement("option")'],
+    HTMLTextAreaElement: ['document.createElement("textarea")'],
+    HTMLKeygenElement: ['document.createElement("keygen")'],
+    HTMLOutputElement: ['document.createElement("output")'],
+    HTMLProgressElement: ['document.createElement("progress")'],
+    HTMLMeterElement: ['document.createElement("meter")'],
+    ValidityState: ['document.createElement("input").validity'],
+    HTMLDetailsElement: ['document.createElement("details")'],
+    HTMLCommandElement: ['document.createElement("command")'],
+    HTMLMenuElement: ['document.createElement("menu")'],
+    Window: ['window'],
+    BarProp: [],
+    History: ['window.history'],
+    Location: ['window.location'],
+    PopStateEvent: ['new PopStateEvent("popstate", { data: {} })'],
+    HashChangeEvent: [],
+    PageTransitionEvent: [],
+    BeforeUnloadEvent: [],
+    ApplicationCache: ['window.applicationCache'],
+    WindowModal: [],
+    Navigator: ['window.navigator'],
+    External: ['window.external'],
+    DataTransfer: [],
+    DataTransferItemList: [],
+    DataTransferItem: [],
+    DragEvent: [],
+    NavigatorUserMediaError: [],
+    MediaStream: [],
+    LocalMediaStream: [],
+    MediaStreamTrack: [],
+    MediaStreamRecorder: [],
+    PeerConnection: [],
+    MediaStreamEvent: [],
+    ErrorEvent: [],
+    AbstractWorker: [],
+    Worker: [],
+    SharedWorker: [],
+    MessageEvent: [],
+    MessageChannel: [],
+    MessagePort: [],
+    HTMLAppletElement: ['document.createElement("applet")'],
+    HTMLMarqueeElement: ['document.createElement("marquee")'],
+    HTMLFrameSetElement: ['document.createElement("frameset")'],
+    HTMLFrameElement: ['document.createElement("frame")'],
+    HTMLDirectoryElement: ['document.createElement("dir")'],
+    HTMLFontElement: ['document.createElement("font")'],
+  });
+  idlArray.prevent_multiple_testing("HTMLElement");
+  idlArray.test();
+  done();
 };
 </script>
--- a/testing/web-platform/tests/html/dom/new-harness.js
+++ b/testing/web-platform/tests/html/dom/new-harness.js
@@ -1,22 +1,22 @@
 // We override only the things we need to -- the rest we'll just inherit from
 // original-harness.js.  Polymorphism, kind of.
 ReflectionHarness.catchUnexpectedExceptions = false;
 
 ReflectionHarness.test = function(expected, actual, description) {
-	test(function() {
-		assert_equals(expected, actual);
-	}, this.getTypeDescription() + ": " + description);
-	// This is the test suite that will rate conformance, so we don't want to
-	// bail out early if a test fails -- we want all tests to always run.
-	return true;
+  test(function() {
+    assert_equals(expected, actual);
+  }, this.getTypeDescription() + ": " + description);
+  // This is the test suite that will rate conformance, so we don't want to
+  // bail out early if a test fails -- we want all tests to always run.
+  return true;
 }
 
 ReflectionHarness.run = function(fun, description) {
-	test(fun, this.getTypeDescription() + ": " + description);
+  test(fun, this.getTypeDescription() + ": " + description);
 }
 
 ReflectionHarness.testException = function(exceptionName, fn, description) {
-	test(function() {
-		assert_throws(exceptionName, fn);
-	}, this.getTypeDescription() + ": " + description);
+  test(function() {
+    assert_throws(exceptionName, fn);
+  }, this.getTypeDescription() + ": " + description);
 }
--- a/testing/web-platform/tests/html/dom/original-harness.js
+++ b/testing/web-platform/tests/html/dom/original-harness.js
@@ -15,318 +15,318 @@ ReflectionHarness.catchUnexpectedExcepti
 
 /**
  * Returns a string representing val.  Basically just adds quotes for strings,
  * and passes through other recognized types literally.
  *
  * @public
  */
 ReflectionHarness.stringRep = function(val) {
-	if (val === null) {
-		// typeof is object, so the switch isn't useful
-		return "null";
-	}
-	// In JavaScript, -0 === 0 and String(-0) == "0", so we have to
-	// special-case.
-	if (val === -0 && 1/val === -Infinity) {
-		return "-0";
-	}
-	switch (typeof val) {
-		case "string":
-			for (var i = 0; i < 32; i++) {
-				var replace = "\\";
-				switch (i) {
-					case 0: replace += "0"; break;
-					case 1: replace += "x01"; break;
-					case 2: replace += "x02"; break;
-					case 3: replace += "x03"; break;
-					case 4: replace += "x04"; break;
-					case 5: replace += "x05"; break;
-					case 6: replace += "x06"; break;
-					case 7: replace += "x07"; break;
-					case 8: replace += "b"; break;
-					case 9: replace += "t"; break;
-					case 10: replace += "n"; break;
-					case 11: replace += "v"; break;
-					case 12: replace += "f"; break;
-					case 13: replace += "r"; break;
-					case 14: replace += "x0e"; break;
-					case 15: replace += "x0f"; break;
-					case 16: replace += "x10"; break;
-					case 17: replace += "x11"; break;
-					case 18: replace += "x12"; break;
-					case 19: replace += "x13"; break;
-					case 20: replace += "x14"; break;
-					case 21: replace += "x15"; break;
-					case 22: replace += "x16"; break;
-					case 23: replace += "x17"; break;
-					case 24: replace += "x18"; break;
-					case 25: replace += "x19"; break;
-					case 26: replace += "x1a"; break;
-					case 27: replace += "x1b"; break;
-					case 28: replace += "x1c"; break;
-					case 29: replace += "x1d"; break;
-					case 30: replace += "x1e"; break;
-					case 31: replace += "x1f"; break;
-				}
-				val = val.replace(String.fromCharCode(i), replace);
-			}
-			return '"' + val.replace('"', '\\"') + '"';
-		case "boolean":
-		case "undefined":
-		case "number":
-			return val + "";
-		default:
-			return typeof val + ' "' + val + '"';
-	}
+  if (val === null) {
+    // typeof is object, so the switch isn't useful
+    return "null";
+  }
+  // In JavaScript, -0 === 0 and String(-0) == "0", so we have to
+  // special-case.
+  if (val === -0 && 1/val === -Infinity) {
+    return "-0";
+  }
+  switch (typeof val) {
+    case "string":
+      for (var i = 0; i < 32; i++) {
+        var replace = "\\";
+        switch (i) {
+          case 0: replace += "0"; break;
+          case 1: replace += "x01"; break;
+          case 2: replace += "x02"; break;
+          case 3: replace += "x03"; break;
+          case 4: replace += "x04"; break;
+          case 5: replace += "x05"; break;
+          case 6: replace += "x06"; break;
+          case 7: replace += "x07"; break;
+          case 8: replace += "b"; break;
+          case 9: replace += "t"; break;
+          case 10: replace += "n"; break;
+          case 11: replace += "v"; break;
+          case 12: replace += "f"; break;
+          case 13: replace += "r"; break;
+          case 14: replace += "x0e"; break;
+          case 15: replace += "x0f"; break;
+          case 16: replace += "x10"; break;
+          case 17: replace += "x11"; break;
+          case 18: replace += "x12"; break;
+          case 19: replace += "x13"; break;
+          case 20: replace += "x14"; break;
+          case 21: replace += "x15"; break;
+          case 22: replace += "x16"; break;
+          case 23: replace += "x17"; break;
+          case 24: replace += "x18"; break;
+          case 25: replace += "x19"; break;
+          case 26: replace += "x1a"; break;
+          case 27: replace += "x1b"; break;
+          case 28: replace += "x1c"; break;
+          case 29: replace += "x1d"; break;
+          case 30: replace += "x1e"; break;
+          case 31: replace += "x1f"; break;
+        }
+        val = val.replace(String.fromCharCode(i), replace);
+      }
+      return '"' + val.replace('"', '\\"') + '"';
+    case "boolean":
+    case "undefined":
+    case "number":
+      return val + "";
+    default:
+      return typeof val + ' "' + val + '"';
+  }
 }
 
 /**
  * An object representing info about the current test, used for printing out
  * nice messages and so forth.
  */
 ReflectionHarness.currentTestInfo = {};
 
 /**
  * This is called when we want to test a single element/attribute combination.
  * For the original harness, it does nothing special (just calls the function),
  * but for testharness.js, it can wrap everything in a test() call.
  */
 ReflectionHarness.testWrapper = function(fn) {
-	fn();
+  fn();
 }
 
 /**
  * If question === answer, output a success, else report a failure with the
  * given description.  Currently success and failure both increment counters,
  * and failures output a message to a <ul>.  Which <ul> is decided by the type
  * parameter -- different attribute types are separated for readability.
  *
  * @public
  */
 ReflectionHarness.test = function(expected, actual, description) {
-	// Special-case -0 yay!
-	if (expected === 0 && actual === 0 && 1/expected === 1/actual) {
-		this.increment(this.passed);
-		return true;
-	} else if (expected === actual) {
-		this.increment(this.passed);
-		return true;
-	} else {
-		this.increment(this.failed);
-		this.reportFailure(description + ' (expected ' + this.stringRep(actual) + ', got ' + this.stringRep(expected) + ')');
-		return false;
-	}
+  // Special-case -0 yay!
+  if (expected === 0 && actual === 0 && 1/expected === 1/actual) {
+    this.increment(this.passed);
+    return true;
+  } else if (expected === actual) {
+    this.increment(this.passed);
+    return true;
+  } else {
+    this.increment(this.failed);
+    this.reportFailure(description + ' (expected ' + this.stringRep(actual) + ', got ' + this.stringRep(expected) + ')');
+    return false;
+  }
 }
 
 ReflectionHarness.run = function(fun, description) {
-	try {
-		fun();
-	} catch (err) {
-		ReflectionHarness.failure(description);
-	}
+  try {
+    fun();
+  } catch (err) {
+    ReflectionHarness.failure(description);
+  }
 }
 
 /**
  * If calling fn causes a DOMException of the type given by the string
  * exceptionName (e.g., "INDEX_SIZE_ERR"), output a success.  Otherwise, report
  * a failure with the given description.
  *
  * @public
  */
 ReflectionHarness.testException = function(exceptionName, fn, description) {
-	try {
-		fn();
-	} catch (e) {
-		if (e instanceof DOMException && e.code == DOMException[exceptionName]) {
-			this.increment(this.passed);
-			return true;
-		}
-	}
-	this.increment(this.failed);
-	this.reportFailure(description);
-	return false;
+  try {
+    fn();
+  } catch (e) {
+    if (e instanceof DOMException && e.code == DOMException[exceptionName]) {
+      this.increment(this.passed);
+      return true;
+    }
+  }
+  this.increment(this.failed);
+  this.reportFailure(description);
+  return false;
 }
 
 /**
  * Get a description of the current type, e.g., "a.href".
  */
 ReflectionHarness.getTypeDescription = function() {
-	var domNode = this.currentTestInfo.domObj.tagName.toLowerCase();
-	var idlNode = this.currentTestInfo.idlObj.nodeName.toLowerCase();
-	var domName = this.currentTestInfo.domName;
-	var idlName = this.currentTestInfo.idlName;
-	var comment = this.currentTestInfo.data.comment;
-	var typeDesc = idlNode + "." + idlName;
-	if (!comment && (domNode != idlNode || domName != idlName)) {
-		comment = "<" + domNode + " " + domName + ">";
-	}
-	if (comment) {
-		typeDesc += " (" + comment + ")";
-	}
-	return typeDesc;
+  var domNode = this.currentTestInfo.domObj.tagName.toLowerCase();
+  var idlNode = this.currentTestInfo.idlObj.nodeName.toLowerCase();
+  var domName = this.currentTestInfo.domName;
+  var idlName = this.currentTestInfo.idlName;
+  var comment = this.currentTestInfo.data.comment;
+  var typeDesc = idlNode + "." + idlName;
+  if (!comment && (domNode != idlNode || domName != idlName)) {
+    comment = "<" + domNode + " " + domName + ">";
+  }
+  if (comment) {
+    typeDesc += " (" + comment + ")";
+  }
+  return typeDesc;
 }
 
 /**
  * Report a failure with the given description, adding context from the
  * currentTestInfo member.
  *
  * @private
  */
 ReflectionHarness.reportFailure = function(description) {
-	var typeDesc = this.getTypeDescription();
-	var idlName = this.currentTestInfo.idlName;
-	var comment = this.currentTestInfo.data.comment;
-	typeDesc = typeDesc.replace("&", "&amp;").replace("<", "&lt;");
-	description = description.replace("&", "&amp;").replace("<", "&lt;");
+  var typeDesc = this.getTypeDescription();
+  var idlName = this.currentTestInfo.idlName;
+  var comment = this.currentTestInfo.data.comment;
+  typeDesc = typeDesc.replace("&", "&amp;").replace("<", "&lt;");
+  description = description.replace("&", "&amp;").replace("<", "&lt;");
 
-	var type = this.currentTestInfo.data.type;
+  var type = this.currentTestInfo.data.type;
 
-	// Special case for undefined attributes, which we don't want getting in
-	// the way of everything else.
-	if (description.search('^typeof IDL attribute \\(expected ".*", got "undefined"\\)$') != -1) {
-		type = "undefined";
-	}
+  // Special case for undefined attributes, which we don't want getting in
+  // the way of everything else.
+  if (description.search('^typeof IDL attribute \\(expected ".*", got "undefined"\\)$') != -1) {
+    type = "undefined";
+  }
 
-	var done = false;
-	var ul = document.getElementById("errors-" + type.replace(" ", "-"));
-	if (ul === null) {
-		ul = document.createElement("ul");
-		ul.id = "errors-" + type.replace(" ", "-");
-		var div = document.getElementById("errors");
-		p = document.createElement("p");
-		if (type == "undefined") {
-			div.parentNode.insertBefore(ul, div.nextSibling);
-			p.innerHTML = "These IDL attributes were of undefined type, presumably representing unimplemented features (cordoned off into a separate section for tidiness):";
-		} else {
-			div.appendChild(ul);
-			p.innerHTML = "Errors for type " + type + ":";
-		}
-		ul.parentNode.insertBefore(p, ul);
-	} else if (type != "undefined") {
-		var existingErrors = ul.getElementsByClassName("desc");
-		for (var i = 0; i < existingErrors.length; i++) {
-			if (existingErrors[i].innerHTML == description) {
-				var typeSpan = existingErrors[i].parentNode.getElementsByClassName("type")[0];
-				// Check if we have lots of the same error for the same
-				// attribute.  If so, we want to collapse them -- the exact
-				// elements that exhibit the error aren't going to be important
-				// to report in this case, and it can take a lot of space if
-				// there's an error in a global attribute like dir or id.
-				var types = typeSpan.innerHTML.split(", ");
-				var count = 0;
-				for (var i = 0; i < types.length; i++) {
-					if (types[i].search("^\\([0-9]* elements\\)\\." + idlName + "$") != -1) {
-						types[i] = "(" + (1 + parseInt(/[0-9]+/.exec(types[i])[0])) + " elements)." + idlName;
-						typeSpan.innerHTML = types.join(", ");
-						return;
-					} else if (types[i].search("\\." + idlName + "$") != -1) {
-						count++;
-					}
-				}
-				if (comment || count < 10) {
-					// Just add the extra error to the end, not many duplicates
-					// (or we have a comment)
-					typeSpan.innerHTML += ", " + typeDesc;
-				} else {
-					var filteredTypes = types.filter(function(type) { return type.search("\\." + idlName + "$") == -1; });
-					if (filteredTypes.length) {
-						typeSpan.innerHTML = filteredTypes.join(", ") + ", ";
-					} else {
-						typeSpan.innerHTML = "";
-					}
-					typeSpan.innerHTML += "(" + (types.length - filteredTypes.length) + " elements)." + idlName;
-				}
-				return;
-			}
-		}
-	}
+  var done = false;
+  var ul = document.getElementById("errors-" + type.replace(" ", "-"));
+  if (ul === null) {
+    ul = document.createElement("ul");
+    ul.id = "errors-" + type.replace(" ", "-");
+    var div = document.getElementById("errors");
+    p = document.createElement("p");
+    if (type == "undefined") {
+      div.parentNode.insertBefore(ul, div.nextSibling);
+      p.innerHTML = "These IDL attributes were of undefined type, presumably representing unimplemented features (cordoned off into a separate section for tidiness):";
+    } else {
+      div.appendChild(ul);
+      p.innerHTML = "Errors for type " + type + ":";
+    }
+    ul.parentNode.insertBefore(p, ul);
+  } else if (type != "undefined") {
+    var existingErrors = ul.getElementsByClassName("desc");
+    for (var i = 0; i < existingErrors.length; i++) {
+      if (existingErrors[i].innerHTML == description) {
+        var typeSpan = existingErrors[i].parentNode.getElementsByClassName("type")[0];
+        // Check if we have lots of the same error for the same
+        // attribute.  If so, we want to collapse them -- the exact
+        // elements that exhibit the error aren't going to be important
+        // to report in this case, and it can take a lot of space if
+        // there's an error in a global attribute like dir or id.
+        var types = typeSpan.innerHTML.split(", ");
+        var count = 0;
+        for (var i = 0; i < types.length; i++) {
+          if (types[i].search("^\\([0-9]* elements\\)\\." + idlName + "$") != -1) {
+            types[i] = "(" + (1 + parseInt(/[0-9]+/.exec(types[i])[0])) + " elements)." + idlName;
+            typeSpan.innerHTML = types.join(", ");
+            return;
+          } else if (types[i].search("\\." + idlName + "$") != -1) {
+            count++;
+          }
+        }
+        if (comment || count < 10) {
+          // Just add the extra error to the end, not many duplicates
+          // (or we have a comment)
+          typeSpan.innerHTML += ", " + typeDesc;
+        } else {
+          var filteredTypes = types.filter(function(type) { return type.search("\\." + idlName + "$") == -1; });
+          if (filteredTypes.length) {
+            typeSpan.innerHTML = filteredTypes.join(", ") + ", ";
+          } else {
+            typeSpan.innerHTML = "";
+          }
+          typeSpan.innerHTML += "(" + (types.length - filteredTypes.length) + " elements)." + idlName;
+        }
+        return;
+      }
+    }
+  }
 
-	if (type == "undefined") {
-		ul.innerHTML += "<li>" + typeDesc;
-	} else {
-		ul.innerHTML += "<li><span class=\"type\">" + typeDesc + "</span>: <span class=\"desc\">" + description + "</span>";
-	}
+  if (type == "undefined") {
+    ul.innerHTML += "<li>" + typeDesc;
+  } else {
+    ul.innerHTML += "<li><span class=\"type\">" + typeDesc + "</span>: <span class=\"desc\">" + description + "</span>";
+  }
 }
 
 /**
  * Shorthand function for when we have a failure outside of test().  Generally
  * used when the failure is an exception thrown unexpectedly or such, something
  * not equality-based.
  *
  * @public
  */
 ReflectionHarness.failure = function(message) {
-	this.increment(this.failed);
-	this.reportFailure(message);
+  this.increment(this.failed);
+  this.reportFailure(message);
 }
 
 /**
  * Shorthand function for when we have a success outside of test().  Only
  * called if catchUnexpectedExceptions is true.
  *
  * @public
  */
 ReflectionHarness.success = function() {
-	this.increment(this.passed);
+  this.increment(this.passed);
 }
 
 /**
  * Increment the count in either "passed" or "failed".  el should always be one
  * of those two variables.  The implementation of this function amuses me.
  *
  * @private
  */
 ReflectionHarness.increment = function(el) {
-	el.innerHTML = parseInt(el.innerHTML) + 1;
-	var percent = document.getElementById("percent");
-	var passed = document.getElementById("passed");
-	var failed = document.getElementById("failed");
-	percent.innerHTML = (parseInt(passed.innerHTML)/(parseInt(passed.innerHTML) + parseInt(failed.innerHTML))*100).toPrecision(3);
+  el.innerHTML = parseInt(el.innerHTML) + 1;
+  var percent = document.getElementById("percent");
+  var passed = document.getElementById("passed");
+  var failed = document.getElementById("failed");
+  percent.innerHTML = (parseInt(passed.innerHTML)/(parseInt(passed.innerHTML) + parseInt(failed.innerHTML))*100).toPrecision(3);
 }
 
 /**
  * Hide all displayed errors matching a given regex, so it's easier to filter
  * out repetitive failures.  TODO: Fix this so it works right with the new
  * "lump many errors in one <li>" thing.
  *
  * @private (kind of, only called in the original reflection.html)
  */
 ReflectionHarness.maskErrors = function(regex) {
-	var uls = document.getElementsByTagName("ul");
-	for (var i = 0; i < uls.length; i++) {
-		var lis = uls[i].children;
-		for (var j = 0; j < lis.length; j++) {
-			if (regex !== "" && lis[j].innerHTML.match(regex)) {
-				lis[j].style.display = "none";
-			} else {
-				lis[j].style.display = "list-item";
-			}
-		}
-	}
+  var uls = document.getElementsByTagName("ul");
+  for (var i = 0; i < uls.length; i++) {
+    var lis = uls[i].children;
+    for (var j = 0; j < lis.length; j++) {
+      if (regex !== "" && lis[j].innerHTML.match(regex)) {
+        lis[j].style.display = "none";
+      } else {
+        lis[j].style.display = "list-item";
+      }
+    }
+  }
 }
 
 // Now for some stuff that has nothing to do with ReflectionHarness and
 // everything to do with initialization needed for reflection.js, which seems
 // pointless to put in an extra file.
 
 var elements = {};
 
 var extraTests = [];
 
 /**
  * Used for combining a number of small arrays of element data into one big
  * one.
  */
 function mergeElements(src) {
-	for (var key in src) {
-		if (!src.hasOwnProperty(key)) {
-			// This is inherited from a prototype or something.
-			continue;
-		}
+  for (var key in src) {
+    if (!src.hasOwnProperty(key)) {
+      // This is inherited from a prototype or something.
+      continue;
+    }
 
-		if (key in elements) {
-			elements[key] = elements[key].concat(src[key]);
-		} else {
-			elements[key] = src[key];
-		}
-	}
+    if (key in elements) {
+      elements[key] = elements[key].concat(src[key]);
+    } else {
+      elements[key] = src[key];
+    }
+  }
 }
--- a/testing/web-platform/tests/html/dom/reflection-original.html
+++ b/testing/web-platform/tests/html/dom/reflection-original.html
@@ -1,24 +1,24 @@
 <!doctype html>
 <title>HTML5 reflection tests</title>
 <meta name=timeout content=long>
 <p>This is <em>not</em> the authoritative conformance test suite for
 reflection.  The authoritative tests can be found here, split up into sections:
 
 <ul>
-	<li><a href=reflection-metadata.html>Metadata elements</a>
-	<li><a href=reflection-sections.html>Section elements</a>
-	<li><a href=reflection-grouping.html>Grouping elements</a>
-	<li><a href=reflection-text.html>Text elements</a>
-	<li><a href=reflection-embedded.html>Embedded elements</a>
-	<li><a href=reflection-tabular.html>Tabular elements</a>
-	<li><a href=reflection-forms.html>Form elements</a>
-	<li><a href=reflection-misc.html>Miscellaneous elements</a>
-	<li><a href=reflection-obsolete.html>Obsolete elements</a>
+  <li><a href=reflection-metadata.html>Metadata elements</a>
+  <li><a href=reflection-sections.html>Section elements</a>
+  <li><a href=reflection-grouping.html>Grouping elements</a>
+  <li><a href=reflection-text.html>Text elements</a>
+  <li><a href=reflection-embedded.html>Embedded elements</a>
+  <li><a href=reflection-tabular.html>Tabular elements</a>
+  <li><a href=reflection-forms.html>Form elements</a>
+  <li><a href=reflection-misc.html>Miscellaneous elements</a>
+  <li><a href=reflection-obsolete.html>Obsolete elements</a>
 </ul>
 
 <p>This test suite is provided for implementers' convenience in debugging
 failures.  It groups similar failures in a fashion that should help fix them.
 It is not intended to be suitable for incorporation into automated testing
 frameworks.
 
 <p>Filter out errors matching a regex (operates on HTML not text, you have to manually escape entities): <input oninput="maskErrors(this.value)">
--- a/testing/web-platform/tests/html/dom/reflection.js
+++ b/testing/web-platform/tests/html/dom/reflection.js
@@ -329,17 +329,17 @@ ReflectionTests.typeMap = {
                      "\u20007", "\u20017", "\u20027", "\u20037", "\u20047", "\u20057",
                      "\u20067", "\u20077", "\u20087", "\u20097", "\u200A7", "\u202F7",
                      "\u30007",
                      undefined, 1.5, true, false, {"test": 6}, NaN, +Infinity,
                      -Infinity, "\0",
                      {toString:function() {return 2;}, valueOf: null},
                      {valueOf:function() {return 3;}}],
         "domExpected": function(val) {
-            var parsed = ReflectionTests.parseInt(val + "");
+            var parsed = ReflectionTests.parseInt(String(val));
             if (parsed === false || parsed > maxInt || parsed < minInt) {
                 return null;
             }
             return parsed;
         },
         "idlTests":       [-36, -1, 0, 1, 2147483647, -2147483648],
         "idlDomExpected": [-36, -1, 0, 1, 2147483647, -2147483648]
     },
--- a/testing/web-platform/tests/html/editing/dnd/resources/crossorigin.sub.js
+++ b/testing/web-platform/tests/html/editing/dnd/resources/crossorigin.sub.js
@@ -1,13 +1,13 @@
 var httpHostMain = '{{domains[]}}'; //name of the server that this page must accessed over port 80
 var httpHostAlias = '{{domains[www]}}'; //another hostname (must be a subdomain so document.domain can be set to a higher domain) that accesses the same content, over HTTP
-var httpsHostAlias = httpHostAlias; //another hostname (can be same as httpHostAlias) that accesses the same content, over HTTPS port 
+var httpsHostAlias = httpHostAlias; //another hostname (can be same as httpHostAlias) that accesses the same content, over HTTPS port
 var httpPortAlias = {{ports[http][0]}}; //another port that accesses the same content on the current hostname, over HTTP
 //XXX HTTPS
 //var httpsPortAlias = ports[https][0]; //another port that accesses the same content on the httpsHostAlias, over HTTPS
 var httpsPortAlias = 8443;
 
 function crossOriginUrl(subdomain, relative_url) {
   var a = document.createElement("a");
   a.href = relative_url;
   return a.href.replace(location.href.replace("://", "://" + subdomain + "."));
-}
\ No newline at end of file
+}
--- a/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html
+++ b/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute.html
@@ -1,30 +1,37 @@
 <!doctype html>
 <title>img parse a sizes attribute</title>
+<meta name="timeout" content="long">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id=log></div>
 <iframe data-desc="standards mode" style="width:1000px; height:1000px" src="sizes-iframed.sub.html?doctype=doctype%20html&style="></iframe>
 <iframe data-desc="quirks mode" style="width:1000px; height:1000px" src="sizes-iframed.sub.html?doctype=----&style="></iframe>
 <iframe data-desc="display:none" style="width:1000px; height:1000px" src="sizes-iframed.sub.html?doctype=doctype%20html&style=display:none"></iframe>
 <iframe data-desc="width:1000px" style="width:1000px; height:1000px" src="sizes-iframed.sub.html?doctype=doctype%20html&style=width:1000px%3B%20height:16px"></iframe>
 <script>
 setup({explicit_done:true});
 
 function check(p, iframe) {
   var current = p.firstElementChild;
   var ref_sizes = current.getAttribute('sizes');
   var expect = p.firstElementChild.currentSrc;
+  if (expect) {
+    expect = expect.split('?')[0];
+  }
   while (current = current.nextElementSibling) {
     test(function() {
       if (expect === '' || expect === null || expect === undefined) {
         assert_unreached('ref currentSrc was ' + format_value(expect));
       }
-      assert_equals(current.currentSrc, expect);
+      var got = current.currentSrc;
+      assert_greater_than(got.indexOf('?'), -1, 'expected a "?" in currentSrc');
+      got = got.split('?')[0];
+      assert_equals(got, expect);
     }, current.outerHTML + ' ref sizes=' + format_value(ref_sizes) + ' (' + iframe.getAttribute('data-desc') + ')');
   }
 }
 
 onload = function() {
   [].forEach.call(document.querySelectorAll('iframe'), function(iframe) {
     [].forEach.call(iframe.contentDocument.querySelectorAll('p'), function(p) {
       check(p, iframe);
--- a/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/sizes/sizes-iframed.sub.html
+++ b/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/sizes/sizes-iframed.sub.html
@@ -1,170 +1,170 @@
 <!{{GET[doctype]}}>
 <style> img { {{GET[style]}} } </style>
 <!-- First <img> in a <p> is the reference. The following <img>s should be equivalent -->
 <!-- default is 100vw, not 300px -->
 <p>
-<img srcset='data:,a 300w, data:,b 301w' sizes='100vw'>
-<img srcset='data:,a 300w, data:,b 301w'>
+<img srcset='/images/green-1x1.png?a1 300w, /images/green-16x16.png?a1 301w' sizes='100vw'>
+<img srcset='/images/green-1x1.png?a2 300w, /images/green-16x16.png?a2 301w'>
 <p>
-<img srcset='data:,a 450w, data:,b 451w' sizes='100vw'>
-<img srcset='data:,a 450w, data:,b 451w'>
+<img srcset='/images/green-1x1.png?b1 450w, /images/green-16x16.png?b1 451w' sizes='100vw'>
+<img srcset='/images/green-1x1.png?b2 450w, /images/green-16x16.png?b2 451w'>
 <p>
-<img srcset='data:,a 600w, data:,b 601w' sizes='100vw'>
-<img srcset='data:,a 600w, data:,b 601w'>
+<img srcset='/images/green-1x1.png?c1 600w, /images/green-16x16.png?c1 601w' sizes='100vw'>
+<img srcset='/images/green-1x1.png?c2 600w, /images/green-16x16.png?c2 601w'>
 <p>
-<img srcset='data:,a 900w, data:,b 901w' sizes='100vw'>
-<img srcset='data:,a 900w, data:,b 901w'>
+<img srcset='/images/green-1x1.png?d1 900w, /images/green-16x16.png?d1 901w' sizes='100vw'>
+<img srcset='/images/green-1x1.png?d2 900w, /images/green-16x16.png?d2 901w'>
 
 <p>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='-0'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='+0'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='+1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='.1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1em'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1ex'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1ch'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1rem'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1vw'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1vh'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1vmin'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1vmax'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1cm'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1mm'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1q'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.01in'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1pc'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1pt'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='/* */1px/* */'>
-<img srcset='data:,a 50w, data:,b 51w' sizes=' /**/ /**/ 1px /**/ /**/ '>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(),1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='x(),1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='{},1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='[],1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px,('>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px,x('>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px,{'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px,['>
-<img srcset='data:,a 50w, data:,b 51w' sizes='\(,1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='x\(,1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='\{,1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='\[,1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1\p\x'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='calc(1px)'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) calc(1px)'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:calc(0)) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 1px, 100vw'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 1px, (min-width:0) 100vw, 100vw'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (min-width:0) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:unknown-mf-value) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (min-width:unknown-mf-value) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:-1px) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (min-width:-1px) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(unknown-mf-name) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (unknown-mf-name) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='("unknown-general-enclosed") 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not ("unknown-general-enclosed") 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='unknown-general-enclosed(foo) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not unknown-general-enclosed(foo) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='print 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not print 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='unknown-media-type 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not unknown-media-type 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or (min-width:0) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or (unknown-mf-name) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or (min-width:unknown-mf-value) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or (min-width:-1px) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or ("unknown-general-enclosed") 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or unknown-general-enclosed(foo) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or (!) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) or unknown-media-type 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(123) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (123) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(!) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (!) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='! 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not ! 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(]) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (]) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='] 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not ] 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(}) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (}) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='} 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not } 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes=') 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not ) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(;) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (;) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(.) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not (.) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='; 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='not ; 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes=', 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px,'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 1px,'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='-0e-0px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='+0.11e+01px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.2e1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.3E1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='.4E1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='all 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='all and (min-width:0) 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='min-width:0 100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px, 100vw'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px, (min-width:0) 100vw'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px, foo bar'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 1px, foo bar'>
+<img srcset='/images/green-1x1.png?e1 50w, /images/green-16x16.png?e1 51w' sizes='1px'>
+<img srcset='/images/green-1x1.png?e2 50w, /images/green-16x16.png?e2 51w' sizes='0'>
+<img srcset='/images/green-1x1.png?e3 50w, /images/green-16x16.png?e3 51w' sizes='-0'>
+<img srcset='/images/green-1x1.png?e4 50w, /images/green-16x16.png?e4 51w' sizes='+0'>
+<img srcset='/images/green-1x1.png?e5 50w, /images/green-16x16.png?e5 51w' sizes='+1px'>
+<img srcset='/images/green-1x1.png?e6 50w, /images/green-16x16.png?e6 51w' sizes='.1px'>
+<img srcset='/images/green-1x1.png?e7 50w, /images/green-16x16.png?e7 51w' sizes='0.1em'>
+<img srcset='/images/green-1x1.png?e8 50w, /images/green-16x16.png?e8 51w' sizes='0.1ex'>
+<img srcset='/images/green-1x1.png?e9 50w, /images/green-16x16.png?e9 51w' sizes='0.1ch'>
+<img srcset='/images/green-1x1.png?e10 50w, /images/green-16x16.png?e10 51w' sizes='0.1rem'>
+<img srcset='/images/green-1x1.png?e11 50w, /images/green-16x16.png?e11 51w' sizes='0.1vw'>
+<img srcset='/images/green-1x1.png?e12 50w, /images/green-16x16.png?e12 51w' sizes='0.1vh'>
+<img srcset='/images/green-1x1.png?e13 50w, /images/green-16x16.png?e13 51w' sizes='0.1vmin'>
+<img srcset='/images/green-1x1.png?e14 50w, /images/green-16x16.png?e14 51w' sizes='0.1vmax'>
+<img srcset='/images/green-1x1.png?e15 50w, /images/green-16x16.png?e15 51w' sizes='0.1cm'>
+<img srcset='/images/green-1x1.png?e16 50w, /images/green-16x16.png?e16 51w' sizes='1mm'>
+<img srcset='/images/green-1x1.png?e17 50w, /images/green-16x16.png?e17 51w' sizes='1q'>
+<img srcset='/images/green-1x1.png?e18 50w, /images/green-16x16.png?e18 51w' sizes='0.01in'>
+<img srcset='/images/green-1x1.png?e19 50w, /images/green-16x16.png?e19 51w' sizes='0.1pc'>
+<img srcset='/images/green-1x1.png?e20 50w, /images/green-16x16.png?e20 51w' sizes='0.1pt'>
+<img srcset='/images/green-1x1.png?e21 50w, /images/green-16x16.png?e21 51w' sizes='/* */1px/* */'>
+<img srcset='/images/green-1x1.png?e22 50w, /images/green-16x16.png?e22 51w' sizes=' /**/ /**/ 1px /**/ /**/ '>
+<img srcset='/images/green-1x1.png?e23 50w, /images/green-16x16.png?e23 51w' sizes='(),1px'>
+<img srcset='/images/green-1x1.png?e24 50w, /images/green-16x16.png?e24 51w' sizes='x(),1px'>
+<img srcset='/images/green-1x1.png?e25 50w, /images/green-16x16.png?e25 51w' sizes='{},1px'>
+<img srcset='/images/green-1x1.png?e26 50w, /images/green-16x16.png?e26 51w' sizes='[],1px'>
+<img srcset='/images/green-1x1.png?e27 50w, /images/green-16x16.png?e27 51w' sizes='1px,('>
+<img srcset='/images/green-1x1.png?e28 50w, /images/green-16x16.png?e28 51w' sizes='1px,x('>
+<img srcset='/images/green-1x1.png?e29 50w, /images/green-16x16.png?e29 51w' sizes='1px,{'>
+<img srcset='/images/green-1x1.png?e30 50w, /images/green-16x16.png?e30 51w' sizes='1px,['>
+<img srcset='/images/green-1x1.png?e31 50w, /images/green-16x16.png?e31 51w' sizes='\(,1px'>
+<img srcset='/images/green-1x1.png?e32 50w, /images/green-16x16.png?e32 51w' sizes='x\(,1px'>
+<img srcset='/images/green-1x1.png?e33 50w, /images/green-16x16.png?e33 51w' sizes='\{,1px'>
+<img srcset='/images/green-1x1.png?e34 50w, /images/green-16x16.png?e34 51w' sizes='\[,1px'>
+<img srcset='/images/green-1x1.png?e35 50w, /images/green-16x16.png?e35 51w' sizes='1\p\x'>
+<img srcset='/images/green-1x1.png?e36 50w, /images/green-16x16.png?e36 51w' sizes='calc(1px)'>
+<img srcset='/images/green-1x1.png?e37 50w, /images/green-16x16.png?e37 51w' sizes='(min-width:0) calc(1px)'>
+<img srcset='/images/green-1x1.png?e38 50w, /images/green-16x16.png?e38 51w' sizes='(min-width:calc(0)) 1px'>
+<img srcset='/images/green-1x1.png?e39 50w, /images/green-16x16.png?e39 51w' sizes='(min-width:0) 1px, 100vw'>
+<img srcset='/images/green-1x1.png?e40 50w, /images/green-16x16.png?e40 51w' sizes='(min-width:0) 1px, (min-width:0) 100vw, 100vw'>
+<img srcset='/images/green-1x1.png?e41 50w, /images/green-16x16.png?e41 51w' sizes='(min-width:0) 1px'>
+<img srcset='/images/green-1x1.png?e42 50w, /images/green-16x16.png?e42 51w' sizes='not (min-width:0) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e43 50w, /images/green-16x16.png?e43 51w' sizes='(min-width:unknown-mf-value) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e44 50w, /images/green-16x16.png?e44 51w' sizes='not (min-width:unknown-mf-value) 1px'>
+<img srcset='/images/green-1x1.png?e45 50w, /images/green-16x16.png?e45 51w' sizes='(min-width:-1px) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e46 50w, /images/green-16x16.png?e46 51w' sizes='not (min-width:-1px) 1px'>
+<img srcset='/images/green-1x1.png?e47 50w, /images/green-16x16.png?e47 51w' sizes='(unknown-mf-name) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e48 50w, /images/green-16x16.png?e48 51w' sizes='not (unknown-mf-name) 1px'>
+<img srcset='/images/green-1x1.png?e49 50w, /images/green-16x16.png?e49 51w' sizes='("unknown-general-enclosed") 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e50 50w, /images/green-16x16.png?e50 51w' sizes='not ("unknown-general-enclosed") 1px'>
+<img srcset='/images/green-1x1.png?e51 50w, /images/green-16x16.png?e51 51w' sizes='unknown-general-enclosed(foo) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e52 50w, /images/green-16x16.png?e52 51w' sizes='not unknown-general-enclosed(foo) 1px'>
+<img srcset='/images/green-1x1.png?e53 50w, /images/green-16x16.png?e53 51w' sizes='print 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e54 50w, /images/green-16x16.png?e54 51w' sizes='not print 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e55 50w, /images/green-16x16.png?e55 51w' sizes='unknown-media-type 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e56 50w, /images/green-16x16.png?e56 51w' sizes='not unknown-media-type 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w' sizes='(min-width:0) or (min-width:0) 1px'>
+<img srcset='/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w' sizes='(min-width:0) or (unknown-mf-name) 1px'>
+<img srcset='/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w' sizes='(min-width:0) or (min-width:unknown-mf-value) 1px'>
+<img srcset='/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w' sizes='(min-width:0) or (min-width:-1px) 1px'>
+<img srcset='/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w' sizes='(min-width:0) or ("unknown-general-enclosed") 1px'>
+<img srcset='/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w' sizes='(min-width:0) or unknown-general-enclosed(foo) 1px'>
+<img srcset='/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w' sizes='(min-width:0) or (!) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e64 50w, /images/green-16x16.png?e64 51w' sizes='(min-width:0) or unknown-media-type 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e65 50w, /images/green-16x16.png?e65 51w' sizes='(123) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e66 50w, /images/green-16x16.png?e66 51w' sizes='not (123) 1px'>
+<img srcset='/images/green-1x1.png?e67 50w, /images/green-16x16.png?e67 51w' sizes='(!) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e68 50w, /images/green-16x16.png?e68 51w' sizes='not (!) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e69 50w, /images/green-16x16.png?e69 51w' sizes='! 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e70 50w, /images/green-16x16.png?e70 51w' sizes='not ! 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e71 50w, /images/green-16x16.png?e71 51w' sizes='(]) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e72 50w, /images/green-16x16.png?e72 51w' sizes='not (]) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e73 50w, /images/green-16x16.png?e73 51w' sizes='] 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e74 50w, /images/green-16x16.png?e74 51w' sizes='not ] 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e75 50w, /images/green-16x16.png?e75 51w' sizes='(}) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e76 50w, /images/green-16x16.png?e76 51w' sizes='not (}) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e77 50w, /images/green-16x16.png?e77 51w' sizes='} 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e78 50w, /images/green-16x16.png?e78 51w' sizes='not } 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e79 50w, /images/green-16x16.png?e79 51w' sizes=') 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e80 50w, /images/green-16x16.png?e80 51w' sizes='not ) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e81 50w, /images/green-16x16.png?e81 51w' sizes='(;) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e82 50w, /images/green-16x16.png?e82 51w' sizes='not (;) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e83 50w, /images/green-16x16.png?e83 51w' sizes='(.) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e84 50w, /images/green-16x16.png?e84 51w' sizes='not (.) 1px'>
+<img srcset='/images/green-1x1.png?e85 50w, /images/green-16x16.png?e85 51w' sizes='; 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e86 50w, /images/green-16x16.png?e86 51w' sizes='not ; 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e87 50w, /images/green-16x16.png?e87 51w' sizes=', 1px'>
+<img srcset='/images/green-1x1.png?e88 50w, /images/green-16x16.png?e88 51w' sizes='1px,'>
+<img srcset='/images/green-1x1.png?e89 50w, /images/green-16x16.png?e89 51w' sizes='(min-width:0) 1px,'>
+<img srcset='/images/green-1x1.png?e90 50w, /images/green-16x16.png?e90 51w' sizes='-0e-0px'>
+<img srcset='/images/green-1x1.png?e91 50w, /images/green-16x16.png?e91 51w' sizes='+0.11e+01px'>
+<img srcset='/images/green-1x1.png?e92 50w, /images/green-16x16.png?e92 51w' sizes='0.2e1px'>
+<img srcset='/images/green-1x1.png?e93 50w, /images/green-16x16.png?e93 51w' sizes='0.3E1px'>
+<img srcset='/images/green-1x1.png?e94 50w, /images/green-16x16.png?e94 51w' sizes='.4E1px'>
+<img srcset='/images/green-1x1.png?e95 50w, /images/green-16x16.png?e95 51w' sizes='all 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e96 50w, /images/green-16x16.png?e96 51w' sizes='all and (min-width:0) 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e97 50w, /images/green-16x16.png?e97 51w' sizes='min-width:0 100vw, 1px'>
+<img srcset='/images/green-1x1.png?e98 50w, /images/green-16x16.png?e98 51w' sizes='1px, 100vw'>
+<img srcset='/images/green-1x1.png?e99 50w, /images/green-16x16.png?e99 51w' sizes='1px, (min-width:0) 100vw'>
+<img srcset='/images/green-1x1.png?e100 50w, /images/green-16x16.png?e100 51w' sizes='1px, foo bar'>
+<img srcset='/images/green-1x1.png?e101 50w, /images/green-16x16.png?e101 51w' sizes='(min-width:0) 1px, foo bar'>
 
 <p>
-<img srcset='data:,a 50w, data:,b 51w' sizes='100vw'>
-<img srcset='data:,a 50w, data:,b 51w' sizes=''>
-<img srcset='data:,a 50w, data:,b 51w' sizes=','>
-<img srcset='data:,a 50w, data:,b 51w' sizes='-1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1%'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1deg'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1grad'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1rad'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1turn'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1s'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1ms'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1Hz'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1kHz'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1dpi'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1dpcm'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='0.1dppx'>
-<img srcset='data:,a 50w, data:,b 51w' data-foo='1px' sizes='attr(data-foo, length, 1px)'>
-<img srcset='data:,a 50w, data:,b 51w' data-foo='1' sizes='attr(data-foo, px, 1px)'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='toggle(1px)'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='inherit'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='auto'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='initial'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='unset'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='default'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1/* */px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1p/* */x'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='-/**/0'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='((),1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='x(x(),1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='{{},1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='[[],1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1px !important'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='\1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='all 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='all and (min-width:0) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='min-width:0 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='100vw, 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='100vw, (min-width:0) 1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='foo bar'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='foo-bar'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 1px foo bar'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 0.1%'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) 1'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='-1e0px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='1e1.5px'>
-<img srcset='data:,a 50w, data:,b 51w' style='--foo: 1px' sizes='var(--foo)'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='calc(1px'>
-<img srcset='data:,a 50w, data:,b 51w' sizes='(min-width:0) calc(1px'>
+<img srcset='/images/green-1x1.png?f1 50w, /images/green-16x16.png?f1 51w' sizes='100vw'>
+<img srcset='/images/green-1x1.png?f2 50w, /images/green-16x16.png?f2 51w' sizes=''>
+<img srcset='/images/green-1x1.png?f3 50w, /images/green-16x16.png?f3 51w' sizes=','>
+<img srcset='/images/green-1x1.png?f4 50w, /images/green-16x16.png?f4 51w' sizes='-1px'>
+<img srcset='/images/green-1x1.png?f5 50w, /images/green-16x16.png?f5 51w' sizes='1'>
+<img srcset='/images/green-1x1.png?f6 50w, /images/green-16x16.png?f6 51w' sizes='0.1%'>
+<img srcset='/images/green-1x1.png?f7 50w, /images/green-16x16.png?f7 51w' sizes='0.1deg'>
+<img srcset='/images/green-1x1.png?f8 50w, /images/green-16x16.png?f8 51w' sizes='0.1grad'>
+<img srcset='/images/green-1x1.png?f9 50w, /images/green-16x16.png?f9 51w' sizes='0.1rad'>
+<img srcset='/images/green-1x1.png?f10 50w, /images/green-16x16.png?f10 51w' sizes='0.1turn'>
+<img srcset='/images/green-1x1.png?f11 50w, /images/green-16x16.png?f11 51w' sizes='0.1s'>
+<img srcset='/images/green-1x1.png?f12 50w, /images/green-16x16.png?f12 51w' sizes='0.1ms'>
+<img srcset='/images/green-1x1.png?f13 50w, /images/green-16x16.png?f13 51w' sizes='0.1Hz'>
+<img srcset='/images/green-1x1.png?f14 50w, /images/green-16x16.png?f14 51w' sizes='0.1kHz'>
+<img srcset='/images/green-1x1.png?f15 50w, /images/green-16x16.png?f15 51w' sizes='0.1dpi'>
+<img srcset='/images/green-1x1.png?f16 50w, /images/green-16x16.png?f16 51w' sizes='0.1dpcm'>
+<img srcset='/images/green-1x1.png?f17 50w, /images/green-16x16.png?f17 51w' sizes='0.1dppx'>
+<img srcset='/images/green-1x1.png?f18 50w, /images/green-16x16.png?f18 51w' data-foo='1px' sizes='attr(data-foo, length, 1px)'>
+<img srcset='/images/green-1x1.png?f19 50w, /images/green-16x16.png?f19 51w' data-foo='1' sizes='attr(data-foo, px, 1px)'>
+<img srcset='/images/green-1x1.png?f20 50w, /images/green-16x16.png?f20 51w' sizes='toggle(1px)'>
+<img srcset='/images/green-1x1.png?f21 50w, /images/green-16x16.png?f21 51w' sizes='inherit'>
+<img srcset='/images/green-1x1.png?f22 50w, /images/green-16x16.png?f22 51w' sizes='auto'>
+<img srcset='/images/green-1x1.png?f23 50w, /images/green-16x16.png?f23 51w' sizes='initial'>
+<img srcset='/images/green-1x1.png?f24 50w, /images/green-16x16.png?f24 51w' sizes='unset'>
+<img srcset='/images/green-1x1.png?f25 50w, /images/green-16x16.png?f25 51w' sizes='default'>
+<img srcset='/images/green-1x1.png?f26 50w, /images/green-16x16.png?f26 51w' sizes='1/* */px'>
+<img srcset='/images/green-1x1.png?f27 50w, /images/green-16x16.png?f27 51w' sizes='1p/* */x'>
+<img srcset='/images/green-1x1.png?f28 50w, /images/green-16x16.png?f28 51w' sizes='-/**/0'>
+<img srcset='/images/green-1x1.png?f29 50w, /images/green-16x16.png?f29 51w' sizes='((),1px'>
+<img srcset='/images/green-1x1.png?f30 50w, /images/green-16x16.png?f30 51w' sizes='x(x(),1px'>
+<img srcset='/images/green-1x1.png?f31 50w, /images/green-16x16.png?f31 51w' sizes='{{},1px'>
+<img srcset='/images/green-1x1.png?f32 50w, /images/green-16x16.png?f32 51w' sizes='[[],1px'>
+<img srcset='/images/green-1x1.png?f33 50w, /images/green-16x16.png?f33 51w' sizes='1px !important'>
+<img srcset='/images/green-1x1.png?f34 50w, /images/green-16x16.png?f34 51w' sizes='\1px'>
+<img srcset='/images/green-1x1.png?f35 50w, /images/green-16x16.png?f35 51w' sizes='all 1px'>
+<img srcset='/images/green-1x1.png?f36 50w, /images/green-16x16.png?f36 51w' sizes='all and (min-width:0) 1px'>
+<img srcset='/images/green-1x1.png?f37 50w, /images/green-16x16.png?f37 51w' sizes='min-width:0 1px'>
+<img srcset='/images/green-1x1.png?f38 50w, /images/green-16x16.png?f38 51w' sizes='100vw, 1px'>
+<img srcset='/images/green-1x1.png?f39 50w, /images/green-16x16.png?f39 51w' sizes='100vw, (min-width:0) 1px'>
+<img srcset='/images/green-1x1.png?f40 50w, /images/green-16x16.png?f40 51w' sizes='foo bar'>
+<img srcset='/images/green-1x1.png?f41 50w, /images/green-16x16.png?f41 51w' sizes='foo-bar'>
+<img srcset='/images/green-1x1.png?f42 50w, /images/green-16x16.png?f42 51w' sizes='(min-width:0) 1px foo bar'>
+<img srcset='/images/green-1x1.png?f43 50w, /images/green-16x16.png?f43 51w' sizes='(min-width:0) 0.1%'>
+<img srcset='/images/green-1x1.png?f44 50w, /images/green-16x16.png?f44 51w' sizes='(min-width:0) 1'>
+<img srcset='/images/green-1x1.png?f45 50w, /images/green-16x16.png?f45 51w' sizes='-1e0px'>
+<img srcset='/images/green-1x1.png?f46 50w, /images/green-16x16.png?f46 51w' sizes='1e1.5px'>
+<img srcset='/images/green-1x1.png?f47 50w, /images/green-16x16.png?f47 51w' style='--foo: 1px' sizes='var(--foo)'>
+<img srcset='/images/green-1x1.png?f48 50w, /images/green-16x16.png?f48 51w' sizes='calc(1px'>
+<img srcset='/images/green-1x1.png?f49 50w, /images/green-16x16.png?f49 51w' sizes='(min-width:0) calc(1px'>
rename from testing/web-platform/tests/html/semantics/grouping-content/the-li-element/grouping-li-novalue-MANUAL.html
rename to testing/web-platform/tests/html/semantics/grouping-content/the-li-element/grouping-li-novalue-manual.html
copy from testing/web-platform/tests/XMLHttpRequest/send-entity-body-none.htm
copy to testing/web-platform/tests/html/semantics/interactive-elements/the-details-element/details.html
--- a/testing/web-platform/tests/XMLHttpRequest/send-entity-body-none.htm
+++ b/testing/web-platform/tests/html/semantics/interactive-elements/the-details-element/details.html
@@ -1,22 +1,47 @@
 <!doctype html>
 <html>
   <head>
-    <title>XMLHttpRequest: send(null) - no entity body</title>
+    <title>HTML details element API</title>
+    <style>#one, #two { visibility: hidden; }</style>
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
-    <link rel="help" href="https://xhr.spec.whatwg.org/#the-send()-method" data-tested-assertations="following::ol[1]/li[4] following::ol[1]/li[7]" />
   </head>
   <body>
     <div id="log"></div>
-    <script>
-      test(function() {
-        var client = new XMLHttpRequest()
-        client.open("POST", "resources/content.py", false)
-        client.upload.onloadstart = function(){assert_unreached('this event should not fire for null')}
-        client.send(null)
-        assert_equals(client.getResponseHeader("x-request-content-length"), "0")
-        assert_equals(client.getResponseHeader("x-request-content-type"), "NO")
-      })
+
+    <!-- Used in parsing tests -->
+    <div id='one'><details></details><details></details></div>
+    <div id='two'><p><details></details></div>
+
+    <script type="text/javascript">
+
+function makeDetails () {
+  return document.createElement('details');
+}
+
+
+// <details>
+test(function () {
+  var times = document.getElementById('one').getElementsByTagName('details');
+  assert_equals( times.length, 2 );
+}, 'HTML parsing should locate 2 details elements in this document');
+
+test(function () {
+  assert_equals( document.getElementById('two').getElementsByTagName('p')[0].innerHTML, '' );
+}, 'HTML parsing should close an unclosed <p> before <details>');
+
+test(function () {
+  assert_true( !!window.HTMLDetailsElement );
+}, 'HTMLDetailsElement should be exposed for prototyping');
+
+test(function () {
+  assert_true( makeDetails() instanceof window.HTMLDetailsElement);
+}, 'a dynamically created details element should be instanceof HTMLDetailsElement');
+
+test(function () {
+  assert_true( document.getElementById('one').getElementsByTagName('details')[0] instanceof window.HTMLDetailsElement);
+}, 'a details element from the parser should be instanceof HTMLDetailsElement');
     </script>
+
   </body>
 </html>
--- a/testing/web-platform/tests/html/semantics/scripting-1/the-script-element/script-before-after-events.html
+++ b/testing/web-platform/tests/html/semantics/scripting-1/the-script-element/script-before-after-events.html
@@ -3,16 +3,17 @@
 <title>script beforescriptexecute/afterscriptexecute events</title>
 <link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org">
 <link rel=help href="https://html.spec.whatwg.org/multipage/#the-script-element">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
 <script>
   var t1 = async_test("'beforescriptexecute'/'afterscriptexecute' events have been fired"),
+      t2 = async_test("default prevented 'beforescriptexecute' event aborts script execution"),
       a = false,
       b = false;
 
   var before = function(e) {
     b = true;
     test(function(){
       assert_true(e.isTrusted);
       assert_true(e.bubbles);
@@ -24,15 +25,31 @@
     a = true;
     test(function(){
       assert_true(e.isTrusted);
       assert_true(e.bubbles);
       assert_false(e.cancelable);
     }, "'afterscriptexecute' event is trusted, bubbles and isn't cancelable");
   };
 
-  document.body.onload = t1.step_func_done(function(){
-    assert_true(a && b);
-  });
+  var prevent_default = function(e) {
+    t2.step(function() {
+      e.preventDefault();
+      assert_true(e.defaultPrevented);
+    });
+  };
+
+  document.body.onload = function() {
+    t1.step(function() {
+      assert_true(a && b);
+    });
+    t1.done();
+    t2.done();
+  };
 </script>
 <script onbeforescriptexecute=before(event) onafterscriptexecute=after(event)>
   document.querySelector("script");
 </script>
+<script onbeforescriptexecute=prevent_default(event)>
+  t2.step(function() {
+    assert_unreached("script execution not aborted by default prevented 'beforescriptexecute' event");
+  });
+</script>
--- a/testing/web-platform/tests/html/semantics/scripting-1/the-script-element/script-for-event.html
+++ b/testing/web-platform/tests/html/semantics/scripting-1/the-script-element/script-for-event.html
@@ -1,16 +1,37 @@
 <!DOCTYPE html>
 <title>Scripts with for and event attributes</title>
+<link rel="author" title="Matheus Kerschbaum" href="mailto:matjk7@gmail.com">
 <link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#prepare-a-script">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="log"></div>
 <script>
-var run = [false, false, false, false, false, false, false, false, false, false, false, false];
+var expected = [
+  false,
+  false,
+  false,
+  false,
+  false,
+  false,
+  false,
+  false,
+  false,
+  false,
+  false,
+  false,
+  true,
+  true,
+  false,
+  true,
+  true,
+];
+var run = expected.map(function() { return false });
 </script>
 <script for="w&#x130;ndow" event="onload">
 run[0] = true;
 </script>
 <script for="window" event="onload x">
 run[1] = true;
 </script>
 <script for="window" event="onload(x">
@@ -38,17 +59,35 @@ run[8] = true;
 run[9] = true;
 </script>
 <script for="window" event="&#xa0;onload">
 run[10] = true;
 </script>
 <script for="window" event="onload&#xa0;">
 run[11] = true;
 </script>
+<script for=" window " event=" onload ">
+run[12] = true;
+</script>
+<script for=" window " event=" onload() ">
+run[13] = true;
+</script>
+<script for="object" event="handler">
+run[14] = true;
+</script>
+<script event="handler">
+run[15] = true;
+</script>
+<script for="object">
+run[16] = true;
+</script>
 <script>
 test(function() {
   for (var i = 0; i < run.length; ++i) {
     test(function() {
-      assert_false(run[i]);
+      var script = document.querySelectorAll("script[for], script[event]")[i];
+      assert_equals(run[i], expected[i],
+                    "script for=" + format_value(script.getAttribute("for")) +
+                    " event=" + format_value(script.getAttribute("event")));
     }, "Script " + i);
   }
 });
 </script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_adoption01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_adoption01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_adoption01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_adoption02.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_adoption02.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_adoption02.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_comments01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_comments01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_comments01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_doctype01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_doctype01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_doctype01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_domjs-unsafe.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_domjs-unsafe.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_domjs-unsafe.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_entities01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_entities01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_entities01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_entities02.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_entities02.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_entities02.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_html5test-com.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_html5test-com.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_html5test-com.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_inbody01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_inbody01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_inbody01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_isindex.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_isindex.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_isindex.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_main-element.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_main-element.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_main-element.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_pending-spec-changes-plain-text-unsafe.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_pending-spec-changes-plain-text-unsafe.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_pending-spec-changes-plain-text-unsafe.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_pending-spec-changes.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_pending-spec-changes.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_pending-spec-changes.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_plain-text-unsafe.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_plain-text-unsafe.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_plain-text-unsafe.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_scriptdata01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_scriptdata01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_scriptdata01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_adoption01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_adoption01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_scripted_adoption01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_ark.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_ark.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_scripted_ark.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_webkit01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_scripted_webkit01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_scripted_webkit01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tables01.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tables01.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tables01.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_template.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_template.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_template.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tests1.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tests1.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tests1.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tests10.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tests10.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tests10.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tests11.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tests11.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tests11.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tests12.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tests12.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tests12.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tests14.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tests14.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tests14.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tests15.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tests15.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tests15.html</title>
     <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
   </head>
   <body>
     <h1>html5lib Parser Test</h1>
     <div id="log"></div>
     <script src="common.js"></script>
     <script src="test.js"></script>
     <script src="template.js"></script>
     <script src="/resources/testharness.js"></script>
--- a/testing/web-platform/tests/html/syntax/parsing/html5lib_tests16.html
+++ b/testing/web-platform/tests/html/syntax/parsing/html5lib_tests16.html
@@ -1,14 +1,17 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf8">
     <title>HTML 5 Parser tests html5lib_tests16.html</title>
     <meta name="timeout" content="long"></