<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[211930] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/211930">211930</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2017-02-08 21:52:02 -0800 (Wed, 08 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Update web-platform-tests resources
https://bugs.webkit.org/show_bug.cgi?id=168026

Reviewed by Youenn Fablet.

LayoutTests/imported/w3c:

* resources/web-platform-tests-modules.json:
* resources/web-platform-tests-modules/darobin/webidl2.js/archive/bd216bcd5596d60734450adc938155deab1e1a80.tar.gz: Removed.
* resources/web-platform-tests-modules/dontcallmedom/widlproc/archive/4ef8dde69c0ba3d0167bccfa2775eea7f0d6c7fe.tar.gz: Removed.
* resources/web-platform-tests-modules/w3c/testharness.js/archive/873f9680aff66553f84d38f21a038c4534cc2789.tar.gz: Removed.
* web-platform-tests/.gitignore:
* web-platform-tests/XMLHttpRequest/interfaces-expected.txt:
* web-platform-tests/dom/interfaces-expected.txt:
* web-platform-tests/fetch/api/headers/headers-idl-expected.txt:
* web-platform-tests/html/dom/interfaces-expected.txt:
* web-platform-tests/html/webappapis/animation-frames/idlharness-expected.txt:
* web-platform-tests/resources/LICENSE: Added.
* web-platform-tests/resources/idlharness.js: Added.
(constValue):
(minOverloadLength):
(throwOrReject):
(awaitNCallbacks):
(return.fround):
(fround):
(self.IdlArray):
(IdlArray.prototype.add_idls):
(IdlArray.prototype.add_untested_idls):
(IdlArray.prototype.internal_add_idls):
(IdlArray.prototype.add_objects):
(IdlArray.prototype.prevent_multiple_testing):
(IdlArray.prototype.recursively_get_implements):
(exposed_in):
(IdlArray.prototype.test):
(IdlArray.prototype.assert_type_is):
(IdlObject):
(IdlObject.prototype.test):
(IdlObject.prototype.has_extended_attribute):
(IdlInterface):
(IdlInterface.prototype.is_callback):
(IdlInterface.prototype.has_constants):
(IdlInterface.prototype.is_global):
(IdlInterface.prototype.test):
(IdlInterface.prototype.test_self):
(IdlInterface.prototype.test_member_const):
(IdlInterface.prototype.test_member_attribute):
(IdlInterface.prototype.test_member_operation):
(IdlInterface.prototype.do_member_operation_asserts):
(IdlInterface.prototype.add_iterable_members):
(IdlInterface.prototype.test_member_iterable):
(IdlInterface.prototype.test_member_stringifier):
(IdlInterface.prototype.test_members):
(IdlInterface.prototype.test_object):
(IdlInterface.prototype.test_primary_interface_of):
(IdlInterface.prototype.test_interface_of):
(IdlInterface.prototype.has_stringifier):
(IdlInterface.prototype.do_interface_attribute_asserts):
(IdlInterfaceMember):
(create_suitable_object):
(IdlEnum):
(IdlTypedef):
* web-platform-tests/resources/readme.md: Added.
* web-platform-tests/resources/testharness.js: Added.
(WindowTestEnvironment):
(WindowTestEnvironment.prototype._dispatch):
(WindowTestEnvironment.prototype._forEach_windows):
(WindowTestEnvironment.prototype.on_tests_ready):
(WindowTestEnvironment.prototype.setup_messages):
(WindowTestEnvironment.prototype.next_default_test_name):
(WindowTestEnvironment.prototype.on_new_harness_properties):
(WindowTestEnvironment.prototype.add_on_loaded_callback):
(WindowTestEnvironment.prototype.test_timeout):
(WindowTestEnvironment.prototype.global_scope):
(WorkerTestEnvironment):
(WorkerTestEnvironment.prototype._dispatch):
(WorkerTestEnvironment.prototype._add_message_port):
(WorkerTestEnvironment.prototype.next_default_test_name):
(WorkerTestEnvironment.prototype.on_new_harness_properties):
(WorkerTestEnvironment.prototype.on_tests_ready):
(WorkerTestEnvironment.prototype.add_on_loaded_callback):
(WorkerTestEnvironment.prototype.test_timeout):
(WorkerTestEnvironment.prototype.global_scope):
(DedicatedWorkerTestEnvironment):
(DedicatedWorkerTestEnvironment.prototype.on_tests_ready):
(SharedWorkerTestEnvironment):
(SharedWorkerTestEnvironment.prototype.on_tests_ready):
(ServiceWorkerTestEnvironment):
(ServiceWorkerTestEnvironment.prototype.add_on_loaded_callback):
(create_test_environment):
(is_shared_worker):
(is_service_worker):
(test):
(async_test):
(promise_test):
(this.wait_for):
(EventWatcher):
(setup):
(done):
(generate_tests):
(step_timeout):
(truncate):
(is_node):
(format_value):
* web-platform-tests/resources/webidl2/LICENSE: Added.
* web-platform-tests/resources/webidl2/README.md: Added.
* web-platform-tests/resources/webidl2/lib/webidl2.js: Added.
(tokenise):
(WebIDLParseError):
(WebIDLParseError.prototype.toString):
(error):
(consume):
(ws):
(all_ws):
(integer_type):
(float_type):
(primitive_type):
(const_value):
(type_suffix):
(single_type):
(union_type):
(type):
(argument):
(argument_list):
(type_pair):
(simple_extended_attr):
(extended_attrs):
(default_):
(const_):
(inheritance):
(operation_rest):
(callback):
(attribute):
(return_type):
(operation):
(identifiers):
(serialiser):
(iterable_type):
(readonly_iterable_type):
(iterable):
(interface_):
(partial):
(dictionary):
(exception):
(enum_):
(parse):
* web-platform-tests/resources/webidl2/lib/writer.js: Added.
(noop):
(literal):
(wsPea):
(wsTPea):
(lineComment):
(multilineComment):
(type):
(const_value):
(argument):
(args):
(make_ext_at):
(extended_attributes):
(operation):
(attribute):
(interface_):
(dictionary):
(field):
(exception):
(const_):
(typedef):
(implements_):
(callback):
(enum_):
(dispatch):
(iterate):
(write):
(obj.write):
* web-platform-tests/url/interfaces-expected.txt:

Tools:

Stop copying testharness.js from resources/ to web-platform-tests/resources.

* Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:
(WebPlatformTestServer._copy_webkit_test_files):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cresourceswebplatformtestsmodulesjson">trunk/LayoutTests/imported/w3c/resources/web-platform-tests-modules.json</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsgitignore">trunk/LayoutTests/imported/w3c/web-platform-tests/.gitignore</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestinterfacesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/interfaces-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestopenurlmultiwindow2expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/open-url-multi-window-2-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestoverridemimetypeinvalidmimetypeexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/overridemimetype-invalid-mime-type-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestresponsetypeexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsetype-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestresponsexmldocumentpropertiesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsexml-document-properties-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsendentitybodydocumentexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-entity-body-document-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsendnetworkerrorsynceventssubexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsendredirectpostuploadexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-redirect-post-upload-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsetrequestheaderbogusnameexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-name-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsetrequestheaderbogusvalueexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-value-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequesttimeoutsyncexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/timeout-sync-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestscustomelementshtmlconstructornewtargetexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/custom-elements/htmlconstructor/newtarget-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdominterfacesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDOMImplementationcreateDocumentexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/DOMImplementation-createDocument-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcontentTypecontentTypecontenttype_datauri_01expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcontentTypecontentTypecontenttype_datauri_02expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcreateElementexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElement-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcreateElementNSexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElementNS-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcreateEventexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createEvent-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomnodesattributesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/attributes-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomparsinginnerhtml01expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/domparsing/innerhtml-01-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsencodingiso2022jpdecoderexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/iso-2022-jp-decoder-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsencodingtextdecoderfatalsinglebyteexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-single-byte-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsencodingtextdecoderfatalstreamingexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-streaming-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsencodingtextdecoderutf16surrogatesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-utf16-surrogates-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicintegrityexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicintegrityworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicschemedataexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicschemedataworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightredirectexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightredirectworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightstatusexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightstatusworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapiheadersheadersidlexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/headers/headers-idl-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapirequestrequestcacheonlyifcachedexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-cache-only-if-cached-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapiresponseresponseconsumestreamexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshrtimetest_cross_frame_startexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/hr-time/test_cross_frame_start-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlbrowsersbrowsingthewebhistorytraversalpersisteduserstaterestorationscrollrestorationfragmentscrollingcrossoriginexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlbrowsersbrowsingthewebreadmediapageloadimageexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/read-media/pageload-image-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlbrowserswindowsnestedbrowsingcontextsframeElementsubexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.sub-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionclosingtheinputstreamdocumentclose01expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/closing-the-input-stream/document.close-01-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertiondocumentwritedocumentwrite01expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-write/document.write-01-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertiondocumentwritelndocumentwriteln01expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-writeln/document.writeln-01-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionopeningtheinputstream010expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/010-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionopeningtheinputstreamdocumentopen01expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-01-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionopeningtheinputstreamdocumentopen02expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-02-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldominterfacesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldomreflectionembeddedexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsdocumentmetadatathelinkelementdocumentwithoutbrowsingcontextexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-link-element/document-without-browsing-context-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsdocumentmetadatathemetaelementpragmadirectivesattrmetahttpequivrefreshnotinshadowtreeexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsembeddedcontentmediaelementsinterfacesHTMLElementHTMLTrackElementsrclangexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsembeddedcontentmediaelementsinterfacesTextTracklanguageexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TextTrack/language-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsembeddedcontenttheimgelementenvironmentchangesviewportchangeexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsformsformsubmission0urlencodedexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/forms/form-submission-0/url-encoded-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsinteractiveelementsthedialogelementdialogshowModalexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisanimationframesidlharnessexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/animation-frames/idlharness-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisatobbase64expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/atob/base64-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisscriptingeventsmessageeventconstructorexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisscriptingeventsmessageeventconstructorhttpsexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapissystemstateandcapabilitiesthenavigatorobjectcontentexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapissystemstateandcapabilitiesthenavigatorobjectprotocolexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingresourcetimingexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/resource-timing-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsurlinterfacesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/url/interfaces-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsurlurlconstructorexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsurlurlencodedparserexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/url/urlencoded-parser-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsusertimingtest_user_timing_mark_and_measure_exception_when_invoke_with_timing_attributesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/user-timing/test_user_timing_mark_and_measure_exception_when_invoke_with_timing_attributes-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestswebrtcRTCDataChannelEventconstructorexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDataChannelEvent-constructor-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorimportedw3cwebplatformtestshtmlbrowsersbrowsingthewebhistorytraversalpersisteduserstaterestorationscrollrestorationfragmentscrollingcrossoriginexpectedtxt">trunk/LayoutTests/platform/ios-simulator/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorwk2importedw3cwebplatformtestshtmldomreflectionembeddedexpectedtxt">trunk/LayoutTests/platform/ios-simulator-wk2/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk1importedw3cwebplatformtestsXMLHttpRequestsendnetworkerrorsynceventssubexpectedtxt">trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitpylayout_testsserversweb_platform_test_serverpy">trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/LayoutTests/imported/w3c/web-platform-tests/resources/</li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcesLICENSE">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/LICENSE</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcesidlharnessjs">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/idlharness.js</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcesreadmemd">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/readme.md</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourcestestharnessjs">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/testharness.js</a></li>
<li>trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/</li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2LICENSE">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/LICENSE</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2READMEmd">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/README.md</a></li>
<li>trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/</li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2libwebidl2js">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/webidl2.js</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2libwriterjs">trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/writer.js</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li>trunk/LayoutTests/imported/w3c/resources/web-platform-tests-modules/darobin/</li>
<li>trunk/LayoutTests/imported/w3c/resources/web-platform-tests-modules/dontcallmedom/</li>
<li>trunk/LayoutTests/imported/w3c/resources/web-platform-tests-modules/w3c/testharness.js/</li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,3 +1,178 @@
</span><ins>+2017-02-08  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Update web-platform-tests resources
+        https://bugs.webkit.org/show_bug.cgi?id=168026
+
+        Reviewed by Youenn Fablet.
+
+        * resources/web-platform-tests-modules.json:
+        * resources/web-platform-tests-modules/darobin/webidl2.js/archive/bd216bcd5596d60734450adc938155deab1e1a80.tar.gz: Removed.
+        * resources/web-platform-tests-modules/dontcallmedom/widlproc/archive/4ef8dde69c0ba3d0167bccfa2775eea7f0d6c7fe.tar.gz: Removed.
+        * resources/web-platform-tests-modules/w3c/testharness.js/archive/873f9680aff66553f84d38f21a038c4534cc2789.tar.gz: Removed.
+        * web-platform-tests/.gitignore:
+        * web-platform-tests/XMLHttpRequest/interfaces-expected.txt:
+        * web-platform-tests/dom/interfaces-expected.txt:
+        * web-platform-tests/fetch/api/headers/headers-idl-expected.txt:
+        * web-platform-tests/html/dom/interfaces-expected.txt:
+        * web-platform-tests/html/webappapis/animation-frames/idlharness-expected.txt:
+        * web-platform-tests/resources/LICENSE: Added.
+        * web-platform-tests/resources/idlharness.js: Added.
+        (constValue):
+        (minOverloadLength):
+        (throwOrReject):
+        (awaitNCallbacks):
+        (return.fround):
+        (fround):
+        (self.IdlArray):
+        (IdlArray.prototype.add_idls):
+        (IdlArray.prototype.add_untested_idls):
+        (IdlArray.prototype.internal_add_idls):
+        (IdlArray.prototype.add_objects):
+        (IdlArray.prototype.prevent_multiple_testing):
+        (IdlArray.prototype.recursively_get_implements):
+        (exposed_in):
+        (IdlArray.prototype.test):
+        (IdlArray.prototype.assert_type_is):
+        (IdlObject):
+        (IdlObject.prototype.test):
+        (IdlObject.prototype.has_extended_attribute):
+        (IdlInterface):
+        (IdlInterface.prototype.is_callback):
+        (IdlInterface.prototype.has_constants):
+        (IdlInterface.prototype.is_global):
+        (IdlInterface.prototype.test):
+        (IdlInterface.prototype.test_self):
+        (IdlInterface.prototype.test_member_const):
+        (IdlInterface.prototype.test_member_attribute):
+        (IdlInterface.prototype.test_member_operation):
+        (IdlInterface.prototype.do_member_operation_asserts):
+        (IdlInterface.prototype.add_iterable_members):
+        (IdlInterface.prototype.test_member_iterable):
+        (IdlInterface.prototype.test_member_stringifier):
+        (IdlInterface.prototype.test_members):
+        (IdlInterface.prototype.test_object):
+        (IdlInterface.prototype.test_primary_interface_of):
+        (IdlInterface.prototype.test_interface_of):
+        (IdlInterface.prototype.has_stringifier):
+        (IdlInterface.prototype.do_interface_attribute_asserts):
+        (IdlInterfaceMember):
+        (create_suitable_object):
+        (IdlEnum):
+        (IdlTypedef):
+        * web-platform-tests/resources/readme.md: Added.
+        * web-platform-tests/resources/testharness.js: Added.
+        (WindowTestEnvironment):
+        (WindowTestEnvironment.prototype._dispatch):
+        (WindowTestEnvironment.prototype._forEach_windows):
+        (WindowTestEnvironment.prototype.on_tests_ready):
+        (WindowTestEnvironment.prototype.setup_messages):
+        (WindowTestEnvironment.prototype.next_default_test_name):
+        (WindowTestEnvironment.prototype.on_new_harness_properties):
+        (WindowTestEnvironment.prototype.add_on_loaded_callback):
+        (WindowTestEnvironment.prototype.test_timeout):
+        (WindowTestEnvironment.prototype.global_scope):
+        (WorkerTestEnvironment):
+        (WorkerTestEnvironment.prototype._dispatch):
+        (WorkerTestEnvironment.prototype._add_message_port):
+        (WorkerTestEnvironment.prototype.next_default_test_name):
+        (WorkerTestEnvironment.prototype.on_new_harness_properties):
+        (WorkerTestEnvironment.prototype.on_tests_ready):
+        (WorkerTestEnvironment.prototype.add_on_loaded_callback):
+        (WorkerTestEnvironment.prototype.test_timeout):
+        (WorkerTestEnvironment.prototype.global_scope):
+        (DedicatedWorkerTestEnvironment):
+        (DedicatedWorkerTestEnvironment.prototype.on_tests_ready):
+        (SharedWorkerTestEnvironment):
+        (SharedWorkerTestEnvironment.prototype.on_tests_ready):
+        (ServiceWorkerTestEnvironment):
+        (ServiceWorkerTestEnvironment.prototype.add_on_loaded_callback):
+        (create_test_environment):
+        (is_shared_worker):
+        (is_service_worker):
+        (test):
+        (async_test):
+        (promise_test):
+        (this.wait_for):
+        (EventWatcher):
+        (setup):
+        (done):
+        (generate_tests):
+        (step_timeout):
+        (truncate):
+        (is_node):
+        (format_value):
+        * web-platform-tests/resources/webidl2/LICENSE: Added.
+        * web-platform-tests/resources/webidl2/README.md: Added.
+        * web-platform-tests/resources/webidl2/lib/webidl2.js: Added.
+        (tokenise):
+        (WebIDLParseError):
+        (WebIDLParseError.prototype.toString):
+        (error):
+        (consume):
+        (ws):
+        (all_ws):
+        (integer_type):
+        (float_type):
+        (primitive_type):
+        (const_value):
+        (type_suffix):
+        (single_type):
+        (union_type):
+        (type):
+        (argument):
+        (argument_list):
+        (type_pair):
+        (simple_extended_attr):
+        (extended_attrs):
+        (default_):
+        (const_):
+        (inheritance):
+        (operation_rest):
+        (callback):
+        (attribute):
+        (return_type):
+        (operation):
+        (identifiers):
+        (serialiser):
+        (iterable_type):
+        (readonly_iterable_type):
+        (iterable):
+        (interface_):
+        (partial):
+        (dictionary):
+        (exception):
+        (enum_):
+        (parse):
+        * web-platform-tests/resources/webidl2/lib/writer.js: Added.
+        (noop):
+        (literal):
+        (wsPea):
+        (wsTPea):
+        (lineComment):
+        (multilineComment):
+        (type):
+        (const_value):
+        (argument):
+        (args):
+        (make_ext_at):
+        (extended_attributes):
+        (operation):
+        (attribute):
+        (interface_):
+        (dictionary):
+        (field):
+        (exception):
+        (const_):
+        (typedef):
+        (implements_):
+        (callback):
+        (enum_):
+        (dispatch):
+        (iterate):
+        (write):
+        (obj.write):
+        * web-platform-tests/url/interfaces-expected.txt:
+
</ins><span class="cx"> 2017-02-08  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r193286): Promise chain no longer prevent UI refresh
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cresourceswebplatformtestsmodulesjson"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/resources/web-platform-tests-modules.json (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/resources/web-platform-tests-modules.json        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/resources/web-platform-tests-modules.json        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,31 +1,6 @@
</span><span class="cx"> [
</span><span class="cx">     {
</span><span class="cx">         &quot;path&quot;: [
</span><del>-            &quot;resources&quot;
-        ], 
-        &quot;url&quot;: &quot;web-platform-tests-modules/w3c/testharness.js/archive/873f9680aff66553f84d38f21a038c4534cc2789.tar.gz&quot;, 
-        &quot;url_subpath&quot;: &quot;testharness.js-873f9680aff66553f84d38f21a038c4534cc2789&quot;
-    }, 
-    {
-        &quot;path&quot;: [
-            &quot;resources&quot;, 
-            &quot;webidl2&quot;
-        ], 
-        &quot;url&quot;: &quot;web-platform-tests-modules/darobin/webidl2.js/archive/bd216bcd5596d60734450adc938155deab1e1a80.tar.gz&quot;, 
-        &quot;url_subpath&quot;: &quot;webidl2.js-bd216bcd5596d60734450adc938155deab1e1a80&quot;
-    }, 
-    {
-        &quot;path&quot;: [
-            &quot;resources&quot;, 
-            &quot;webidl2&quot;, 
-            &quot;test&quot;, 
-            &quot;widlproc&quot;
-        ], 
-        &quot;url&quot;: &quot;web-platform-tests-modules/dontcallmedom/widlproc/archive/4ef8dde69c0ba3d0167bccfa2775eea7f0d6c7fe.tar.gz&quot;, 
-        &quot;url_subpath&quot;: &quot;widlproc-4ef8dde69c0ba3d0167bccfa2775eea7f0d6c7fe&quot;
-    }, 
-    {
-        &quot;path&quot;: [
</del><span class="cx">             &quot;tools&quot;
</span><span class="cx">         ], 
</span><span class="cx">         &quot;url&quot;: &quot;web-platform-tests-modules/w3c/wpt-tools/archive/cf9748586c2bca14998eda5956be6cf4d6d221d9.tar.gz&quot;, 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsgitignore"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/.gitignore (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/.gitignore        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/.gitignore        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,10 +1,4 @@
</span><span class="cx"> /config.json
</span><del>-/resources/
-/.resources.url
-/resources/webidl2/
-/resources/.webidl2.url
-/resources/webidl2/test/widlproc/
-/resources/webidl2/test/.widlproc.url
</del><span class="cx"> /tools/
</span><span class="cx"> /.tools.url
</span><span class="cx"> /tools/html5lib/
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestinterfacesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/interfaces-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/interfaces-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/interfaces-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 236: callback not yet supported
</del><ins>+CONSOLE MESSAGE: line 251: callback not yet supported
</ins><span class="cx"> XMLHttpRequest IDL tests
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestopenurlmultiwindow2expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/open-url-multi-window-2-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/open-url-multi-window-2-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/open-url-multi-window-2-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,5 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL XMLHttpRequest: open() resolving URLs (multi-Window; 2; evil) assert_throws: open() when associated document's IFRAME is removed function &quot;function () { 
</span><del>-            client.open(&quot;GET&quot;, &quot;folder.txt...&quot; did not throw
</del><ins>+            client.open(&quot;GET&quot;, &quot;folder.txt&quot;) 
+          }&quot; did not throw
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestoverridemimetypeinvalidmimetypeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/overridemimetype-invalid-mime-type-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/overridemimetype-invalid-mime-type-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/overridemimetype-invalid-mime-type-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,3 +1,3 @@
</span><span class="cx"> 
</span><del>-FAIL XMLHttpRequest: overrideMimeType() in unsent state, invalid MIME types assert_throws: function &quot;function () { client.overrideMimeType('text\\plain;charse...&quot; did not throw
</del><ins>+FAIL XMLHttpRequest: overrideMimeType() in unsent state, invalid MIME types assert_throws: function &quot;function () { client.overrideMimeType('text\\plain;charset=Shift-JIS'); }&quot; did not throw
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestresponsetypeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsetype-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsetype-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsetype-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,9 +1,9 @@
</span><del>-CONSOLE MESSAGE: line 1151: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
-CONSOLE MESSAGE: line 1151: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
-CONSOLE MESSAGE: line 1151: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
-CONSOLE MESSAGE: line 1151: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
-CONSOLE MESSAGE: line 1151: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
-CONSOLE MESSAGE: line 1151: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
</del><ins>+CONSOLE MESSAGE: line 1177: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
+CONSOLE MESSAGE: line 1177: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
+CONSOLE MESSAGE: line 1177: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
+CONSOLE MESSAGE: line 1177: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
+CONSOLE MESSAGE: line 1177: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
+CONSOLE MESSAGE: line 1177: XMLHttpRequest.responseType cannot be changed for synchronous HTTP(S) requests made from the window context.
</ins><span class="cx"> 
</span><span class="cx"> PASS Initial value of responseType 
</span><span class="cx"> PASS Set responseType to &quot;&quot; when readyState is UNSENT. 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestresponsexmldocumentpropertiesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsexml-document-properties-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsexml-document-properties-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/responsexml-document-properties-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> FAIL links assert_equals: expected (undefined) undefined but got (object) object &quot;[object HTMLCollection]&quot;
</span><span class="cx"> PASS cookie 
</span><span class="cx"> PASS lastModified set to time of response if no HTTP header provided 
</span><del>-FAIL lastModified set to related HTTP header if provided assert_equals: expected 1473410953000 but got 1473416201000
</del><ins>+FAIL lastModified set to related HTTP header if provided assert_equals: expected 1486609216000 but got 1452506064000
</ins><span class="cx"> PASS cookie (after setting it) 
</span><span class="cx"> PASS styleSheets 
</span><span class="cx"> PASS implementation 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsendentitybodydocumentexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-entity-body-document-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-entity-body-document-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-entity-body-document-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,9 +1,9 @@
</span><span class="cx"> 
</span><ins>+PASS HTML document, invalid UTF-8 
</ins><span class="cx"> PASS XML document, windows-1252 
</span><del>-PASS HTML document, invalid UTF-8 
</del><span class="cx"> PASS HTML document, shift-jis 
</span><ins>+PASS img tag 
</ins><span class="cx"> PASS plain text file 
</span><ins>+PASS image file 
</ins><span class="cx"> PASS empty div 
</span><del>-PASS img tag 
-PASS image file 
</del><span class="cx">          
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsendnetworkerrorsynceventssubexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -2,5 +2,6 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL XmlHttpRequest: The send() method: Throw a &quot;throw an &quot;NetworkError&quot; exception when Network error happens (synchronous flag is set) assert_throws: function &quot;function ()
</span><span class="cx">             {
</span><del>-                xhr.send(&quot;Test ...&quot; threw object &quot;AbortError (DOM Exception 20): The operation was aborted.&quot; that is not a DOMException NetworkError: property &quot;code&quot; is equal to 20, expected 19
</del><ins>+                xhr.send(&quot;Test Message&quot;);
+            }&quot; threw object &quot;AbortError (DOM Exception 20): The operation was aborted.&quot; that is not a DOMException NetworkError: property &quot;code&quot; is equal to 20, expected 19
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsendredirectpostuploadexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-redirect-post-upload-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-redirect-post-upload-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/send-redirect-post-upload-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> 
</span><del>-PASS XMLHttpRequest: The send() method: POSTing to URL that redirects (301) 
</del><ins>+FAIL XMLHttpRequest: The send() method: POSTing to URL that redirects (301) assert_true: One progress event should fire on xhr.upload when readyState is 1 expected true got false
</ins><span class="cx"> PASS XMLHttpRequest: The send() method: POSTing to URL that redirects (302) 
</span><span class="cx"> PASS XMLHttpRequest: The send() method: POSTing to URL that redirects (303) 
</span><span class="cx"> PASS XMLHttpRequest: The send() method: POSTing to URL that redirects (307) 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsetrequestheaderbogusnameexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-name-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-name-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-name-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -68,6 +68,6 @@
</span><span class="cx"> PASS setRequestHeader should throw with header name &quot;\x1d&quot;. 
</span><span class="cx"> PASS setRequestHeader should throw with header name &quot;\x1e&quot;. 
</span><span class="cx"> PASS setRequestHeader should throw with header name &quot;\x1f&quot;. 
</span><del>-FAIL setRequestHeader should throw with header name &quot;テスト&quot;. assert_throws: function &quot;function () { client.setRequestHeader(name, 'x-value') }&quot; threw object &quot;SyntaxError (DOM Exception 12): The string did not match ...&quot; (&quot;SyntaxError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
-FAIL setRequestHeader should throw with header name &quot;X-テスト&quot;. assert_throws: function &quot;function () { client.setRequestHeader(name, 'x-value') }&quot; threw object &quot;SyntaxError (DOM Exception 12): The string did not match ...&quot; (&quot;SyntaxError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
</del><ins>+FAIL setRequestHeader should throw with header name &quot;テスト&quot;. assert_throws: function &quot;function () { client.setRequestHeader(name, 'x-value') }&quot; threw object &quot;SyntaxError (DOM Exception 12): The string did not match the expected pattern.&quot; (&quot;SyntaxError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
+FAIL setRequestHeader should throw with header name &quot;X-テスト&quot;. assert_throws: function &quot;function () { client.setRequestHeader(name, 'x-value') }&quot; threw object &quot;SyntaxError (DOM Exception 12): The string did not match the expected pattern.&quot; (&quot;SyntaxError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequestsetrequestheaderbogusvalueexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-value-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-value-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/setrequestheader-bogus-value-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -3,6 +3,6 @@
</span><span class="cx"> PASS XMLHttpRequest: setRequestHeader() value argument checks 1 
</span><span class="cx"> PASS XMLHttpRequest: setRequestHeader() value argument checks 2 
</span><span class="cx"> PASS XMLHttpRequest: setRequestHeader() value argument checks 3 
</span><del>-FAIL XMLHttpRequest: setRequestHeader() value argument checks 4 assert_throws:  given value テスト, function &quot;function () { client.setRequestHeader(&quot;x-test&quot;, &quot;テスト&quot;) }&quot; threw object &quot;SyntaxError (DOM Exception 12): The string did not match ...&quot; (&quot;SyntaxError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
</del><ins>+FAIL XMLHttpRequest: setRequestHeader() value argument checks 4 assert_throws:  given value テスト, function &quot;function () { client.setRequestHeader(&quot;x-test&quot;, &quot;テスト&quot;) }&quot; threw object &quot;SyntaxError (DOM Exception 12): The string did not match the expected pattern.&quot; (&quot;SyntaxError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
</ins><span class="cx"> PASS Omitted value argument 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsXMLHttpRequesttimeoutsyncexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/timeout-sync-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/timeout-sync-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/XMLHttpRequest/timeout-sync-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 1151: XMLHttpRequest.timeout cannot be set for synchronous HTTP(S) requests made from the window context.
</del><ins>+CONSOLE MESSAGE: line 1177: XMLHttpRequest.timeout cannot be set for synchronous HTTP(S) requests made from the window context.
</ins><span class="cx"> CONSOLE MESSAGE: line 21: Synchronous XMLHttpRequests must not have a timeout value set.
</span><span class="cx"> 
</span><span class="cx"> PASS setting timeout attribute on sync request 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestscustomelementshtmlconstructornewtargetexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/custom-elements/htmlconstructor/newtarget-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/custom-elements/htmlconstructor/newtarget-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/custom-elements/htmlconstructor/newtarget-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -5,8 +5,8 @@
</span><span class="cx"> FAIL If prototype is not object (undefined), derives the fallback from NewTarget's realm (autonomous custom elements) assert_equals: Must use the HTMLElement from the realm of NewTarget expected object &quot;[object HTMLElementPrototype]&quot; but got object &quot;[object HTMLElementPrototype]&quot;
</span><span class="cx"> FAIL If prototype is not object (5), derives the fallback from NewTarget's realm (autonomous custom elements) assert_equals: Must use the HTMLElement from the realm of NewTarget expected object &quot;[object HTMLElementPrototype]&quot; but got object &quot;[object HTMLElementPrototype]&quot;
</span><span class="cx"> FAIL If prototype is not object (string), derives the fallback from NewTarget's realm (autonomous custom elements) assert_equals: Must use the HTMLElement from the realm of NewTarget expected object &quot;[object HTMLElementPrototype]&quot; but got object &quot;[object HTMLElementPrototype]&quot;
</span><del>-FAIL If prototype is not object (null), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument ...&quot;
-FAIL If prototype is not object (undefined), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument ...&quot;
-FAIL If prototype is not object (5), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument ...&quot;
-FAIL If prototype is not object (string), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument ...&quot;
</del><ins>+FAIL If prototype is not object (null), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument be a constructor&quot;
+FAIL If prototype is not object (undefined), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument be a constructor&quot;
+FAIL If prototype is not object (5), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument be a constructor&quot;
+FAIL If prototype is not object (string), derives the fallback from NewTarget's realm (customized built-in elements) promise_test: Unhandled rejection with value: object &quot;TypeError: Reflect.construct requires the first argument be a constructor&quot;
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdominterfacesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 236: callback not yet supported
</del><ins>+CONSOLE MESSAGE: line 251: callback not yet supported
</ins><span class="cx"> DOM IDL tests
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1547,7 +1547,9 @@
</span><span class="cx"> PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property &quot;nextSibling&quot; with the proper type (8) 
</span><span class="cx"> PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property &quot;previousNode&quot; with the proper type (9) 
</span><span class="cx"> PASS TreeWalker interface: document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, null, false) must inherit property &quot;nextNode&quot; with the proper type (10) 
</span><del>-PASS NodeFilter interface: existence and properties of interface object 
</del><ins>+FAIL NodeFilter interface: existence and properties of interface object assert_equals: prototype of self's property &quot;NodeFilter&quot; is not Object.prototype expected (function) function &quot;function () {
+    [native code]
+}&quot; but got (object) object &quot;[object Object]&quot;
</ins><span class="cx"> PASS NodeFilter interface object name 
</span><span class="cx"> PASS NodeFilter interface: existence and properties of interface prototype object 
</span><span class="cx"> PASS NodeFilter interface: existence and properties of interface prototype object's &quot;constructor&quot; property 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDOMImplementationcreateDocumentexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/DOMImplementation-createDocument-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/DOMImplementation-createDocument-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/DOMImplementation-createDocument-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -20,9 +20,9 @@
</span><span class="cx"> PASS createDocument test: null,&quot;}foo&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createDocument test: null,&quot;f}oo&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createDocument test: null,&quot;foo}&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><del>-PASS createDocument test: null,&quot;\x{FFFF}foo&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createDocument test: null,&quot;f\x{FFFF}oo&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createDocument test: null,&quot;foo\x{FFFF}&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</del><ins>+PASS createDocument test: null,&quot;\ufffffoo&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createDocument test: null,&quot;f\uffffoo&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createDocument test: null,&quot;foo\uffff&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</ins><span class="cx"> PASS createDocument test: null,&quot;&lt;foo&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createDocument test: null,&quot;foo&gt;&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createDocument test: null,&quot;&lt;foo&gt;&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="lines">@@ -104,12 +104,12 @@
</span><span class="cx"> PASS createDocument test: &quot;http://example.com/&quot;,&quot;f:o:o&quot;,null,&quot;NAMESPACE_ERR&quot; 
</span><span class="cx"> PASS createDocument test: &quot;http://example.com/&quot;,&quot;foo:&quot;,null,&quot;NAMESPACE_ERR&quot; 
</span><span class="cx"> PASS createDocument test: &quot;http://example.com/&quot;,&quot;f::oo&quot;,null,&quot;NAMESPACE_ERR&quot; 
</span><del>-FAIL createDocument test: &quot;http://example.com/&quot;,&quot;a:0&quot;,null,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { document.implementation.createDocument(name...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</del><ins>+FAIL createDocument test: &quot;http://example.com/&quot;,&quot;a:0&quot;,null,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { document.implementation.createDocument(namespace, qualifiedName, doctype) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</ins><span class="cx"> PASS createDocument test: &quot;http://example.com/&quot;,&quot;0:a&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createDocument test: &quot;http://example.com/&quot;,&quot;a:_&quot;,null,null 
</span><span class="cx"> PASS createDocument test: metadata for &quot;http://example.com/&quot;,&quot;a:_&quot;,null 
</span><span class="cx"> PASS createDocument test: characterSet aliases for &quot;http://example.com/&quot;,&quot;a:_&quot;,null 
</span><del>-FAIL createDocument test: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,null,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { document.implementation.createDocument(name...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</del><ins>+FAIL createDocument test: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,null,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { document.implementation.createDocument(namespace, qualifiedName, doctype) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</ins><span class="cx"> PASS createDocument test: &quot;http://example.com/&quot;,&quot;ெ:a&quot;,null,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createDocument test: &quot;http://example.com/&quot;,&quot;a:aெ&quot;,null,null 
</span><span class="cx"> PASS createDocument test: metadata for &quot;http://example.com/&quot;,&quot;a:aெ&quot;,null 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcontentTypecontentTypecontenttype_datauri_01expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 1380: Blocked a frame with origin &quot;http://localhost:8800&quot; from accessing a frame with origin &quot;null&quot;.  The frame requesting access has a protocol of &quot;http&quot;, the frame being accessed has a protocol of &quot;data&quot;. Protocols must match.
</del><ins>+CONSOLE MESSAGE: line 1409: Blocked a frame with origin &quot;http://localhost:8800&quot; from accessing a frame with origin &quot;null&quot;.  The frame requesting access has a protocol of &quot;http&quot;, the frame being accessed has a protocol of &quot;data&quot;. Protocols must match.
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> FAIL Data URI document.contentType === 'text/plain' when data URI MIME type is not set null is not an object (evaluating 'iframe.contentDocument.contentType')
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcontentTypecontentTypecontenttype_datauri_02expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 1380: Blocked a frame with origin &quot;http://localhost:8800&quot; from accessing a frame with origin &quot;null&quot;.  The frame requesting access has a protocol of &quot;http&quot;, the frame being accessed has a protocol of &quot;data&quot;. Protocols must match.
</del><ins>+CONSOLE MESSAGE: line 1409: Blocked a frame with origin &quot;http://localhost:8800&quot; from accessing a frame with origin &quot;null&quot;.  The frame requesting access has a protocol of &quot;http&quot;, the frame being accessed has a protocol of &quot;data&quot;. Protocols must match.
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> FAIL Data URI document.contentType === 'text/html' when data URI MIME type is set null is not an object (evaluating 'iframe.contentDocument.contentType')
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcreateElementexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElement-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElement-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElement-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -116,15 +116,15 @@
</span><span class="cx"> PASS createElement(&quot;foo}&quot;) in HTML document 
</span><span class="cx"> PASS createElement(&quot;foo}&quot;) in XML document 
</span><span class="cx"> PASS createElement(&quot;foo}&quot;) in XHTML document 
</span><del>-PASS createElement(&quot;\x{FFFF}foo&quot;) in HTML document 
-PASS createElement(&quot;\x{FFFF}foo&quot;) in XML document 
-PASS createElement(&quot;\x{FFFF}foo&quot;) in XHTML document 
-PASS createElement(&quot;f\x{FFFF}oo&quot;) in HTML document 
-PASS createElement(&quot;f\x{FFFF}oo&quot;) in XML document 
-PASS createElement(&quot;f\x{FFFF}oo&quot;) in XHTML document 
-PASS createElement(&quot;foo\x{FFFF}&quot;) in HTML document 
-PASS createElement(&quot;foo\x{FFFF}&quot;) in XML document 
-PASS createElement(&quot;foo\x{FFFF}&quot;) in XHTML document 
</del><ins>+PASS createElement(&quot;\ufffffoo&quot;) in HTML document 
+PASS createElement(&quot;\ufffffoo&quot;) in XML document 
+PASS createElement(&quot;\ufffffoo&quot;) in XHTML document 
+PASS createElement(&quot;f\uffffoo&quot;) in HTML document 
+PASS createElement(&quot;f\uffffoo&quot;) in XML document 
+PASS createElement(&quot;f\uffffoo&quot;) in XHTML document 
+PASS createElement(&quot;foo\uffff&quot;) in HTML document 
+PASS createElement(&quot;foo\uffff&quot;) in XML document 
+PASS createElement(&quot;foo\uffff&quot;) in XHTML document 
</ins><span class="cx"> PASS createElement(&quot;&lt;foo&quot;) in HTML document 
</span><span class="cx"> PASS createElement(&quot;&lt;foo&quot;) in XML document 
</span><span class="cx"> PASS createElement(&quot;&lt;foo&quot;) in XHTML document 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcreateElementNSexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElementNS-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElementNS-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createElementNS-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -29,15 +29,15 @@
</span><span class="cx"> PASS createElementNS test in HTML document: null,&quot;foo}&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XML document: null,&quot;foo}&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XHTML document: null,&quot;foo}&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><del>-PASS createElementNS test in HTML document: null,&quot;\x{FFFF}foo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in XML document: null,&quot;\x{FFFF}foo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in XHTML document: null,&quot;\x{FFFF}foo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in HTML document: null,&quot;f\x{FFFF}oo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in XML document: null,&quot;f\x{FFFF}oo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in XHTML document: null,&quot;f\x{FFFF}oo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in HTML document: null,&quot;foo\x{FFFF}&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in XML document: null,&quot;foo\x{FFFF}&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
-PASS createElementNS test in XHTML document: null,&quot;foo\x{FFFF}&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</del><ins>+PASS createElementNS test in HTML document: null,&quot;\ufffffoo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in XML document: null,&quot;\ufffffoo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in XHTML document: null,&quot;\ufffffoo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in HTML document: null,&quot;f\uffffoo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in XML document: null,&quot;f\uffffoo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in XHTML document: null,&quot;f\uffffoo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in HTML document: null,&quot;foo\uffff&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in XML document: null,&quot;foo\uffff&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
+PASS createElementNS test in XHTML document: null,&quot;foo\uffff&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</ins><span class="cx"> PASS createElementNS test in HTML document: null,&quot;&lt;foo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XML document: null,&quot;&lt;foo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XHTML document: null,&quot;&lt;foo&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="lines">@@ -197,9 +197,9 @@
</span><span class="cx"> PASS createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;f::oo&quot;,&quot;NAMESPACE_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;f::oo&quot;,&quot;NAMESPACE_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;f::oo&quot;,&quot;NAMESPACE_ERR&quot; 
</span><del>-FAIL createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;a:0&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedNam...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
-FAIL createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;a:0&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedNam...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
-FAIL createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;a:0&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedNam...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</del><ins>+FAIL createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;a:0&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedName) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
+FAIL createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;a:0&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedName) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
+FAIL createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;a:0&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedName) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</ins><span class="cx"> PASS createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;0:a&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;0:a&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;0:a&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="lines">@@ -206,9 +206,9 @@
</span><span class="cx"> PASS createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;a:_&quot;,null 
</span><span class="cx"> PASS createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;a:_&quot;,null 
</span><span class="cx"> PASS createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;a:_&quot;,null 
</span><del>-FAIL createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedNam...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
-FAIL createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedNam...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
-FAIL createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedNam...&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string conta...&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</del><ins>+FAIL createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedName) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
+FAIL createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedName) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
+FAIL createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;a:ெ&quot;,&quot;NAMESPACE_ERR&quot; assert_throws: function &quot;function () { doc.createElementNS(namespace, qualifiedName) }&quot; threw object &quot;InvalidCharacterError (DOM Exception 5): The string contains invalid characters.&quot; that is not a DOMException NAMESPACE_ERR: property &quot;code&quot; is equal to 5, expected 14
</ins><span class="cx"> PASS createElementNS test in HTML document: &quot;http://example.com/&quot;,&quot;ெ:a&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XML document: &quot;http://example.com/&quot;,&quot;ெ:a&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span><span class="cx"> PASS createElementNS test in XHTML document: &quot;http://example.com/&quot;,&quot;ெ:a&quot;,&quot;INVALID_CHARACTER_ERR&quot; 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomnodesDocumentcreateEventexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createEvent-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createEvent-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Document-createEvent-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -108,7 +108,8 @@
</span><span class="cx"> PASS KEYBOARDEVENT should be an alias for KeyboardEvent. 
</span><span class="cx"> PASS createEvent('KEYBOARDEVENT') should be initialized correctly. 
</span><span class="cx"> FAIL Should throw NOT_SUPPORTED_ERR for pluralized legacy event interface &quot;KeyboardEvents&quot; assert_throws: function &quot;function () {
</span><del>-          var evt = document.createEvent(pl...&quot; did not throw
</del><ins>+          var evt = document.createEvent(plural);
+        }&quot; did not throw
</ins><span class="cx"> PASS MessageEvent should be an alias for MessageEvent. 
</span><span class="cx"> PASS createEvent('MessageEvent') should be initialized correctly. 
</span><span class="cx"> PASS messageevent should be an alias for MessageEvent. 
</span><span class="lines">@@ -274,9 +275,11 @@
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;MouseScrollEvent&quot; 
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for pluralized non-legacy event interface &quot;MouseScrollEvents&quot; 
</span><span class="cx"> FAIL Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;MutationEvent&quot; assert_throws: function &quot;function () {
</span><del>-        var evt = document.createEvent(even...&quot; did not throw
</del><ins>+        var evt = document.createEvent(eventInterface);
+      }&quot; did not throw
</ins><span class="cx"> FAIL Should throw NOT_SUPPORTED_ERR for pluralized non-legacy event interface &quot;MutationEvents&quot; assert_throws: function &quot;function () {
</span><del>-        var evt = document.createEvent(even...&quot; did not throw
</del><ins>+        var evt = document.createEvent(eventInterface + &quot;s&quot;);
+      }&quot; did not throw
</ins><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;NotificationEvent&quot; 
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for pluralized non-legacy event interface &quot;NotificationEvents&quot; 
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;NotifyPaintEvent&quot; 
</span><span class="lines">@@ -312,7 +315,8 @@
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;SVGEvent&quot; 
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;SVGZoomEvent&quot; 
</span><span class="cx"> FAIL Should throw NOT_SUPPORTED_ERR for pluralized non-legacy event interface &quot;SVGZoomEvents&quot; assert_throws: function &quot;function () {
</span><del>-        var evt = document.createEvent(even...&quot; did not throw
</del><ins>+        var evt = document.createEvent(eventInterface + &quot;s&quot;);
+      }&quot; did not throw
</ins><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;ScrollAreaEvent&quot; 
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for pluralized non-legacy event interface &quot;ScrollAreaEvents&quot; 
</span><span class="cx"> PASS Should throw NOT_SUPPORTED_ERR for non-legacy event interface &quot;SecurityPolicyViolationEvent&quot; 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomnodesattributesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/attributes-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/attributes-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/attributes-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -40,10 +40,10 @@
</span><span class="cx"> PASS Basic functionality of getAttributeNode/getAttributeNodeNS 
</span><span class="cx"> PASS Basic functionality of setAttributeNode 
</span><span class="cx"> PASS Basic functionality of setAttributeNodeNS 
</span><del>-FAIL If attr’s element is neither null nor element, throw an InUseAttributeError. Test bug: unrecognized DOMException code &quot;INUSE_ATTRIBUTE_ERR&quot; passed to assert_throws()
</del><ins>+PASS If attr’s element is neither null nor element, throw an InUseAttributeError. 
</ins><span class="cx"> PASS Replacing an attr by itself 
</span><span class="cx"> PASS Basic functionality of removeAttributeNode 
</span><del>-FAIL setAttributeNode on bound attribute should throw InUseAttributeError Test bug: unrecognized DOMException code &quot;INUSE_ATTRIBUTE_ERR&quot; passed to assert_throws()
</del><ins>+PASS setAttributeNode on bound attribute should throw InUseAttributeError 
</ins><span class="cx"> PASS setAttributeNode, if it fires mutation events, should fire one with the new node when resetting an existing attribute 
</span><span class="cx"> PASS setAttributeNode, if it fires mutation events, should fire one with the new node when resetting an existing attribute (outer shell) 
</span><span class="cx"> PASS setAttributeNode called with an Attr that has the same name as an existing one should not change attribute order 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomparsinginnerhtml01expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/domparsing/innerhtml-01-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/domparsing/innerhtml-01-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/domparsing/innerhtml-01-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -3,5 +3,6 @@
</span><span class="cx">     document.documentElement.innerHTML;
</span><span class="cx">   }&quot; did not throw
</span><span class="cx"> FAIL innerHTML in XHTML: getting while the document is in an invalid state 1 assert_throws: Getting a Text node whose data contains characters that are not matched by the XML Char production function &quot;function () {
</span><del>-    document.getElementsByTagName(&quot;title&quot;)[...&quot; did not throw
</del><ins>+    document.getElementsByTagName(&quot;title&quot;)[0].innerHTML;
+  }&quot; did not throw
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsencodingiso2022jpdecoderexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/iso-2022-jp-decoder-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/iso-2022-jp-decoder-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/iso-2022-jp-decoder-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,8 +1,8 @@
</span><span class="cx"> 
</span><del>-FAIL iso-2022-jp decoder: Error ESC assert_equals: expected &quot;�$&quot; but got &quot;�&quot;
</del><ins>+FAIL iso-2022-jp decoder: Error ESC assert_equals: expected &quot;\ufffd$&quot; but got &quot;\ufffd&quot;
</ins><span class="cx"> PASS iso-2022-jp decoder: Error ESC, character 
</span><del>-FAIL iso-2022-jp decoder: ASCII ESC, character assert_equals: expected &quot;�P&quot; but got &quot;P&quot;
-FAIL iso-2022-jp decoder: Double ASCII ESC, character assert_equals: expected &quot;��P&quot; but got &quot;�P&quot;
</del><ins>+FAIL iso-2022-jp decoder: ASCII ESC, character assert_equals: expected &quot;\ufffdP&quot; but got &quot;P&quot;
+FAIL iso-2022-jp decoder: Double ASCII ESC, character assert_equals: expected &quot;\ufffd\ufffdP&quot; but got &quot;\ufffdP&quot;
</ins><span class="cx"> PASS iso-2022-jp decoder: character, ASCII ESC, character 
</span><span class="cx"> PASS iso-2022-jp decoder: characters 
</span><span class="cx"> PASS iso-2022-jp decoder: SO / SI 
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> PASS iso-2022-jp decoder: Katakana ESC, error ESC, character 
</span><span class="cx"> PASS iso-2022-jp decoder: Katakana ESC, error ESC #2, character 
</span><span class="cx"> PASS iso-2022-jp decoder: Katakana ESC, character, Katakana ESC, character 
</span><del>-FAIL iso-2022-jp decoder: Katakana ESC, SO / SI assert_equals: expected &quot;����&quot; but got &quot;\r��\x10&quot;
</del><ins>+FAIL iso-2022-jp decoder: Katakana ESC, SO / SI assert_equals: expected &quot;\ufffd\ufffd\ufffd\ufffd&quot; but got &quot;\r\ufffd\ufffd\x10&quot;
</ins><span class="cx"> PASS iso-2022-jp decoder: Multibyte ESC, character 
</span><span class="cx"> PASS iso-2022-jp decoder: Multibyte ESC #2, character 
</span><span class="cx"> PASS iso-2022-jp decoder: Multibyte ESC, error ESC, character 
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> PASS iso-2022-jp decoder: Multibyte ESC, lead error byte 
</span><span class="cx"> PASS iso-2022-jp decoder: Multibyte ESC, trail error byte 
</span><span class="cx"> PASS iso-2022-jp decoder: character, error ESC 
</span><del>-FAIL iso-2022-jp decoder: character, error ESC #2 assert_equals: expected &quot;P�$&quot; but got &quot;P�&quot;
</del><ins>+FAIL iso-2022-jp decoder: character, error ESC #2 assert_equals: expected &quot;P\ufffd$&quot; but got &quot;P\ufffd&quot;
</ins><span class="cx"> PASS iso-2022-jp decoder: character, error ESC #3 
</span><span class="cx"> PASS iso-2022-jp decoder: character, ASCII ESC 
</span><span class="cx"> PASS iso-2022-jp decoder: character, Roman ESC 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsencodingtextdecoderfatalsinglebyteexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-single-byte-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-single-byte-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-single-byte-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -677,7 +677,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 163 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 164 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-3 doesn't have a pointer 165 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 166 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 167 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 168 
</span><span class="lines">@@ -687,7 +688,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 172 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 173 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-3 doesn't have a pointer 174 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 175 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 176 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 177 
</span><span class="lines">@@ -704,13 +706,15 @@
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 188 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 189 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-3 doesn't have a pointer 190 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 191 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 192 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 193 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 194 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-3 doesn't have a pointer 195 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 196 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 197 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 198 
</span><span class="lines">@@ -724,7 +728,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 206 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 207 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-3 doesn't have a pointer 208 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 209 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 210 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 211 
</span><span class="lines">@@ -744,7 +749,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 225 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 226 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-3 doesn't have a pointer 227 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 228 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 229 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 230 
</span><span class="lines">@@ -758,7 +764,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 238 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 239 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-3 doesn't have a pointer 240 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 241 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 242 
</span><span class="cx"> PASS Not throw: ISO-8859-3 has a pointer 243 
</span><span class="lines">@@ -1448,64 +1455,91 @@
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 159 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 160 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 161 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 162 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 163 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 164 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 165 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 166 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 167 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 168 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 169 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 170 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 171 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 172 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 173 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 174 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 175 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 176 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 177 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 178 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 179 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 180 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 181 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 182 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 183 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 184 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 185 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 186 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 187 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 188 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 189 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 190 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 191 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 192 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 193 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 194 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 195 
</span><span class="lines">@@ -1533,15 +1567,20 @@
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 217 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 218 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 219 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 220 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 221 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 222 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 223 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 224 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 225 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 226 
</span><span class="lines">@@ -1562,31 +1601,44 @@
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 241 
</span><span class="cx"> PASS Not throw: ISO-8859-6 has a pointer 242 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 243 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 244 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 245 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 246 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 247 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 248 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 249 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 250 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 251 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 252 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 253 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 254 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-6 doesn't have a pointer 255 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 0 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 1 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 2 
</span><span class="lines">@@ -1762,7 +1814,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 172 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 173 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-7 doesn't have a pointer 174 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 175 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 176 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 177 
</span><span class="lines">@@ -1799,7 +1852,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 208 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 209 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-7 doesn't have a pointer 210 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 211 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 212 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 213 
</span><span class="lines">@@ -1845,7 +1899,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 253 
</span><span class="cx"> PASS Not throw: ISO-8859-7 has a pointer 254 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-7 doesn't have a pointer 255 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 0 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 1 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 2 
</span><span class="lines">@@ -2008,7 +2063,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 159 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 160 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 161 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 162 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 163 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 164 
</span><span class="lines">@@ -2039,69 +2095,101 @@
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 189 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 190 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 191 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 192 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 193 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 194 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 195 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 196 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 197 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 198 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 199 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 200 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 201 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 202 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 203 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 204 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 205 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 206 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 207 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 208 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 209 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 210 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 211 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 212 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 213 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 214 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 215 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 216 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 217 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 218 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 219 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 220 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 221 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 222 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 223 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 224 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 225 
</span><span class="lines">@@ -2131,13 +2219,16 @@
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 249 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 250 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 251 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 252 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 253 
</span><span class="cx"> PASS Not throw: ISO-8859-8 has a pointer 254 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8 doesn't have a pointer 255 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 0 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 1 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 2 
</span><span class="lines">@@ -2300,7 +2391,8 @@
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 159 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 160 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 161 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 162 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 163 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 164 
</span><span class="lines">@@ -2331,69 +2423,101 @@
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 189 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 190 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 191 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 192 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 193 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 194 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 195 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 196 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 197 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 198 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 199 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 200 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 201 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 202 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 203 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 204 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 205 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 206 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 207 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 208 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 209 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 210 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 211 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 212 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 213 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 214 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 215 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 216 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 217 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 218 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 219 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 220 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 221 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 222 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 223 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 224 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 225 
</span><span class="lines">@@ -2423,13 +2547,16 @@
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 249 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 250 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 251 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 252 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 253 
</span><span class="cx"> PASS Not throw: ISO-8859-8-I has a pointer 254 
</span><span class="cx"> FAIL Throw due to fatal flag: ISO-8859-8-I doesn't have a pointer 255 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: ISO-8859-10 has a pointer 0 
</span><span class="cx"> PASS Not throw: ISO-8859-10 has a pointer 1 
</span><span class="cx"> PASS Not throw: ISO-8859-10 has a pointer 2 
</span><span class="lines">@@ -4698,13 +4825,17 @@
</span><span class="cx"> PASS Not throw: windows-874 has a pointer 217 
</span><span class="cx"> PASS Not throw: windows-874 has a pointer 218 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 219 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 220 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 221 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 222 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-874 has a pointer 223 
</span><span class="cx"> PASS Not throw: windows-874 has a pointer 224 
</span><span class="cx"> PASS Not throw: windows-874 has a pointer 225 
</span><span class="lines">@@ -4735,13 +4866,17 @@
</span><span class="cx"> PASS Not throw: windows-874 has a pointer 250 
</span><span class="cx"> PASS Not throw: windows-874 has a pointer 251 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 252 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 253 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 254 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-874 doesn't have a pointer 255 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1250 has a pointer 0 
</span><span class="cx"> PASS Not throw: windows-1250 has a pointer 1 
</span><span class="cx"> PASS Not throw: windows-1250 has a pointer 2 
</span><span class="lines">@@ -5681,7 +5816,8 @@
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 168 
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 169 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1253 doesn't have a pointer 170 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1253 has a pointer 171 
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 172 
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 173 
</span><span class="lines">@@ -5722,7 +5858,8 @@
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 208 
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 209 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1253 doesn't have a pointer 210 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1253 has a pointer 211 
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 212 
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 213 
</span><span class="lines">@@ -5768,7 +5905,8 @@
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 253 
</span><span class="cx"> PASS Not throw: windows-1253 has a pointer 254 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1253 doesn't have a pointer 255 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1254 has a pointer 0 
</span><span class="cx"> PASS Not throw: windows-1254 has a pointer 1 
</span><span class="cx"> PASS Not throw: windows-1254 has a pointer 2 
</span><span class="lines">@@ -6228,7 +6366,8 @@
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 200 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 201 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 202 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1255 has a pointer 203 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 204 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 205 
</span><span class="lines">@@ -6244,19 +6383,26 @@
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 215 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 216 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 217 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 218 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 219 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 220 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 221 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 222 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 223 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1255 has a pointer 224 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 225 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 226 
</span><span class="lines">@@ -6285,13 +6431,16 @@
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 249 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 250 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 251 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 252 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1255 has a pointer 253 
</span><span class="cx"> PASS Not throw: windows-1255 has a pointer 254 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1255 doesn't have a pointer 255 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1256 has a pointer 0 
</span><span class="cx"> PASS Not throw: windows-1256 has a pointer 1 
</span><span class="cx"> PASS Not throw: windows-1256 has a pointer 2 
</span><span class="lines">@@ -6710,12 +6859,14 @@
</span><span class="cx"> PASS Not throw: windows-1257 has a pointer 159 
</span><span class="cx"> PASS Not throw: windows-1257 has a pointer 160 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1257 doesn't have a pointer 161 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1257 has a pointer 162 
</span><span class="cx"> PASS Not throw: windows-1257 has a pointer 163 
</span><span class="cx"> PASS Not throw: windows-1257 has a pointer 164 
</span><span class="cx"> FAIL Throw due to fatal flag: windows-1257 doesn't have a pointer 165 assert_throws: function &quot;function () {
</span><del>-                    new TextDecoder(t.encod...&quot; did not throw
</del><ins>+                    new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array([i]));
+                }&quot; did not throw
</ins><span class="cx"> PASS Not throw: windows-1257 has a pointer 166 
</span><span class="cx"> PASS Not throw: windows-1257 has a pointer 167 
</span><span class="cx"> PASS Not throw: windows-1257 has a pointer 168 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsencodingtextdecoderfatalstreamingexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-streaming-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-streaming-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-fatal-streaming-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><span class="cx"> 
</span><del>-FAIL Fatal flag, non-streaming cases assert_equals: Unterminated UTF-8 sequence should emit replacement character if fatal flag is unset expected &quot;�&quot; but got &quot;&quot;
</del><ins>+FAIL Fatal flag, non-streaming cases assert_equals: Unterminated UTF-8 sequence should emit replacement character if fatal flag is unset expected &quot;\ufffd&quot; but got &quot;&quot;
</ins><span class="cx"> FAIL Fatal flag, streaming cases assert_equals: expected &quot;\0&quot; but got &quot;&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsencodingtextdecoderutf16surrogatesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-utf16-surrogates-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-utf16-surrogates-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/encoding/textdecoder-utf16-surrogates-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,17 +1,22 @@
</span><span class="cx"> 
</span><del>-FAIL utf-16le - lone surrogate lead assert_equals: expected &quot;�&quot; but got &quot;í €&quot;
</del><ins>+FAIL utf-16le - lone surrogate lead assert_equals: expected &quot;\ufffd&quot; but got &quot;í €&quot;
</ins><span class="cx"> FAIL utf-16le - lone surrogate lead (fatal flag set) assert_throws: function &quot;function () {
</span><del>-            new TextDecoder(t.encoding, {fa...&quot; did not throw
-FAIL utf-16le - lone surrogate trail assert_equals: expected &quot;�&quot; but got &quot;í°€&quot;
</del><ins>+            new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array(t.input))
+        }&quot; did not throw
+FAIL utf-16le - lone surrogate trail assert_equals: expected &quot;\ufffd&quot; but got &quot;í°€&quot;
</ins><span class="cx"> FAIL utf-16le - lone surrogate trail (fatal flag set) assert_throws: function &quot;function () {
</span><del>-            new TextDecoder(t.encoding, {fa...&quot; did not throw
-FAIL utf-16le - unmatched surrogate lead assert_equals: expected &quot;�\0&quot; but got &quot;í €\0&quot;
</del><ins>+            new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array(t.input))
+        }&quot; did not throw
+FAIL utf-16le - unmatched surrogate lead assert_equals: expected &quot;\ufffd\0&quot; but got &quot;í €\0&quot;
</ins><span class="cx"> FAIL utf-16le - unmatched surrogate lead (fatal flag set) assert_throws: function &quot;function () {
</span><del>-            new TextDecoder(t.encoding, {fa...&quot; did not throw
-FAIL utf-16le - unmatched surrogate trail assert_equals: expected &quot;�\0&quot; but got &quot;í°€\0&quot;
</del><ins>+            new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array(t.input))
+        }&quot; did not throw
+FAIL utf-16le - unmatched surrogate trail assert_equals: expected &quot;\ufffd\0&quot; but got &quot;í°€\0&quot;
</ins><span class="cx"> FAIL utf-16le - unmatched surrogate trail (fatal flag set) assert_throws: function &quot;function () {
</span><del>-            new TextDecoder(t.encoding, {fa...&quot; did not throw
-FAIL utf-16le - swapped surrogate pair assert_equals: expected &quot;��&quot; but got &quot;í°€í €&quot;
</del><ins>+            new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array(t.input))
+        }&quot; did not throw
+FAIL utf-16le - swapped surrogate pair assert_equals: expected &quot;\ufffd\ufffd&quot; but got &quot;í°€í €&quot;
</ins><span class="cx"> FAIL utf-16le - swapped surrogate pair (fatal flag set) assert_throws: function &quot;function () {
</span><del>-            new TextDecoder(t.encoding, {fa...&quot; did not throw
</del><ins>+            new TextDecoder(t.encoding, {fatal: true}).decode(new Uint8Array(t.input))
+        }&quot; did not throw
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicintegrityexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -3,13 +3,13 @@
</span><span class="cx"> PASS SHA-256 integrity 
</span><span class="cx"> PASS SHA-384 integrity 
</span><span class="cx"> PASS SHA-512 integrity 
</span><del>-FAIL Invalid integrity assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Invalid integrity assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> PASS Multiple integrities: valid stronger than invalid 
</span><del>-FAIL Multiple integrities: invalid stronger than valid assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Multiple integrities: invalid stronger than valid assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> PASS Multiple integrities: invalid as strong as valid 
</span><span class="cx"> PASS Multiple integrities: both are valid 
</span><del>-FAIL Multiple integrities: both are invalid assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Multiple integrities: both are invalid assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> PASS CORS empty integrity 
</span><span class="cx"> PASS CORS SHA-512 integrity 
</span><del>-FAIL CORS invalid integrity assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL CORS invalid integrity assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicintegrityworkerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-worker-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-worker-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/integrity-worker-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -3,13 +3,13 @@
</span><span class="cx"> PASS SHA-256 integrity 
</span><span class="cx"> PASS SHA-384 integrity 
</span><span class="cx"> PASS SHA-512 integrity 
</span><del>-FAIL Invalid integrity assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Invalid integrity assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> PASS Multiple integrities: valid stronger than invalid 
</span><del>-FAIL Multiple integrities: invalid stronger than valid assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Multiple integrities: invalid stronger than valid assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> PASS Multiple integrities: invalid as strong as valid 
</span><span class="cx"> PASS Multiple integrities: both are valid 
</span><del>-FAIL Multiple integrities: both are invalid assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Multiple integrities: both are invalid assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> PASS CORS empty integrity 
</span><span class="cx"> PASS CORS SHA-512 integrity 
</span><del>-FAIL CORS invalid integrity assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL CORS invalid integrity assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicschemedataexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -6,5 +6,5 @@
</span><span class="cx"> PASS Fetching data:image/png;base64,cmVzcG9uc2UncyBib2[...] is OK 
</span><span class="cx"> PASS Fetching [POST] data:,response%27s%20body is OK 
</span><span class="cx"> PASS Fetching [HEAD] data:,response%27s%20body is OK 
</span><del>-FAIL Fetching [GET] data:notAdataUrl.com is KO assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Fetching [GET] data:notAdataUrl.com is KO assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicschemedataworkerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-worker-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-worker-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/scheme-data-worker-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -6,5 +6,5 @@
</span><span class="cx"> PASS Fetching data:image/png;base64,cmVzcG9uc2UncyBib2[...] is OK 
</span><span class="cx"> PASS Fetching [POST] data:,response%27s%20body is OK 
</span><span class="cx"> PASS Fetching [HEAD] data:,response%27s%20body is OK 
</span><del>-FAIL Fetching [GET] data:notAdataUrl.com is KO assert_unreached: Should have rejected. Reached unreachable code
</del><ins>+FAIL Fetching [GET] data:notAdataUrl.com is KO assert_unreached: Should have rejected: undefined Reached unreachable code
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightredirectexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,12 +1,12 @@
</span><span class="cx"> 
</span><del>-PASS Redirection 301 on preflight failed 
-PASS Redirection 301 after preflight failed 
-PASS Redirection 302 on preflight failed 
-PASS Redirection 302 after preflight failed 
-PASS Redirection 303 on preflight failed 
-PASS Redirection 303 after preflight failed 
-PASS Redirection 307 on preflight failed 
-PASS Redirection 307 after preflight failed 
-PASS Redirection 308 on preflight failed 
-PASS Redirection 308 after preflight failed 
</del><ins>+FAIL Redirection 301 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 301 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 302 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 302 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 303 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 303 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 307 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 307 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 308 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 308 after preflight failed assert_not_equals: got disallowed value undefined
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightredirectworkerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-worker-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-worker-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-redirect-worker-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,12 +1,12 @@
</span><span class="cx"> 
</span><del>-PASS Redirection 301 on preflight failed 
-PASS Redirection 301 after preflight failed 
-PASS Redirection 302 on preflight failed 
-PASS Redirection 302 after preflight failed 
-PASS Redirection 303 on preflight failed 
-PASS Redirection 303 after preflight failed 
-PASS Redirection 307 on preflight failed 
-PASS Redirection 307 after preflight failed 
-PASS Redirection 308 on preflight failed 
-PASS Redirection 308 after preflight failed 
</del><ins>+FAIL Redirection 301 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 301 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 302 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 302 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 303 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 303 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 307 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 307 after preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 308 on preflight failed assert_not_equals: got disallowed value undefined
+FAIL Redirection 308 after preflight failed assert_not_equals: got disallowed value undefined
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightstatusexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,29 +1,29 @@
</span><span class="cx"> 
</span><del>-PASS Preflight answered with status 200 
-PASS Preflight answered with status 201 
-PASS Preflight answered with status 202 
-PASS Preflight answered with status 203 
-PASS Preflight answered with status 204 
-PASS Preflight answered with status 205 
-PASS Preflight answered with status 206 
-PASS Preflight answered with status 300 
-PASS Preflight answered with status 301 
-PASS Preflight answered with status 302 
-PASS Preflight answered with status 303 
-PASS Preflight answered with status 304 
-PASS Preflight answered with status 305 
-PASS Preflight answered with status 306 
-PASS Preflight answered with status 307 
-PASS Preflight answered with status 308 
-PASS Preflight answered with status 400 
-PASS Preflight answered with status 401 
-PASS Preflight answered with status 402 
-PASS Preflight answered with status 403 
-PASS Preflight answered with status 404 
-PASS Preflight answered with status 405 
-PASS Preflight answered with status 501 
-PASS Preflight answered with status 502 
-PASS Preflight answered with status 503 
-PASS Preflight answered with status 504 
-PASS Preflight answered with status 505 
</del><ins>+FAIL Preflight answered with status 200 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 201 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 202 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 203 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 204 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 205 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 206 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 300 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 301 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 302 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 303 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 304 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 305 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 306 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 307 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 308 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 400 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 401 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 402 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 403 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 404 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 405 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 501 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 502 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 503 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 504 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 505 assert_not_equals: got disallowed value undefined
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightstatusworkerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-status-worker-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,29 +1,29 @@
</span><span class="cx"> 
</span><del>-PASS Preflight answered with status 200 
-PASS Preflight answered with status 201 
-PASS Preflight answered with status 202 
-PASS Preflight answered with status 203 
-PASS Preflight answered with status 204 
-PASS Preflight answered with status 205 
-PASS Preflight answered with status 206 
-PASS Preflight answered with status 300 
-PASS Preflight answered with status 301 
-PASS Preflight answered with status 302 
-PASS Preflight answered with status 303 
-PASS Preflight answered with status 304 
-PASS Preflight answered with status 305 
-PASS Preflight answered with status 306 
-PASS Preflight answered with status 307 
-PASS Preflight answered with status 308 
-PASS Preflight answered with status 400 
-PASS Preflight answered with status 401 
-PASS Preflight answered with status 402 
-PASS Preflight answered with status 403 
-PASS Preflight answered with status 404 
-PASS Preflight answered with status 405 
-PASS Preflight answered with status 501 
-PASS Preflight answered with status 502 
-PASS Preflight answered with status 503 
-PASS Preflight answered with status 504 
-PASS Preflight answered with status 505 
</del><ins>+FAIL Preflight answered with status 200 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 201 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 202 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 203 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 204 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 205 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 206 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 300 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 301 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 302 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 303 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 304 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 305 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 306 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 307 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 308 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 400 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 401 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 402 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 403 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 404 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 405 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 501 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 502 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 503 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 504 assert_not_equals: got disallowed value undefined
+FAIL Preflight answered with status 505 assert_not_equals: got disallowed value undefined
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapiheadersheadersidlexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/headers/headers-idl-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/headers/headers-idl-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/headers/headers-idl-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -9,6 +9,16 @@
</span><span class="cx"> PASS Headers interface: operation get(ByteString) 
</span><span class="cx"> PASS Headers interface: operation has(ByteString) 
</span><span class="cx"> PASS Headers interface: operation set(ByteString,ByteString) 
</span><ins>+FAIL Testing Symbol.iterator property of iterable interface Headers assert_equals: @@iterator function does not have the right name expected &quot;entries&quot; but got &quot;[Symbol.Iterator]&quot;
+FAIL Testing pair iterable interface Headers assert_equals: entries method is not the same as @@iterator expected function &quot;function entries() {
+    [native code]
+}&quot; but got function &quot;function [Symbol.Iterator]() {
+    [native code]
+}&quot;
+PASS Headers interface: operation entries() 
+PASS Headers interface: operation keys() 
+PASS Headers interface: operation values() 
+PASS Headers interface: operation forEach(function,any) 
</ins><span class="cx"> PASS Headers must be primary interface of new Headers() 
</span><span class="cx"> PASS Stringification of new Headers() 
</span><span class="cx"> PASS Headers interface: new Headers() must inherit property &quot;append&quot; with the proper type (0) 
</span><span class="lines">@@ -21,4 +31,9 @@
</span><span class="cx"> PASS Headers interface: calling has(ByteString) on new Headers() with too few arguments must throw TypeError 
</span><span class="cx"> PASS Headers interface: new Headers() must inherit property &quot;set&quot; with the proper type (4) 
</span><span class="cx"> PASS Headers interface: calling set(ByteString,ByteString) on new Headers() with too few arguments must throw TypeError 
</span><ins>+PASS Headers interface: new Headers() must inherit property &quot;entries&quot; with the proper type (6) 
+PASS Headers interface: new Headers() must inherit property &quot;keys&quot; with the proper type (7) 
+PASS Headers interface: new Headers() must inherit property &quot;values&quot; with the proper type (8) 
+PASS Headers interface: new Headers() must inherit property &quot;forEach&quot; with the proper type (9) 
+PASS Headers interface: calling forEach(function,any) on new Headers() with too few arguments must throw TypeError 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapirequestrequestcacheonlyifcachedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-cache-only-if-cached-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-cache-only-if-cached-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/request/request-cache-only-if-cached-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,10 +1,10 @@
</span><del>-CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=ba172d39-45a6-4f65-989a-a500bb5056a3&amp;content=0.5336064804239897&amp;tag=0.46453612856618554&amp;expires=Wed,%2004%20Oct%202017%2022:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</del><ins>+CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=1d84352f-432d-46f6-83d6-efd82d81092c&amp;content=0.9413241569924276&amp;tag=0.9895903109991878&amp;expires=Sat,%2003%20Feb%202018%2008:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</ins><span class="cx"> 
</span><del>-CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=e02cf9bc-fa40-44bd-af2d-4a6d534d0656&amp;content=0.021466740348400903&amp;date=Fri,%2028%20Oct%202016%2009:22:28%20GMT&amp;expires=Wed,%2004%20Oct%202017%2022:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</del><ins>+CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=2cf608f3-2bb8-499c-ae51-2230222c5984&amp;content=0.7260435172644429&amp;date=Thu,%2009%20Feb%202017%2002:59:31%20GMT&amp;expires=Sat,%2003%20Feb%202018%2008:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</ins><span class="cx"> 
</span><del>-CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=6d031cde-bf54-4c7f-b7bc-a5f9924440bd&amp;content=0.10583250676458489&amp;tag=0.8657810433316643&amp;expires=Sun,%2004%20Oct%202015%2022:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</del><ins>+CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=956ebb77-1859-4f31-a52b-26977a1b166e&amp;content=0.18635733973883173&amp;tag=0.2072962381119845&amp;expires=Wed,%2003%20Feb%202016%2008:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</ins><span class="cx"> 
</span><del>-CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=8e5f669a-a795-4744-963d-184b082cc7a5&amp;content=0.2908942432786532&amp;date=Fri,%2028%20Oct%202016%2009:22:28%20GMT&amp;expires=Sun,%2004%20Oct%202015%2022:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</del><ins>+CONSOLE MESSAGE: Unsafe attempt to load URL http://127.0.0.1:8800/fetch/api/request/resources/cache.py?token=81826c36-42a2-44f0-9d0e-13a9f2c9631b&amp;content=0.3282920975572807&amp;date=Thu,%2009%20Feb%202017%2002:59:31%20GMT&amp;expires=Wed,%2003%20Feb%202016%2008:00:00%20GMT from frame with URL http://localhost:8800/fetch/api/request/request-cache-only-if-cached.html. Domains, protocols and ports must match.
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> PASS RequestCache &quot;only-if-cached&quot; mode checks the cache for previously cached content and avoids revalidation for stale responses with Etag and stale response 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapiresponseresponseconsumestreamexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -7,5 +7,5 @@
</span><span class="cx"> PASS Read array buffer response's body as readableStream 
</span><span class="cx"> FAIL Read form data response's body as readableStream promise_test: Unhandled rejection with value: object &quot;TypeError: not implemented&quot;
</span><span class="cx"> PASS Getting an error Response stream 
</span><del>-PASS Getting a redirect Response stream 
</del><ins>+FAIL Getting a redirect Response stream assert_not_equals: got disallowed value undefined
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshrtimetest_cross_frame_startexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/hr-time/test_cross_frame_start-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/hr-time/test_cross_frame_start-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/hr-time/test_cross_frame_start-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -6,6 +6,6 @@
</span><span class="cx"> PASS Setup the frame 
</span><span class="cx"> PASS parent performance.now() &gt; 0 
</span><span class="cx"> PASS child performance.now() &gt; 0 
</span><del>-FAIL Child created at least 1 second after parent assert_true: expected true got false
-FAIL Child and parent time bases are correct assert_true: Child and parent's now()s have different bases (skewed more than 1 second) expected true got false
</del><ins>+PASS Child created at least 1 second after parent 
+PASS Child and parent time bases are correct 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlbrowsersbrowsingthewebhistorytraversalpersisteduserstaterestorationscrollrestorationfragmentscrollingcrossoriginexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> Blocked access to external URL http://www.localhost:8800/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/resources/blank1.html
</span><del>-CONSOLE MESSAGE: line 2422: Error: assert_equals: navigating back should retain scrollRestoration value expected (string) &quot;manual&quot; but got (undefined) undefined
</del><ins>+CONSOLE MESSAGE: line 2451: Error: assert_equals: navigating back should retain scrollRestoration value expected (string) &quot;manual&quot; but got (undefined) undefined
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Harness Error (TIMEOUT), message = null
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlbrowsersbrowsingthewebreadmediapageloadimageexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/read-media/pageload-image-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/read-media/pageload-image-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/read-media/pageload-image-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 1380: Blocked a frame with origin &quot;http://localhost:8800&quot; from accessing a frame with origin &quot;null&quot;.  The frame requesting access has a protocol of &quot;http&quot;, the frame being accessed has a protocol of &quot;data&quot;. Protocols must match.
</del><ins>+CONSOLE MESSAGE: line 1409: Blocked a frame with origin &quot;http://localhost:8800&quot; from accessing a frame with origin &quot;null&quot;.  The frame requesting access has a protocol of &quot;http&quot;, the frame being accessed has a protocol of &quot;data&quot;. Protocols must match.
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> FAIL The document for a standalone media file should have one child in the body. null is not an object (evaluating 'testframe.contentDocument.body')
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlbrowserswindowsnestedbrowsingcontextsframeElementsubexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.sub-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.sub-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.sub-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,7 +1,8 @@
</span><del>-CONSOLE MESSAGE: line 7: Blocked a frame with origin &quot;http://127.0.0.1:8800&quot; from accessing a frame with origin &quot;http://localhost:8800&quot;. Protocols, domains, and ports must match.
</del><span class="cx"> 
</span><ins>+Harness Error (TIMEOUT), message = null
+
</ins><span class="cx"> PASS The window's frameElement attribute must return its container element if it is a nested browsing context 
</span><del>-PASS The SecurityError must be thrown if the window accesses to frameElement attribute of a Window which does not have the same effective script origin 
-PASS The window's frameElement attribute must return null if the container's document does not have the same effective script origin 
</del><ins>+FAIL The SecurityError must be thrown if the window accesses to frameElement attribute of a Window which does not have the same effective script origin assert_throws: The SecurityError exception should be thrown. function &quot;function () { frames[1].frameElement; }&quot; did not throw
+TIMEOUT The window's frameElement attribute must return null if the container's document does not have the same effective script origin Test timed out
</ins><span class="cx"> PASS The window's frameElement attribute must return null if it is not a nested browsing context 
</span><span class="cx">         
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionclosingtheinputstreamdocumentclose01expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/closing-the-input-stream/document.close-01-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/closing-the-input-stream/document.close-01-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/closing-the-input-stream/document.close-01-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL document.close in XHTML assert_throws: document.close in XHTML should throw an INVALID_STATE_ERR  function &quot;function () {
</span><span class="cx">     document.close();
</span><del>-  }&quot; threw object &quot;TypeError: document.close is not a function. (In 'documen...&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</del><ins>+  }&quot; threw object &quot;TypeError: document.close is not a function. (In 'document.close()', 'document.close' is undefined)&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertiondocumentwritedocumentwrite01expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-write/document.write-01-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-write/document.write-01-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-write/document.write-01-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,5 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL document.write in XHTML assert_throws: document.write in XHTML should throw an INVALID_STATE_ERR  function &quot;function () {
</span><del>-    document.write(&quot;Failure: document.write...&quot; threw object &quot;TypeError: document.write is not a function. (In 'documen...&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</del><ins>+    document.write(&quot;Failure: document.write actually worked&quot;);
+  }&quot; threw object &quot;TypeError: document.write is not a function. (In 'document.write(&quot;Failure: document.write actually worked&quot;)', 'document.write' is undefined)&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertiondocumentwritelndocumentwriteln01expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-writeln/document.writeln-01-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-writeln/document.writeln-01-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/document-writeln/document.writeln-01-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,5 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL document.writeln in XHTML assert_throws: document.writeln in XHTML should throw an INVALID_STATE_ERR  function &quot;function () {
</span><del>-    document.writeln(&quot;Failure: document.wri...&quot; threw object &quot;TypeError: document.writeln is not a function. (In 'docum...&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</del><ins>+    document.writeln(&quot;Failure: document.writeln actually worked&quot;);
+  }&quot; threw object &quot;TypeError: document.writeln is not a function. (In 'document.writeln(&quot;Failure: document.writeln actually worked&quot;)', 'document.writeln' is undefined)&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionopeningtheinputstream010expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/010-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/010-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/010-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-#PID UNRESPONSIVE - com.apple.WebKit.WebContent.Development (pid 83529)
</del><ins>+#PID UNRESPONSIVE - com.apple.WebKit.WebContent.Development (pid 23342)
</ins><span class="cx"> FAIL: Timed out waiting for notifyDone to be called
</span><span class="cx"> 
</span><span class="cx"> #EOF
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionopeningtheinputstreamdocumentopen01expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-01-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-01-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-01-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL document.open in XHTML assert_throws: document.open in XHTML should throw an INVALID_STATE_ERR  function &quot;function () {
</span><span class="cx">     document.open();
</span><del>-  }&quot; threw object &quot;TypeError: document.open is not a function. (In 'document...&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</del><ins>+  }&quot; threw object &quot;TypeError: document.open is not a function. (In 'document.open()', 'document.open' is undefined)&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldomdynamicmarkupinsertionopeningtheinputstreamdocumentopen02expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-02-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-02-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/dynamic-markup-insertion/opening-the-input-stream/document.open-02-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,5 +1,6 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL document.open should redirect to window.open when called with three arguments assert_unreached: The call should be redirected to the real window.open Reached unreachable code
</span><span class="cx"> FAIL document.open should throw when it has no window and is called with three arguments assert_throws: function &quot;function () {
</span><del>-    doc.open(&quot;/resources/testharness.js&quot;, &quot;...&quot; did not throw
</del><ins>+    doc.open(&quot;/resources/testharness.js&quot;, &quot;&quot;, &quot;&quot;);
+  }&quot; did not throw
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldominterfacesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,10 +1,10 @@
</span><del>-CONSOLE MESSAGE: line 236: callback not yet supported
-CONSOLE MESSAGE: line 236: callback not yet supported
-CONSOLE MESSAGE: line 236: callback not yet supported
-CONSOLE MESSAGE: line 236: callback not yet supported
-CONSOLE MESSAGE: line 236: callback not yet supported
-CONSOLE MESSAGE: line 236: callback not yet supported
-CONSOLE MESSAGE: line 236: callback not yet supported
</del><ins>+CONSOLE MESSAGE: line 251: callback not yet supported
+CONSOLE MESSAGE: line 251: callback not yet supported
+CONSOLE MESSAGE: line 251: callback not yet supported
+CONSOLE MESSAGE: line 251: callback not yet supported
+CONSOLE MESSAGE: line 251: callback not yet supported
+CONSOLE MESSAGE: line 251: callback not yet supported
+CONSOLE MESSAGE: line 251: callback not yet supported
</ins><span class="cx"> HTML IDL tests
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldomreflectionembeddedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -19,19 +19,19 @@
</span><span class="cx"> CONSOLE MESSAGE: line 707: The language 'null' is not a valid BCP 47 language tag.
</span><span class="cx"> CONSOLE MESSAGE: line 707: The language 'test-toString' is not a valid BCP 47 language tag.
</span><span class="cx"> CONSOLE MESSAGE: line 707: The language 'test-valueOf' is not a valid BCP 47 language tag.
</span><del>-CONSOLE MESSAGE: line 1380: The language contains a null character and is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'undefined' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '7' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '1.5' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'true' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'false' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '[object Object]' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'Infinity' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '-Infinity' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language contains a null character and is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'null' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'test-toString' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'test-valueOf' is not a valid BCP 47 language tag.
</del><ins>+CONSOLE MESSAGE: line 1409: The language contains a null character and is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'undefined' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '7' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '1.5' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'true' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'false' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '[object Object]' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'Infinity' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '-Infinity' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language contains a null character and is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'null' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'test-toString' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'test-valueOf' is not a valid BCP 47 language tag.
</ins><span class="cx"> Implementers looking to fix bugs might want to use the original version of this suite's test framework, which conveniently aggregates similar errors and only reports failures. This file is (part of) the authoritative conformance test suite, and is suitable for incorporation into automated test suites.
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsdocumentmetadatathelinkelementdocumentwithoutbrowsingcontextexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-link-element/document-without-browsing-context-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-link-element/document-without-browsing-context-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-link-element/document-without-browsing-context-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><span class="cx"> 
</span><del>-FAIL Create a document, adopt the node assert_equals: expected &quot;1&quot; but got &quot;0&quot;
-FAIL Create a stylesheet in innerHTML document assert_equals: expected &quot;1&quot; but got &quot;0&quot;
</del><ins>+PASS Create a document, adopt the node 
+PASS Create a stylesheet in innerHTML document 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsdocumentmetadatathemetaelementpragmadirectivesattrmetahttpequivrefreshnotinshadowtreeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 2422: Error: assert_unreached: Got more than 1 load event Reached unreachable code
</del><ins>+CONSOLE MESSAGE: line 2451: Error: assert_unreached: Got more than 1 load event Reached unreachable code
</ins><span class="cx"> 
</span><span class="cx"> FAIL Meta refresh only applies while in the document tree, not in a shadow tree Error: assert_unreached: Got more than 1 load event Reached unreachable code
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsembeddedcontentmediaelementsinterfacesHTMLElementHTMLTrackElementsrclangexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,9 +1,9 @@
</span><span class="cx"> CONSOLE MESSAGE: line 43: The language contains a null character and is not a valid BCP 47 language tag.
</span><span class="cx"> CONSOLE MESSAGE: line 64: The language ' foo 
</span><span class="cx"> ' is not a valid BCP 47 language tag.
</span><del>-CONSOLE MESSAGE: line 1380: The language ' foo 
</del><ins>+CONSOLE MESSAGE: line 1409: The language ' foo 
</ins><span class="cx"> ' is not a valid BCP 47 language tag.
</span><del>-CONSOLE MESSAGE: line 1380: The language contains a null character and is not a valid BCP 47 language tag.
</del><ins>+CONSOLE MESSAGE: line 1409: The language contains a null character and is not a valid BCP 47 language tag.
</ins><span class="cx"> 
</span><span class="cx"> PASS HTMLTrackElement.srclang missing value 
</span><span class="cx"> PASS HTMLTrackElement.srclang empty string content attribute 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsembeddedcontentmediaelementsinterfacesTextTracklanguageexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TextTrack/language-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TextTrack/language-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TextTrack/language-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 1380: The language contains a null character and is not a valid BCP 47 language tag.
</del><ins>+CONSOLE MESSAGE: line 1409: The language contains a null character and is not a valid BCP 47 language tag.
</ins><span class="cx"> CONSOLE MESSAGE: line 26: The language contains a null character and is not a valid BCP 47 language tag.
</span><span class="cx"> 
</span><span class="cx"> PASS TextTrack.language 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsembeddedcontenttheimgelementenvironmentchangesviewportchangeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -3,7 +3,7 @@
</span><span class="cx"> 
</span><span class="cx"> PASS img (no src), onload, narrow 
</span><span class="cx"> PASS img (no src), resize to wide 
</span><del>-FAIL img (empty src), onload, narrow assert_equals: expected &quot;&quot; but got &quot;http://localhost:8800/html/semantics/embedded-content/the-img-element/environment-changes/iframed.sub.html?id=be66a72b-5cfb-43ca-a2eb-cdefb02fab7a&quot;
</del><ins>+FAIL img (empty src), onload, narrow assert_equals: expected &quot;&quot; but got &quot;http://localhost:8800/html/semantics/embedded-content/the-img-element/environment-changes/iframed.sub.html?id=4fceefe3-a188-42e1-a0de-f0ef3c45c766&quot;
</ins><span class="cx"> PASS img (empty src), resize to wide 
</span><span class="cx"> PASS img (src only) broken image, onload, narrow 
</span><span class="cx"> PASS img (src only) broken image, resize to wide 
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> FAIL picture: same URL in source (max-width:500px) and img, resize to wide assert_unreached: Got unexpected load event Reached unreachable code
</span><span class="cx"> PASS img (no src), onload, wide 
</span><span class="cx"> PASS img (no src), resize to narrow 
</span><del>-FAIL img (empty src), onload, wide assert_equals: expected &quot;&quot; but got &quot;http://localhost:8800/html/semantics/embedded-content/the-img-element/environment-changes/iframed.sub.html?id=0bbe45b0-ade2-4f85-8ade-697e62732529&quot;
</del><ins>+FAIL img (empty src), onload, wide assert_equals: expected &quot;&quot; but got &quot;http://localhost:8800/html/semantics/embedded-content/the-img-element/environment-changes/iframed.sub.html?id=6167c066-e03b-464d-93c0-37df45222827&quot;
</ins><span class="cx"> PASS img (empty src), resize to narrow 
</span><span class="cx"> PASS img (src only) broken image, onload, wide 
</span><span class="cx"> PASS img (src only) broken image, resize to narrow 
</span><span class="lines">@@ -35,13 +35,13 @@
</span><span class="cx"> PASS img (srcset 1 cand) broken image, resize to narrow 
</span><span class="cx"> PASS img (srcset 1 cand) valid image, onload, wide 
</span><span class="cx"> PASS img (srcset 1 cand) valid image, resize to narrow 
</span><del>-FAIL picture: source (max-width:500px) broken image, img broken image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/broken.png?71-0bbe45b0-ade2-4f85-8ade-697e62732529&quot; but got &quot;http://localhost:8800/images/broken.png?70-0bbe45b0-ade2-4f85-8ade-697e62732529&quot;
</del><ins>+FAIL picture: source (max-width:500px) broken image, img broken image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/broken.png?71-6167c066-e03b-464d-93c0-37df45222827&quot; but got &quot;http://localhost:8800/images/broken.png?70-6167c066-e03b-464d-93c0-37df45222827&quot;
</ins><span class="cx"> TIMEOUT picture: source (max-width:500px) broken image, img broken image, resize to narrow Test timed out
</span><del>-FAIL picture: source (max-width:500px) broken image, img valid image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/green-2x2.png?81-0bbe45b0-ade2-4f85-8ade-697e62732529&quot; but got &quot;http://localhost:8800/images/broken.png?80-0bbe45b0-ade2-4f85-8ade-697e62732529&quot;
</del><ins>+FAIL picture: source (max-width:500px) broken image, img valid image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/green-2x2.png?81-6167c066-e03b-464d-93c0-37df45222827&quot; but got &quot;http://localhost:8800/images/broken.png?80-6167c066-e03b-464d-93c0-37df45222827&quot;
</ins><span class="cx"> TIMEOUT picture: source (max-width:500px) broken image, img valid image, resize to narrow Test timed out
</span><del>-FAIL picture: source (max-width:500px) valid image, img broken image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/broken.png?91-0bbe45b0-ade2-4f85-8ade-697e62732529&quot; but got &quot;http://localhost:8800/images/green-1x1.png?90-0bbe45b0-ade2-4f85-8ade-697e62732529&quot;
</del><ins>+FAIL picture: source (max-width:500px) valid image, img broken image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/broken.png?91-6167c066-e03b-464d-93c0-37df45222827&quot; but got &quot;http://localhost:8800/images/green-1x1.png?90-6167c066-e03b-464d-93c0-37df45222827&quot;
</ins><span class="cx"> TIMEOUT picture: source (max-width:500px) valid image, img broken image, resize to narrow Test timed out
</span><del>-FAIL picture: source (max-width:500px) valid image, img valid image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/green-2x2.png?101-0bbe45b0-ade2-4f85-8ade-697e62732529&quot; but got &quot;http://localhost:8800/images/green-1x1.png?100-0bbe45b0-ade2-4f85-8ade-697e62732529&quot;
</del><ins>+FAIL picture: source (max-width:500px) valid image, img valid image, onload, wide assert_equals: expected &quot;http://localhost:8800/images/green-2x2.png?101-6167c066-e03b-464d-93c0-37df45222827&quot; but got &quot;http://localhost:8800/images/green-1x1.png?100-6167c066-e03b-464d-93c0-37df45222827&quot;
</ins><span class="cx"> TIMEOUT picture: source (max-width:500px) valid image, img valid image, resize to narrow Test timed out
</span><span class="cx"> PASS picture: same URL in source (max-width:500px) and img, onload, wide 
</span><span class="cx"> PASS picture: same URL in source (max-width:500px) and img, resize to narrow 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsformsformsubmission0urlencodedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/forms/form-submission-0/url-encoded-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/forms/form-submission-0/url-encoded-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/forms/form-submission-0/url-encoded-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -2,5 +2,5 @@
</span><span class="cx"> 
</span><span class="cx"> PASS text.simple 
</span><span class="cx"> PASS textarea.simple 
</span><del>-FAIL nokeygen.simple assert_equals: expected &quot;foo=barb&quot; but got &quot;foo=barb&amp;=MIICQTCCASkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAKolMWpMDjDhmhvM%2BiH6BzrRtB2QiXxhpzH0PBs%2FPA%2B7DBg8Nrg33PH8BawapYzK0MZMA0biC3bnI4X%2F3y4SvgB8InNLR%2FpEE4QuTIwFrNX%2FSNZu6Bt9JSXbjKMZ073XGjUfBVotI9PfyTX4vkFoYSZllZy2wy0wDQCfNKFni5ORYHU%2FxrVnjuegGySZ80vESS65pWdgw8cUWqnWrK%2FkRb%2Bz0egAtGA274gFUuCb%2FG0EQ83%2BVEbwGNSI9NA7E4NmtVtIDXWeqhcNqCIJRKFf5wfFgVriVFxnF5rXlp9FT%2FvWZFJDf7D2GhDrdmsHQ53IyvdtNa%2FxUHIBLIKdXRWa%2FAgMBAAEWAQAwDQYJKoZIhvcNAQEEBQADggEBABkeZ0kaPY%2FzWFt6IXQ5h1eQR%2BxO8eUpe3Wr53PNydidCWK0waHqgorGDQsGV4Vaj6e%2BF2K8HZ4CDU34N710tW8T6DrJ0HWteWlaphLuoE5BecsvpB8YEkM3KbNJYPcuVlhraj177XbiPEuwFRpyqdKatxtmh%2Flj6E0eXKaKGOZKT9ICPpPSkZKDLR1jDGx5vnPNnA44IYHm75mGDQ12lXTuxLum8sUPNJVmD6iv9l4ZshWeEi6HRrCtIwp%2BfrY5r%2F4BjGt63igsZjj6QyuHHxg%2F%2FBymsO%2B4rhWUS3QVVtwT27qPobRaIvz9ZVB3WqTyHCo97W7Qa1yuIWVhALpkALw%3D&quot;
</del><ins>+FAIL nokeygen.simple assert_equals: expected &quot;foo=barb&quot; but got &quot;foo=barb&amp;=MIICQTCCASkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUQG7OUET%2BonWyar%2BS%2Bu6sZraJSp7Z165cAcpCXJfswpnSETvI8TnamSmO4Y5jZkavWxDxhoztrM4Q5c72Uufqx4aay9wmWEYlj7ytorSuCkG8tbKQEGWLh%2Fm2M5l3B4Lvz4PTka73%2BzJxm%2FeDyXAKkp1efF9QTOdsAMMQJpoLikxx%2BlFfLGgbqKp5RRYneOUx9d4lpDhW8PnaWdm19TL3RgZaKhvJOcAtrCoeW%2B%2F54zGhjhWeHVCZC%2B%2FsHsrjnDcuNiCC%2FtkCi9PzhZoPVikx4RLS4ws9hWTRnD%2BSaAXAGTbiPBbyTHWTnG6%2Ff8gTu88j0Pr34gfQExjHKUDfka7tAgMBAAEWAQAwDQYJKoZIhvcNAQEEBQADggEBAM6%2FQV3%2BvdaBxTuvl3QR6OQHHRGtCmnfnRzENK%2FjIUUBSJVJJl3BqwiD7G7few7LoCIdGR3EpZUB6QmOQzMcMBi7ymOAyyx7iw%2F2iZjUooxUOLTvAspHRmsTYAG9VtHYzVZgRKOhypFftcdqRhWliXNW2X254eVW2YWpP5hT%2Fartbqjd7Tv7jN5lLuKmTxTI35JiHw7L8jRdIBgP5G0bu2EG8Fvk7%2FbqVlhdlyHg7XJD6CsB0pU%2FXj3mor7DtTLZ9rwifu3b7Ib%2F03Ak9OArav4KxMo7gb7gagFgjStt9WXVSUsa%2BedrfezVccWCT6ZFDVEJii0zBl2d9FQKRunonPk%3D&quot;
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsinteractiveelementsthedialogelementdialogshowModalexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -2,10 +2,12 @@
</span><span class="cx"> FAIL dialog element: showModal() assert_false: expected false got undefined
</span><span class="cx"> FAIL showModal() on a &lt;dialog&gt; that already has an open attribute throws an InvalidStateError exception assert_throws: function &quot;function () {
</span><span class="cx">       d2.showModal();
</span><del>-      this.add_cleanu...&quot; threw object &quot;TypeError: d2.showModal is not a function. (In 'd2.showMo...&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</del><ins>+      this.add_cleanup(function() { d2.close(); });
+    }&quot; threw object &quot;TypeError: d2.showModal is not a function. (In 'd2.showModal()', 'd2.showModal' is undefined)&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</ins><span class="cx"> FAIL showModal() on a &lt;dialog&gt; not in a Document throws an InvalidStateError exception assert_throws: function &quot;function () {
</span><span class="cx">       d.showModal();
</span><del>-      this.add_cleanup...&quot; threw object &quot;TypeError: d.showModal is not a function. (In 'd.showModa...&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</del><ins>+      this.add_cleanup(function() { d.close(); });
+    }&quot; threw object &quot;TypeError: d.showModal is not a function. (In 'd.showModal()', 'd.showModal' is undefined)&quot; that is not a DOMException INVALID_STATE_ERR: property &quot;code&quot; is equal to undefined, expected 11
</ins><span class="cx"> FAIL when opening multiple dialogs, only the newest one is non-inert assert_false: expected false got undefined
</span><span class="cx"> FAIL opening dialog without focusable children assert_false: expected false got undefined
</span><span class="cx"> FAIL opening dialog with multiple focusable children assert_false: expected false got undefined
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisanimationframesidlharnessexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/animation-frames/idlharness-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/animation-frames/idlharness-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/animation-frames/idlharness-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 236: callback not yet supported
</del><ins>+CONSOLE MESSAGE: line 251: callback not yet supported
</ins><span class="cx"> idlharness test
</span><span class="cx"> 
</span><span class="cx"> This test validates the WebIDL included in the Timing control for script-based animations specification.
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisatobbase64expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/atob/base64-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/atob/base64-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/atob/base64-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -280,8 +280,8 @@
</span><span class="cx"> PASS btoa(&quot;Ā&quot;) must raise INVALID_CHARACTER_ERR 
</span><span class="cx"> PASS btoa(&quot;ā&quot;) must raise INVALID_CHARACTER_ERR 
</span><span class="cx"> PASS btoa(&quot;✐&quot;) must raise INVALID_CHARACTER_ERR 
</span><del>-PASS btoa(&quot;￾&quot;) must raise INVALID_CHARACTER_ERR 
-PASS btoa(&quot;\x{FFFF}&quot;) must raise INVALID_CHARACTER_ERR 
</del><ins>+PASS btoa(&quot;\ufffe&quot;) must raise INVALID_CHARACTER_ERR 
+PASS btoa(&quot;\uffff&quot;) must raise INVALID_CHARACTER_ERR 
</ins><span class="cx"> PASS btoa(&quot;𐀀&quot;) must raise INVALID_CHARACTER_ERR 
</span><span class="cx"> PASS btoa(first 256 code points concatenated) 
</span><span class="cx"> PASS atob(&quot;&quot;) == &quot;&quot; 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisscriptingeventsmessageeventconstructorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -5,6 +5,7 @@
</span><span class="cx"> FAIL ports attribute should be a FrozenArray assert_true: ev.ports should return the same object expected true got false
</span><span class="cx"> PASS initMessageEvent operation 
</span><span class="cx"> FAIL Passing null for ports parameter to initMessageEvent assert_throws: function &quot;function () {
</span><del>-    ev.initMessageEvent(&quot;test&quot;, true, false...&quot; did not throw
</del><ins>+    ev.initMessageEvent(&quot;test&quot;, true, false, &quot;testData&quot;, &quot;testOrigin&quot;, &quot;testId&quot;, window, null)
+  }&quot; did not throw
</ins><span class="cx"> FAIL All parameters to initMessageEvent should be mandatory assert_equals: MessageEvent.prototype.initMessageEvent.length should be 8 expected 8 but got 0
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapisscriptingeventsmessageeventconstructorhttpsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -5,7 +5,8 @@
</span><span class="cx"> FAIL ports attribute should be a FrozenArray assert_true: ev.ports should return the same object expected true got false
</span><span class="cx"> PASS initMessageEvent operation 
</span><span class="cx"> FAIL Passing null for ports parameter to initMessageEvent assert_throws: function &quot;function () {
</span><del>-    ev.initMessageEvent(&quot;test&quot;, true, false...&quot; did not throw
</del><ins>+    ev.initMessageEvent(&quot;test&quot;, true, false, &quot;testData&quot;, &quot;testOrigin&quot;, &quot;testId&quot;, window, null)
+  }&quot; did not throw
</ins><span class="cx"> FAIL All parameters to initMessageEvent should be mandatory assert_equals: MessageEvent.prototype.initMessageEvent.length should be 8 expected 8 but got 0
</span><span class="cx"> FAIL Passing ServiceWorker for source member undefined is not an object (evaluating 'navigator.serviceWorker.getRegistration')
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapissystemstateandcapabilitiesthenavigatorobjectcontentexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -10,20 +10,20 @@
</span><span class="cx"> FAIL a URL with the passed string as a directory name should work navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/bar/baz/', 'foo')', 'navigator.registerContentHandler' is undefined)
</span><span class="cx"> FAIL a URL with the passed string as a directory name followed by a query string and fragment identifier should work navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/bar/baz/?foo=1337&amp;bar#baz', 'foo')', 'navigator.registerContentHandler' is undefined)
</span><span class="cx"> FAIL a URL with the passed string included twice should work navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/foo/%s/', 'foo')', 'navigator.registerContentHandler' is undefined)
</span><del>-FAIL an empty url argument should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL %s instead of domain name should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL %s instead of subdomain name should throw syntax_err assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument pointing to a different domain name, without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument without %s (but with %) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument without %s (but with %a) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument pointing to a different domain name should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (2) assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (3) assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-un...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the image/jpeg MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the text/html MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the text/javascript MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the text/plain MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[...&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a func...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
</del><ins>+FAIL an empty url argument should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', '', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', '', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL %s instead of domain name should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', 'http://%s.com', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', 'http://%s.com', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL %s instead of subdomain name should throw syntax_err assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', 'http://%s.example.com', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', 'http://%s.example.com', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', location.href + '', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument pointing to a different domain name, without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', 'http://example.com', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', 'http://example.com', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument without %s (but with %) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '/%', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', location.href + '/%', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument without %s (but with %a) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', location.href + '/%a', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument pointing to a different domain name should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', 'http://example.com/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', 'http://example.com/%s', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (2) assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', 'https://example.com/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', 'https://example.com/%s', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (3) assert_throws: function &quot;function () { navigator.registerContentHandler('text/x-unknown-type', 'http://foobar.example.com/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler('text/x-unknown-type', 'http://foobar.example.com/%s', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the image/jpeg MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the text/html MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the text/javascript MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the text/plain MIME type should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerContentHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
</ins><span class="cx"> FAIL overriding the application/atom+xml MIME type should work navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler(whitelist[wi], location.href + '/%s', 'foo')', 'navigator.registerContentHandler' is undefined)
</span><span class="cx"> FAIL overriding the application/rss+xml MIME type should work navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler(whitelist[wi], location.href + '/%s', 'foo')', 'navigator.registerContentHandler' is undefined)
</span><span class="cx"> FAIL overriding the application/x-unrecognized MIME type should work navigator.registerContentHandler is not a function. (In 'navigator.registerContentHandler(whitelist[wi], location.href + '/%s', 'foo')', 'navigator.registerContentHandler' is undefined)
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlwebappapissystemstateandcapabilitiesthenavigatorobjectprotocolexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -10,53 +10,53 @@
</span><span class="cx"> FAIL a URL with the passed string as a directory name should work navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('tel', location.href + '/%s/bar/baz/', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span><span class="cx"> FAIL a URL with the passed string as a directory name followed by a query string and fragment identifier should work navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('tel', location.href + '/%s/bar/baz/?foo=1337&amp;bar#baz', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span><span class="cx"> FAIL a URL with the passed string included twice should work navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('tel', location.href + '/%s/foo/%s/', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span><del>-FAIL an empty url argument should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL %s instead of domain name should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL %s instead of subdomain name should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument pointing to a different domain name, without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument without %s (but with %) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument without %s (but with %a) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a url argument pointing to a different domain name should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (2) assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (3) assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL looping handlers should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL a url argument pointing to a non-http[s] scheme should throw SECURITY_ERR due to not being of the same origin assert_throws: function &quot;function () { navigator.registerProtocolHandler('sms', 't...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL a protocol argument containing an unrecognized scheme should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('unrecogn...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a protocol argument containing : should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto:'...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a protocol argument containing :// should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto:/...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a protocol argument containing http:// should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('http://'...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a protocol argument containing a null character should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto' ...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a protocol argument containing a backspace character should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailtoo'...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a protocol argument containing a LF character should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto' ...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
-FAIL a protocol argument containing non-alphanumeric characters (like a cyrillic “а”) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mаilto',...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
</del><ins>+FAIL an empty url argument should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', '', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', '', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL %s instead of domain name should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', 'http://%s.com', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', 'http://%s.com', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL %s instead of subdomain name should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', 'http://%s.example.com', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', 'http://%s.example.com', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', location.href + '', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', location.href + '', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument pointing to a different domain name, without %s should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', 'http://example.com', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', 'http://example.com', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument without %s (but with %) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', location.href + '/%', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', location.href + '/%', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument without %s (but with %a) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a url argument pointing to a different domain name should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', 'http://example.com/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', 'http://example.com/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (2) assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', 'https://example.com/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', 'https://example.com/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL a url argument pointing to a different domain name should throw SECURITY_ERR (3) assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', 'http://foobar.example.com/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', 'http://foobar.example.com/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL looping handlers should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto', 'mailto:%s@example.com', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto', 'mailto:%s@example.com', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL a url argument pointing to a non-http[s] scheme should throw SECURITY_ERR due to not being of the same origin assert_throws: function &quot;function () { navigator.registerProtocolHandler('sms', 'tel:%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('sms', 'tel:%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL a protocol argument containing an unrecognized scheme should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('unrecognized', location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('unrecognized', location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a protocol argument containing : should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto:', location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto:', location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a protocol argument containing :// should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto://', location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto://', location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a protocol argument containing http:// should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('http://', location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('http://', location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a protocol argument containing a null character should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto' + String.fromCharCode(0), location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto' + String.fromCharCode(0), location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a protocol argument containing a backspace character should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailtoo' + String.fromCharCode(8), location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailtoo' + String.fromCharCode(8), location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a protocol argument containing a LF character should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mailto' + String.fromCharCode(10), location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mailto' + String.fromCharCode(10), location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
+FAIL a protocol argument containing non-alphanumeric characters (like a cyrillic “а”) should throw SYNTAX_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler('mаilto', location.href + '/%a', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('mаilto', location.href + '/%a', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SYNTAX_ERR: property &quot;code&quot; is equal to undefined, expected 12
</ins><span class="cx"> FAIL a protocol argument of “TEL” should be equivalent to “tel” navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('TEL', location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span><span class="cx"> FAIL a protocol argument of “teL” should be equivalent to “tel” navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler('teL', location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span><del>-FAIL attempting to override the about protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the attachment protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the blob protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the chrome protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the cid protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the data protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the file protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the ftp protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the http protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the https protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the javascript protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the livescript protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the mid protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the mocha protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the opera protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the operamail protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the res protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the resource protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the shttp protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the tcl protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the vbscript protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the view-source protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the ws protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the wss protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
-FAIL attempting to override the wyciwyg protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist...&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a fun...&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
</del><ins>+FAIL attempting to override the about protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the attachment protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the blob protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the chrome protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the cid protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the data protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the file protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the ftp protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the http protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the https protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the javascript protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the livescript protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the mid protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the mocha protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the opera protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the operamail protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the res protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the resource protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the shttp protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the tcl protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the vbscript protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the view-source protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the ws protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the wss protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
+FAIL attempting to override the wyciwyg protocol should throw SECURITY_ERR assert_throws: function &quot;function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') }&quot; threw object &quot;TypeError: navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)&quot; that is not a DOMException SECURITY_ERR: property &quot;code&quot; is equal to undefined, expected 18
</ins><span class="cx"> FAIL overriding the geo protocol should work navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(whitelist[wi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span><span class="cx"> FAIL overriding the im protocol should work navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(whitelist[wi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span><span class="cx"> FAIL overriding the irc protocol should work navigator.registerProtocolHandler is not a function. (In 'navigator.registerProtocolHandler(whitelist[wi], location.href + '/%s', 'foo')', 'navigator.registerProtocolHandler' is undefined)
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcetimingresourcetimingexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/resource-timing-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/resource-timing-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resource-timing/resource-timing-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,20 +1,20 @@
</span><span class="cx"> 
</span><del>-FAIL No timeline entry for about:blank assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL Setting 'document.domain' does not effect same-origin checks assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'iframe (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'iframe (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'xmlhttprequest (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'xmlhttprequest (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'script (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'script (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'link (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'link (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'iframe: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'xmlhttprequest: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'script: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'link: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'iframe (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'xmlhttprequest (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'script (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
-FAIL 'link (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: fetchStart &lt;= domainLookupStart expected a number less than or equal to 0 but got 20.505000000000003
</del><ins>+FAIL No timeline entry for about:blank assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL Setting 'document.domain' does not effect same-origin checks assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'iframe (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'iframe (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'xmlhttprequest (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'xmlhttprequest (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'script (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'script (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'link (Populate cache): The initial request populates the cache (if appropriate). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'link (Potentially Cached): Immediately fetch the same URL, exercising the cache hit path (if any). assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'iframe: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'xmlhttprequest: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'script: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'link: 1 second delay before 'responseStart', another 1 second delay before 'responseEnd'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'iframe (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'xmlhttprequest (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'script (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
+FAIL 'link (Redirected): 1 second delay before 'redirectEnd', another 1 second delay before 'responseStart'. assert_less_than_equal: connectEnd &lt;= requestStart expected a number less than or equal to 0 but got 17.9
</ins><span class="cx"> Show details
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcesLICENSE"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/LICENSE (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/LICENSE                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/LICENSE        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+W3C 3-clause BSD License
+
+http://www.w3.org/Consortium/Legal/2008/03-bsd-license.html
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of works must retain the original copyright notice,
+  this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the original copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+* Neither the name of the W3C nor the names of its contributors may be
+  used to endorse or promote products derived from this work without
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+&quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcesidlharnessjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/idlharness.js (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/idlharness.js                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/idlharness.js        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,1968 @@
</span><ins>+/*
+Distributed under both the W3C Test Suite License [1] and the W3C
+3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
+policies and contribution forms [3].
+
+[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+[3] http://www.w3.org/2004/10/27-testcases
+*/
+
+/* For user documentation see docs/idlharness.md */
+
+/**
+ * Notes for people who want to edit this file (not just use it as a library):
+ *
+ * Most of the interesting stuff happens in the derived classes of IdlObject,
+ * especially IdlInterface.  The entry point for all IdlObjects is .test(),
+ * which is called by IdlArray.test().  An IdlObject is conceptually just
+ * &quot;thing we want to run tests on&quot;, and an IdlArray is an array of IdlObjects
+ * with some additional data thrown in.
+ *
+ * The object model is based on what WebIDLParser.js produces, which is in turn
+ * based on its pegjs grammar.  If you want to figure out what properties an
+ * object will have from WebIDLParser.js, the best way is to look at the
+ * grammar:
+ *
+ *   https://github.com/darobin/webidl.js/blob/master/lib/grammar.peg
+ *
+ * So for instance:
+ *
+ *   // interface definition
+ *   interface
+ *       =   extAttrs:extendedAttributeList? S? &quot;interface&quot; S name:identifier w herit:ifInheritance? w &quot;{&quot; w mem:ifMember* w &quot;}&quot; w &quot;;&quot; w
+ *           { return { type: &quot;interface&quot;, name: name, inheritance: herit, members: mem, extAttrs: extAttrs }; }
+ *
+ * This means that an &quot;interface&quot; object will have a .type property equal to
+ * the string &quot;interface&quot;, a .name property equal to the identifier that the
+ * parser found, an .inheritance property equal to either null or the result of
+ * the &quot;ifInheritance&quot; production found elsewhere in the grammar, and so on.
+ * After each grammatical production is a JavaScript function in curly braces
+ * that gets called with suitable arguments and returns some JavaScript value.
+ *
+ * (Note that the version of WebIDLParser.js we use might sometimes be
+ * out-of-date or forked.)
+ *
+ * The members and methods of the classes defined by this file are all at least
+ * briefly documented, hopefully.
+ */
+(function(){
+&quot;use strict&quot;;
+/// Helpers ///
+function constValue (cnt)
+//@{
+{
+    if (cnt.type === &quot;null&quot;) return null;
+    if (cnt.type === &quot;NaN&quot;) return NaN;
+    if (cnt.type === &quot;Infinity&quot;) return cnt.negative ? -Infinity : Infinity;
+    return cnt.value;
+}
+
+//@}
+function minOverloadLength(overloads)
+//@{
+{
+    if (!overloads.length) {
+        return 0;
+    }
+
+    return overloads.map(function(attr) {
+        return attr.arguments ? attr.arguments.filter(function(arg) {
+            return !arg.optional &amp;&amp; !arg.variadic;
+        }).length : 0;
+    })
+    .reduce(function(m, n) { return Math.min(m, n); });
+}
+
+//@}
+function throwOrReject(a_test, operation, fn, obj, args,  message, cb)
+//@{
+{
+    if (operation.idlType.generic !== &quot;Promise&quot;) {
+        assert_throws(new TypeError(), function() {
+            fn.apply(obj, args);
+        }, message);
+        cb();
+    } else {
+        try {
+            promise_rejects(a_test, new TypeError(), fn.apply(obj, args)).then(cb, cb);
+        } catch (e){
+            a_test.step(function() {
+                assert_unreached(&quot;Throws \&quot;&quot; + e + &quot;\&quot; instead of rejecting promise&quot;);
+                cb();
+            });
+        }
+    }
+}
+
+//@}
+function awaitNCallbacks(n, cb, ctx)
+//@{
+{
+    var counter = 0;
+    return function() {
+        counter++;
+        if (counter &gt;= n) {
+            cb();
+        }
+    };
+}
+
+//@}
+var fround =
+//@{
+(function(){
+    if (Math.fround) return Math.fround;
+
+    var arr = new Float32Array(1);
+    return function fround(n) {
+        arr[0] = n;
+        return arr[0];
+    };
+})();
+//@}
+
+/// IdlArray ///
+// Entry point
+self.IdlArray = function()
+//@{
+{
+    /**
+     * A map from strings to the corresponding named IdlObject, such as
+     * IdlInterface or IdlException.  These are the things that test() will run
+     * tests on.
+     */
+    this.members = {};
+
+    /**
+     * A map from strings to arrays of strings.  The keys are interface or
+     * exception names, and are expected to also exist as keys in this.members
+     * (otherwise they'll be ignored).  This is populated by add_objects() --
+     * see documentation at the start of the file.  The actual tests will be
+     * run by calling this.members[name].test_object(obj) for each obj in
+     * this.objects[name].  obj is a string that will be eval'd to produce a
+     * JavaScript value, which is supposed to be an object implementing the
+     * given IdlObject (interface, exception, etc.).
+     */
+    this.objects = {};
+
+    /**
+     * When adding multiple collections of IDLs one at a time, an earlier one
+     * might contain a partial interface or implements statement that depends
+     * on a later one.  Save these up and handle them right before we run
+     * tests.
+     *
+     * .partials is simply an array of objects from WebIDLParser.js'
+     * &quot;partialinterface&quot; production.  .implements maps strings to arrays of
+     * strings, such that
+     *
+     *   A implements B;
+     *   A implements C;
+     *   D implements E;
+     *
+     * results in { A: [&quot;B&quot;, &quot;C&quot;], D: [&quot;E&quot;] }.
+     */
+    this.partials = [];
+    this[&quot;implements&quot;] = {};
+};
+
+//@}
+IdlArray.prototype.add_idls = function(raw_idls)
+//@{
+{
+    /** Entry point.  See documentation at beginning of file. */
+    this.internal_add_idls(WebIDL2.parse(raw_idls));
+};
+
+//@}
+IdlArray.prototype.add_untested_idls = function(raw_idls)
+//@{
+{
+    /** Entry point.  See documentation at beginning of file. */
+    var parsed_idls = WebIDL2.parse(raw_idls);
+    for (var i = 0; i &lt; parsed_idls.length; i++)
+    {
+        parsed_idls[i].untested = true;
+        if (&quot;members&quot; in parsed_idls[i])
+        {
+            for (var j = 0; j &lt; parsed_idls[i].members.length; j++)
+            {
+                parsed_idls[i].members[j].untested = true;
+            }
+        }
+    }
+    this.internal_add_idls(parsed_idls);
+};
+
+//@}
+IdlArray.prototype.internal_add_idls = function(parsed_idls)
+//@{
+{
+    /**
+     * Internal helper called by add_idls() and add_untested_idls().
+     * parsed_idls is an array of objects that come from WebIDLParser.js's
+     * &quot;definitions&quot; production.  The add_untested_idls() entry point
+     * additionally sets an .untested property on each object (and its
+     * .members) so that they'll be skipped by test() -- they'll only be
+     * used for base interfaces of tested interfaces, return types, etc.
+     */
+    parsed_idls.forEach(function(parsed_idl)
+    {
+        if (parsed_idl.type == &quot;interface&quot; &amp;&amp; parsed_idl.partial)
+        {
+            this.partials.push(parsed_idl);
+            return;
+        }
+
+        if (parsed_idl.type == &quot;implements&quot;)
+        {
+            if (!(parsed_idl.target in this[&quot;implements&quot;]))
+            {
+                this[&quot;implements&quot;][parsed_idl.target] = [];
+            }
+            this[&quot;implements&quot;][parsed_idl.target].push(parsed_idl[&quot;implements&quot;]);
+            return;
+        }
+
+        parsed_idl.array = this;
+        if (parsed_idl.name in this.members)
+        {
+            throw &quot;Duplicate identifier &quot; + parsed_idl.name;
+        }
+        switch(parsed_idl.type)
+        {
+        case &quot;interface&quot;:
+            this.members[parsed_idl.name] =
+                new IdlInterface(parsed_idl, /* is_callback = */ false);
+            break;
+
+        case &quot;dictionary&quot;:
+            // Nothing to test, but we need the dictionary info around for type
+            // checks
+            this.members[parsed_idl.name] = new IdlDictionary(parsed_idl);
+            break;
+
+        case &quot;typedef&quot;:
+            this.members[parsed_idl.name] = new IdlTypedef(parsed_idl);
+            break;
+
+        case &quot;callback&quot;:
+            // TODO
+            console.log(&quot;callback not yet supported&quot;);
+            break;
+
+        case &quot;enum&quot;:
+            this.members[parsed_idl.name] = new IdlEnum(parsed_idl);
+            break;
+
+        case &quot;callback interface&quot;:
+            this.members[parsed_idl.name] =
+                new IdlInterface(parsed_idl, /* is_callback = */ true);
+            break;
+
+        default:
+            throw parsed_idl.name + &quot;: &quot; + parsed_idl.type + &quot; not yet supported&quot;;
+        }
+    }.bind(this));
+};
+
+//@}
+IdlArray.prototype.add_objects = function(dict)
+//@{
+{
+    /** Entry point.  See documentation at beginning of file. */
+    for (var k in dict)
+    {
+        if (k in this.objects)
+        {
+            this.objects[k] = this.objects[k].concat(dict[k]);
+        }
+        else
+        {
+            this.objects[k] = dict[k];
+        }
+    }
+};
+
+//@}
+IdlArray.prototype.prevent_multiple_testing = function(name)
+//@{
+{
+    /** Entry point.  See documentation at beginning of file. */
+    this.members[name].prevent_multiple_testing = true;
+};
+
+//@}
+IdlArray.prototype.recursively_get_implements = function(interface_name)
+//@{
+{
+    /**
+     * Helper function for test().  Returns an array of things that implement
+     * interface_name, so if the IDL contains
+     *
+     *   A implements B;
+     *   B implements C;
+     *   B implements D;
+     *
+     * then recursively_get_implements(&quot;A&quot;) should return [&quot;B&quot;, &quot;C&quot;, &quot;D&quot;].
+     */
+    var ret = this[&quot;implements&quot;][interface_name];
+    if (ret === undefined)
+    {
+        return [];
+    }
+    for (var i = 0; i &lt; this[&quot;implements&quot;][interface_name].length; i++)
+    {
+        ret = ret.concat(this.recursively_get_implements(ret[i]));
+        if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i]))
+        {
+            throw &quot;Circular implements statements involving &quot; + ret[i];
+        }
+    }
+    return ret;
+};
+
+function exposed_in(globals) {
+    if ('document' in self) {
+        return globals.indexOf(&quot;Window&quot;) &gt;= 0;
+    }
+    if ('DedicatedWorkerGlobalScope' in self &amp;&amp;
+        self instanceof DedicatedWorkerGlobalScope) {
+        return globals.indexOf(&quot;Worker&quot;) &gt;= 0 ||
+               globals.indexOf(&quot;DedicatedWorker&quot;) &gt;= 0;
+    }
+    if ('SharedWorkerGlobalScope' in self &amp;&amp;
+        self instanceof SharedWorkerGlobalScope) {
+        return globals.indexOf(&quot;Worker&quot;) &gt;= 0 ||
+               globals.indexOf(&quot;SharedWorker&quot;) &gt;= 0;
+    }
+    if ('ServiceWorkerGlobalScope' in self &amp;&amp;
+        self instanceof ServiceWorkerGlobalScope) {
+        return globals.indexOf(&quot;Worker&quot;) &gt;= 0 ||
+               globals.indexOf(&quot;ServiceWorker&quot;) &gt;= 0;
+    }
+    throw &quot;Unexpected global object&quot;;
+}
+
+//@}
+IdlArray.prototype.test = function()
+//@{
+{
+    /** Entry point.  See documentation at beginning of file. */
+
+    // First merge in all the partial interfaces and implements statements we
+    // encountered.
+    this.partials.forEach(function(parsed_idl)
+    {
+        if (!(parsed_idl.name in this.members)
+        || !(this.members[parsed_idl.name] instanceof IdlInterface))
+        {
+            throw &quot;Partial interface &quot; + parsed_idl.name + &quot; with no original interface&quot;;
+        }
+        if (parsed_idl.extAttrs)
+        {
+            parsed_idl.extAttrs.forEach(function(extAttr)
+            {
+                this.members[parsed_idl.name].extAttrs.push(extAttr);
+            }.bind(this));
+        }
+        parsed_idl.members.forEach(function(member)
+        {
+            this.members[parsed_idl.name].members.push(new IdlInterfaceMember(member));
+        }.bind(this));
+    }.bind(this));
+    this.partials = [];
+
+    for (var lhs in this[&quot;implements&quot;])
+    {
+        this.recursively_get_implements(lhs).forEach(function(rhs)
+        {
+            var errStr = lhs + &quot; implements &quot; + rhs + &quot;, but &quot;;
+            if (!(lhs in this.members)) throw errStr + lhs + &quot; is undefined.&quot;;
+            if (!(this.members[lhs] instanceof IdlInterface)) throw errStr + lhs + &quot; is not an interface.&quot;;
+            if (!(rhs in this.members)) throw errStr + rhs + &quot; is undefined.&quot;;
+            if (!(this.members[rhs] instanceof IdlInterface)) throw errStr + rhs + &quot; is not an interface.&quot;;
+            this.members[rhs].members.forEach(function(member)
+            {
+                this.members[lhs].members.push(new IdlInterfaceMember(member));
+            }.bind(this));
+        }.bind(this));
+    }
+    this[&quot;implements&quot;] = {};
+
+    Object.getOwnPropertyNames(this.members).forEach(function(memberName) {
+        var member = this.members[memberName];
+        if (!(member instanceof IdlInterface)) {
+            return;
+        }
+
+        var exposed = member.extAttrs.filter(function(a) { return a.name == &quot;Exposed&quot; });
+        if (exposed.length &gt; 1) {
+            throw &quot;Unexpected Exposed extended attributes on &quot; + memberName + &quot;: &quot; + exposed;
+        }
+
+        var globals = exposed.length === 1
+                    ? exposed[0].rhs.value
+                    : [&quot;Window&quot;];
+        member.exposed = exposed_in(globals);
+    }.bind(this));
+
+    // Now run test() on every member, and test_object() for every object.
+    for (var name in this.members)
+    {
+        this.members[name].test();
+        if (name in this.objects)
+        {
+            this.objects[name].forEach(function(str)
+            {
+                this.members[name].test_object(str);
+            }.bind(this));
+        }
+    }
+};
+
+//@}
+IdlArray.prototype.assert_type_is = function(value, type)
+//@{
+{
+    /**
+     * Helper function that tests that value is an instance of type according
+     * to the rules of WebIDL.  value is any JavaScript value, and type is an
+     * object produced by WebIDLParser.js' &quot;type&quot; production.  That production
+     * is fairly elaborate due to the complexity of WebIDL's types, so it's
+     * best to look at the grammar to figure out what properties it might have.
+     */
+    if (type.idlType == &quot;any&quot;)
+    {
+        // No assertions to make
+        return;
+    }
+
+    if (type.nullable &amp;&amp; value === null)
+    {
+        // This is fine
+        return;
+    }
+
+    if (type.array)
+    {
+        // TODO: not supported yet
+        return;
+    }
+
+    if (type.sequence)
+    {
+        assert_true(Array.isArray(value), &quot;is not array&quot;);
+        if (!value.length)
+        {
+            // Nothing we can do.
+            return;
+        }
+        this.assert_type_is(value[0], type.idlType.idlType);
+        return;
+    }
+
+    if (type.generic === &quot;Promise&quot;) {
+        assert_true(&quot;then&quot; in value, &quot;Attribute with a Promise type has a then property&quot;);
+        // TODO: Ideally, we would check on project fulfillment
+        // that we get the right type
+        // but that would require making the type check async
+        return;
+    }
+
+    type = type.idlType;
+
+    switch(type)
+    {
+        case &quot;void&quot;:
+            assert_equals(value, undefined);
+            return;
+
+        case &quot;boolean&quot;:
+            assert_equals(typeof value, &quot;boolean&quot;);
+            return;
+
+        case &quot;byte&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, Math.floor(value), &quot;not an integer&quot;);
+            assert_true(-128 &lt;= value &amp;&amp; value &lt;= 127, &quot;byte &quot; + value + &quot; not in range [-128, 127]&quot;);
+            return;
+
+        case &quot;octet&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, Math.floor(value), &quot;not an integer&quot;);
+            assert_true(0 &lt;= value &amp;&amp; value &lt;= 255, &quot;octet &quot; + value + &quot; not in range [0, 255]&quot;);
+            return;
+
+        case &quot;short&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, Math.floor(value), &quot;not an integer&quot;);
+            assert_true(-32768 &lt;= value &amp;&amp; value &lt;= 32767, &quot;short &quot; + value + &quot; not in range [-32768, 32767]&quot;);
+            return;
+
+        case &quot;unsigned short&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, Math.floor(value), &quot;not an integer&quot;);
+            assert_true(0 &lt;= value &amp;&amp; value &lt;= 65535, &quot;unsigned short &quot; + value + &quot; not in range [0, 65535]&quot;);
+            return;
+
+        case &quot;long&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, Math.floor(value), &quot;not an integer&quot;);
+            assert_true(-2147483648 &lt;= value &amp;&amp; value &lt;= 2147483647, &quot;long &quot; + value + &quot; not in range [-2147483648, 2147483647]&quot;);
+            return;
+
+        case &quot;unsigned long&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, Math.floor(value), &quot;not an integer&quot;);
+            assert_true(0 &lt;= value &amp;&amp; value &lt;= 4294967295, &quot;unsigned long &quot; + value + &quot; not in range [0, 4294967295]&quot;);
+            return;
+
+        case &quot;long long&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            return;
+
+        case &quot;unsigned long long&quot;:
+        case &quot;DOMTimeStamp&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_true(0 &lt;= value, &quot;unsigned long long is negative&quot;);
+            return;
+
+        case &quot;float&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, fround(value), &quot;float rounded to 32-bit float should be itself&quot;);
+            assert_not_equals(value, Infinity);
+            assert_not_equals(value, -Infinity);
+            assert_not_equals(value, NaN);
+            return;
+
+        case &quot;DOMHighResTimeStamp&quot;:
+        case &quot;double&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_not_equals(value, Infinity);
+            assert_not_equals(value, -Infinity);
+            assert_not_equals(value, NaN);
+            return;
+
+        case &quot;unrestricted float&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            assert_equals(value, fround(value), &quot;unrestricted float rounded to 32-bit float should be itself&quot;);
+            return;
+
+        case &quot;unrestricted double&quot;:
+            assert_equals(typeof value, &quot;number&quot;);
+            return;
+
+        case &quot;DOMString&quot;:
+            assert_equals(typeof value, &quot;string&quot;);
+            return;
+
+        case &quot;ByteString&quot;:
+            assert_equals(typeof value, &quot;string&quot;);
+            assert_regexp_match(value, /^[\x00-\x7F]*$/);
+            return;
+
+        case &quot;USVString&quot;:
+            assert_equals(typeof value, &quot;string&quot;);
+            assert_regexp_match(value, /^([\x00-\ud7ff\ue000-\uffff]|[\ud800-\udbff][\udc00-\udfff])*$/);
+            return;
+
+        case &quot;object&quot;:
+            assert_true(typeof value == &quot;object&quot; || typeof value == &quot;function&quot;, &quot;wrong type: not object or function&quot;);
+            return;
+    }
+
+    if (!(type in this.members))
+    {
+        throw &quot;Unrecognized type &quot; + type;
+    }
+
+    if (this.members[type] instanceof IdlInterface)
+    {
+        // We don't want to run the full
+        // IdlInterface.prototype.test_instance_of, because that could result
+        // in an infinite loop.  TODO: This means we don't have tests for
+        // NoInterfaceObject interfaces, and we also can't test objects that
+        // come from another self.
+        assert_true(typeof value == &quot;object&quot; || typeof value == &quot;function&quot;, &quot;wrong type: not object or function&quot;);
+        if (value instanceof Object
+        &amp;&amp; !this.members[type].has_extended_attribute(&quot;NoInterfaceObject&quot;)
+        &amp;&amp; type in self)
+        {
+            assert_true(value instanceof self[type], &quot;not instanceof &quot; + type);
+        }
+    }
+    else if (this.members[type] instanceof IdlEnum)
+    {
+        assert_equals(typeof value, &quot;string&quot;);
+    }
+    else if (this.members[type] instanceof IdlDictionary)
+    {
+        // TODO: Test when we actually have something to test this on
+    }
+    else if (this.members[type] instanceof IdlTypedef)
+    {
+        // TODO: Test when we actually have something to test this on
+    }
+    else
+    {
+        throw &quot;Type &quot; + type + &quot; isn't an interface or dictionary&quot;;
+    }
+};
+//@}
+
+/// IdlObject ///
+function IdlObject() {}
+IdlObject.prototype.test = function()
+//@{
+{
+    /**
+     * By default, this does nothing, so no actual tests are run for IdlObjects
+     * that don't define any (e.g., IdlDictionary at the time of this writing).
+     */
+};
+
+//@}
+IdlObject.prototype.has_extended_attribute = function(name)
+//@{
+{
+    /**
+     * This is only meaningful for things that support extended attributes,
+     * such as interfaces, exceptions, and members.
+     */
+    return this.extAttrs.some(function(o)
+    {
+        return o.name == name;
+    });
+};
+
+//@}
+
+/// IdlDictionary ///
+// Used for IdlArray.prototype.assert_type_is
+function IdlDictionary(obj)
+//@{
+{
+    /**
+     * obj is an object produced by the WebIDLParser.js &quot;dictionary&quot;
+     * production.
+     */
+
+    /** Self-explanatory. */
+    this.name = obj.name;
+
+    /** An array of objects produced by the &quot;dictionaryMember&quot; production. */
+    this.members = obj.members;
+
+    /**
+     * The name (as a string) of the dictionary type we inherit from, or null
+     * if there is none.
+     */
+    this.base = obj.inheritance;
+}
+
+//@}
+IdlDictionary.prototype = Object.create(IdlObject.prototype);
+
+/// IdlInterface ///
+function IdlInterface(obj, is_callback)
+//@{
+{
+    /**
+     * obj is an object produced by the WebIDLParser.js &quot;interface&quot; production.
+     */
+
+    /** Self-explanatory. */
+    this.name = obj.name;
+
+    /** A back-reference to our IdlArray. */
+    this.array = obj.array;
+
+    /**
+     * An indicator of whether we should run tests on the interface object and
+     * interface prototype object. Tests on members are controlled by .untested
+     * on each member, not this.
+     */
+    this.untested = obj.untested;
+
+    /** An array of objects produced by the &quot;ExtAttr&quot; production. */
+    this.extAttrs = obj.extAttrs;
+
+    /** An array of IdlInterfaceMembers. */
+    this.members = obj.members.map(function(m){return new IdlInterfaceMember(m); });
+    if (this.has_extended_attribute(&quot;Unforgeable&quot;)) {
+        this.members
+            .filter(function(m) { return !m[&quot;static&quot;] &amp;&amp; (m.type == &quot;attribute&quot; || m.type == &quot;operation&quot;); })
+            .forEach(function(m) { return m.isUnforgeable = true; });
+    }
+
+    /**
+     * The name (as a string) of the type we inherit from, or null if there is
+     * none.
+     */
+    this.base = obj.inheritance;
+
+    this._is_callback = is_callback;
+}
+//@}
+IdlInterface.prototype = Object.create(IdlObject.prototype);
+IdlInterface.prototype.is_callback = function()
+//@{
+{
+    return this._is_callback;
+};
+//@}
+
+IdlInterface.prototype.has_constants = function()
+//@{
+{
+    return this.members.some(function(member) {
+        return member.type === &quot;const&quot;;
+    });
+};
+//@}
+
+IdlInterface.prototype.is_global = function()
+//@{
+{
+    return this.extAttrs.some(function(attribute) {
+        return attribute.name === &quot;Global&quot; ||
+               attribute.name === &quot;PrimaryGlobal&quot;;
+    });
+};
+//@}
+
+IdlInterface.prototype.test = function()
+//@{
+{
+    if (this.has_extended_attribute(&quot;NoInterfaceObject&quot;))
+    {
+        // No tests to do without an instance.  TODO: We should still be able
+        // to run tests on the prototype object, if we obtain one through some
+        // other means.
+        return;
+    }
+
+    if (!this.exposed) {
+        test(function() {
+            assert_false(this.name in self);
+        }.bind(this), this.name + &quot; interface: existence and properties of interface object&quot;);
+        return;
+    }
+
+    if (!this.untested)
+    {
+        // First test things to do with the exception/interface object and
+        // exception/interface prototype object.
+        this.test_self();
+    }
+    // Then test things to do with its members (constants, fields, attributes,
+    // operations, . . .).  These are run even if .untested is true, because
+    // members might themselves be marked as .untested.  This might happen to
+    // interfaces if the interface itself is untested but a partial interface
+    // that extends it is tested -- then the interface itself and its initial
+    // members will be marked as untested, but the members added by the partial
+    // interface are still tested.
+    this.test_members();
+};
+//@}
+
+IdlInterface.prototype.test_self = function()
+//@{
+{
+    test(function()
+    {
+        // This function tests WebIDL as of 2015-01-13.
+
+        // &quot;For every interface that is exposed in a given ECMAScript global
+        // environment and:
+        // * is a callback interface that has constants declared on it, or
+        // * is a non-callback interface that is not declared with the
+        //   [NoInterfaceObject] extended attribute,
+        // a corresponding property MUST exist on the ECMAScript global object.
+        // The name of the property is the identifier of the interface, and its
+        // value is an object called the interface object.
+        // The property has the attributes { [[Writable]]: true,
+        // [[Enumerable]]: false, [[Configurable]]: true }.&quot;
+        if (this.is_callback() &amp;&amp; !this.has_constants()) {
+            return;
+        }
+
+        // TODO: Should we test here that the property is actually writable
+        // etc., or trust getOwnPropertyDescriptor?
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+        var desc = Object.getOwnPropertyDescriptor(self, this.name);
+        assert_false(&quot;get&quot; in desc, &quot;self's property &quot; + format_value(this.name) + &quot; has getter&quot;);
+        assert_false(&quot;set&quot; in desc, &quot;self's property &quot; + format_value(this.name) + &quot; has setter&quot;);
+        assert_true(desc.writable, &quot;self's property &quot; + format_value(this.name) + &quot; is not writable&quot;);
+        assert_false(desc.enumerable, &quot;self's property &quot; + format_value(this.name) + &quot; is enumerable&quot;);
+        assert_true(desc.configurable, &quot;self's property &quot; + format_value(this.name) + &quot; is not configurable&quot;);
+
+        if (this.is_callback()) {
+            // &quot;The internal [[Prototype]] property of an interface object for
+            // a callback interface must be the Function.prototype object.&quot;
+            assert_equals(Object.getPrototypeOf(self[this.name]), Function.prototype,
+                          &quot;prototype of self's property &quot; + format_value(this.name) + &quot; is not Object.prototype&quot;);
+
+            return;
+        }
+
+        // &quot;The interface object for a given non-callback interface is a
+        // function object.&quot;
+        // &quot;If an object is defined to be a function object, then it has
+        // characteristics as follows:&quot;
+
+        // Its [[Prototype]] internal property is otherwise specified (see
+        // below).
+
+        // &quot;* Its [[Get]] internal property is set as described in ECMA-262
+        //    section 9.1.8.&quot;
+        // Not much to test for this.
+
+        // &quot;* Its [[Construct]] internal property is set as described in
+        //    ECMA-262 section 19.2.2.3.&quot;
+        // Tested below if no constructor is defined.  TODO: test constructors
+        // if defined.
+
+        // &quot;* Its @@hasInstance property is set as described in ECMA-262
+        //    section 19.2.3.8, unless otherwise specified.&quot;
+        // TODO
+
+        // ES6 (rev 30) 19.1.3.6:
+        // &quot;Else, if O has a [[Call]] internal method, then let builtinTag be
+        // &quot;Function&quot;.&quot;
+        assert_class_string(self[this.name], &quot;Function&quot;, &quot;class string of &quot; + this.name);
+
+        // &quot;The [[Prototype]] internal property of an interface object for a
+        // non-callback interface is determined as follows:&quot;
+        var prototype = Object.getPrototypeOf(self[this.name]);
+        if (this.base) {
+            // &quot;* If the interface inherits from some other interface, the
+            //    value of [[Prototype]] is the interface object for that other
+            //    interface.&quot;
+            var has_interface_object =
+                !this.array
+                     .members[this.base]
+                     .has_extended_attribute(&quot;NoInterfaceObject&quot;);
+            if (has_interface_object) {
+                assert_own_property(self, this.base,
+                                    'should inherit from ' + this.base +
+                                    ', but self has no such property');
+                assert_equals(prototype, self[this.base],
+                              'prototype of ' + this.name + ' is not ' +
+                              this.base);
+            }
+        } else {
+            // &quot;If the interface doesn't inherit from any other interface, the
+            // value of [[Prototype]] is %FunctionPrototype% ([ECMA-262],
+            // section 6.1.7.4).&quot;
+            assert_equals(prototype, Function.prototype,
+                          &quot;prototype of self's property &quot; + format_value(this.name) + &quot; is not Function.prototype&quot;);
+        }
+
+        if (!this.has_extended_attribute(&quot;Constructor&quot;)) {
+            // &quot;The internal [[Call]] method of the interface object behaves as
+            // follows . . .
+            //
+            // &quot;If I was not declared with a [Constructor] extended attribute,
+            // then throw a TypeError.&quot;
+            assert_throws(new TypeError(), function() {
+                self[this.name]();
+            }.bind(this), &quot;interface object didn't throw TypeError when called as a function&quot;);
+            assert_throws(new TypeError(), function() {
+                new self[this.name]();
+            }.bind(this), &quot;interface object didn't throw TypeError when called as a constructor&quot;);
+        }
+    }.bind(this), this.name + &quot; interface: existence and properties of interface object&quot;);
+
+    if (!this.is_callback()) {
+        test(function() {
+            // This function tests WebIDL as of 2014-10-25.
+            // https://heycam.github.io/webidl/#es-interface-call
+
+            assert_own_property(self, this.name,
+                                &quot;self does not have own property &quot; + format_value(this.name));
+
+            // &quot;Interface objects for non-callback interfaces MUST have a
+            // property named “length” with attributes { [[Writable]]: false,
+            // [[Enumerable]]: false, [[Configurable]]: true } whose value is
+            // a Number.&quot;
+            assert_own_property(self[this.name], &quot;length&quot;);
+            var desc = Object.getOwnPropertyDescriptor(self[this.name], &quot;length&quot;);
+            assert_false(&quot;get&quot; in desc, this.name + &quot;.length has getter&quot;);
+            assert_false(&quot;set&quot; in desc, this.name + &quot;.length has setter&quot;);
+            assert_false(desc.writable, this.name + &quot;.length is writable&quot;);
+            assert_false(desc.enumerable, this.name + &quot;.length is enumerable&quot;);
+            assert_true(desc.configurable, this.name + &quot;.length is not configurable&quot;);
+
+            var constructors = this.extAttrs
+                .filter(function(attr) { return attr.name == &quot;Constructor&quot;; });
+            var expected_length = minOverloadLength(constructors);
+            assert_equals(self[this.name].length, expected_length, &quot;wrong value for &quot; + this.name + &quot;.length&quot;);
+        }.bind(this), this.name + &quot; interface object length&quot;);
+    }
+
+    if (!this.is_callback() || this.has_constants()) {
+        test(function() {
+            // This function tests WebIDL as of 2015-11-17.
+            // https://heycam.github.io/webidl/#interface-object
+
+            assert_own_property(self, this.name,
+                                &quot;self does not have own property &quot; + format_value(this.name));
+
+            // &quot;All interface objects must have a property named “name” with
+            // attributes { [[Writable]]: false, [[Enumerable]]: false,
+            // [[Configurable]]: true } whose value is the identifier of the
+            // corresponding interface.&quot;
+
+            assert_own_property(self[this.name], &quot;name&quot;);
+            var desc = Object.getOwnPropertyDescriptor(self[this.name], &quot;name&quot;);
+            assert_false(&quot;get&quot; in desc, this.name + &quot;.name has getter&quot;);
+            assert_false(&quot;set&quot; in desc, this.name + &quot;.name has setter&quot;);
+            assert_false(desc.writable, this.name + &quot;.name is writable&quot;);
+            assert_false(desc.enumerable, this.name + &quot;.name is enumerable&quot;);
+            assert_true(desc.configurable, this.name + &quot;.name is not configurable&quot;);
+            assert_equals(self[this.name].name, this.name, &quot;wrong value for &quot; + this.name + &quot;.name&quot;);
+        }.bind(this), this.name + &quot; interface object name&quot;);
+    }
+
+    // TODO: Test named constructors if I find any interfaces that have them.
+
+    test(function()
+    {
+        // This function tests WebIDL as of 2015-01-21.
+        // https://heycam.github.io/webidl/#interface-object
+
+        if (this.is_callback() &amp;&amp; !this.has_constants()) {
+            return;
+        }
+
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+
+        if (this.is_callback()) {
+            assert_false(&quot;prototype&quot; in self[this.name],
+                         this.name + ' should not have a &quot;prototype&quot; property');
+            return;
+        }
+
+        // &quot;An interface object for a non-callback interface must have a
+        // property named “prototype” with attributes { [[Writable]]: false,
+        // [[Enumerable]]: false, [[Configurable]]: false } whose value is an
+        // object called the interface prototype object. This object has
+        // properties that correspond to the regular attributes and regular
+        // operations defined on the interface, and is described in more detail
+        // in section 4.5.4 below.&quot;
+        assert_own_property(self[this.name], &quot;prototype&quot;,
+                            'interface &quot;' + this.name + '&quot; does not have own property &quot;prototype&quot;');
+        var desc = Object.getOwnPropertyDescriptor(self[this.name], &quot;prototype&quot;);
+        assert_false(&quot;get&quot; in desc, this.name + &quot;.prototype has getter&quot;);
+        assert_false(&quot;set&quot; in desc, this.name + &quot;.prototype has setter&quot;);
+        assert_false(desc.writable, this.name + &quot;.prototype is writable&quot;);
+        assert_false(desc.enumerable, this.name + &quot;.prototype is enumerable&quot;);
+        assert_false(desc.configurable, this.name + &quot;.prototype is configurable&quot;);
+
+        // Next, test that the [[Prototype]] of the interface prototype object
+        // is correct. (This is made somewhat difficult by the existence of
+        // [NoInterfaceObject].)
+        // TODO: Aryeh thinks there's at least other place in this file where
+        //       we try to figure out if an interface prototype object is
+        //       correct. Consolidate that code.
+
+        // &quot;The interface prototype object for a given interface A must have an
+        // internal [[Prototype]] property whose value is returned from the
+        // following steps:
+        // &quot;If A is declared with the [Global] or [PrimaryGlobal] extended
+        // attribute, and A supports named properties, then return the named
+        // properties object for A, as defined in section 4.5.5 below.
+        // &quot;Otherwise, if A is declared to inherit from another interface, then
+        // return the interface prototype object for the inherited interface.
+        // &quot;Otherwise, if A is declared with the [ArrayClass] extended
+        // attribute, then return %ArrayPrototype% ([ECMA-262], section
+        // 6.1.7.4).
+        // &quot;Otherwise, return %ObjectPrototype% ([ECMA-262], section 6.1.7.4).
+        // ([ECMA-262], section 15.2.4).
+        if (this.name === &quot;Window&quot;) {
+            assert_class_string(Object.getPrototypeOf(self[this.name].prototype),
+                                'WindowProperties',
+                                'Class name for prototype of Window' +
+                                '.prototype is not &quot;WindowProperties&quot;');
+        } else {
+            var inherit_interface, inherit_interface_has_interface_object;
+            if (this.base) {
+                inherit_interface = this.base;
+                inherit_interface_has_interface_object =
+                    !this.array
+                         .members[inherit_interface]
+                         .has_extended_attribute(&quot;NoInterfaceObject&quot;);
+            } else if (this.has_extended_attribute('ArrayClass')) {
+                inherit_interface = 'Array';
+                inherit_interface_has_interface_object = true;
+            } else {
+                inherit_interface = 'Object';
+                inherit_interface_has_interface_object = true;
+            }
+            if (inherit_interface_has_interface_object) {
+                assert_own_property(self, inherit_interface,
+                                    'should inherit from ' + inherit_interface + ', but self has no such property');
+                assert_own_property(self[inherit_interface], 'prototype',
+                                    'should inherit from ' + inherit_interface + ', but that object has no &quot;prototype&quot; property');
+                assert_equals(Object.getPrototypeOf(self[this.name].prototype),
+                              self[inherit_interface].prototype,
+                              'prototype of ' + this.name + '.prototype is not ' + inherit_interface + '.prototype');
+            } else {
+                // We can't test that we get the correct object, because this is the
+                // only way to get our hands on it. We only test that its class
+                // string, at least, is correct.
+                assert_class_string(Object.getPrototypeOf(self[this.name].prototype),
+                                    inherit_interface + 'Prototype',
+                                    'Class name for prototype of ' + this.name +
+                                    '.prototype is not &quot;' + inherit_interface + 'Prototype&quot;');
+            }
+        }
+
+        // &quot;The class string of an interface prototype object is the
+        // concatenation of the interface’s identifier and the string
+        // “Prototype”.&quot;
+        assert_class_string(self[this.name].prototype, this.name + &quot;Prototype&quot;,
+                            &quot;class string of &quot; + this.name + &quot;.prototype&quot;);
+        // String() should end up calling {}.toString if nothing defines a
+        // stringifier.
+        if (!this.has_stringifier()) {
+            assert_equals(String(self[this.name].prototype), &quot;[object &quot; + this.name + &quot;Prototype]&quot;,
+                    &quot;String(&quot; + this.name + &quot;.prototype)&quot;);
+        }
+    }.bind(this), this.name + &quot; interface: existence and properties of interface prototype object&quot;);
+
+    test(function()
+    {
+        if (this.is_callback() &amp;&amp; !this.has_constants()) {
+            return;
+        }
+
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+
+        if (this.is_callback()) {
+            assert_false(&quot;prototype&quot; in self[this.name],
+                         this.name + ' should not have a &quot;prototype&quot; property');
+            return;
+        }
+
+        assert_own_property(self[this.name], &quot;prototype&quot;,
+                            'interface &quot;' + this.name + '&quot; does not have own property &quot;prototype&quot;');
+
+        // &quot;If the [NoInterfaceObject] extended attribute was not specified on
+        // the interface, then the interface prototype object must also have a
+        // property named “constructor” with attributes { [[Writable]]: true,
+        // [[Enumerable]]: false, [[Configurable]]: true } whose value is a
+        // reference to the interface object for the interface.&quot;
+        assert_own_property(self[this.name].prototype, &quot;constructor&quot;,
+                            this.name + '.prototype does not have own property &quot;constructor&quot;');
+        var desc = Object.getOwnPropertyDescriptor(self[this.name].prototype, &quot;constructor&quot;);
+        assert_false(&quot;get&quot; in desc, this.name + &quot;.prototype.constructor has getter&quot;);
+        assert_false(&quot;set&quot; in desc, this.name + &quot;.prototype.constructor has setter&quot;);
+        assert_true(desc.writable, this.name + &quot;.prototype.constructor is not writable&quot;);
+        assert_false(desc.enumerable, this.name + &quot;.prototype.constructor is enumerable&quot;);
+        assert_true(desc.configurable, this.name + &quot;.prototype.constructor in not configurable&quot;);
+        assert_equals(self[this.name].prototype.constructor, self[this.name],
+                      this.name + '.prototype.constructor is not the same object as ' + this.name);
+    }.bind(this), this.name + ' interface: existence and properties of interface prototype object\'s &quot;constructor&quot; property');
+};
+
+//@}
+IdlInterface.prototype.test_member_const = function(member)
+//@{
+{
+    if (!this.has_constants()) {
+        throw &quot;Internal error: test_member_const called without any constants&quot;;
+    }
+
+    test(function()
+    {
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+
+        // &quot;For each constant defined on an interface A, there must be
+        // a corresponding property on the interface object, if it
+        // exists.&quot;
+        assert_own_property(self[this.name], member.name);
+        // &quot;The value of the property is that which is obtained by
+        // converting the constant’s IDL value to an ECMAScript
+        // value.&quot;
+        assert_equals(self[this.name][member.name], constValue(member.value),
+                      &quot;property has wrong value&quot;);
+        // &quot;The property has attributes { [[Writable]]: false,
+        // [[Enumerable]]: true, [[Configurable]]: false }.&quot;
+        var desc = Object.getOwnPropertyDescriptor(self[this.name], member.name);
+        assert_false(&quot;get&quot; in desc, &quot;property has getter&quot;);
+        assert_false(&quot;set&quot; in desc, &quot;property has setter&quot;);
+        assert_false(desc.writable, &quot;property is writable&quot;);
+        assert_true(desc.enumerable, &quot;property is not enumerable&quot;);
+        assert_false(desc.configurable, &quot;property is configurable&quot;);
+    }.bind(this), this.name + &quot; interface: constant &quot; + member.name + &quot; on interface object&quot;);
+
+    // &quot;In addition, a property with the same characteristics must
+    // exist on the interface prototype object.&quot;
+    test(function()
+    {
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+
+        if (this.is_callback()) {
+            assert_false(&quot;prototype&quot; in self[this.name],
+                         this.name + ' should not have a &quot;prototype&quot; property');
+            return;
+        }
+
+        assert_own_property(self[this.name], &quot;prototype&quot;,
+                            'interface &quot;' + this.name + '&quot; does not have own property &quot;prototype&quot;');
+
+        assert_own_property(self[this.name].prototype, member.name);
+        assert_equals(self[this.name].prototype[member.name], constValue(member.value),
+                      &quot;property has wrong value&quot;);
+        var desc = Object.getOwnPropertyDescriptor(self[this.name], member.name);
+        assert_false(&quot;get&quot; in desc, &quot;property has getter&quot;);
+        assert_false(&quot;set&quot; in desc, &quot;property has setter&quot;);
+        assert_false(desc.writable, &quot;property is writable&quot;);
+        assert_true(desc.enumerable, &quot;property is not enumerable&quot;);
+        assert_false(desc.configurable, &quot;property is configurable&quot;);
+    }.bind(this), this.name + &quot; interface: constant &quot; + member.name + &quot; on interface prototype object&quot;);
+};
+
+
+//@}
+IdlInterface.prototype.test_member_attribute = function(member)
+//@{
+  {
+    var a_test = async_test(this.name + &quot; interface: attribute &quot; + member.name);
+    a_test.step(function()
+    {
+        if (this.is_callback() &amp;&amp; !this.has_constants()) {
+            a_test.done()
+            return;
+        }
+
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+        assert_own_property(self[this.name], &quot;prototype&quot;,
+                            'interface &quot;' + this.name + '&quot; does not have own property &quot;prototype&quot;');
+
+        if (member[&quot;static&quot;]) {
+            assert_own_property(self[this.name], member.name,
+                &quot;The interface object must have a property &quot; +
+                format_value(member.name));
+            a_test.done();
+        } else if (this.is_global()) {
+            assert_own_property(self, member.name,
+                &quot;The global object must have a property &quot; +
+                format_value(member.name));
+            assert_false(member.name in self[this.name].prototype,
+                &quot;The prototype object must not have a property &quot; +
+                format_value(member.name));
+
+            var getter = Object.getOwnPropertyDescriptor(self, member.name).get;
+            assert_equals(typeof(getter), &quot;function&quot;,
+                          format_value(member.name) + &quot; must have a getter&quot;);
+
+            // Try/catch around the get here, since it can legitimately throw.
+            // If it does, we obviously can't check for equality with direct
+            // invocation of the getter.
+            var gotValue;
+            var propVal;
+            try {
+                propVal = self[member.name];
+                gotValue = true;
+            } catch (e) {
+                gotValue = false;
+            }
+            if (gotValue) {
+                assert_equals(propVal, getter.call(undefined),
+                              &quot;Gets on a global should not require an explicit this&quot;);
+            }
+
+            // do_interface_attribute_asserts must be the last thing we do,
+            // since it will call done() on a_test.
+            this.do_interface_attribute_asserts(self, member, a_test);
+        } else {
+            assert_true(member.name in self[this.name].prototype,
+                &quot;The prototype object must have a property &quot; +
+                format_value(member.name));
+
+            if (!member.has_extended_attribute(&quot;LenientThis&quot;)) {
+                if (member.idlType.generic !== &quot;Promise&quot;) {
+                    assert_throws(new TypeError(), function() {
+                        self[this.name].prototype[member.name];
+                    }.bind(this), &quot;getting property on prototype object must throw TypeError&quot;);
+                    // do_interface_attribute_asserts must be the last thing we
+                    // do, since it will call done() on a_test.
+                    this.do_interface_attribute_asserts(self[this.name].prototype, member, a_test);
+                } else {
+                    promise_rejects(a_test, new TypeError(),
+                                    self[this.name].prototype[member.name])
+                        .then(function() {
+                            // do_interface_attribute_asserts must be the last
+                            // thing we do, since it will call done() on a_test.
+                            this.do_interface_attribute_asserts(self[this.name].prototype,
+                                                                member, a_test);
+                        }.bind(this));
+                }
+            } else {
+                assert_equals(self[this.name].prototype[member.name], undefined,
+                              &quot;getting property on prototype object must return undefined&quot;);
+              // do_interface_attribute_asserts must be the last thing we do,
+              // since it will call done() on a_test.
+              this.do_interface_attribute_asserts(self[this.name].prototype, member, a_test);
+            }
+
+        }
+    }.bind(this));
+};
+
+//@}
+IdlInterface.prototype.test_member_operation = function(member)
+//@{
+{
+    var a_test = async_test(this.name + &quot; interface: operation &quot; + member.name +
+                            &quot;(&quot; + member.arguments.map(
+                                function(m) {return m.idlType.idlType; } )
+                            +&quot;)&quot;);
+    a_test.step(function()
+    {
+        // This function tests WebIDL as of 2015-12-29.
+        // https://heycam.github.io/webidl/#es-operations
+
+        if (this.is_callback() &amp;&amp; !this.has_constants()) {
+            a_test.done();
+            return;
+        }
+
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+
+        if (this.is_callback()) {
+            assert_false(&quot;prototype&quot; in self[this.name],
+                         this.name + ' should not have a &quot;prototype&quot; property');
+            a_test.done();
+            return;
+        }
+
+        assert_own_property(self[this.name], &quot;prototype&quot;,
+                            'interface &quot;' + this.name + '&quot; does not have own property &quot;prototype&quot;');
+
+        // &quot;For each unique identifier of an exposed operation defined on the
+        // interface, there must exist a corresponding property, unless the
+        // effective overload set for that identifier and operation and with an
+        // argument count of 0 has no entries.&quot;
+
+        // TODO: Consider [Exposed].
+
+        // &quot;The location of the property is determined as follows:&quot;
+        var memberHolderObject;
+        // &quot;* If the operation is static, then the property exists on the
+        //    interface object.&quot;
+        if (member[&quot;static&quot;]) {
+            assert_own_property(self[this.name], member.name,
+                    &quot;interface object missing static operation&quot;);
+            memberHolderObject = self[this.name];
+        // &quot;* Otherwise, [...] if the interface was declared with the [Global]
+        //    or [PrimaryGlobal] extended attribute, then the property exists
+        //    on every object that implements the interface.&quot;
+        } else if (this.is_global()) {
+            assert_own_property(self, member.name,
+                    &quot;global object missing non-static operation&quot;);
+            memberHolderObject = self;
+        // &quot;* Otherwise, the property exists solely on the interface’s
+        //    interface prototype object.&quot;
+        } else {
+            assert_own_property(self[this.name].prototype, member.name,
+                    &quot;interface prototype object missing non-static operation&quot;);
+            memberHolderObject = self[this.name].prototype;
+        }
+        this.do_member_operation_asserts(memberHolderObject, member, a_test);
+    }.bind(this));
+};
+
+//@}
+IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject, member, a_test)
+//@{
+{
+    var done = a_test.done.bind(a_test);
+    var operationUnforgeable = member.isUnforgeable;
+    var desc = Object.getOwnPropertyDescriptor(memberHolderObject, member.name);
+    // &quot;The property has attributes { [[Writable]]: B,
+    // [[Enumerable]]: true, [[Configurable]]: B }, where B is false if the
+    // operation is unforgeable on the interface, and true otherwise&quot;.
+    assert_false(&quot;get&quot; in desc, &quot;property has getter&quot;);
+    assert_false(&quot;set&quot; in desc, &quot;property has setter&quot;);
+    assert_equals(desc.writable, !operationUnforgeable,
+                  &quot;property should be writable if and only if not unforgeable&quot;);
+    assert_true(desc.enumerable, &quot;property is not enumerable&quot;);
+    assert_equals(desc.configurable, !operationUnforgeable,
+                  &quot;property should be configurable if and only if not unforgeable&quot;);
+    // &quot;The value of the property is a Function object whose
+    // behavior is as follows . . .&quot;
+    assert_equals(typeof memberHolderObject[member.name], &quot;function&quot;,
+                  &quot;property must be a function&quot;);
+    // &quot;The value of the Function object’s “length” property is
+    // a Number determined as follows:
+    // &quot;. . .
+    // &quot;Return the length of the shortest argument list of the
+    // entries in S.&quot;
+    assert_equals(memberHolderObject[member.name].length,
+        minOverloadLength(this.members.filter(function(m) {
+            return m.type == &quot;operation&quot; &amp;&amp; m.name == member.name;
+        })),
+        &quot;property has wrong .length&quot;);
+
+    // Make some suitable arguments
+    var args = member.arguments.map(function(arg) {
+        return create_suitable_object(arg.idlType);
+    });
+
+    // &quot;Let O be a value determined as follows:
+    // &quot;. . .
+    // &quot;Otherwise, throw a TypeError.&quot;
+    // This should be hit if the operation is not static, there is
+    // no [ImplicitThis] attribute, and the this value is null.
+    //
+    // TODO: We currently ignore the [ImplicitThis] case.  Except we manually
+    // check for globals, since otherwise we'll invoke window.close().  And we
+    // have to skip this test for anything that on the proto chain of &quot;self&quot;,
+    // since that does in fact have implicit-this behavior.
+    if (!member[&quot;static&quot;]) {
+        var cb;
+        if (!this.is_global() &amp;&amp;
+            memberHolderObject[member.name] != self[member.name])
+        {
+            cb = awaitNCallbacks(2, done);
+            throwOrReject(a_test, member, memberHolderObject[member.name], null, args,
+                          &quot;calling operation with this = null didn't throw TypeError&quot;, cb);
+        } else {
+            cb = awaitNCallbacks(1, done);
+        }
+
+        // &quot;. . . If O is not null and is also not a platform object
+        // that implements interface I, throw a TypeError.&quot;
+        //
+        // TODO: Test a platform object that implements some other
+        // interface.  (Have to be sure to get inheritance right.)
+        throwOrReject(a_test, member, memberHolderObject[member.name], {}, args,
+                      &quot;calling operation with this = {} didn't throw TypeError&quot;, cb);
+    } else {
+        done();
+    }
+}
+
+//@}
+IdlInterface.prototype.add_iterable_members = function(member)
+//@{
+{
+    this.members.push({type: &quot;operation&quot;, name: &quot;entries&quot;, idlType: &quot;iterator&quot;, arguments: []});
+    this.members.push({type: &quot;operation&quot;, name: &quot;keys&quot;, idlType: &quot;iterator&quot;, arguments: []});
+    this.members.push({type: &quot;operation&quot;, name: &quot;values&quot;, idlType: &quot;iterator&quot;, arguments: []});
+    this.members.push({type: &quot;operation&quot;, name: &quot;forEach&quot;, idlType: &quot;void&quot;, arguments:
+        [{ name: &quot;callback&quot;, idlType: {idlType: &quot;function&quot;}},
+        { name: &quot;thisValue&quot;, idlType: {idlType: &quot;any&quot;}, optional: true}]});
+};
+
+//@}
+IdlInterface.prototype.test_member_iterable = function(member)
+//@{
+{
+    var interfaceName = this.name;
+    var isPairIterator = member.idlType instanceof Array;
+    test(function()
+    {
+        var descriptor = Object.getOwnPropertyDescriptor(self[interfaceName].prototype, Symbol.iterator);
+        assert_true(descriptor.writable, &quot;property is not writable&quot;);
+        assert_true(descriptor.configurable, &quot;property is not configurable&quot;);
+        assert_false(descriptor.enumerable, &quot;property is enumerable&quot;);
+        assert_equals(self[interfaceName].prototype[Symbol.iterator].name, isPairIterator ? &quot;entries&quot; : &quot;values&quot;, &quot;@@iterator function does not have the right name&quot;);
+    }, &quot;Testing Symbol.iterator property of iterable interface &quot; + interfaceName);
+
+    if (isPairIterator) {
+        test(function() {
+            assert_equals(self[interfaceName].prototype[Symbol.iterator], self[interfaceName].prototype[&quot;entries&quot;], &quot;entries method is not the same as @@iterator&quot;);
+        }, &quot;Testing pair iterable interface &quot; + interfaceName);
+    } else {
+        test(function() {
+            [&quot;entries&quot;, &quot;keys&quot;, &quot;values&quot;, &quot;forEach&quot;, Symbol.Iterator].forEach(function(property) {
+                assert_equals(self[interfaceName].prototype[property], Array.prototype[property], property + &quot; function is not the same as Array one&quot;);
+            });
+        }, &quot;Testing value iterable interface &quot; + interfaceName);
+    }
+};
+
+//@}
+IdlInterface.prototype.test_member_stringifier = function(member)
+//@{
+{
+    test(function()
+    {
+        if (this.is_callback() &amp;&amp; !this.has_constants()) {
+            return;
+        }
+
+        assert_own_property(self, this.name,
+                            &quot;self does not have own property &quot; + format_value(this.name));
+
+        if (this.is_callback()) {
+            assert_false(&quot;prototype&quot; in self[this.name],
+                         this.name + ' should not have a &quot;prototype&quot; property');
+            return;
+        }
+
+        assert_own_property(self[this.name], &quot;prototype&quot;,
+                            'interface &quot;' + this.name + '&quot; does not have own property &quot;prototype&quot;');
+
+        // &quot;. . . the property exists on the interface prototype object.&quot;
+        var interfacePrototypeObject = self[this.name].prototype;
+        assert_own_property(self[this.name].prototype, &quot;toString&quot;,
+                &quot;interface prototype object missing non-static operation&quot;);
+
+        var stringifierUnforgeable = member.isUnforgeable;
+        var desc = Object.getOwnPropertyDescriptor(interfacePrototypeObject, &quot;toString&quot;);
+        // &quot;The property has attributes { [[Writable]]: B,
+        // [[Enumerable]]: true, [[Configurable]]: B }, where B is false if the
+        // stringifier is unforgeable on the interface, and true otherwise.&quot;
+        assert_false(&quot;get&quot; in desc, &quot;property has getter&quot;);
+        assert_false(&quot;set&quot; in desc, &quot;property has setter&quot;);
+        assert_equals(desc.writable, !stringifierUnforgeable,
+                      &quot;property should be writable if and only if not unforgeable&quot;);
+        assert_true(desc.enumerable, &quot;property is not enumerable&quot;);
+        assert_equals(desc.configurable, !stringifierUnforgeable,
+                      &quot;property should be configurable if and only if not unforgeable&quot;);
+        // &quot;The value of the property is a Function object, which behaves as
+        // follows . . .&quot;
+        assert_equals(typeof interfacePrototypeObject.toString, &quot;function&quot;,
+                      &quot;property must be a function&quot;);
+        // &quot;The value of the Function object’s “length” property is the Number
+        // value 0.&quot;
+        assert_equals(interfacePrototypeObject.toString.length, 0,
+            &quot;property has wrong .length&quot;);
+
+        // &quot;Let O be the result of calling ToObject on the this value.&quot;
+        assert_throws(new TypeError(), function() {
+            self[this.name].prototype.toString.apply(null, []);
+        }, &quot;calling stringifier with this = null didn't throw TypeError&quot;);
+
+        // &quot;If O is not an object that implements the interface on which the
+        // stringifier was declared, then throw a TypeError.&quot;
+        //
+        // TODO: Test a platform object that implements some other
+        // interface.  (Have to be sure to get inheritance right.)
+        assert_throws(new TypeError(), function() {
+            self[this.name].prototype.toString.apply({}, []);
+        }, &quot;calling stringifier with this = {} didn't throw TypeError&quot;);
+    }.bind(this), this.name + &quot; interface: stringifier&quot;);
+};
+
+//@}
+IdlInterface.prototype.test_members = function()
+//@{
+{
+    for (var i = 0; i &lt; this.members.length; i++)
+    {
+        var member = this.members[i];
+        switch (member.type) {
+        case &quot;iterable&quot;:
+            this.add_iterable_members(member);
+            break;
+        // TODO: add setlike and maplike handling.
+        default:
+            break;
+        }
+    }
+
+    for (var i = 0; i &lt; this.members.length; i++)
+    {
+        var member = this.members[i];
+        if (member.untested) {
+            continue;
+        }
+
+        switch (member.type) {
+        case &quot;const&quot;:
+            this.test_member_const(member);
+            break;
+
+        case &quot;attribute&quot;:
+            // For unforgeable attributes, we do the checks in
+            // test_interface_of instead.
+            if (!member.isUnforgeable)
+            {
+                this.test_member_attribute(member);
+            }
+            if (member.stringifier) {
+                this.test_member_stringifier(member);
+            }
+            break;
+
+        case &quot;operation&quot;:
+            // TODO: Need to correctly handle multiple operations with the same
+            // identifier.
+            // For unforgeable operations, we do the checks in
+            // test_interface_of instead.
+            if (member.name) {
+                if (!member.isUnforgeable)
+                {
+                    this.test_member_operation(member);
+                }
+            } else if (member.stringifier) {
+                this.test_member_stringifier(member);
+            }
+            break;
+
+        case &quot;iterable&quot;:
+            this.test_member_iterable(member);
+            break;
+        default:
+            // TODO: check more member types.
+            break;
+        }
+    }
+};
+
+//@}
+IdlInterface.prototype.test_object = function(desc)
+//@{
+{
+    var obj, exception = null;
+    try
+    {
+        obj = eval(desc);
+    }
+    catch(e)
+    {
+        exception = e;
+    }
+
+    var expected_typeof =
+        this.members.some(function(member) { return member.legacycaller; })
+        ? &quot;function&quot;
+        : &quot;object&quot;;
+
+    this.test_primary_interface_of(desc, obj, exception, expected_typeof);
+    var current_interface = this;
+    while (current_interface)
+    {
+        if (!(current_interface.name in this.array.members))
+        {
+            throw &quot;Interface &quot; + current_interface.name + &quot; not found (inherited by &quot; + this.name + &quot;)&quot;;
+        }
+        if (current_interface.prevent_multiple_testing &amp;&amp; current_interface.already_tested)
+        {
+            return;
+        }
+        current_interface.test_interface_of(desc, obj, exception, expected_typeof);
+        current_interface = this.array.members[current_interface.base];
+    }
+};
+
+//@}
+IdlInterface.prototype.test_primary_interface_of = function(desc, obj, exception, expected_typeof)
+//@{
+{
+    // We can't easily test that its prototype is correct if there's no
+    // interface object, or the object is from a different global environment
+    // (not instanceof Object).  TODO: test in this case that its prototype at
+    // least looks correct, even if we can't test that it's actually correct.
+    if (!this.has_extended_attribute(&quot;NoInterfaceObject&quot;)
+    &amp;&amp; (typeof obj != expected_typeof || obj instanceof Object))
+    {
+        test(function()
+        {
+            assert_equals(exception, null, &quot;Unexpected exception when evaluating object&quot;);
+            assert_equals(typeof obj, expected_typeof, &quot;wrong typeof object&quot;);
+            assert_own_property(self, this.name,
+                                &quot;self does not have own property &quot; + format_value(this.name));
+            assert_own_property(self[this.name], &quot;prototype&quot;,
+                                'interface &quot;' + this.name + '&quot; does not have own property &quot;prototype&quot;');
+
+            // &quot;The value of the internal [[Prototype]] property of the
+            // platform object is the interface prototype object of the primary
+            // interface from the platform object’s associated global
+            // environment.&quot;
+            assert_equals(Object.getPrototypeOf(obj),
+                          self[this.name].prototype,
+                          desc + &quot;'s prototype is not &quot; + this.name + &quot;.prototype&quot;);
+        }.bind(this), this.name + &quot; must be primary interface of &quot; + desc);
+    }
+
+    // &quot;The class string of a platform object that implements one or more
+    // interfaces must be the identifier of the primary interface of the
+    // platform object.&quot;
+    test(function()
+    {
+        assert_equals(exception, null, &quot;Unexpected exception when evaluating object&quot;);
+        assert_equals(typeof obj, expected_typeof, &quot;wrong typeof object&quot;);
+        assert_class_string(obj, this.name, &quot;class string of &quot; + desc);
+        if (!this.has_stringifier())
+        {
+            assert_equals(String(obj), &quot;[object &quot; + this.name + &quot;]&quot;, &quot;String(&quot; + desc + &quot;)&quot;);
+        }
+    }.bind(this), &quot;Stringification of &quot; + desc);
+};
+
+//@}
+IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expected_typeof)
+//@{
+{
+    // TODO: Indexed and named properties, more checks on interface members
+    this.already_tested = true;
+
+    for (var i = 0; i &lt; this.members.length; i++)
+    {
+        var member = this.members[i];
+        if (member.type == &quot;attribute&quot; &amp;&amp; member.isUnforgeable)
+        {
+            var a_test = async_test(this.name + &quot; interface: &quot; + desc + ' must have own property &quot;' + member.name + '&quot;');
+            a_test.step(function() {
+                assert_equals(exception, null, &quot;Unexpected exception when evaluating object&quot;);
+                assert_equals(typeof obj, expected_typeof, &quot;wrong typeof object&quot;);
+                // Call do_interface_attribute_asserts last, since it will call a_test.done()
+                this.do_interface_attribute_asserts(obj, member, a_test);
+            }.bind(this));
+        }
+        else if (member.type == &quot;operation&quot; &amp;&amp;
+                 member.name &amp;&amp;
+                 member.isUnforgeable)
+        {
+            var a_test = async_test(this.name + &quot; interface: &quot; + desc + ' must have own property &quot;' + member.name + '&quot;');
+            a_test.step(function()
+            {
+                assert_equals(exception, null, &quot;Unexpected exception when evaluating object&quot;);
+                assert_equals(typeof obj, expected_typeof, &quot;wrong typeof object&quot;);
+                assert_own_property(obj, member.name,
+                                    &quot;Doesn't have the unforgeable operation property&quot;);
+                this.do_member_operation_asserts(obj, member, a_test);
+            }.bind(this));
+        }
+        else if ((member.type == &quot;const&quot;
+        || member.type == &quot;attribute&quot;
+        || member.type == &quot;operation&quot;)
+        &amp;&amp; member.name)
+        {
+            test(function()
+            {
+                assert_equals(exception, null, &quot;Unexpected exception when evaluating object&quot;);
+                assert_equals(typeof obj, expected_typeof, &quot;wrong typeof object&quot;);
+                if (!member[&quot;static&quot;]) {
+                    if (!this.is_global()) {
+                        assert_inherits(obj, member.name);
+                    } else {
+                        assert_own_property(obj, member.name);
+                    }
+
+                    if (member.type == &quot;const&quot;)
+                    {
+                        assert_equals(obj[member.name], constValue(member.value));
+                    }
+                    if (member.type == &quot;attribute&quot;)
+                    {
+                        // Attributes are accessor properties, so they might
+                        // legitimately throw an exception rather than returning
+                        // anything.
+                        var property, thrown = false;
+                        try
+                        {
+                            property = obj[member.name];
+                        }
+                        catch (e)
+                        {
+                            thrown = true;
+                        }
+                        if (!thrown)
+                        {
+                            this.array.assert_type_is(property, member.idlType);
+                        }
+                    }
+                    if (member.type == &quot;operation&quot;)
+                    {
+                        assert_equals(typeof obj[member.name], &quot;function&quot;);
+                    }
+                }
+            }.bind(this), this.name + &quot; interface: &quot; + desc + ' must inherit property &quot;' + member.name + '&quot; with the proper type (' + i + ')');
+        }
+        // TODO: This is wrong if there are multiple operations with the same
+        // identifier.
+        // TODO: Test passing arguments of the wrong type.
+        if (member.type == &quot;operation&quot; &amp;&amp; member.name &amp;&amp; member.arguments.length)
+        {
+            var a_test = async_test( this.name + &quot; interface: calling &quot; + member.name +
+            &quot;(&quot; + member.arguments.map(function(m) { return m.idlType.idlType; }) +
+            &quot;) on &quot; + desc + &quot; with too few arguments must throw TypeError&quot;);
+            a_test.step(function()
+            {
+                assert_equals(exception, null, &quot;Unexpected exception when evaluating object&quot;);
+                assert_equals(typeof obj, expected_typeof, &quot;wrong typeof object&quot;);
+                if (!member[&quot;static&quot;]) {
+                    if (!this.is_global() &amp;&amp; !member.isUnforgeable) {
+                        assert_inherits(obj, member.name);
+                    } else {
+                        assert_own_property(obj, member.name);
+                    }
+                }
+                else
+                {
+                    assert_false(member.name in obj);
+                }
+
+                var minLength = minOverloadLength(this.members.filter(function(m) {
+                    return m.type == &quot;operation&quot; &amp;&amp; m.name == member.name;
+                }));
+                var args = [];
+                var cb = awaitNCallbacks(minLength, a_test.done.bind(a_test));
+                for (var i = 0; i &lt; minLength; i++) {
+                    throwOrReject(a_test, member, obj[member.name], obj, args,  &quot;Called with &quot; + i + &quot; arguments&quot;, cb);
+
+                    args.push(create_suitable_object(member.arguments[i].idlType));
+                }
+                if (minLength === 0) {
+                    cb();
+                }
+            }.bind(this));
+        }
+    }
+};
+
+//@}
+IdlInterface.prototype.has_stringifier = function()
+//@{
+{
+    if (this.members.some(function(member) { return member.stringifier; })) {
+        return true;
+    }
+    if (this.base &amp;&amp;
+        this.array.members[this.base].has_stringifier()) {
+        return true;
+    }
+    return false;
+};
+
+//@}
+IdlInterface.prototype.do_interface_attribute_asserts = function(obj, member, a_test)
+//@{
+{
+    // This function tests WebIDL as of 2015-01-27.
+    // TODO: Consider [Exposed].
+
+    // This is called by test_member_attribute() with the prototype as obj if
+    // it is not a global, and the global otherwise, and by test_interface_of()
+    // with the object as obj.
+
+    var pendingPromises = [];
+
+    // &quot;For each exposed attribute of the interface, whether it was declared on
+    // the interface itself or one of its consequential interfaces, there MUST
+    // exist a corresponding property. The characteristics of this property are
+    // as follows:&quot;
+
+    // &quot;The name of the property is the identifier of the attribute.&quot;
+    assert_own_property(obj, member.name);
+
+    // &quot;The property has attributes { [[Get]]: G, [[Set]]: S, [[Enumerable]]:
+    // true, [[Configurable]]: configurable }, where:
+    // &quot;configurable is false if the attribute was declared with the
+    // [Unforgeable] extended attribute and true otherwise;
+    // &quot;G is the attribute getter, defined below; and
+    // &quot;S is the attribute setter, also defined below.&quot;
+    var desc = Object.getOwnPropertyDescriptor(obj, member.name);
+    assert_false(&quot;value&quot; in desc, 'property descriptor has value but is supposed to be accessor');
+    assert_false(&quot;writable&quot; in desc, 'property descriptor has &quot;writable&quot; field but is supposed to be accessor');
+    assert_true(desc.enumerable, &quot;property is not enumerable&quot;);
+    if (member.isUnforgeable)
+    {
+        assert_false(desc.configurable, &quot;[Unforgeable] property must not be configurable&quot;);
+    }
+    else
+    {
+        assert_true(desc.configurable, &quot;property must be configurable&quot;);
+    }
+
+
+    // &quot;The attribute getter is a Function object whose behavior when invoked
+    // is as follows:&quot;
+    assert_equals(typeof desc.get, &quot;function&quot;, &quot;getter must be Function&quot;);
+
+    // &quot;If the attribute is a regular attribute, then:&quot;
+    if (!member[&quot;static&quot;]) {
+        // &quot;If O is not a platform object that implements I, then:
+        // &quot;If the attribute was specified with the [LenientThis] extended
+        // attribute, then return undefined.
+        // &quot;Otherwise, throw a TypeError.&quot;
+        if (!member.has_extended_attribute(&quot;LenientThis&quot;)) {
+            if (member.idlType.generic !== &quot;Promise&quot;) {
+                assert_throws(new TypeError(), function() {
+                    desc.get.call({});
+                }.bind(this), &quot;calling getter on wrong object type must throw TypeError&quot;);
+            } else {
+                pendingPromises.push(
+                    promise_rejects(a_test, new TypeError(), desc.get.call({}),
+                                    &quot;calling getter on wrong object type must reject the return promise with TypeError&quot;));
+            }
+        } else {
+            assert_equals(desc.get.call({}), undefined,
+                          &quot;calling getter on wrong object type must return undefined&quot;);
+        }
+    }
+
+    // &quot;The value of the Function object’s “length” property is the Number
+    // value 0.&quot;
+    assert_equals(desc.get.length, 0, &quot;getter length must be 0&quot;);
+
+
+    // TODO: Test calling setter on the interface prototype (should throw
+    // TypeError in most cases).
+    if (member.readonly
+    &amp;&amp; !member.has_extended_attribute(&quot;PutForwards&quot;)
+    &amp;&amp; !member.has_extended_attribute(&quot;Replaceable&quot;))
+    {
+        // &quot;The attribute setter is undefined if the attribute is declared
+        // readonly and has neither a [PutForwards] nor a [Replaceable]
+        // extended attribute declared on it.&quot;
+        assert_equals(desc.set, undefined, &quot;setter must be undefined for readonly attributes&quot;);
+    }
+    else
+    {
+        // &quot;Otherwise, it is a Function object whose behavior when
+        // invoked is as follows:&quot;
+        assert_equals(typeof desc.set, &quot;function&quot;, &quot;setter must be function for PutForwards, Replaceable, or non-readonly attributes&quot;);
+
+        // &quot;If the attribute is a regular attribute, then:&quot;
+        if (!member[&quot;static&quot;]) {
+            // &quot;If /validThis/ is false and the attribute was not specified
+            // with the [LenientThis] extended attribute, then throw a
+            // TypeError.&quot;
+            // &quot;If the attribute is declared with a [Replaceable] extended
+            // attribute, then: ...&quot;
+            // &quot;If validThis is false, then return.&quot;
+            if (!member.has_extended_attribute(&quot;LenientThis&quot;)) {
+                assert_throws(new TypeError(), function() {
+                    desc.set.call({});
+                }.bind(this), &quot;calling setter on wrong object type must throw TypeError&quot;);
+            } else {
+                assert_equals(desc.set.call({}), undefined,
+                              &quot;calling setter on wrong object type must return undefined&quot;);
+            }
+        }
+
+        // &quot;The value of the Function object’s “length” property is the Number
+        // value 1.&quot;
+        assert_equals(desc.set.length, 1, &quot;setter length must be 1&quot;);
+    }
+
+    Promise.all(pendingPromises).then(a_test.done.bind(a_test));
+}
+//@}
+
+/// IdlInterfaceMember ///
+function IdlInterfaceMember(obj)
+//@{
+{
+    /**
+     * obj is an object produced by the WebIDLParser.js &quot;ifMember&quot; production.
+     * We just forward all properties to this object without modification,
+     * except for special extAttrs handling.
+     */
+    for (var k in obj)
+    {
+        this[k] = obj[k];
+    }
+    if (!(&quot;extAttrs&quot; in this))
+    {
+        this.extAttrs = [];
+    }
+
+    this.isUnforgeable = this.has_extended_attribute(&quot;Unforgeable&quot;);
+}
+
+//@}
+IdlInterfaceMember.prototype = Object.create(IdlObject.prototype);
+
+/// Internal helper functions ///
+function create_suitable_object(type)
+//@{
+{
+    /**
+     * type is an object produced by the WebIDLParser.js &quot;type&quot; production.  We
+     * return a JavaScript value that matches the type, if we can figure out
+     * how.
+     */
+    if (type.nullable)
+    {
+        return null;
+    }
+    switch (type.idlType)
+    {
+        case &quot;any&quot;:
+        case &quot;boolean&quot;:
+            return true;
+
+        case &quot;byte&quot;: case &quot;octet&quot;: case &quot;short&quot;: case &quot;unsigned short&quot;:
+        case &quot;long&quot;: case &quot;unsigned long&quot;: case &quot;long long&quot;:
+        case &quot;unsigned long long&quot;: case &quot;float&quot;: case &quot;double&quot;:
+        case &quot;unrestricted float&quot;: case &quot;unrestricted double&quot;:
+            return 7;
+
+        case &quot;DOMString&quot;:
+        case &quot;ByteString&quot;:
+        case &quot;USVString&quot;:
+            return &quot;foo&quot;;
+
+        case &quot;object&quot;:
+            return {a: &quot;b&quot;};
+
+        case &quot;Node&quot;:
+            return document.createTextNode(&quot;abc&quot;);
+    }
+    return null;
+}
+//@}
+
+/// IdlEnum ///
+// Used for IdlArray.prototype.assert_type_is
+function IdlEnum(obj)
+//@{
+{
+    /**
+     * obj is an object produced by the WebIDLParser.js &quot;dictionary&quot;
+     * production.
+     */
+
+    /** Self-explanatory. */
+    this.name = obj.name;
+
+    /** An array of values produced by the &quot;enum&quot; production. */
+    this.values = obj.values;
+
+}
+//@}
+
+IdlEnum.prototype = Object.create(IdlObject.prototype);
+
+/// IdlTypedef ///
+// Used for IdlArray.prototype.assert_type_is
+function IdlTypedef(obj)
+//@{
+{
+    /**
+     * obj is an object produced by the WebIDLParser.js &quot;typedef&quot;
+     * production.
+     */
+
+    /** Self-explanatory. */
+    this.name = obj.name;
+
+    /** An array of values produced by the &quot;typedef&quot; production. */
+    this.values = obj.values;
+
+}
+//@}
+
+IdlTypedef.prototype = Object.create(IdlObject.prototype);
+
+}());
+// vim: set expandtab shiftwidth=4 tabstop=4 foldmarker=@{,@} foldmethod=marker:
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcesreadmemd"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/readme.md (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/readme.md                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/readme.md        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+## Introduction ##
+
+testharness.js provides a framework for writing low-level tests of
+browser functionality in javascript. It provides a convenient API for
+making assertions and is intended to work for both simple synchronous
+tests and for tests of asynchronous behaviour.
+
+## Getting Started ##
+
+To use testharness.js you must include two scripts, in the order given:
+
+``` html
+&lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+```
+
+## Full documentation ##
+
+Full user documentation for the API is in the
+[docs/api.md](https://github.com/w3c/testharness.js/blob/master/docs/api.md) file.
+
+You can also read a tutorial on 
+[Using testharness.js](http://darobin.github.com/test-harness-tutorial/docs/using-testharness.html).
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourcestestharnessjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/testharness.js (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/testharness.js                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/testharness.js        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,2698 @@
</span><ins>+/*global self*/
+/*jshint latedef: nofunc*/
+/*
+Distributed under both the W3C Test Suite License [1] and the W3C
+3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
+policies and contribution forms [3].
+
+[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+[3] http://www.w3.org/2004/10/27-testcases
+*/
+
+/* Documentation is in docs/api.md */
+
+(function ()
+{
+    var debug = false;
+    // default timeout is 10 seconds, test can override if needed
+    var settings = {
+        output:true,
+        harness_timeout:{
+            &quot;normal&quot;:10000,
+            &quot;long&quot;:60000
+        },
+        test_timeout:null,
+        message_events: [&quot;start&quot;, &quot;test_state&quot;, &quot;result&quot;, &quot;completion&quot;]
+    };
+
+    var xhtml_ns = &quot;http://www.w3.org/1999/xhtml&quot;;
+
+    /*
+     * TestEnvironment is an abstraction for the environment in which the test
+     * harness is used. Each implementation of a test environment has to provide
+     * the following interface:
+     *
+     * interface TestEnvironment {
+     *   // Invoked after the global 'tests' object has been created and it's
+     *   // safe to call add_*_callback() to register event handlers.
+     *   void on_tests_ready();
+     *
+     *   // Invoked after setup() has been called to notify the test environment
+     *   // of changes to the test harness properties.
+     *   void on_new_harness_properties(object properties);
+     *
+     *   // Should return a new unique default test name.
+     *   DOMString next_default_test_name();
+     *
+     *   // Should return the test harness timeout duration in milliseconds.
+     *   float test_timeout();
+     *
+     *   // Should return the global scope object.
+     *   object global_scope();
+     * };
+     */
+
+    /*
+     * A test environment with a DOM. The global object is 'window'. By default
+     * test results are displayed in a table. Any parent windows receive
+     * callbacks or messages via postMessage() when test events occur. See
+     * apisample11.html and apisample12.html.
+     */
+    function WindowTestEnvironment() {
+        this.name_counter = 0;
+        this.window_cache = null;
+        this.output_handler = null;
+        this.all_loaded = false;
+        var this_obj = this;
+        this.message_events = [];
+
+        this.message_functions = {
+            start: [add_start_callback, remove_start_callback,
+                    function (properties) {
+                        this_obj._dispatch(&quot;start_callback&quot;, [properties],
+                                           {type: &quot;start&quot;, properties: properties});
+                    }],
+
+            test_state: [add_test_state_callback, remove_test_state_callback,
+                         function(test) {
+                             this_obj._dispatch(&quot;test_state_callback&quot;, [test],
+                                                {type: &quot;test_state&quot;,
+                                                 test: test.structured_clone()});
+                         }],
+            result: [add_result_callback, remove_result_callback,
+                     function (test) {
+                         this_obj.output_handler.show_status();
+                         this_obj._dispatch(&quot;result_callback&quot;, [test],
+                                            {type: &quot;result&quot;,
+                                             test: test.structured_clone()});
+                     }],
+            completion: [add_completion_callback, remove_completion_callback,
+                         function (tests, harness_status) {
+                             var cloned_tests = map(tests, function(test) {
+                                 return test.structured_clone();
+                             });
+                             this_obj._dispatch(&quot;completion_callback&quot;, [tests, harness_status],
+                                                {type: &quot;complete&quot;,
+                                                 tests: cloned_tests,
+                                                 status: harness_status.structured_clone()});
+                         }]
+        }
+
+        on_event(window, 'load', function() {
+            this_obj.all_loaded = true;
+        });
+    }
+
+    WindowTestEnvironment.prototype._dispatch = function(selector, callback_args, message_arg) {
+        this._forEach_windows(
+                function(w, same_origin) {
+                    if (same_origin) {
+                        try {
+                            var has_selector = selector in w;
+                        } catch(e) {
+                            // If document.domain was set at some point same_origin can be
+                            // wrong and the above will fail.
+                            has_selector = false;
+                        }
+                        if (has_selector) {
+                            try {
+                                w[selector].apply(undefined, callback_args);
+                            } catch (e) {
+                                if (debug) {
+                                    throw e;
+                                }
+                            }
+                        }
+                    }
+                    if (supports_post_message(w) &amp;&amp; w !== self) {
+                        w.postMessage(message_arg, &quot;*&quot;);
+                    }
+                });
+    };
+
+    WindowTestEnvironment.prototype._forEach_windows = function(callback) {
+        // Iterate of the the windows [self ... top, opener]. The callback is passed
+        // two objects, the first one is the windows object itself, the second one
+        // is a boolean indicating whether or not its on the same origin as the
+        // current window.
+        var cache = this.window_cache;
+        if (!cache) {
+            cache = [[self, true]];
+            var w = self;
+            var i = 0;
+            var so;
+            var origins = location.ancestorOrigins;
+            while (w != w.parent) {
+                w = w.parent;
+                // In WebKit, calls to parent windows' properties that aren't on the same
+                // origin cause an error message to be displayed in the error console but
+                // don't throw an exception. This is a deviation from the current HTML5
+                // spec. See: https://bugs.webkit.org/show_bug.cgi?id=43504
+                // The problem with WebKit's behavior is that it pollutes the error console
+                // with error messages that can't be caught.
+                //
+                // This issue can be mitigated by relying on the (for now) proprietary
+                // `location.ancestorOrigins` property which returns an ordered list of
+                // the origins of enclosing windows. See:
+                // http://trac.webkit.org/changeset/113945.
+                if (origins) {
+                    so = (location.origin == origins[i]);
+                } else {
+                    so = is_same_origin(w);
+                }
+                cache.push([w, so]);
+                i++;
+            }
+            w = window.opener;
+            if (w) {
+                // window.opener isn't included in the `location.ancestorOrigins` prop.
+                // We'll just have to deal with a simple check and an error msg on WebKit
+                // browsers in this case.
+                cache.push([w, is_same_origin(w)]);
+            }
+            this.window_cache = cache;
+        }
+
+        forEach(cache,
+                function(a) {
+                    callback.apply(null, a);
+                });
+    };
+
+    WindowTestEnvironment.prototype.on_tests_ready = function() {
+        var output = new Output();
+        this.output_handler = output;
+
+        var this_obj = this;
+
+        add_start_callback(function (properties) {
+            this_obj.output_handler.init(properties);
+        });
+
+        add_test_state_callback(function(test) {
+            this_obj.output_handler.show_status();
+        });
+
+        add_result_callback(function (test) {
+            this_obj.output_handler.show_status();
+        });
+
+        add_completion_callback(function (tests, harness_status) {
+            this_obj.output_handler.show_results(tests, harness_status);
+        });
+        this.setup_messages(settings.message_events);
+    };
+
+    WindowTestEnvironment.prototype.setup_messages = function(new_events) {
+        var this_obj = this;
+        forEach(settings.message_events, function(x) {
+            var current_dispatch = this_obj.message_events.indexOf(x) !== -1;
+            var new_dispatch = new_events.indexOf(x) !== -1;
+            if (!current_dispatch &amp;&amp; new_dispatch) {
+                this_obj.message_functions[x][0](this_obj.message_functions[x][2]);
+            } else if (current_dispatch &amp;&amp; !new_dispatch) {
+                this_obj.message_functions[x][1](this_obj.message_functions[x][2]);
+            }
+        });
+        this.message_events = new_events;
+    }
+
+    WindowTestEnvironment.prototype.next_default_test_name = function() {
+        //Don't use document.title to work around an Opera bug in XHTML documents
+        var title = document.getElementsByTagName(&quot;title&quot;)[0];
+        var prefix = (title &amp;&amp; title.firstChild &amp;&amp; title.firstChild.data) || &quot;Untitled&quot;;
+        var suffix = this.name_counter &gt; 0 ? &quot; &quot; + this.name_counter : &quot;&quot;;
+        this.name_counter++;
+        return prefix + suffix;
+    };
+
+    WindowTestEnvironment.prototype.on_new_harness_properties = function(properties) {
+        this.output_handler.setup(properties);
+        if (properties.hasOwnProperty(&quot;message_events&quot;)) {
+            this.setup_messages(properties.message_events);
+        }
+    };
+
+    WindowTestEnvironment.prototype.add_on_loaded_callback = function(callback) {
+        on_event(window, 'load', callback);
+    };
+
+    WindowTestEnvironment.prototype.test_timeout = function() {
+        var metas = document.getElementsByTagName(&quot;meta&quot;);
+        for (var i = 0; i &lt; metas.length; i++) {
+            if (metas[i].name == &quot;timeout&quot;) {
+                if (metas[i].content == &quot;long&quot;) {
+                    return settings.harness_timeout.long;
+                }
+                break;
+            }
+        }
+        return settings.harness_timeout.normal;
+    };
+
+    WindowTestEnvironment.prototype.global_scope = function() {
+        return window;
+    };
+
+    /*
+     * Base TestEnvironment implementation for a generic web worker.
+     *
+     * Workers accumulate test results. One or more clients can connect and
+     * retrieve results from a worker at any time.
+     *
+     * WorkerTestEnvironment supports communicating with a client via a
+     * MessagePort.  The mechanism for determining the appropriate MessagePort
+     * for communicating with a client depends on the type of worker and is
+     * implemented by the various specializations of WorkerTestEnvironment
+     * below.
+     *
+     * A client document using testharness can use fetch_tests_from_worker() to
+     * retrieve results from a worker. See apisample16.html.
+     */
+    function WorkerTestEnvironment() {
+        this.name_counter = 0;
+        this.all_loaded = true;
+        this.message_list = [];
+        this.message_ports = [];
+    }
+
+    WorkerTestEnvironment.prototype._dispatch = function(message) {
+        this.message_list.push(message);
+        for (var i = 0; i &lt; this.message_ports.length; ++i)
+        {
+            this.message_ports[i].postMessage(message);
+        }
+    };
+
+    // The only requirement is that port has a postMessage() method. It doesn't
+    // have to be an instance of a MessagePort, and often isn't.
+    WorkerTestEnvironment.prototype._add_message_port = function(port) {
+        this.message_ports.push(port);
+        for (var i = 0; i &lt; this.message_list.length; ++i)
+        {
+            port.postMessage(this.message_list[i]);
+        }
+    };
+
+    WorkerTestEnvironment.prototype.next_default_test_name = function() {
+        var suffix = this.name_counter &gt; 0 ? &quot; &quot; + this.name_counter : &quot;&quot;;
+        this.name_counter++;
+        return &quot;Untitled&quot; + suffix;
+    };
+
+    WorkerTestEnvironment.prototype.on_new_harness_properties = function() {};
+
+    WorkerTestEnvironment.prototype.on_tests_ready = function() {
+        var this_obj = this;
+        add_start_callback(
+                function(properties) {
+                    this_obj._dispatch({
+                        type: &quot;start&quot;,
+                        properties: properties,
+                    });
+                });
+        add_test_state_callback(
+                function(test) {
+                    this_obj._dispatch({
+                        type: &quot;test_state&quot;,
+                        test: test.structured_clone()
+                    });
+                });
+        add_result_callback(
+                function(test) {
+                    this_obj._dispatch({
+                        type: &quot;result&quot;,
+                        test: test.structured_clone()
+                    });
+                });
+        add_completion_callback(
+                function(tests, harness_status) {
+                    this_obj._dispatch({
+                        type: &quot;complete&quot;,
+                        tests: map(tests,
+                            function(test) {
+                                return test.structured_clone();
+                            }),
+                        status: harness_status.structured_clone()
+                    });
+                });
+    };
+
+    WorkerTestEnvironment.prototype.add_on_loaded_callback = function() {};
+
+    WorkerTestEnvironment.prototype.test_timeout = function() {
+        // Tests running in a worker don't have a default timeout. I.e. all
+        // worker tests behave as if settings.explicit_timeout is true.
+        return null;
+    };
+
+    WorkerTestEnvironment.prototype.global_scope = function() {
+        return self;
+    };
+
+    /*
+     * Dedicated web workers.
+     * https://html.spec.whatwg.org/multipage/workers.html#dedicatedworkerglobalscope
+     *
+     * This class is used as the test_environment when testharness is running
+     * inside a dedicated worker.
+     */
+    function DedicatedWorkerTestEnvironment() {
+        WorkerTestEnvironment.call(this);
+        // self is an instance of DedicatedWorkerGlobalScope which exposes
+        // a postMessage() method for communicating via the message channel
+        // established when the worker is created.
+        this._add_message_port(self);
+    }
+    DedicatedWorkerTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype);
+
+    DedicatedWorkerTestEnvironment.prototype.on_tests_ready = function() {
+        WorkerTestEnvironment.prototype.on_tests_ready.call(this);
+        // In the absence of an onload notification, we a require dedicated
+        // workers to explicitly signal when the tests are done.
+        tests.wait_for_finish = true;
+    };
+
+    /*
+     * Shared web workers.
+     * https://html.spec.whatwg.org/multipage/workers.html#sharedworkerglobalscope
+     *
+     * This class is used as the test_environment when testharness is running
+     * inside a shared web worker.
+     */
+    function SharedWorkerTestEnvironment() {
+        WorkerTestEnvironment.call(this);
+        var this_obj = this;
+        // Shared workers receive message ports via the 'onconnect' event for
+        // each connection.
+        self.addEventListener(&quot;connect&quot;,
+                function(message_event) {
+                    this_obj._add_message_port(message_event.source);
+                }, false);
+    }
+    SharedWorkerTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype);
+
+    SharedWorkerTestEnvironment.prototype.on_tests_ready = function() {
+        WorkerTestEnvironment.prototype.on_tests_ready.call(this);
+        // In the absence of an onload notification, we a require shared
+        // workers to explicitly signal when the tests are done.
+        tests.wait_for_finish = true;
+    };
+
+    /*
+     * Service workers.
+     * http://www.w3.org/TR/service-workers/
+     *
+     * This class is used as the test_environment when testharness is running
+     * inside a service worker.
+     */
+    function ServiceWorkerTestEnvironment() {
+        WorkerTestEnvironment.call(this);
+        this.all_loaded = false;
+        this.on_loaded_callback = null;
+        var this_obj = this;
+        self.addEventListener(&quot;message&quot;,
+                function(event) {
+                    if (event.data.type &amp;&amp; event.data.type === &quot;connect&quot;) {
+                        if (event.ports &amp;&amp; event.ports[0]) {
+                            // If a MessageChannel was passed, then use it to
+                            // send results back to the main window.  This
+                            // allows the tests to work even if the browser
+                            // does not fully support MessageEvent.source in
+                            // ServiceWorkers yet.
+                            this_obj._add_message_port(event.ports[0]);
+                            event.ports[0].start();
+                        } else {
+                            // If there is no MessageChannel, then attempt to
+                            // use the MessageEvent.source to send results
+                            // back to the main window.
+                            this_obj._add_message_port(event.source);
+                        }
+                    }
+                }, false);
+
+        // The oninstall event is received after the service worker script and
+        // all imported scripts have been fetched and executed. It's the
+        // equivalent of an onload event for a document. All tests should have
+        // been added by the time this event is received, thus it's not
+        // necessary to wait until the onactivate event.
+        on_event(self, &quot;install&quot;,
+                function(event) {
+                    this_obj.all_loaded = true;
+                    if (this_obj.on_loaded_callback) {
+                        this_obj.on_loaded_callback();
+                    }
+                });
+    }
+    ServiceWorkerTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype);
+
+    ServiceWorkerTestEnvironment.prototype.add_on_loaded_callback = function(callback) {
+        if (this.all_loaded) {
+            callback();
+        } else {
+            this.on_loaded_callback = callback;
+        }
+    };
+
+    function create_test_environment() {
+        if ('document' in self) {
+            return new WindowTestEnvironment();
+        }
+        if ('DedicatedWorkerGlobalScope' in self &amp;&amp;
+            self instanceof DedicatedWorkerGlobalScope) {
+            return new DedicatedWorkerTestEnvironment();
+        }
+        if ('SharedWorkerGlobalScope' in self &amp;&amp;
+            self instanceof SharedWorkerGlobalScope) {
+            return new SharedWorkerTestEnvironment();
+        }
+        if ('ServiceWorkerGlobalScope' in self &amp;&amp;
+            self instanceof ServiceWorkerGlobalScope) {
+            return new ServiceWorkerTestEnvironment();
+        }
+        if ('WorkerGlobalScope' in self &amp;&amp;
+            self instanceof WorkerGlobalScope) {
+            return new DedicatedWorkerTestEnvironment();
+        }
+
+        throw new Error(&quot;Unsupported test environment&quot;);
+    }
+
+    var test_environment = create_test_environment();
+
+    function is_shared_worker(worker) {
+        return 'SharedWorker' in self &amp;&amp; worker instanceof SharedWorker;
+    }
+
+    function is_service_worker(worker) {
+        return 'ServiceWorker' in self &amp;&amp; worker instanceof ServiceWorker;
+    }
+
+    /*
+     * API functions
+     */
+
+    function test(func, name, properties)
+    {
+        var test_name = name ? name : test_environment.next_default_test_name();
+        properties = properties ? properties : {};
+        var test_obj = new Test(test_name, properties);
+        test_obj.step(func, test_obj, test_obj);
+        if (test_obj.phase === test_obj.phases.STARTED) {
+            test_obj.done();
+        }
+    }
+
+    function async_test(func, name, properties)
+    {
+        if (typeof func !== &quot;function&quot;) {
+            properties = name;
+            name = func;
+            func = null;
+        }
+        var test_name = name ? name : test_environment.next_default_test_name();
+        properties = properties ? properties : {};
+        var test_obj = new Test(test_name, properties);
+        if (func) {
+            test_obj.step(func, test_obj, test_obj);
+        }
+        return test_obj;
+    }
+
+    function promise_test(func, name, properties) {
+        var test = async_test(name, properties);
+        // If there is no promise tests queue make one.
+        if (!tests.promise_tests) {
+            tests.promise_tests = Promise.resolve();
+        }
+        tests.promise_tests = tests.promise_tests.then(function() {
+            var donePromise = new Promise(function(resolve) {
+                test.add_cleanup(resolve);
+            });
+            var promise = test.step(func, test, test);
+            test.step(function() {
+                assert_not_equals(promise, undefined);
+            });
+            Promise.resolve(promise).then(
+                    function() {
+                        test.done();
+                    })
+                .catch(test.step_func(
+                    function(value) {
+                        if (value instanceof AssertionError) {
+                            throw value;
+                        }
+                        assert(false, &quot;promise_test&quot;, null,
+                               &quot;Unhandled rejection with value: ${value}&quot;, {value:value});
+                    }));
+            return donePromise;
+        });
+    }
+
+    function promise_rejects(test, expected, promise, description) {
+        return promise.then(test.unreached_func(&quot;Should have rejected: &quot; + description)).catch(function(e) {
+            assert_throws(expected, function() { throw e }, description);
+        });
+    }
+
+    /**
+     * This constructor helper allows DOM events to be handled using Promises,
+     * which can make it a lot easier to test a very specific series of events,
+     * including ensuring that unexpected events are not fired at any point.
+     */
+    function EventWatcher(test, watchedNode, eventTypes)
+    {
+        if (typeof eventTypes == 'string') {
+            eventTypes = [eventTypes];
+        }
+
+        var waitingFor = null;
+
+        var eventHandler = test.step_func(function(evt) {
+            assert_true(!!waitingFor,
+                        'Not expecting event, but got ' + evt.type + ' event');
+            assert_equals(evt.type, waitingFor.types[0],
+                          'Expected ' + waitingFor.types[0] + ' event, but got ' +
+                          evt.type + ' event instead');
+            if (waitingFor.types.length &gt; 1) {
+                // Pop first event from array
+                waitingFor.types.shift();
+                return;
+            }
+            // We need to null out waitingFor before calling the resolve function
+            // since the Promise's resolve handlers may call wait_for() which will
+            // need to set waitingFor.
+            var resolveFunc = waitingFor.resolve;
+            waitingFor = null;
+            resolveFunc(evt);
+        });
+
+        for (var i = 0; i &lt; eventTypes.length; i++) {
+            watchedNode.addEventListener(eventTypes[i], eventHandler, false);
+        }
+
+        /**
+         * Returns a Promise that will resolve after the specified event or
+         * series of events has occured.
+         */
+        this.wait_for = function(types) {
+            if (waitingFor) {
+                return Promise.reject('Already waiting for an event or events');
+            }
+            if (typeof types == 'string') {
+                types = [types];
+            }
+            return new Promise(function(resolve, reject) {
+                waitingFor = {
+                    types: types,
+                    resolve: resolve,
+                    reject: reject
+                };
+            });
+        };
+
+        function stop_watching() {
+            for (var i = 0; i &lt; eventTypes.length; i++) {
+                watchedNode.removeEventListener(eventTypes[i], eventHandler, false);
+            }
+        };
+
+        test.add_cleanup(stop_watching);
+
+        return this;
+    }
+    expose(EventWatcher, 'EventWatcher');
+
+    function setup(func_or_properties, maybe_properties)
+    {
+        var func = null;
+        var properties = {};
+        if (arguments.length === 2) {
+            func = func_or_properties;
+            properties = maybe_properties;
+        } else if (func_or_properties instanceof Function) {
+            func = func_or_properties;
+        } else {
+            properties = func_or_properties;
+        }
+        tests.setup(func, properties);
+        test_environment.on_new_harness_properties(properties);
+    }
+
+    function done() {
+        if (tests.tests.length === 0) {
+            tests.set_file_is_test();
+        }
+        if (tests.file_is_test) {
+            tests.tests[0].done();
+        }
+        tests.end_wait();
+    }
+
+    function generate_tests(func, args, properties) {
+        forEach(args, function(x, i)
+                {
+                    var name = x[0];
+                    test(function()
+                         {
+                             func.apply(this, x.slice(1));
+                         },
+                         name,
+                         Array.isArray(properties) ? properties[i] : properties);
+                });
+    }
+
+    function on_event(object, event, callback)
+    {
+        object.addEventListener(event, callback, false);
+    }
+
+    function step_timeout(f, t) {
+        var outer_this = this;
+        var args = Array.prototype.slice.call(arguments, 2);
+        return setTimeout(function() {
+            f.apply(outer_this, args);
+        }, t * tests.timeout_multiplier);
+    }
+
+    expose(test, 'test');
+    expose(async_test, 'async_test');
+    expose(promise_test, 'promise_test');
+    expose(promise_rejects, 'promise_rejects');
+    expose(generate_tests, 'generate_tests');
+    expose(setup, 'setup');
+    expose(done, 'done');
+    expose(on_event, 'on_event');
+    expose(step_timeout, 'step_timeout');
+
+    /*
+     * Return a string truncated to the given length, with ... added at the end
+     * if it was longer.
+     */
+    function truncate(s, len)
+    {
+        if (s.length &gt; len) {
+            return s.substring(0, len - 3) + &quot;...&quot;;
+        }
+        return s;
+    }
+
+    /*
+     * Return true if object is probably a Node object.
+     */
+    function is_node(object)
+    {
+        // I use duck-typing instead of instanceof, because
+        // instanceof doesn't work if the node is from another window (like an
+        // iframe's contentWindow):
+        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=12295
+        try {
+            var has_node_properties = (&quot;nodeType&quot; in object &amp;&amp;
+                                       &quot;nodeName&quot; in object &amp;&amp;
+                                       &quot;nodeValue&quot; in object &amp;&amp;
+                                       &quot;childNodes&quot; in object);
+        } catch (e) {
+            // We're probably cross-origin, which means we aren't a node
+            return false;
+        }
+
+        if (has_node_properties) {
+            try {
+                object.nodeType;
+            } catch (e) {
+                // The object is probably Node.prototype or another prototype
+                // object that inherits from it, and not a Node instance.
+                return false;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    var replacements = {
+        &quot;0&quot;: &quot;0&quot;,
+        &quot;1&quot;: &quot;x01&quot;,
+        &quot;2&quot;: &quot;x02&quot;,
+        &quot;3&quot;: &quot;x03&quot;,
+        &quot;4&quot;: &quot;x04&quot;,
+        &quot;5&quot;: &quot;x05&quot;,
+        &quot;6&quot;: &quot;x06&quot;,
+        &quot;7&quot;: &quot;x07&quot;,
+        &quot;8&quot;: &quot;b&quot;,
+        &quot;9&quot;: &quot;t&quot;,
+        &quot;10&quot;: &quot;n&quot;,
+        &quot;11&quot;: &quot;v&quot;,
+        &quot;12&quot;: &quot;f&quot;,
+        &quot;13&quot;: &quot;r&quot;,
+        &quot;14&quot;: &quot;x0e&quot;,
+        &quot;15&quot;: &quot;x0f&quot;,
+        &quot;16&quot;: &quot;x10&quot;,
+        &quot;17&quot;: &quot;x11&quot;,
+        &quot;18&quot;: &quot;x12&quot;,
+        &quot;19&quot;: &quot;x13&quot;,
+        &quot;20&quot;: &quot;x14&quot;,
+        &quot;21&quot;: &quot;x15&quot;,
+        &quot;22&quot;: &quot;x16&quot;,
+        &quot;23&quot;: &quot;x17&quot;,
+        &quot;24&quot;: &quot;x18&quot;,
+        &quot;25&quot;: &quot;x19&quot;,
+        &quot;26&quot;: &quot;x1a&quot;,
+        &quot;27&quot;: &quot;x1b&quot;,
+        &quot;28&quot;: &quot;x1c&quot;,
+        &quot;29&quot;: &quot;x1d&quot;,
+        &quot;30&quot;: &quot;x1e&quot;,
+        &quot;31&quot;: &quot;x1f&quot;,
+        &quot;0xfffd&quot;: &quot;ufffd&quot;,
+        &quot;0xfffe&quot;: &quot;ufffe&quot;,
+        &quot;0xffff&quot;: &quot;uffff&quot;,
+    };
+
+    /*
+     * Convert a value to a nice, human-readable string
+     */
+    function format_value(val, seen)
+    {
+        if (!seen) {
+            seen = [];
+        }
+        if (typeof val === &quot;object&quot; &amp;&amp; val !== null) {
+            if (seen.indexOf(val) &gt;= 0) {
+                return &quot;[...]&quot;;
+            }
+            seen.push(val);
+        }
+        if (Array.isArray(val)) {
+            return &quot;[&quot; + val.map(function(x) {return format_value(x, seen);}).join(&quot;, &quot;) + &quot;]&quot;;
+        }
+
+        switch (typeof val) {
+        case &quot;string&quot;:
+            val = val.replace(&quot;\\&quot;, &quot;\\\\&quot;);
+            for (var p in replacements) {
+                var replace = &quot;\\&quot; + replacements[p];
+                val = val.replace(RegExp(String.fromCharCode(p), &quot;g&quot;), replace);
+            }
+            return '&quot;' + val.replace(/&quot;/g, '\\&quot;') + '&quot;';
+        case &quot;boolean&quot;:
+        case &quot;undefined&quot;:
+            return String(val);
+        case &quot;number&quot;:
+            // In JavaScript, -0 === 0 and String(-0) == &quot;0&quot;, so we have to
+            // special-case.
+            if (val === -0 &amp;&amp; 1/val === -Infinity) {
+                return &quot;-0&quot;;
+            }
+            return String(val);
+        case &quot;object&quot;:
+            if (val === null) {
+                return &quot;null&quot;;
+            }
+
+            // Special-case Node objects, since those come up a lot in my tests.  I
+            // ignore namespaces.
+            if (is_node(val)) {
+                switch (val.nodeType) {
+                case Node.ELEMENT_NODE:
+                    var ret = &quot;&lt;&quot; + val.localName;
+                    for (var i = 0; i &lt; val.attributes.length; i++) {
+                        ret += &quot; &quot; + val.attributes[i].name + '=&quot;' + val.attributes[i].value + '&quot;';
+                    }
+                    ret += &quot;&gt;&quot; + val.innerHTML + &quot;&lt;/&quot; + val.localName + &quot;&gt;&quot;;
+                    return &quot;Element node &quot; + truncate(ret, 60);
+                case Node.TEXT_NODE:
+                    return 'Text node &quot;' + truncate(val.data, 60) + '&quot;';
+                case Node.PROCESSING_INSTRUCTION_NODE:
+                    return &quot;ProcessingInstruction node with target &quot; + format_value(truncate(val.target, 60)) + &quot; and data &quot; + format_value(truncate(val.data, 60));
+                case Node.COMMENT_NODE:
+                    return &quot;Comment node &lt;!--&quot; + truncate(val.data, 60) + &quot;--&gt;&quot;;
+                case Node.DOCUMENT_NODE:
+                    return &quot;Document node with &quot; + val.childNodes.length + (val.childNodes.length == 1 ? &quot; child&quot; : &quot; children&quot;);
+                case Node.DOCUMENT_TYPE_NODE:
+                    return &quot;DocumentType node&quot;;
+                case Node.DOCUMENT_FRAGMENT_NODE:
+                    return &quot;DocumentFragment node with &quot; + val.childNodes.length + (val.childNodes.length == 1 ? &quot; child&quot; : &quot; children&quot;);
+                default:
+                    return &quot;Node object of unknown type&quot;;
+                }
+            }
+
+        /* falls through */
+        default:
+            try {
+                return typeof val + ' &quot;' + truncate(String(val), 1000) + '&quot;';
+            } catch(e) {
+                return (&quot;[stringifying object threw &quot; + String(e) +
+                        &quot; with type &quot; + String(typeof e) + &quot;]&quot;);
+            }
+        }
+    }
+    expose(format_value, &quot;format_value&quot;);
+
+    /*
+     * Assertions
+     */
+
+    function assert_true(actual, description)
+    {
+        assert(actual === true, &quot;assert_true&quot;, description,
+                                &quot;expected true got ${actual}&quot;, {actual:actual});
+    }
+    expose(assert_true, &quot;assert_true&quot;);
+
+    function assert_false(actual, description)
+    {
+        assert(actual === false, &quot;assert_false&quot;, description,
+                                 &quot;expected false got ${actual}&quot;, {actual:actual});
+    }
+    expose(assert_false, &quot;assert_false&quot;);
+
+    function same_value(x, y) {
+        if (y !== y) {
+            //NaN case
+            return x !== x;
+        }
+        if (x === 0 &amp;&amp; y === 0) {
+            //Distinguish +0 and -0
+            return 1/x === 1/y;
+        }
+        return x === y;
+    }
+
+    function assert_equals(actual, expected, description)
+    {
+         /*
+          * Test if two primitives are equal or two objects
+          * are the same object
+          */
+        if (typeof actual != typeof expected) {
+            assert(false, &quot;assert_equals&quot;, description,
+                          &quot;expected (&quot; + typeof expected + &quot;) ${expected} but got (&quot; + typeof actual + &quot;) ${actual}&quot;,
+                          {expected:expected, actual:actual});
+            return;
+        }
+        assert(same_value(actual, expected), &quot;assert_equals&quot;, description,
+                                             &quot;expected ${expected} but got ${actual}&quot;,
+                                             {expected:expected, actual:actual});
+    }
+    expose(assert_equals, &quot;assert_equals&quot;);
+
+    function assert_not_equals(actual, expected, description)
+    {
+         /*
+          * Test if two primitives are unequal or two objects
+          * are different objects
+          */
+        assert(!same_value(actual, expected), &quot;assert_not_equals&quot;, description,
+                                              &quot;got disallowed value ${actual}&quot;,
+                                              {actual:actual});
+    }
+    expose(assert_not_equals, &quot;assert_not_equals&quot;);
+
+    function assert_in_array(actual, expected, description)
+    {
+        assert(expected.indexOf(actual) != -1, &quot;assert_in_array&quot;, description,
+                                               &quot;value ${actual} not in array ${expected}&quot;,
+                                               {actual:actual, expected:expected});
+    }
+    expose(assert_in_array, &quot;assert_in_array&quot;);
+
+    function assert_object_equals(actual, expected, description)
+    {
+         //This needs to be improved a great deal
+         function check_equal(actual, expected, stack)
+         {
+             stack.push(actual);
+
+             var p;
+             for (p in actual) {
+                 assert(expected.hasOwnProperty(p), &quot;assert_object_equals&quot;, description,
+                                                    &quot;unexpected property ${p}&quot;, {p:p});
+
+                 if (typeof actual[p] === &quot;object&quot; &amp;&amp; actual[p] !== null) {
+                     if (stack.indexOf(actual[p]) === -1) {
+                         check_equal(actual[p], expected[p], stack);
+                     }
+                 } else {
+                     assert(same_value(actual[p], expected[p]), &quot;assert_object_equals&quot;, description,
+                                                       &quot;property ${p} expected ${expected} got ${actual}&quot;,
+                                                       {p:p, expected:expected, actual:actual});
+                 }
+             }
+             for (p in expected) {
+                 assert(actual.hasOwnProperty(p),
+                        &quot;assert_object_equals&quot;, description,
+                        &quot;expected property ${p} missing&quot;, {p:p});
+             }
+             stack.pop();
+         }
+         check_equal(actual, expected, []);
+    }
+    expose(assert_object_equals, &quot;assert_object_equals&quot;);
+
+    function assert_array_equals(actual, expected, description)
+    {
+        assert(actual.length === expected.length,
+               &quot;assert_array_equals&quot;, description,
+               &quot;lengths differ, expected ${expected} got ${actual}&quot;,
+               {expected:expected.length, actual:actual.length});
+
+        for (var i = 0; i &lt; actual.length; i++) {
+            assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i),
+                   &quot;assert_array_equals&quot;, description,
+                   &quot;property ${i}, property expected to be ${expected} but was ${actual}&quot;,
+                   {i:i, expected:expected.hasOwnProperty(i) ? &quot;present&quot; : &quot;missing&quot;,
+                   actual:actual.hasOwnProperty(i) ? &quot;present&quot; : &quot;missing&quot;});
+            assert(same_value(expected[i], actual[i]),
+                   &quot;assert_array_equals&quot;, description,
+                   &quot;property ${i}, expected ${expected} but got ${actual}&quot;,
+                   {i:i, expected:expected[i], actual:actual[i]});
+        }
+    }
+    expose(assert_array_equals, &quot;assert_array_equals&quot;);
+
+    function assert_approx_equals(actual, expected, epsilon, description)
+    {
+        /*
+         * Test if two primitive numbers are equal withing +/- epsilon
+         */
+        assert(typeof actual === &quot;number&quot;,
+               &quot;assert_approx_equals&quot;, description,
+               &quot;expected a number but got a ${type_actual}&quot;,
+               {type_actual:typeof actual});
+
+        assert(Math.abs(actual - expected) &lt;= epsilon,
+               &quot;assert_approx_equals&quot;, description,
+               &quot;expected ${expected} +/- ${epsilon} but got ${actual}&quot;,
+               {expected:expected, actual:actual, epsilon:epsilon});
+    }
+    expose(assert_approx_equals, &quot;assert_approx_equals&quot;);
+
+    function assert_less_than(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is less than another
+         */
+        assert(typeof actual === &quot;number&quot;,
+               &quot;assert_less_than&quot;, description,
+               &quot;expected a number but got a ${type_actual}&quot;,
+               {type_actual:typeof actual});
+
+        assert(actual &lt; expected,
+               &quot;assert_less_than&quot;, description,
+               &quot;expected a number less than ${expected} but got ${actual}&quot;,
+               {expected:expected, actual:actual});
+    }
+    expose(assert_less_than, &quot;assert_less_than&quot;);
+
+    function assert_greater_than(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is greater than another
+         */
+        assert(typeof actual === &quot;number&quot;,
+               &quot;assert_greater_than&quot;, description,
+               &quot;expected a number but got a ${type_actual}&quot;,
+               {type_actual:typeof actual});
+
+        assert(actual &gt; expected,
+               &quot;assert_greater_than&quot;, description,
+               &quot;expected a number greater than ${expected} but got ${actual}&quot;,
+               {expected:expected, actual:actual});
+    }
+    expose(assert_greater_than, &quot;assert_greater_than&quot;);
+
+    function assert_between_exclusive(actual, lower, upper, description)
+    {
+        /*
+         * Test if a primitive number is between two others
+         */
+        assert(typeof actual === &quot;number&quot;,
+               &quot;assert_between_exclusive&quot;, description,
+               &quot;expected a number but got a ${type_actual}&quot;,
+               {type_actual:typeof actual});
+
+        assert(actual &gt; lower &amp;&amp; actual &lt; upper,
+               &quot;assert_between_exclusive&quot;, description,
+               &quot;expected a number greater than ${lower} &quot; +
+               &quot;and less than ${upper} but got ${actual}&quot;,
+               {lower:lower, upper:upper, actual:actual});
+    }
+    expose(assert_between_exclusive, &quot;assert_between_exclusive&quot;);
+
+    function assert_less_than_equal(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is less than or equal to another
+         */
+        assert(typeof actual === &quot;number&quot;,
+               &quot;assert_less_than_equal&quot;, description,
+               &quot;expected a number but got a ${type_actual}&quot;,
+               {type_actual:typeof actual});
+
+        assert(actual &lt;= expected,
+               &quot;assert_less_than_equal&quot;, description,
+               &quot;expected a number less than or equal to ${expected} but got ${actual}&quot;,
+               {expected:expected, actual:actual});
+    }
+    expose(assert_less_than_equal, &quot;assert_less_than_equal&quot;);
+
+    function assert_greater_than_equal(actual, expected, description)
+    {
+        /*
+         * Test if a primitive number is greater than or equal to another
+         */
+        assert(typeof actual === &quot;number&quot;,
+               &quot;assert_greater_than_equal&quot;, description,
+               &quot;expected a number but got a ${type_actual}&quot;,
+               {type_actual:typeof actual});
+
+        assert(actual &gt;= expected,
+               &quot;assert_greater_than_equal&quot;, description,
+               &quot;expected a number greater than or equal to ${expected} but got ${actual}&quot;,
+               {expected:expected, actual:actual});
+    }
+    expose(assert_greater_than_equal, &quot;assert_greater_than_equal&quot;);
+
+    function assert_between_inclusive(actual, lower, upper, description)
+    {
+        /*
+         * Test if a primitive number is between to two others or equal to either of them
+         */
+        assert(typeof actual === &quot;number&quot;,
+               &quot;assert_between_inclusive&quot;, description,
+               &quot;expected a number but got a ${type_actual}&quot;,
+               {type_actual:typeof actual});
+
+        assert(actual &gt;= lower &amp;&amp; actual &lt;= upper,
+               &quot;assert_between_inclusive&quot;, description,
+               &quot;expected a number greater than or equal to ${lower} &quot; +
+               &quot;and less than or equal to ${upper} but got ${actual}&quot;,
+               {lower:lower, upper:upper, actual:actual});
+    }
+    expose(assert_between_inclusive, &quot;assert_between_inclusive&quot;);
+
+    function assert_regexp_match(actual, expected, description) {
+        /*
+         * Test if a string (actual) matches a regexp (expected)
+         */
+        assert(expected.test(actual),
+               &quot;assert_regexp_match&quot;, description,
+               &quot;expected ${expected} but got ${actual}&quot;,
+               {expected:expected, actual:actual});
+    }
+    expose(assert_regexp_match, &quot;assert_regexp_match&quot;);
+
+    function assert_class_string(object, class_string, description) {
+        assert_equals({}.toString.call(object), &quot;[object &quot; + class_string + &quot;]&quot;,
+                      description);
+    }
+    expose(assert_class_string, &quot;assert_class_string&quot;);
+
+
+    function _assert_own_property(name) {
+        return function(object, property_name, description)
+        {
+            assert(object.hasOwnProperty(property_name),
+                   name, description,
+                   &quot;expected property ${p} missing&quot;, {p:property_name});
+        };
+    }
+    expose(_assert_own_property(&quot;assert_exists&quot;), &quot;assert_exists&quot;);
+    expose(_assert_own_property(&quot;assert_own_property&quot;), &quot;assert_own_property&quot;);
+
+    function assert_not_exists(object, property_name, description)
+    {
+        assert(!object.hasOwnProperty(property_name),
+               &quot;assert_not_exists&quot;, description,
+               &quot;unexpected property ${p} found&quot;, {p:property_name});
+    }
+    expose(assert_not_exists, &quot;assert_not_exists&quot;);
+
+    function _assert_inherits(name) {
+        return function (object, property_name, description)
+        {
+            assert(typeof object === &quot;object&quot; || typeof object === &quot;function&quot;,
+                   name, description,
+                   &quot;provided value is not an object&quot;);
+
+            assert(&quot;hasOwnProperty&quot; in object,
+                   name, description,
+                   &quot;provided value is an object but has no hasOwnProperty method&quot;);
+
+            assert(!object.hasOwnProperty(property_name),
+                   name, description,
+                   &quot;property ${p} found on object expected in prototype chain&quot;,
+                   {p:property_name});
+
+            assert(property_name in object,
+                   name, description,
+                   &quot;property ${p} not found in prototype chain&quot;,
+                   {p:property_name});
+        };
+    }
+    expose(_assert_inherits(&quot;assert_inherits&quot;), &quot;assert_inherits&quot;);
+    expose(_assert_inherits(&quot;assert_idl_attribute&quot;), &quot;assert_idl_attribute&quot;);
+
+    function assert_readonly(object, property_name, description)
+    {
+         var initial_value = object[property_name];
+         try {
+             //Note that this can have side effects in the case where
+             //the property has PutForwards
+             object[property_name] = initial_value + &quot;a&quot;; //XXX use some other value here?
+             assert(same_value(object[property_name], initial_value),
+                    &quot;assert_readonly&quot;, description,
+                    &quot;changing property ${p} succeeded&quot;,
+                    {p:property_name});
+         } finally {
+             object[property_name] = initial_value;
+         }
+    }
+    expose(assert_readonly, &quot;assert_readonly&quot;);
+
+    function assert_throws(code, func, description)
+    {
+        try {
+            func.call(this);
+            assert(false, &quot;assert_throws&quot;, description,
+                   &quot;${func} did not throw&quot;, {func:func});
+        } catch (e) {
+            if (e instanceof AssertionError) {
+                throw e;
+            }
+            if (code === null) {
+                return;
+            }
+            if (typeof code === &quot;object&quot;) {
+                assert(typeof e == &quot;object&quot; &amp;&amp; &quot;name&quot; in e &amp;&amp; e.name == code.name,
+                       &quot;assert_throws&quot;, description,
+                       &quot;${func} threw ${actual} (${actual_name}) expected ${expected} (${expected_name})&quot;,
+                                    {func:func, actual:e, actual_name:e.name,
+                                     expected:code,
+                                     expected_name:code.name});
+                return;
+            }
+
+            var code_name_map = {
+                INDEX_SIZE_ERR: 'IndexSizeError',
+                HIERARCHY_REQUEST_ERR: 'HierarchyRequestError',
+                WRONG_DOCUMENT_ERR: 'WrongDocumentError',
+                INVALID_CHARACTER_ERR: 'InvalidCharacterError',
+                NO_MODIFICATION_ALLOWED_ERR: 'NoModificationAllowedError',
+                NOT_FOUND_ERR: 'NotFoundError',
+                NOT_SUPPORTED_ERR: 'NotSupportedError',
+                INUSE_ATTRIBUTE_ERR: 'InUseAttributeError',
+                INVALID_STATE_ERR: 'InvalidStateError',
+                SYNTAX_ERR: 'SyntaxError',
+                INVALID_MODIFICATION_ERR: 'InvalidModificationError',
+                NAMESPACE_ERR: 'NamespaceError',
+                INVALID_ACCESS_ERR: 'InvalidAccessError',
+                TYPE_MISMATCH_ERR: 'TypeMismatchError',
+                SECURITY_ERR: 'SecurityError',
+                NETWORK_ERR: 'NetworkError',
+                ABORT_ERR: 'AbortError',
+                URL_MISMATCH_ERR: 'URLMismatchError',
+                QUOTA_EXCEEDED_ERR: 'QuotaExceededError',
+                TIMEOUT_ERR: 'TimeoutError',
+                INVALID_NODE_TYPE_ERR: 'InvalidNodeTypeError',
+                DATA_CLONE_ERR: 'DataCloneError'
+            };
+
+            var name = code in code_name_map ? code_name_map[code] : code;
+
+            var name_code_map = {
+                IndexSizeError: 1,
+                HierarchyRequestError: 3,
+                WrongDocumentError: 4,
+                InvalidCharacterError: 5,
+                NoModificationAllowedError: 7,
+                NotFoundError: 8,
+                NotSupportedError: 9,
+                InUseAttributeError: 10,
+                InvalidStateError: 11,
+                SyntaxError: 12,
+                InvalidModificationError: 13,
+                NamespaceError: 14,
+                InvalidAccessError: 15,
+                TypeMismatchError: 17,
+                SecurityError: 18,
+                NetworkError: 19,
+                AbortError: 20,
+                URLMismatchError: 21,
+                QuotaExceededError: 22,
+                TimeoutError: 23,
+                InvalidNodeTypeError: 24,
+                DataCloneError: 25,
+
+                EncodingError: 0,
+                NotReadableError: 0,
+                UnknownError: 0,
+                ConstraintError: 0,
+                DataError: 0,
+                TransactionInactiveError: 0,
+                ReadOnlyError: 0,
+                VersionError: 0,
+                OperationError: 0,
+                NotAllowedError: 0
+            };
+
+            if (!(name in name_code_map)) {
+                throw new AssertionError('Test bug: unrecognized DOMException code &quot;' + code + '&quot; passed to assert_throws()');
+            }
+
+            var required_props = { code: name_code_map[name] };
+
+            if (required_props.code === 0 ||
+               (typeof e == &quot;object&quot; &amp;&amp;
+                &quot;name&quot; in e &amp;&amp;
+                e.name !== e.name.toUpperCase() &amp;&amp;
+                e.name !== &quot;DOMException&quot;)) {
+                // New style exception: also test the name property.
+                required_props.name = name;
+            }
+
+            //We'd like to test that e instanceof the appropriate interface,
+            //but we can't, because we don't know what window it was created
+            //in.  It might be an instanceof the appropriate interface on some
+            //unknown other window.  TODO: Work around this somehow?
+
+            assert(typeof e == &quot;object&quot;,
+                   &quot;assert_throws&quot;, description,
+                   &quot;${func} threw ${e} with type ${type}, not an object&quot;,
+                   {func:func, e:e, type:typeof e});
+
+            for (var prop in required_props) {
+                assert(typeof e == &quot;object&quot; &amp;&amp; prop in e &amp;&amp; e[prop] == required_props[prop],
+                       &quot;assert_throws&quot;, description,
+                       &quot;${func} threw ${e} that is not a DOMException &quot; + code + &quot;: property ${prop} is equal to ${actual}, expected ${expected}&quot;,
+                       {func:func, e:e, prop:prop, actual:e[prop], expected:required_props[prop]});
+            }
+        }
+    }
+    expose(assert_throws, &quot;assert_throws&quot;);
+
+    function assert_unreached(description) {
+         assert(false, &quot;assert_unreached&quot;, description,
+                &quot;Reached unreachable code&quot;);
+    }
+    expose(assert_unreached, &quot;assert_unreached&quot;);
+
+    function assert_any(assert_func, actual, expected_array)
+    {
+        var args = [].slice.call(arguments, 3);
+        var errors = [];
+        var passed = false;
+        forEach(expected_array,
+                function(expected)
+                {
+                    try {
+                        assert_func.apply(this, [actual, expected].concat(args));
+                        passed = true;
+                    } catch (e) {
+                        errors.push(e.message);
+                    }
+                });
+        if (!passed) {
+            throw new AssertionError(errors.join(&quot;\n\n&quot;));
+        }
+    }
+    expose(assert_any, &quot;assert_any&quot;);
+
+    function Test(name, properties)
+    {
+        if (tests.file_is_test &amp;&amp; tests.tests.length) {
+            throw new Error(&quot;Tried to create a test with file_is_test&quot;);
+        }
+        this.name = name;
+
+        this.phase = this.phases.INITIAL;
+
+        this.status = this.NOTRUN;
+        this.timeout_id = null;
+        this.index = null;
+
+        this.properties = properties;
+        var timeout = properties.timeout ? properties.timeout : settings.test_timeout;
+        if (timeout !== null) {
+            this.timeout_length = timeout * tests.timeout_multiplier;
+        } else {
+            this.timeout_length = null;
+        }
+
+        this.message = null;
+        this.stack = null;
+
+        this.steps = [];
+
+        this.cleanup_callbacks = [];
+
+        tests.push(this);
+    }
+
+    Test.statuses = {
+        PASS:0,
+        FAIL:1,
+        TIMEOUT:2,
+        NOTRUN:3
+    };
+
+    Test.prototype = merge({}, Test.statuses);
+
+    Test.prototype.phases = {
+        INITIAL:0,
+        STARTED:1,
+        HAS_RESULT:2,
+        COMPLETE:3
+    };
+
+    Test.prototype.structured_clone = function()
+    {
+        if (!this._structured_clone) {
+            var msg = this.message;
+            msg = msg ? String(msg) : msg;
+            this._structured_clone = merge({
+                name:String(this.name),
+                properties:merge({}, this.properties),
+            }, Test.statuses);
+        }
+        this._structured_clone.status = this.status;
+        this._structured_clone.message = this.message;
+        this._structured_clone.stack = this.stack;
+        this._structured_clone.index = this.index;
+        return this._structured_clone;
+    };
+
+    Test.prototype.step = function(func, this_obj)
+    {
+        if (this.phase &gt; this.phases.STARTED) {
+            return;
+        }
+        this.phase = this.phases.STARTED;
+        //If we don't get a result before the harness times out that will be a test timout
+        this.set_status(this.TIMEOUT, &quot;Test timed out&quot;);
+
+        tests.started = true;
+        tests.notify_test_state(this);
+
+        if (this.timeout_id === null) {
+            this.set_timeout();
+        }
+
+        this.steps.push(func);
+
+        if (arguments.length === 1) {
+            this_obj = this;
+        }
+
+        try {
+            return func.apply(this_obj, Array.prototype.slice.call(arguments, 2));
+        } catch (e) {
+            if (this.phase &gt;= this.phases.HAS_RESULT) {
+                return;
+            }
+            var message = String((typeof e === &quot;object&quot; &amp;&amp; e !== null) ? e.message : e);
+            var stack = e.stack ? e.stack : null;
+
+            this.set_status(this.FAIL, message, stack);
+            this.phase = this.phases.HAS_RESULT;
+            this.done();
+        }
+    };
+
+    Test.prototype.step_func = function(func, this_obj)
+    {
+        var test_this = this;
+
+        if (arguments.length === 1) {
+            this_obj = test_this;
+        }
+
+        return function()
+        {
+            return test_this.step.apply(test_this, [func, this_obj].concat(
+                Array.prototype.slice.call(arguments)));
+        };
+    };
+
+    Test.prototype.step_func_done = function(func, this_obj)
+    {
+        var test_this = this;
+
+        if (arguments.length === 1) {
+            this_obj = test_this;
+        }
+
+        return function()
+        {
+            if (func) {
+                test_this.step.apply(test_this, [func, this_obj].concat(
+                    Array.prototype.slice.call(arguments)));
+            }
+            test_this.done();
+        };
+    };
+
+    Test.prototype.unreached_func = function(description)
+    {
+        return this.step_func(function() {
+            assert_unreached(description);
+        });
+    };
+
+    Test.prototype.step_timeout = function(f, timeout) {
+        var test_this = this;
+        var args = Array.prototype.slice.call(arguments, 2);
+        return setTimeout(this.step_func(function() {
+            return f.apply(test_this, args);
+        }), timeout * tests.timeout_multiplier);
+    }
+
+    Test.prototype.add_cleanup = function(callback) {
+        this.cleanup_callbacks.push(callback);
+    };
+
+    Test.prototype.force_timeout = function() {
+        this.set_status(this.TIMEOUT);
+        this.phase = this.phases.HAS_RESULT;
+    };
+
+    Test.prototype.set_timeout = function()
+    {
+        if (this.timeout_length !== null) {
+            var this_obj = this;
+            this.timeout_id = setTimeout(function()
+                                         {
+                                             this_obj.timeout();
+                                         }, this.timeout_length);
+        }
+    };
+
+    Test.prototype.set_status = function(status, message, stack)
+    {
+        this.status = status;
+        this.message = message;
+        this.stack = stack ? stack : null;
+    };
+
+    Test.prototype.timeout = function()
+    {
+        this.timeout_id = null;
+        this.set_status(this.TIMEOUT, &quot;Test timed out&quot;);
+        this.phase = this.phases.HAS_RESULT;
+        this.done();
+    };
+
+    Test.prototype.done = function()
+    {
+        if (this.phase == this.phases.COMPLETE) {
+            return;
+        }
+
+        if (this.phase &lt;= this.phases.STARTED) {
+            this.set_status(this.PASS, null);
+        }
+
+        this.phase = this.phases.COMPLETE;
+
+        clearTimeout(this.timeout_id);
+        tests.result(this);
+        this.cleanup();
+    };
+
+    Test.prototype.cleanup = function() {
+        forEach(this.cleanup_callbacks,
+                function(cleanup_callback) {
+                    cleanup_callback();
+                });
+    };
+
+    /*
+     * A RemoteTest object mirrors a Test object on a remote worker. The
+     * associated RemoteWorker updates the RemoteTest object in response to
+     * received events. In turn, the RemoteTest object replicates these events
+     * on the local document. This allows listeners (test result reporting
+     * etc..) to transparently handle local and remote events.
+     */
+    function RemoteTest(clone) {
+        var this_obj = this;
+        Object.keys(clone).forEach(
+                function(key) {
+                    this_obj[key] = clone[key];
+                });
+        this.index = null;
+        this.phase = this.phases.INITIAL;
+        this.update_state_from(clone);
+        tests.push(this);
+    }
+
+    RemoteTest.prototype.structured_clone = function() {
+        var clone = {};
+        Object.keys(this).forEach(
+                (function(key) {
+                    if (typeof(this[key]) === &quot;object&quot;) {
+                        clone[key] = merge({}, this[key]);
+                    } else {
+                        clone[key] = this[key];
+                    }
+                }).bind(this));
+        clone.phases = merge({}, this.phases);
+        return clone;
+    };
+
+    RemoteTest.prototype.cleanup = function() {};
+    RemoteTest.prototype.phases = Test.prototype.phases;
+    RemoteTest.prototype.update_state_from = function(clone) {
+        this.status = clone.status;
+        this.message = clone.message;
+        this.stack = clone.stack;
+        if (this.phase === this.phases.INITIAL) {
+            this.phase = this.phases.STARTED;
+        }
+    };
+    RemoteTest.prototype.done = function() {
+        this.phase = this.phases.COMPLETE;
+    }
+
+    /*
+     * A RemoteWorker listens for test events from a worker. These events are
+     * then used to construct and maintain RemoteTest objects that mirror the
+     * tests running on the remote worker.
+     */
+    function RemoteWorker(worker) {
+        this.running = true;
+        this.tests = new Array();
+
+        var this_obj = this;
+        worker.onerror = function(error) { this_obj.worker_error(error); };
+
+        var message_port;
+
+        if (is_service_worker(worker)) {
+            if (window.MessageChannel) {
+                // The ServiceWorker's implicit MessagePort is currently not
+                // reliably accessible from the ServiceWorkerGlobalScope due to
+                // Blink setting MessageEvent.source to null for messages sent
+                // via ServiceWorker.postMessage(). Until that's resolved,
+                // create an explicit MessageChannel and pass one end to the
+                // worker.
+                var message_channel = new MessageChannel();
+                message_port = message_channel.port1;
+                message_port.start();
+                worker.postMessage({type: &quot;connect&quot;}, [message_channel.port2]);
+            } else {
+                // If MessageChannel is not available, then try the
+                // ServiceWorker.postMessage() approach using MessageEvent.source
+                // on the other end.
+                message_port = navigator.serviceWorker;
+                worker.postMessage({type: &quot;connect&quot;});
+            }
+        } else if (is_shared_worker(worker)) {
+            message_port = worker.port;
+        } else {
+            message_port = worker;
+        }
+
+        // Keeping a reference to the worker until worker_done() is seen
+        // prevents the Worker object and its MessageChannel from going away
+        // before all the messages are dispatched.
+        this.worker = worker;
+
+        message_port.onmessage =
+            function(message) {
+                if (this_obj.running &amp;&amp; (message.data.type in this_obj.message_handlers)) {
+                    this_obj.message_handlers[message.data.type].call(this_obj, message.data);
+                }
+            };
+    }
+
+    RemoteWorker.prototype.worker_error = function(error) {
+        var message = error.message || String(error);
+        var filename = (error.filename ? &quot; &quot; + error.filename: &quot;&quot;);
+        // FIXME: Display worker error states separately from main document
+        // error state.
+        this.worker_done({
+            status: {
+                status: tests.status.ERROR,
+                message: &quot;Error in worker&quot; + filename + &quot;: &quot; + message,
+                stack: error.stack
+            }
+        });
+        error.preventDefault();
+    };
+
+    RemoteWorker.prototype.test_state = function(data) {
+        var remote_test = this.tests[data.test.index];
+        if (!remote_test) {
+            remote_test = new RemoteTest(data.test);
+            this.tests[data.test.index] = remote_test;
+        }
+        remote_test.update_state_from(data.test);
+        tests.notify_test_state(remote_test);
+    };
+
+    RemoteWorker.prototype.test_done = function(data) {
+        var remote_test = this.tests[data.test.index];
+        remote_test.update_state_from(data.test);
+        remote_test.done();
+        tests.result(remote_test);
+    };
+
+    RemoteWorker.prototype.worker_done = function(data) {
+        if (tests.status.status === null &amp;&amp;
+            data.status.status !== data.status.OK) {
+            tests.status.status = data.status.status;
+            tests.status.message = data.status.message;
+            tests.status.stack = data.status.stack;
+        }
+        this.running = false;
+        this.worker = null;
+        if (tests.all_done()) {
+            tests.complete();
+        }
+    };
+
+    RemoteWorker.prototype.message_handlers = {
+        test_state: RemoteWorker.prototype.test_state,
+        result: RemoteWorker.prototype.test_done,
+        complete: RemoteWorker.prototype.worker_done
+    };
+
+    /*
+     * Harness
+     */
+
+    function TestsStatus()
+    {
+        this.status = null;
+        this.message = null;
+        this.stack = null;
+    }
+
+    TestsStatus.statuses = {
+        OK:0,
+        ERROR:1,
+        TIMEOUT:2
+    };
+
+    TestsStatus.prototype = merge({}, TestsStatus.statuses);
+
+    TestsStatus.prototype.structured_clone = function()
+    {
+        if (!this._structured_clone) {
+            var msg = this.message;
+            msg = msg ? String(msg) : msg;
+            this._structured_clone = merge({
+                status:this.status,
+                message:msg,
+                stack:this.stack
+            }, TestsStatus.statuses);
+        }
+        return this._structured_clone;
+    };
+
+    function Tests()
+    {
+        this.tests = [];
+        this.num_pending = 0;
+
+        this.phases = {
+            INITIAL:0,
+            SETUP:1,
+            HAVE_TESTS:2,
+            HAVE_RESULTS:3,
+            COMPLETE:4
+        };
+        this.phase = this.phases.INITIAL;
+
+        this.properties = {};
+
+        this.wait_for_finish = false;
+        this.processing_callbacks = false;
+
+        this.allow_uncaught_exception = false;
+
+        this.file_is_test = false;
+
+        this.timeout_multiplier = 1;
+        this.timeout_length = test_environment.test_timeout();
+        this.timeout_id = null;
+
+        this.start_callbacks = [];
+        this.test_state_callbacks = [];
+        this.test_done_callbacks = [];
+        this.all_done_callbacks = [];
+
+        this.pending_workers = [];
+
+        this.status = new TestsStatus();
+
+        var this_obj = this;
+
+        test_environment.add_on_loaded_callback(function() {
+            if (this_obj.all_done()) {
+                this_obj.complete();
+            }
+        });
+
+        this.set_timeout();
+    }
+
+    Tests.prototype.setup = function(func, properties)
+    {
+        if (this.phase &gt;= this.phases.HAVE_RESULTS) {
+            return;
+        }
+
+        if (this.phase &lt; this.phases.SETUP) {
+            this.phase = this.phases.SETUP;
+        }
+
+        this.properties = properties;
+
+        for (var p in properties) {
+            if (properties.hasOwnProperty(p)) {
+                var value = properties[p];
+                if (p == &quot;allow_uncaught_exception&quot;) {
+                    this.allow_uncaught_exception = value;
+                } else if (p == &quot;explicit_done&quot; &amp;&amp; value) {
+                    this.wait_for_finish = true;
+                } else if (p == &quot;explicit_timeout&quot; &amp;&amp; value) {
+                    this.timeout_length = null;
+                    if (this.timeout_id)
+                    {
+                        clearTimeout(this.timeout_id);
+                    }
+                } else if (p == &quot;timeout_multiplier&quot;) {
+                    this.timeout_multiplier = value;
+                }
+            }
+        }
+
+        if (func) {
+            try {
+                func();
+            } catch (e) {
+                this.status.status = this.status.ERROR;
+                this.status.message = String(e);
+                this.status.stack = e.stack ? e.stack : null;
+            }
+        }
+        this.set_timeout();
+    };
+
+    Tests.prototype.set_file_is_test = function() {
+        if (this.tests.length &gt; 0) {
+            throw new Error(&quot;Tried to set file as test after creating a test&quot;);
+        }
+        this.wait_for_finish = true;
+        this.file_is_test = true;
+        // Create the test, which will add it to the list of tests
+        async_test();
+    };
+
+    Tests.prototype.set_timeout = function() {
+        var this_obj = this;
+        clearTimeout(this.timeout_id);
+        if (this.timeout_length !== null) {
+            this.timeout_id = setTimeout(function() {
+                                             this_obj.timeout();
+                                         }, this.timeout_length);
+        }
+    };
+
+    Tests.prototype.timeout = function() {
+        if (this.status.status === null) {
+            this.status.status = this.status.TIMEOUT;
+        }
+        this.complete();
+    };
+
+    Tests.prototype.end_wait = function()
+    {
+        this.wait_for_finish = false;
+        if (this.all_done()) {
+            this.complete();
+        }
+    };
+
+    Tests.prototype.push = function(test)
+    {
+        if (this.phase &lt; this.phases.HAVE_TESTS) {
+            this.start();
+        }
+        this.num_pending++;
+        test.index = this.tests.push(test);
+        this.notify_test_state(test);
+    };
+
+    Tests.prototype.notify_test_state = function(test) {
+        var this_obj = this;
+        forEach(this.test_state_callbacks,
+                function(callback) {
+                    callback(test, this_obj);
+                });
+    };
+
+    Tests.prototype.all_done = function() {
+        return (this.tests.length &gt; 0 &amp;&amp; test_environment.all_loaded &amp;&amp;
+                this.num_pending === 0 &amp;&amp; !this.wait_for_finish &amp;&amp;
+                !this.processing_callbacks &amp;&amp;
+                !this.pending_workers.some(function(w) { return w.running; }));
+    };
+
+    Tests.prototype.start = function() {
+        this.phase = this.phases.HAVE_TESTS;
+        this.notify_start();
+    };
+
+    Tests.prototype.notify_start = function() {
+        var this_obj = this;
+        forEach (this.start_callbacks,
+                 function(callback)
+                 {
+                     callback(this_obj.properties);
+                 });
+    };
+
+    Tests.prototype.result = function(test)
+    {
+        if (this.phase &gt; this.phases.HAVE_RESULTS) {
+            return;
+        }
+        this.phase = this.phases.HAVE_RESULTS;
+        this.num_pending--;
+        this.notify_result(test);
+    };
+
+    Tests.prototype.notify_result = function(test) {
+        var this_obj = this;
+        this.processing_callbacks = true;
+        forEach(this.test_done_callbacks,
+                function(callback)
+                {
+                    callback(test, this_obj);
+                });
+        this.processing_callbacks = false;
+        if (this_obj.all_done()) {
+            this_obj.complete();
+        }
+    };
+
+    Tests.prototype.complete = function() {
+        if (this.phase === this.phases.COMPLETE) {
+            return;
+        }
+        this.phase = this.phases.COMPLETE;
+        var this_obj = this;
+        this.tests.forEach(
+            function(x)
+            {
+                if (x.phase &lt; x.phases.COMPLETE) {
+                    this_obj.notify_result(x);
+                    x.cleanup();
+                    x.phase = x.phases.COMPLETE;
+                }
+            }
+        );
+        this.notify_complete();
+    };
+
+    Tests.prototype.notify_complete = function() {
+        var this_obj = this;
+        if (this.status.status === null) {
+            this.status.status = this.status.OK;
+        }
+
+        forEach (this.all_done_callbacks,
+                 function(callback)
+                 {
+                     callback(this_obj.tests, this_obj.status);
+                 });
+    };
+
+    Tests.prototype.fetch_tests_from_worker = function(worker) {
+        if (this.phase &gt;= this.phases.COMPLETE) {
+            return;
+        }
+
+        this.pending_workers.push(new RemoteWorker(worker));
+    };
+
+    function fetch_tests_from_worker(port) {
+        tests.fetch_tests_from_worker(port);
+    }
+    expose(fetch_tests_from_worker, 'fetch_tests_from_worker');
+
+    function timeout() {
+        if (tests.timeout_length === null) {
+            tests.timeout();
+        }
+    }
+    expose(timeout, 'timeout');
+
+    function add_start_callback(callback) {
+        tests.start_callbacks.push(callback);
+    }
+
+    function add_test_state_callback(callback) {
+        tests.test_state_callbacks.push(callback);
+    }
+
+    function add_result_callback(callback) {
+        tests.test_done_callbacks.push(callback);
+    }
+
+    function add_completion_callback(callback) {
+        tests.all_done_callbacks.push(callback);
+    }
+
+    expose(add_start_callback, 'add_start_callback');
+    expose(add_test_state_callback, 'add_test_state_callback');
+    expose(add_result_callback, 'add_result_callback');
+    expose(add_completion_callback, 'add_completion_callback');
+
+    function remove(array, item) {
+        var index = array.indexOf(item);
+        if (index &gt; -1) {
+            array.splice(index, 1);
+        }
+    }
+
+    function remove_start_callback(callback) {
+        remove(tests.start_callbacks, callback);
+    }
+
+    function remove_test_state_callback(callback) {
+        remove(tests.test_state_callbacks, callback);
+    }
+
+    function remove_result_callback(callback) {
+        remove(tests.test_done_callbacks, callback);
+    }
+
+    function remove_completion_callback(callback) {
+       remove(tests.all_done_callbacks, callback);
+    }
+
+    /*
+     * Output listener
+    */
+
+    function Output() {
+        this.output_document = document;
+        this.output_node = null;
+        this.enabled = settings.output;
+        this.phase = this.INITIAL;
+    }
+
+    Output.prototype.INITIAL = 0;
+    Output.prototype.STARTED = 1;
+    Output.prototype.HAVE_RESULTS = 2;
+    Output.prototype.COMPLETE = 3;
+
+    Output.prototype.setup = function(properties) {
+        if (this.phase &gt; this.INITIAL) {
+            return;
+        }
+
+        //If output is disabled in testharnessreport.js the test shouldn't be
+        //able to override that
+        this.enabled = this.enabled &amp;&amp; (properties.hasOwnProperty(&quot;output&quot;) ?
+                                        properties.output : settings.output);
+    };
+
+    Output.prototype.init = function(properties) {
+        if (this.phase &gt;= this.STARTED) {
+            return;
+        }
+        if (properties.output_document) {
+            this.output_document = properties.output_document;
+        } else {
+            this.output_document = document;
+        }
+        this.phase = this.STARTED;
+    };
+
+    Output.prototype.resolve_log = function() {
+        var output_document;
+        if (typeof this.output_document === &quot;function&quot;) {
+            output_document = this.output_document.apply(undefined);
+        } else {
+            output_document = this.output_document;
+        }
+        if (!output_document) {
+            return;
+        }
+        var node = output_document.getElementById(&quot;log&quot;);
+        if (!node) {
+            if (!document.body || document.readyState == &quot;loading&quot;) {
+                return;
+            }
+            node = output_document.createElement(&quot;div&quot;);
+            node.id = &quot;log&quot;;
+            output_document.body.appendChild(node);
+        }
+        this.output_document = output_document;
+        this.output_node = node;
+    };
+
+    Output.prototype.show_status = function() {
+        if (this.phase &lt; this.STARTED) {
+            this.init();
+        }
+        if (!this.enabled) {
+            return;
+        }
+        if (this.phase &lt; this.HAVE_RESULTS) {
+            this.resolve_log();
+            this.phase = this.HAVE_RESULTS;
+        }
+        var done_count = tests.tests.length - tests.num_pending;
+        if (this.output_node) {
+            if (done_count &lt; 100 ||
+                (done_count &lt; 1000 &amp;&amp; done_count % 100 === 0) ||
+                done_count % 1000 === 0) {
+                this.output_node.textContent = &quot;Running, &quot; +
+                    done_count + &quot; complete, &quot; +
+                    tests.num_pending + &quot; remain&quot;;
+            }
+        }
+    };
+
+    Output.prototype.show_results = function (tests, harness_status) {
+        if (this.phase &gt;= this.COMPLETE) {
+            return;
+        }
+        if (!this.enabled) {
+            return;
+        }
+        if (!this.output_node) {
+            this.resolve_log();
+        }
+        this.phase = this.COMPLETE;
+
+        var log = this.output_node;
+        if (!log) {
+            return;
+        }
+        var output_document = this.output_document;
+
+        while (log.lastChild) {
+            log.removeChild(log.lastChild);
+        }
+
+        var harness_url = get_harness_url();
+        if (harness_url !== null) {
+            var stylesheet = output_document.createElementNS(xhtml_ns, &quot;link&quot;);
+            stylesheet.setAttribute(&quot;rel&quot;, &quot;stylesheet&quot;);
+            stylesheet.setAttribute(&quot;href&quot;, harness_url + &quot;testharness.css&quot;);
+            var heads = output_document.getElementsByTagName(&quot;head&quot;);
+            if (heads.length) {
+                heads[0].appendChild(stylesheet);
+            }
+        }
+
+        var status_text_harness = {};
+        status_text_harness[harness_status.OK] = &quot;OK&quot;;
+        status_text_harness[harness_status.ERROR] = &quot;Error&quot;;
+        status_text_harness[harness_status.TIMEOUT] = &quot;Timeout&quot;;
+
+        var status_text = {};
+        status_text[Test.prototype.PASS] = &quot;Pass&quot;;
+        status_text[Test.prototype.FAIL] = &quot;Fail&quot;;
+        status_text[Test.prototype.TIMEOUT] = &quot;Timeout&quot;;
+        status_text[Test.prototype.NOTRUN] = &quot;Not Run&quot;;
+
+        var status_number = {};
+        forEach(tests,
+                function(test) {
+                    var status = status_text[test.status];
+                    if (status_number.hasOwnProperty(status)) {
+                        status_number[status] += 1;
+                    } else {
+                        status_number[status] = 1;
+                    }
+                });
+
+        function status_class(status)
+        {
+            return status.replace(/\s/g, '').toLowerCase();
+        }
+
+        var summary_template = [&quot;section&quot;, {&quot;id&quot;:&quot;summary&quot;},
+                                [&quot;h2&quot;, {}, &quot;Summary&quot;],
+                                function()
+                                {
+
+                                    var status = status_text_harness[harness_status.status];
+                                    var rv = [[&quot;section&quot;, {},
+                                               [&quot;p&quot;, {},
+                                                &quot;Harness status: &quot;,
+                                                [&quot;span&quot;, {&quot;class&quot;:status_class(status)},
+                                                 status
+                                                ],
+                                               ]
+                                              ]];
+
+                                    if (harness_status.status === harness_status.ERROR) {
+                                        rv[0].push([&quot;pre&quot;, {}, harness_status.message]);
+                                        if (harness_status.stack) {
+                                            rv[0].push([&quot;pre&quot;, {}, harness_status.stack]);
+                                        }
+                                    }
+                                    return rv;
+                                },
+                                [&quot;p&quot;, {}, &quot;Found ${num_tests} tests&quot;],
+                                function() {
+                                    var rv = [[&quot;div&quot;, {}]];
+                                    var i = 0;
+                                    while (status_text.hasOwnProperty(i)) {
+                                        if (status_number.hasOwnProperty(status_text[i])) {
+                                            var status = status_text[i];
+                                            rv[0].push([&quot;div&quot;, {&quot;class&quot;:status_class(status)},
+                                                        [&quot;label&quot;, {},
+                                                         [&quot;input&quot;, {type:&quot;checkbox&quot;, checked:&quot;checked&quot;}],
+                                                         status_number[status] + &quot; &quot; + status]]);
+                                        }
+                                        i++;
+                                    }
+                                    return rv;
+                                },
+                               ];
+
+        log.appendChild(render(summary_template, {num_tests:tests.length}, output_document));
+
+        forEach(output_document.querySelectorAll(&quot;section#summary label&quot;),
+                function(element)
+                {
+                    on_event(element, &quot;click&quot;,
+                             function(e)
+                             {
+                                 if (output_document.getElementById(&quot;results&quot;) === null) {
+                                     e.preventDefault();
+                                     return;
+                                 }
+                                 var result_class = element.parentNode.getAttribute(&quot;class&quot;);
+                                 var style_element = output_document.querySelector(&quot;style#hide-&quot; + result_class);
+                                 var input_element = element.querySelector(&quot;input&quot;);
+                                 if (!style_element &amp;&amp; !input_element.checked) {
+                                     style_element = output_document.createElementNS(xhtml_ns, &quot;style&quot;);
+                                     style_element.id = &quot;hide-&quot; + result_class;
+                                     style_element.textContent = &quot;table#results &gt; tbody &gt; tr.&quot;+result_class+&quot;{display:none}&quot;;
+                                     output_document.body.appendChild(style_element);
+                                 } else if (style_element &amp;&amp; input_element.checked) {
+                                     style_element.parentNode.removeChild(style_element);
+                                 }
+                             });
+                });
+
+        // This use of innerHTML plus manual escaping is not recommended in
+        // general, but is necessary here for performance.  Using textContent
+        // on each individual &lt;td&gt; adds tens of seconds of execution time for
+        // large test suites (tens of thousands of tests).
+        function escape_html(s)
+        {
+            return s.replace(/\&amp;/g, &quot;&amp;amp;&quot;)
+                .replace(/&lt;/g, &quot;&amp;lt;&quot;)
+                .replace(/&quot;/g, &quot;&amp;quot;&quot;)
+                .replace(/'/g, &quot;&amp;#39;&quot;);
+        }
+
+        function has_assertions()
+        {
+            for (var i = 0; i &lt; tests.length; i++) {
+                if (tests[i].properties.hasOwnProperty(&quot;assert&quot;)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        function get_assertion(test)
+        {
+            if (test.properties.hasOwnProperty(&quot;assert&quot;)) {
+                if (Array.isArray(test.properties.assert)) {
+                    return test.properties.assert.join(' ');
+                }
+                return test.properties.assert;
+            }
+            return '';
+        }
+
+        log.appendChild(document.createElementNS(xhtml_ns, &quot;section&quot;));
+        var assertions = has_assertions();
+        var html = &quot;&lt;h2&gt;Details&lt;/h2&gt;&lt;table id='results' &quot; + (assertions ? &quot;class='assertions'&quot; : &quot;&quot; ) + &quot;&gt;&quot; +
+            &quot;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Result&lt;/th&gt;&lt;th&gt;Test Name&lt;/th&gt;&quot; +
+            (assertions ? &quot;&lt;th&gt;Assertion&lt;/th&gt;&quot; : &quot;&quot;) +
+            &quot;&lt;th&gt;Message&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&quot; +
+            &quot;&lt;tbody&gt;&quot;;
+        for (var i = 0; i &lt; tests.length; i++) {
+            html += '&lt;tr class=&quot;' +
+                escape_html(status_class(status_text[tests[i].status])) +
+                '&quot;&gt;&lt;td&gt;' +
+                escape_html(status_text[tests[i].status]) +
+                &quot;&lt;/td&gt;&lt;td&gt;&quot; +
+                escape_html(tests[i].name) +
+                &quot;&lt;/td&gt;&lt;td&gt;&quot; +
+                (assertions ? escape_html(get_assertion(tests[i])) + &quot;&lt;/td&gt;&lt;td&gt;&quot; : &quot;&quot;) +
+                escape_html(tests[i].message ? tests[i].message : &quot; &quot;) +
+                (tests[i].stack ? &quot;&lt;pre&gt;&quot; +
+                 escape_html(tests[i].stack) +
+                 &quot;&lt;/pre&gt;&quot;: &quot;&quot;) +
+                &quot;&lt;/td&gt;&lt;/tr&gt;&quot;;
+        }
+        html += &quot;&lt;/tbody&gt;&lt;/table&gt;&quot;;
+        try {
+            log.lastChild.innerHTML = html;
+        } catch (e) {
+            log.appendChild(document.createElementNS(xhtml_ns, &quot;p&quot;))
+               .textContent = &quot;Setting innerHTML for the log threw an exception.&quot;;
+            log.appendChild(document.createElementNS(xhtml_ns, &quot;pre&quot;))
+               .textContent = html;
+        }
+    };
+
+    /*
+     * Template code
+     *
+     * A template is just a javascript structure. An element is represented as:
+     *
+     * [tag_name, {attr_name:attr_value}, child1, child2]
+     *
+     * the children can either be strings (which act like text nodes), other templates or
+     * functions (see below)
+     *
+     * A text node is represented as
+     *
+     * [&quot;{text}&quot;, value]
+     *
+     * String values have a simple substitution syntax; ${foo} represents a variable foo.
+     *
+     * It is possible to embed logic in templates by using a function in a place where a
+     * node would usually go. The function must either return part of a template or null.
+     *
+     * In cases where a set of nodes are required as output rather than a single node
+     * with children it is possible to just use a list
+     * [node1, node2, node3]
+     *
+     * Usage:
+     *
+     * render(template, substitutions) - take a template and an object mapping
+     * variable names to parameters and return either a DOM node or a list of DOM nodes
+     *
+     * substitute(template, substitutions) - take a template and variable mapping object,
+     * make the variable substitutions and return the substituted template
+     *
+     */
+
+    function is_single_node(template)
+    {
+        return typeof template[0] === &quot;string&quot;;
+    }
+
+    function substitute(template, substitutions)
+    {
+        if (typeof template === &quot;function&quot;) {
+            var replacement = template(substitutions);
+            if (!replacement) {
+                return null;
+            }
+
+            return substitute(replacement, substitutions);
+        }
+
+        if (is_single_node(template)) {
+            return substitute_single(template, substitutions);
+        }
+
+        return filter(map(template, function(x) {
+                              return substitute(x, substitutions);
+                          }), function(x) {return x !== null;});
+    }
+
+    function substitute_single(template, substitutions)
+    {
+        var substitution_re = /\$\{([^ }]*)\}/g;
+
+        function do_substitution(input) {
+            var components = input.split(substitution_re);
+            var rv = [];
+            for (var i = 0; i &lt; components.length; i += 2) {
+                rv.push(components[i]);
+                if (components[i + 1]) {
+                    rv.push(String(substitutions[components[i + 1]]));
+                }
+            }
+            return rv;
+        }
+
+        function substitute_attrs(attrs, rv)
+        {
+            rv[1] = {};
+            for (var name in template[1]) {
+                if (attrs.hasOwnProperty(name)) {
+                    var new_name = do_substitution(name).join(&quot;&quot;);
+                    var new_value = do_substitution(attrs[name]).join(&quot;&quot;);
+                    rv[1][new_name] = new_value;
+                }
+            }
+        }
+
+        function substitute_children(children, rv)
+        {
+            for (var i = 0; i &lt; children.length; i++) {
+                if (children[i] instanceof Object) {
+                    var replacement = substitute(children[i], substitutions);
+                    if (replacement !== null) {
+                        if (is_single_node(replacement)) {
+                            rv.push(replacement);
+                        } else {
+                            extend(rv, replacement);
+                        }
+                    }
+                } else {
+                    extend(rv, do_substitution(String(children[i])));
+                }
+            }
+            return rv;
+        }
+
+        var rv = [];
+        rv.push(do_substitution(String(template[0])).join(&quot;&quot;));
+
+        if (template[0] === &quot;{text}&quot;) {
+            substitute_children(template.slice(1), rv);
+        } else {
+            substitute_attrs(template[1], rv);
+            substitute_children(template.slice(2), rv);
+        }
+
+        return rv;
+    }
+
+    function make_dom_single(template, doc)
+    {
+        var output_document = doc || document;
+        var element;
+        if (template[0] === &quot;{text}&quot;) {
+            element = output_document.createTextNode(&quot;&quot;);
+            for (var i = 1; i &lt; template.length; i++) {
+                element.data += template[i];
+            }
+        } else {
+            element = output_document.createElementNS(xhtml_ns, template[0]);
+            for (var name in template[1]) {
+                if (template[1].hasOwnProperty(name)) {
+                    element.setAttribute(name, template[1][name]);
+                }
+            }
+            for (var i = 2; i &lt; template.length; i++) {
+                if (template[i] instanceof Object) {
+                    var sub_element = make_dom(template[i]);
+                    element.appendChild(sub_element);
+                } else {
+                    var text_node = output_document.createTextNode(template[i]);
+                    element.appendChild(text_node);
+                }
+            }
+        }
+
+        return element;
+    }
+
+    function make_dom(template, substitutions, output_document)
+    {
+        if (is_single_node(template)) {
+            return make_dom_single(template, output_document);
+        }
+
+        return map(template, function(x) {
+                       return make_dom_single(x, output_document);
+                   });
+    }
+
+    function render(template, substitutions, output_document)
+    {
+        return make_dom(substitute(template, substitutions), output_document);
+    }
+
+    /*
+     * Utility funcions
+     */
+    function assert(expected_true, function_name, description, error, substitutions)
+    {
+        if (tests.tests.length === 0) {
+            tests.set_file_is_test();
+        }
+        if (expected_true !== true) {
+            var msg = make_message(function_name, description,
+                                   error, substitutions);
+            throw new AssertionError(msg);
+        }
+    }
+
+    function AssertionError(message)
+    {
+        this.message = message;
+        this.stack = this.get_stack();
+    }
+
+    AssertionError.prototype = Object.create(Error.prototype);
+
+    AssertionError.prototype.get_stack = function() {
+        var stack = new Error().stack;
+        // IE11 does not initialize 'Error.stack' until the object is thrown.
+        if (!stack) {
+            try {
+                throw new Error();
+            } catch (e) {
+                stack = e.stack;
+            }
+        }
+
+        // 'Error.stack' is not supported in all browsers/versions
+        if (!stack) {
+            return &quot;(Stack trace unavailable)&quot;;
+        }
+
+        var lines = stack.split(&quot;\n&quot;);
+
+        // Create a pattern to match stack frames originating within testharness.js.  These include the
+        // script URL, followed by the line/col (e.g., '/resources/testharness.js:120:21').
+        // Escape the URL per http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+        // in case it contains RegExp characters.
+        var script_url = get_script_url();
+        var re_text = script_url ? script_url.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&amp;') : &quot;\\btestharness.js&quot;;
+        var re = new RegExp(re_text + &quot;:\\d+:\\d+&quot;);
+
+        // Some browsers include a preamble that specifies the type of the error object.  Skip this by
+        // advancing until we find the first stack frame originating from testharness.js.
+        var i = 0;
+        while (!re.test(lines[i]) &amp;&amp; i &lt; lines.length) {
+            i++;
+        }
+
+        // Then skip the top frames originating from testharness.js to begin the stack at the test code.
+        while (re.test(lines[i]) &amp;&amp; i &lt; lines.length) {
+            i++;
+        }
+
+        // Paranoid check that we didn't skip all frames.  If so, return the original stack unmodified.
+        if (i &gt;= lines.length) {
+            return stack;
+        }
+
+        return lines.slice(i).join(&quot;\n&quot;);
+    }
+
+    function make_message(function_name, description, error, substitutions)
+    {
+        for (var p in substitutions) {
+            if (substitutions.hasOwnProperty(p)) {
+                substitutions[p] = format_value(substitutions[p]);
+            }
+        }
+        var node_form = substitute([&quot;{text}&quot;, &quot;${function_name}: ${description}&quot; + error],
+                                   merge({function_name:function_name,
+                                          description:(description?description + &quot; &quot;:&quot;&quot;)},
+                                          substitutions));
+        return node_form.slice(1).join(&quot;&quot;);
+    }
+
+    function filter(array, callable, thisObj) {
+        var rv = [];
+        for (var i = 0; i &lt; array.length; i++) {
+            if (array.hasOwnProperty(i)) {
+                var pass = callable.call(thisObj, array[i], i, array);
+                if (pass) {
+                    rv.push(array[i]);
+                }
+            }
+        }
+        return rv;
+    }
+
+    function map(array, callable, thisObj)
+    {
+        var rv = [];
+        rv.length = array.length;
+        for (var i = 0; i &lt; array.length; i++) {
+            if (array.hasOwnProperty(i)) {
+                rv[i] = callable.call(thisObj, array[i], i, array);
+            }
+        }
+        return rv;
+    }
+
+    function extend(array, items)
+    {
+        Array.prototype.push.apply(array, items);
+    }
+
+    function forEach(array, callback, thisObj)
+    {
+        for (var i = 0; i &lt; array.length; i++) {
+            if (array.hasOwnProperty(i)) {
+                callback.call(thisObj, array[i], i, array);
+            }
+        }
+    }
+
+    function merge(a,b)
+    {
+        var rv = {};
+        var p;
+        for (p in a) {
+            rv[p] = a[p];
+        }
+        for (p in b) {
+            rv[p] = b[p];
+        }
+        return rv;
+    }
+
+    function expose(object, name)
+    {
+        var components = name.split(&quot;.&quot;);
+        var target = test_environment.global_scope();
+        for (var i = 0; i &lt; components.length - 1; i++) {
+            if (!(components[i] in target)) {
+                target[components[i]] = {};
+            }
+            target = target[components[i]];
+        }
+        target[components[components.length - 1]] = object;
+    }
+
+    function is_same_origin(w) {
+        try {
+            'random_prop' in w;
+            return true;
+        } catch (e) {
+            return false;
+        }
+    }
+
+    /** Returns the 'src' URL of the first &lt;script&gt; tag in the page to include the file 'testharness.js'. */
+    function get_script_url()
+    {
+        if (!('document' in self)) {
+            return undefined;
+        }
+
+        var scripts = document.getElementsByTagName(&quot;script&quot;);
+        for (var i = 0; i &lt; scripts.length; i++) {
+            var src;
+            if (scripts[i].src) {
+                src = scripts[i].src;
+            } else if (scripts[i].href) {
+                //SVG case
+                src = scripts[i].href.baseVal;
+            }
+
+            var matches = src &amp;&amp; src.match(/^(.*\/|)testharness\.js$/);
+            if (matches) {
+                return src;
+            }
+        }
+        return undefined;
+    }
+
+    /** Returns the URL path at which the files for testharness.js are assumed to reside (e.g., '/resources/').
+        The path is derived from inspecting the 'src' of the &lt;script&gt; tag that included 'testharness.js'. */
+    function get_harness_url()
+    {
+        var script_url = get_script_url();
+
+        // Exclude the 'testharness.js' file from the returned path, but '+ 1' to include the trailing slash.
+        return script_url ? script_url.slice(0, script_url.lastIndexOf('/') + 1) : undefined;
+    }
+
+    function supports_post_message(w)
+    {
+        var supports;
+        var type;
+        // Given IE implements postMessage across nested iframes but not across
+        // windows or tabs, you can't infer cross-origin communication from the presence
+        // of postMessage on the current window object only.
+        //
+        // Touching the postMessage prop on a window can throw if the window is
+        // not from the same origin AND post message is not supported in that
+        // browser. So just doing an existence test here won't do, you also need
+        // to wrap it in a try..cacth block.
+        try {
+            type = typeof w.postMessage;
+            if (type === &quot;function&quot;) {
+                supports = true;
+            }
+
+            // IE8 supports postMessage, but implements it as a host object which
+            // returns &quot;object&quot; as its `typeof`.
+            else if (type === &quot;object&quot;) {
+                supports = true;
+            }
+
+            // This is the case where postMessage isn't supported AND accessing a
+            // window property across origins does NOT throw (e.g. old Safari browser).
+            else {
+                supports = false;
+            }
+        } catch (e) {
+            // This is the case where postMessage isn't supported AND accessing a
+            // window property across origins throws (e.g. old Firefox browser).
+            supports = false;
+        }
+        return supports;
+    }
+
+    /**
+     * Setup globals
+     */
+
+    var tests = new Tests();
+
+    var error_handler = function(e) {
+        if (tests.file_is_test) {
+            var test = tests.tests[0];
+            if (test.phase &gt;= test.phases.HAS_RESULT) {
+                return;
+            }
+            test.set_status(test.FAIL, e.message, e.stack);
+            test.phase = test.phases.HAS_RESULT;
+            test.done();
+            done();
+        } else if (!tests.allow_uncaught_exception) {
+            tests.status.status = tests.status.ERROR;
+            tests.status.message = e.message;
+            tests.status.stack = e.stack;
+        }
+    };
+
+    addEventListener(&quot;error&quot;, error_handler, false);
+    addEventListener(&quot;unhandledrejection&quot;, function(e){ error_handler(e.reason); }, false);
+
+    test_environment.on_tests_ready();
+
+})();
+// vim: set expandtab shiftwidth=4 tabstop=4:
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2LICENSE"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/LICENSE (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/LICENSE                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/LICENSE        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+The MIT License (MIT)
+
+Copyright (c) 2014 Robin Berjon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the &quot;Software&quot;), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2READMEmd"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/README.md (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/README.md                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/README.md        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,760 @@
</span><ins>+
+# WebIDL 2
+
+[![NPM version](https://badge.fury.io/js/webidl2.png)](http://badge.fury.io/js/webidl2)
+
+Purpose
+=======
+
+This is a parser for the [WebIDL](http://dev.w3.org/2006/webapi/WebIDL/) language. If
+you don't know what that is, then you probably don't need it. It is meant to be used
+both in Node and in the browser (the parser likely works in other JS environments, but
+not the test suite).
+
+What of v1?
+-----------
+There was a previous incarnation of this project. I had written it in the most quick
+and dirty manner that was handy because I required it as a dependency in an experiment.
+As these things tend to happen, some people started using that, which then had to be
+maintained. But since it was not built on solid foundations, it was painful to keep
+up to date with the specification, which is a bit of a moving target.
+
+So I started from scratch. Compared to the previous version (which used a parser generator)
+this one is about 6x less code (which translates to 4x smaller minified or 2x smaller 
+minizipped) and 4x faster. The test suite is reasonably complete (95% coverage), much more
+than previously. This version is up to date with WebIDL, rather than a couple years' behind.
+It also has *far* better error reporting.
+
+The AST you get from parsing is very similar to the one you got in v1, but some adjustments 
+have been made in order to be more systematic, and to map better to what's actually in the spec 
+now. If you used v1, you will need to tweak your code but the result ought to be simpler and
+you ought to be able to be a fair bit less defensive against irregularities in the way 
+information is represented.
+
+Installation
+============
+
+Just the usual. For Node:
+
+    npm install webidl2
+    
+In the browser:
+
+    &lt;script src='webidl2.js'&gt;&lt;/script&gt;
+
+Documentation
+=============
+
+The API to WebIDL2 is trivial: you parse a string of WebIDL and it returns a syntax tree.
+
+Parsing
+-------
+In Node, that happens with:
+
+    var WebIDL2 = require(&quot;webidl2&quot;);
+    var tree = WebIDL2.parse(&quot;string of WebIDL&quot;);
+
+In the browser:
+
+    &lt;script src='webidl2.js'&gt;&lt;/script&gt;
+    &lt;script&gt;
+      var tree = WebIDL2.parse(&quot;string of WebIDL&quot;);
+    &lt;/script&gt;
+
+Advanced Parsing
+----------------
+
+`parse()` can optionally accept a second parameter, an options object, which can be used to
+modify parsing behavior.
+
+The following options are recognized:
+```javascript
+{
+    allowNestedTypedefs: false # 
+}
+```
+And their meanings are as follows:
+
+* `allowNestedTypedefs`: Boolean indicating whether the parser should accept `typedef`s as valid members of `interface`s. This is non-standard syntax and therefore the default is `false`.
+
+Errors
+------
+When there is a syntax error in the WebIDL, it throws an exception object with the following
+properties:
+
+* `message`: the error message
+* `line`: the line at which the error occurred.
+* `input`: a short peek at the text at the point where the error happened
+* `tokens`: the five tokens at the point of error, as understood by the tokeniser
+  (this is the same content as `input`, but seen from the tokeniser's point of view)
+
+The exception also has a `toString()` method that hopefully should produce a decent
+error message.
+
+AST (Abstract Syntax Tree)
+--------------------------
+The `parse()` method returns a tree object representing the parse tree of the IDL.
+Comment and white space are not represented in the AST.
+
+The root of this object is always an array of definitions (where definitions are
+any of interfaces, exceptions, callbacks, etc. — anything that can occur at the root
+of the IDL).
+
+### IDL Type
+
+This structure is used in many other places (operation return types, argument types, etc.).
+It captures a WebIDL type with a number of options. Types look like this and are typically
+attached to a field called `idlType`:
+
+    {
+        &quot;sequence&quot;: false,
+        &quot;generic&quot;: null,
+        &quot;nullable&quot;: false,
+        &quot;array&quot;: false,
+        &quot;union&quot;: false,
+        &quot;idlType&quot;: &quot;void&quot;
+    }
+
+Where the fields are as follows:
+
+* `sequence`: Boolean indicating whether this is a sequence or not. Deprecated. Use
+  `generic` instead.
+* `generic`: String indicating the generic type (e.g. &quot;Promise&quot;, &quot;sequence&quot;). `null`
+  otherwise.
+* `nullable`: Boolean indicating whether this is nullable or not.
+* `array`: Either `false` to indicate that it is not an array, or a number for the level of
+  array nesting.
+* `union`: Boolean indicating whether this is a union type or not.
+* `idlType`: Can be different things depending on context. In most cases, this will just
+  be a string with the type name. But the reason this field isn't called &quot;typeName&quot; is
+  because it can take more complex values. If the type is a union, then this contains an
+  array of the types it unites. If it is a generic type, it contains the IDL type
+  description for the type in the sequence, the eventual value of the promise, etc.
+
+#### Interactions between `nullable` and `array`
+
+A more complex data model for our AST would likely represent `Foo[][][]` as a series of
+nested types four levels deep with three anonymous array types eventually containing a 
+`Foo` type. But experience shows that such structures are cumbersome to use, and so we
+have a simpler model in which the depth of the array is specified with the `array` field.
+
+This is all fine and well, and in the vast majority of cases is actually simpler. But it
+does run afoul of cases in which it is necessary to distinguish between `Foo[][][]?`,
+`Foo?[][][]`, `Foo[][]?[]`, or even `Foo?[]?[]?[]?`.
+
+For this, when a type is an array type an additional `nullableArray` field is made available
+that captures which of the arrays contain nullable elements. It contains booleans that are
+true if the given array depth contains nullable elements, and false otherwise (mapping that to
+the syntax, and item is true if there is a `?` preceding the `[]`). These examples ought to
+clarify the model:
+
+    Foo[][][]?
+        -&gt; nullable: true
+        -&gt; nullableArray: [false, false, false]
+    Foo?[][][]
+        -&gt; nullable: false
+        -&gt; nullableArray: [true, false, false]
+    Foo[][]?[]
+        -&gt; nullable: false
+        -&gt; nullableArray: [false, false, true]
+    Foo?[]?[]?[]?
+        -&gt; nullable: true
+        -&gt; nullableArray: [true, true, true]
+
+Of particular importance, please note that the overall type is only `nullable` if there is
+a `?` at the end.
+
+### Interface
+Interfaces look like this:
+
+    {
+        &quot;type&quot;: &quot;interface&quot;,
+        &quot;name&quot;: &quot;Animal&quot;,
+        &quot;partial&quot;: false,
+        &quot;members&quot;: [...],
+        &quot;inheritance&quot;: null,
+        &quot;extAttrs&quot;: [...]
+    },
+    {
+        &quot;type&quot;: &quot;interface&quot;,
+        &quot;name&quot;: &quot;Human&quot;,
+        &quot;partial&quot;: false,
+        &quot;members&quot;: [...],
+        &quot;inheritance&quot;: &quot;Animal&quot;,
+        &quot;extAttrs&quot;: [...]
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;interface&quot;.
+* `name`: The name of the interface
+* `partial`: A boolean indicating whether it's a partial interface.
+* `members`: An array of interface members (attributes, operations, etc.). Empty if there are none.
+* `inheritance`: A string giving the name of an interface this one inherits from, `null` otherwise.
+  **NOTE**: In v1 this was an array, but multiple inheritance is no longer supported so this didn't make
+  sense.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Callback Interfaces
+
+These are captured by the same structure as [Interfaces](#interface) except that
+their `type` field is &quot;callback interface&quot;.
+
+### Callback
+
+A callback looks like this:
+
+  {
+      &quot;type&quot;: &quot;callback&quot;,
+      &quot;name&quot;: &quot;AsyncOperationCallback&quot;,
+      &quot;idlType&quot;: {
+          &quot;sequence&quot;: false,
+          &quot;generic&quot;: null,
+          &quot;nullable&quot;: false,
+          &quot;array&quot;: false,
+          &quot;union&quot;: false,
+          &quot;idlType&quot;: &quot;void&quot;
+      },
+      &quot;arguments&quot;: [...],
+      &quot;extAttrs&quot;: []
+  }
+
+The fields are as follows:
+
+* `type`: Always &quot;callback&quot;.
+* `name`: The name of the callback.
+* `idlType`: An [IDL Type](#idl-type) describing what the callback returns.
+* `arguments`: A list of [arguments](#arguments), as in function paramters.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Dictionary
+
+A dictionary looks like this:
+
+    {
+        &quot;type&quot;: &quot;dictionary&quot;,
+        &quot;name&quot;: &quot;PaintOptions&quot;,
+        &quot;partial&quot;: false,
+        &quot;members&quot;: [
+            {
+                &quot;type&quot;: &quot;field&quot;,
+                &quot;name&quot;: &quot;fillPattern&quot;,
+                &quot;required&quot;: false,
+                &quot;idlType&quot;: {
+                    &quot;sequence&quot;: false,
+                    &quot;generic&quot;: null,
+                    &quot;nullable&quot;: true,
+                    &quot;array&quot;: false,
+                    &quot;union&quot;: false,
+                    &quot;idlType&quot;: &quot;DOMString&quot;
+                },
+                &quot;extAttrs&quot;: [],
+                &quot;default&quot;: {
+                    &quot;type&quot;: &quot;string&quot;,
+                    &quot;value&quot;: &quot;black&quot;
+                }
+            }
+        ],
+        &quot;inheritance&quot;: null,
+        &quot;extAttrs&quot;: []
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;dictionary&quot;.
+* `name`: The dictionary name.
+* `partial`: Boolean indicating whether it's a partial dictionary.
+* `members`: An array of members (see below).
+* `inheritance`: A string indicating which dictionary is being inherited from, `null` otherwise.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+All the members are fields as follows:
+
+* `type`: Always &quot;field&quot;.
+* `name`: The name of the field.
+* `required`: Boolean indicating whether this is a [required](https://heycam.github.io/webidl/#required-dictionary-member) field.
+* `idlType`: An [IDL Type](#idl-type) describing what field's type.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+* `default`: A [default value](#default-and-const-values), absent if there is none.
+
+### Exception
+
+An exception looks like this:
+
+    {
+        &quot;type&quot;: &quot;exception&quot;,
+        &quot;name&quot;: &quot;HierarchyRequestError&quot;,
+        &quot;members&quot;: [
+            {
+                &quot;type&quot;: &quot;field&quot;,
+                &quot;name&quot;: &quot;code&quot;,
+                &quot;idlType&quot;: {
+                    &quot;sequence&quot;: false,
+                    &quot;generic&quot;: null,
+                    &quot;nullable&quot;: false,
+                    &quot;array&quot;: false,
+                    &quot;union&quot;: false,
+                    &quot;idlType&quot;: &quot;unsigned short&quot;
+                },
+                &quot;extAttrs&quot;: []
+            }
+        ],
+        &quot;inheritance&quot;: &quot;DOMException&quot;,
+        &quot;extAttrs&quot;: []
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;exception&quot;.
+* `name`: The exception name.
+* `members`: An array of members (constants or fields, where fields are described below).
+* `inheritance`: A string indicating which exception is being inherited from, `null` otherwise.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+Members that aren't [constants](#constants) have the following fields:
+
+* `type`: Always &quot;field&quot;.
+* `name`: The field's name.
+* `idlType`: An [IDL Type](#idl-type) describing what field's type.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Enum
+
+An enum looks like this:
+
+    {
+        &quot;type&quot;: &quot;enum&quot;,
+        &quot;name&quot;: &quot;MealType&quot;,
+        &quot;values&quot;: [
+            &quot;rice&quot;,
+            &quot;noodles&quot;,
+            &quot;other&quot;
+        ],
+        &quot;extAttrs&quot;: []
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;enum&quot;.
+* `name`: The enum's name.
+* `value`: An array of values (strings).
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Typedef
+
+A typedef looks like this:
+
+    {
+        &quot;type&quot;: &quot;typedef&quot;,
+        &quot;typeExtAttrs&quot;: [],
+        &quot;idlType&quot;: {
+            &quot;sequence&quot;: true,
+            &quot;generic&quot;: &quot;sequence&quot;,
+            &quot;nullable&quot;: false,
+            &quot;array&quot;: false,
+            &quot;union&quot;: false,
+            &quot;idlType&quot;: {
+                &quot;sequence&quot;: false,
+                &quot;generic&quot;: null,
+                &quot;nullable&quot;: false,
+                &quot;array&quot;: false,
+                &quot;union&quot;: false,
+                &quot;idlType&quot;: &quot;Point&quot;
+            }
+        },
+        &quot;name&quot;: &quot;PointSequence&quot;,
+        &quot;extAttrs&quot;: []
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;typedef&quot;.
+* `name`: The typedef's name.
+* `idlType`: An [IDL Type](#idl-type) describing what typedef's type.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+* `typeExtAttrs`: A list of [extended attributes](#extended-attributes) that apply to the 
+type rather than to the typedef as a whole.
+
+### Implements
+
+An implements definition looks like this:
+
+    {
+        &quot;type&quot;: &quot;implements&quot;,
+        &quot;target&quot;: &quot;Node&quot;,
+        &quot;implements&quot;: &quot;EventTarget&quot;,
+        &quot;extAttrs&quot;: []
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;implements&quot;.
+* `target`: The interface that implements another.
+* `implements`: The interface that is being implemented by the target.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Operation Member
+
+An operation looks like this:
+
+    {
+        &quot;type&quot;: &quot;operation&quot;,
+        &quot;getter&quot;: false,
+        &quot;setter&quot;: false,
+        &quot;creator&quot;: false,
+        &quot;deleter&quot;: false,
+        &quot;legacycaller&quot;: false,
+        &quot;static&quot;: false,
+        &quot;stringifier&quot;: false,
+        &quot;idlType&quot;: {
+            &quot;sequence&quot;: false,
+            &quot;generic&quot;: null,
+            &quot;nullable&quot;: false,
+            &quot;array&quot;: false,
+            &quot;union&quot;: false,
+            &quot;idlType&quot;: &quot;void&quot;
+        },
+        &quot;name&quot;: &quot;intersection&quot;,
+        &quot;arguments&quot;: [
+            {
+                &quot;optional&quot;: false,
+                &quot;variadic&quot;: true,
+                &quot;extAttrs&quot;: [],
+                &quot;idlType&quot;: {
+                    &quot;sequence&quot;: false,
+                    &quot;generic&quot;: null,
+                    &quot;nullable&quot;: false,
+                    &quot;array&quot;: false,
+                    &quot;union&quot;: false,
+                    &quot;idlType&quot;: &quot;long&quot;
+                },
+                &quot;name&quot;: &quot;ints&quot;
+            }
+        ],
+        &quot;extAttrs&quot;: []
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;operation&quot;.
+* `getter`: True if a getter operation.
+* `setter`: True if a setter operation.
+* `creator`: True if a creator operation.
+* `deleter`: True if a deleter operation.
+* `legacycaller`: True if a legacycaller operation.
+* `static`: True if a static operation.
+* `stringifier`: True if a stringifier operation.
+* `idlType`: An [IDL Type](#idl-type) of what the operation returns. If a stringifier, may be absent.
+* `name`: The name of the operation. If a stringifier, may be `null`.
+* `arguments`: An array of [arguments](#arguments) for the operation.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Attribute Member
+
+An attribute member looks like this:
+
+    {
+        &quot;type&quot;: &quot;attribute&quot;,
+        &quot;static&quot;: false,
+        &quot;stringifier&quot;: false,
+        &quot;inherit&quot;: false,
+        &quot;readonly&quot;: false,
+        &quot;idlType&quot;: {
+            &quot;sequence&quot;: false,
+            &quot;generic&quot;: null,
+            &quot;nullable&quot;: false,
+            &quot;array&quot;: false,
+            &quot;union&quot;: false,
+            &quot;idlType&quot;: &quot;RegExp&quot;
+        },
+        &quot;name&quot;: &quot;regexp&quot;,
+        &quot;extAttrs&quot;: []
+    }
+    
+The fields are as follows:
+
+* `type`: Always &quot;attribute&quot;.
+* `name`: The attribute's name.
+* `static`: True if it's a static attribute.
+* `stringifier`: True if it's a stringifier attribute.
+* `inherit`: True if it's an inherit attribute.
+* `readonly`: True if it's a read-only attribute.
+* `idlType`: An [IDL Type](#idl-type) for the attribute.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Constant Member
+
+A constant member looks like this:
+
+    {
+        &quot;type&quot;: &quot;const&quot;,
+        &quot;nullable&quot;: false,
+        &quot;idlType&quot;: &quot;boolean&quot;,
+        &quot;name&quot;: &quot;DEBUG&quot;,
+        &quot;value&quot;: {
+            &quot;type&quot;: &quot;boolean&quot;,
+            &quot;value&quot;: false
+        },
+        &quot;extAttrs&quot;: []
+    }
+
+The fields are as follows:
+
+* `type`: Always &quot;const&quot;.
+* `nullable`: Whether its type is nullable.
+* `idlType`: The type of the constant (a simple type, the type name).
+* `name`: The name of the constant.
+* `value`: The constant value as described by [Const Values](#default-and-const-values)
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Serializer Member
+
+Serializers come in many shapes, which are best understood by looking at the
+examples below that map the IDL to the produced AST.
+
+    // serializer;
+    {
+        &quot;type&quot;: &quot;serializer&quot;,
+        &quot;extAttrs&quot;: []
+    }
+
+    // serializer DOMString serialize();
+    {
+        &quot;type&quot;: &quot;serializer&quot;,
+        &quot;idlType&quot;: {
+            &quot;sequence&quot;: false,
+            &quot;generic&quot;: null,
+            &quot;nullable&quot;: false,
+            &quot;array&quot;: false,
+            &quot;union&quot;: false,
+            &quot;idlType&quot;: &quot;DOMString&quot;
+        },
+        &quot;operation&quot;: {
+            &quot;name&quot;: &quot;serialize&quot;,
+            &quot;arguments&quot;: []
+        },
+        &quot;extAttrs&quot;: []
+    }
+
+    // serializer = { from, to, amount, description };
+    {
+        &quot;type&quot;: &quot;serializer&quot;,
+        &quot;patternMap&quot;: true,
+        &quot;names&quot;: [
+            &quot;from&quot;,
+            &quot;to&quot;,
+            &quot;amount&quot;,
+            &quot;description&quot;
+        ],
+        &quot;extAttrs&quot;: []
+    }
+
+    // serializer = number;
+    {
+        &quot;type&quot;: &quot;serializer&quot;,
+        &quot;name&quot;: &quot;number&quot;,
+        &quot;extAttrs&quot;: []
+    }
+
+    // serializer = [ name, number ];
+    {
+        &quot;type&quot;: &quot;serializer&quot;,
+        &quot;patternList&quot;: true,
+        &quot;names&quot;: [
+            &quot;name&quot;,
+            &quot;number&quot;
+        ],
+        &quot;extAttrs&quot;: []
+    }
+
+The common fields are as follows:
+
+* `type`: Always &quot;serializer&quot;.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+For a simple serializer, that's all there is. If the serializer is an operation, it will
+have:
+
+* `idlType`: An [IDL Type](#idl-type) describing what the serializer returns.
+* `operation`: An object with the following fields:
+    * `name`: The name of the operation.
+    * `arguments`: An array of [arguments](#arguments) for the operation.
+
+If the serializer is a pattern map:
+
+* `patternMap`: Always true.
+* `names`: An array of names in the pattern map.
+
+If the serializer is a pattern list:
+
+* `patternList`: Always true.
+* `names`: An array of names in the pattern list.
+
+Finally, if the serializer is a named serializer:
+
+* `name`: The serializer's name.
+
+### Iterator Member
+
+Iterator members look like this
+
+    {
+        &quot;type&quot;: &quot;iterator&quot;,
+        &quot;getter&quot;: false,
+        &quot;setter&quot;: false,
+        &quot;creator&quot;: false,
+        &quot;deleter&quot;: false,
+        &quot;legacycaller&quot;: false,
+        &quot;static&quot;: false,
+        &quot;stringifier&quot;: false,
+        &quot;idlType&quot;: {
+            &quot;sequence&quot;: false,
+            &quot;generic&quot;: null,
+            &quot;nullable&quot;: false,
+            &quot;array&quot;: false,
+            &quot;union&quot;: false,
+            &quot;idlType&quot;: &quot;Session2&quot;
+        },
+        &quot;iteratorObject&quot;: &quot;SessionIterator&quot;,
+        &quot;extAttrs&quot;: []
+    }
+
+* `type`: Always &quot;iterator&quot;.
+* `iteratorObject`: The string on the right-hand side; absent if there isn't one.
+* the rest: same as on [operations](#operation-member).
+
+### Arguments
+
+The arguments (e.g. for an operation) look like this:
+
+    &quot;arguments&quot;: [
+        {
+            &quot;optional&quot;: false,
+            &quot;variadic&quot;: true,
+            &quot;extAttrs&quot;: [],
+            &quot;idlType&quot;: {
+                &quot;sequence&quot;: false,
+                &quot;generic&quot;: null,
+                &quot;nullable&quot;: false,
+                &quot;array&quot;: false,
+                &quot;union&quot;: false,
+                &quot;idlType&quot;: &quot;long&quot;
+            },
+            &quot;name&quot;: &quot;ints&quot;
+        }
+    ]
+
+The fields are as follows:
+
+* `optional`: True if the argument is optional.
+* `variadic`: True if the argument is variadic.
+* `idlType`: An [IDL Type](#idl-type) describing the type of the argument.
+* `name`: The argument's name.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+### Extended Attributes
+
+Extended attributes are arrays of items that look like this:
+
+    &quot;extAttrs&quot;: [
+        {
+            &quot;name&quot;: &quot;TreatNullAs&quot;,
+            &quot;arguments&quot;: null,
+            &quot;rhs&quot;: {
+                &quot;type&quot;: &quot;identifier&quot;,
+                &quot;value&quot;: &quot;EmptyString&quot;
+            }
+        }
+    ]
+
+The fields are as follows:
+
+* `name`: The extended attribute's name.
+* `arguments`: If the extended attribute takes arguments (e.g. `[Foo()]`) or if
+  its right-hand side does (e.g. `[NamedConstructor=Name(DOMString blah)]`) they
+  are listed here. Note that an empty arguments list will produce an empty array,
+  whereas the lack thereof will yield a `null`. If there is an `rhs` field then
+  they are the right-hand side's arguments, otherwise they apply to the extended
+  attribute directly.
+* `rhs`: If there is a right-hand side, this will capture its `type` (which can be
+  &quot;identifier&quot; or &quot;identifier-list&quot;) and its `value`.
+* `typePair`: If the extended attribute is a `MapClass` this will capture the
+  map's key type and value type respectively.
+
+### Default and Const Values
+
+Dictionary fields and operation arguments can take default values, and constants take
+values, all of which have the following fields:
+
+* `type`: One of string, number, boolean, null, Infinity, NaN, or sequence.
+
+For string, number, boolean, and sequence:
+
+* `value`: The value of the given type. For sequence, the only possible value is `[]`.
+
+For Infinity:
+
+* `negative`: Boolean indicating whether this is negative Infinity or not.
+
+### `iterable&lt;&gt;`, `legacyiterable&lt;&gt;`, `maplike&lt;&gt;`, `setlike&lt;&gt;` declarations
+
+These appear as members of interfaces that look like this:
+
+        {
+            &quot;type&quot;: &quot;maplike&quot;, // or &quot;legacyiterable&quot; / &quot;iterable&quot; / &quot;setlike&quot;
+            &quot;idlType&quot;: /* One or two types */,
+            &quot;readonly&quot;: false, // only for maplike and setlike
+            &quot;extAttrs&quot;: []
+        }
+
+The fields are as follows:
+
+* `type`: Always one of &quot;iterable&quot;, &quot;legacyiterable&quot;, &quot;maplike&quot; or &quot;setlike&quot;.
+* `idlType`: An [IDL Type](#idl-type) (or an array of two types) representing the declared type arguments.
+* `readonly`: Whether the maplike or setlike is declared as read only.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
+
+
+Testing
+=======
+
+In order to run the tests you need to ensure that the widlproc submodule inside `test` is
+initialised and up to date:
+
+    git submodule init
+    git submodule update
+
+Running
+-------
+The test runs with mocha and expect.js. Normally, running mocha in the root directory
+should be enough once you're set up.
+
+Coverage
+--------
+Current test coverage, as documented in `coverage.html`, is 95%. You can run your own
+coverage analysis with:
+
+    jscoverage lib lib-cov
+    
+That will create the lib-cov directory with instrumented code; the test suite knows
+to use that if needed. You can then run the tests with:
+
+    JSCOV=1 mocha --reporter html-cov &gt; coverage.html
+
+Note that I've been getting weirdly overescaped results from the html-cov reporter,
+so you might wish to try this instead:
+
+    JSCOV=1 mocha  --reporter html-cov | sed &quot;s/&amp;lt;/&lt;/g&quot; | sed &quot;s/&amp;gt;/&gt;/g&quot; | sed &quot;s/&amp;quot;/\&quot;/g&quot; &gt; coverage.html
+
+Browser tests
+-------------
+In order to test in the browser, get inside `test/web` and run `make-web-tests.js`. This
+will generate a `browser-tests.html` file that you can open in a browser. As of this
+writing tests pass in the latest Firefox, Chrome, Opera, and Safari. Testing on IE
+and older versions will happen progressively.
+
+TODO
+====
+
+* add some tests to address coverage limitations
+* add a push API for processors that need to process things like comments
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2libwebidl2js"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/webidl2.js (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/webidl2.js                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/webidl2.js        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,1012 @@
</span><ins>+
+
+(function () {
+    var tokenise = function (str) {
+        var tokens = []
+        ,   re = {
+                &quot;float&quot;:        /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][-+]?[0-9]+)?|[0-9]+[Ee][-+]?[0-9]+)/
+            ,   &quot;integer&quot;:      /^-?(0([Xx][0-9A-Fa-f]+|[0-7]*)|[1-9][0-9]*)/
+            ,   &quot;identifier&quot;:   /^[A-Z_a-z][0-9A-Z_a-z]*/
+            ,   &quot;string&quot;:       /^&quot;[^&quot;]*&quot;/
+            ,   &quot;whitespace&quot;:   /^(?:[\t\n\r ]+|[\t\n\r ]*((\/\/.*|\/\*(.|\n|\r)*?\*\/)[\t\n\r ]*))+/
+            ,   &quot;other&quot;:        /^[^\t\n\r 0-9A-Z_a-z]/
+            }
+        ,   types = []
+        ;
+        for (var k in re) types.push(k);
+        while (str.length &gt; 0) {
+            var matched = false;
+            for (var i = 0, n = types.length; i &lt; n; i++) {
+                var type = types[i];
+                str = str.replace(re[type], function (tok) {
+                    tokens.push({ type: type, value: tok });
+                    matched = true;
+                    return &quot;&quot;;
+                });
+                if (matched) break;
+            }
+            if (matched) continue;
+            throw new Error(&quot;Token stream not progressing&quot;);
+        }
+        return tokens;
+    };
+    
+    var parse = function (tokens, opt) {
+        var line = 1;
+        tokens = tokens.slice();
+        
+        var FLOAT = &quot;float&quot;
+        ,   INT = &quot;integer&quot;
+        ,   ID = &quot;identifier&quot;
+        ,   STR = &quot;string&quot;
+        ,   OTHER = &quot;other&quot;
+        ;
+        
+        var WebIDLParseError = function (str, line, input, tokens) {
+            this.message = str;
+            this.line = line;
+            this.input = input;
+            this.tokens = tokens;
+        };
+        WebIDLParseError.prototype.toString = function () {
+            return this.message + &quot;, line &quot; + this.line + &quot; (tokens: '&quot; + this.input + &quot;')\n&quot; +
+                   JSON.stringify(this.tokens, null, 4);
+        };
+        
+        var error = function (str) {
+            var tok = &quot;&quot;, numTokens = 0, maxTokens = 5;
+            while (numTokens &lt; maxTokens &amp;&amp; tokens.length &gt; numTokens) {
+                tok += tokens[numTokens].value;
+                numTokens++;
+            }
+            throw new WebIDLParseError(str, line, tok, tokens.slice(0, 5));
+        };
+        
+        var last_token = null;
+        
+        var consume = function (type, value) {
+            if (!tokens.length || tokens[0].type !== type) return;
+            if (typeof value === &quot;undefined&quot; || tokens[0].value === value) {
+                 last_token = tokens.shift();
+                 if (type === ID) last_token.value = last_token.value.replace(/^_/, &quot;&quot;);
+                 return last_token;
+             }
+        };
+        
+        var ws = function () {
+            if (!tokens.length) return;
+            if (tokens[0].type === &quot;whitespace&quot;) {
+                var t = tokens.shift();
+                t.value.replace(/\n/g, function (m) { line++; return m; });
+                return t;
+            }
+        };
+        
+        var all_ws = function (store, pea) { // pea == post extended attribute, tpea = same for types
+            var t = { type: &quot;whitespace&quot;, value: &quot;&quot; };
+            while (true) {
+                var w = ws();
+                if (!w) break;
+                t.value += w.value;
+            }
+            if (t.value.length &gt; 0) {
+                if (store) {
+                    var w = t.value
+                    ,   re = {
+                            &quot;ws&quot;:                   /^([\t\n\r ]+)/
+                        ,   &quot;line-comment&quot;:         /^\/\/(.*)\n?/m
+                        ,   &quot;multiline-comment&quot;:    /^\/\*((?:.|\n|\r)*?)\*\//
+                        }
+                    ,   wsTypes = []
+                    ;
+                    for (var k in re) wsTypes.push(k);
+                    while (w.length) {
+                        var matched = false;
+                        for (var i = 0, n = wsTypes.length; i &lt; n; i++) {
+                            var type = wsTypes[i];
+                            w = w.replace(re[type], function (tok, m1) {
+                                store.push({ type: type + (pea ? (&quot;-&quot; + pea) : &quot;&quot;), value: m1 });
+                                matched = true;
+                                return &quot;&quot;;
+                            });
+                            if (matched) break;
+                        }
+                        if (matched) continue;
+                        throw new Error(&quot;Surprising white space construct.&quot;); // this shouldn't happen
+                    }
+                }
+                return t;
+            }
+        };
+        
+        var integer_type = function () {
+            var ret = &quot;&quot;;
+            all_ws();
+            if (consume(ID, &quot;unsigned&quot;)) ret = &quot;unsigned &quot;;
+            all_ws();
+            if (consume(ID, &quot;short&quot;)) return ret + &quot;short&quot;;
+            if (consume(ID, &quot;long&quot;)) {
+                ret += &quot;long&quot;;
+                all_ws();
+                if (consume(ID, &quot;long&quot;)) return ret + &quot; long&quot;;
+                return ret;
+            }
+            if (ret) error(&quot;Failed to parse integer type&quot;);
+        };
+        
+        var float_type = function () {
+            var ret = &quot;&quot;;
+            all_ws();
+            if (consume(ID, &quot;unrestricted&quot;)) ret = &quot;unrestricted &quot;;
+            all_ws();
+            if (consume(ID, &quot;float&quot;)) return ret + &quot;float&quot;;
+            if (consume(ID, &quot;double&quot;)) return ret + &quot;double&quot;;
+            if (ret) error(&quot;Failed to parse float type&quot;);
+        };
+        
+        var primitive_type = function () {
+            var num_type = integer_type() || float_type();
+            if (num_type) return num_type;
+            all_ws();
+            if (consume(ID, &quot;boolean&quot;)) return &quot;boolean&quot;;
+            if (consume(ID, &quot;byte&quot;)) return &quot;byte&quot;;
+            if (consume(ID, &quot;octet&quot;)) return &quot;octet&quot;;
+        };
+        
+        var const_value = function () {
+            if (consume(ID, &quot;true&quot;)) return { type: &quot;boolean&quot;, value: true };
+            if (consume(ID, &quot;false&quot;)) return { type: &quot;boolean&quot;, value: false };
+            if (consume(ID, &quot;null&quot;)) return { type: &quot;null&quot; };
+            if (consume(ID, &quot;Infinity&quot;)) return { type: &quot;Infinity&quot;, negative: false };
+            if (consume(ID, &quot;NaN&quot;)) return { type: &quot;NaN&quot; };
+            var ret = consume(FLOAT) || consume(INT);
+            if (ret) return { type: &quot;number&quot;, value: 1 * ret.value };
+            var tok = consume(OTHER, &quot;-&quot;);
+            if (tok) {
+                if (consume(ID, &quot;Infinity&quot;)) return { type: &quot;Infinity&quot;, negative: true };
+                else tokens.unshift(tok);
+            }
+        };
+        
+        var type_suffix = function (obj) {
+            while (true) {
+                all_ws();
+                if (consume(OTHER, &quot;?&quot;)) {
+                    if (obj.nullable) error(&quot;Can't nullable more than once&quot;);
+                    obj.nullable = true;
+                }
+                else if (consume(OTHER, &quot;[&quot;)) {
+                    all_ws();
+                    consume(OTHER, &quot;]&quot;) || error(&quot;Unterminated array type&quot;);
+                    if (!obj.array) {
+                        obj.array = 1;
+                        obj.nullableArray = [obj.nullable];
+                    }
+                    else {
+                        obj.array++;
+                        obj.nullableArray.push(obj.nullable);
+                    }
+                    obj.nullable = false;
+                }
+                else return;
+            }
+        };
+        
+        var single_type = function () {
+            var prim = primitive_type()
+            ,   ret = { sequence: false, generic: null, nullable: false, array: false, union: false }
+            ,   name
+            ,   value
+            ;
+            if (prim) {
+                ret.idlType = prim;
+            }
+            else if (name = consume(ID)) {
+                value = name.value;
+                all_ws();
+                // Generic types
+                if (consume(OTHER, &quot;&lt;&quot;)) {
+                    // backwards compat
+                    if (value === &quot;sequence&quot;) {
+                        ret.sequence = true;
+                    }
+                    ret.generic = value;
+                    ret.idlType = type() || error(&quot;Error parsing generic type &quot; + value);
+                    all_ws();
+                    if (!consume(OTHER, &quot;&gt;&quot;)) error(&quot;Unterminated generic type &quot; + value);
+                    type_suffix(ret);
+                    return ret;
+                }
+                else {
+                    ret.idlType = value;
+                }
+            }
+            else {
+                return;
+            }
+            type_suffix(ret);
+            if (ret.nullable &amp;&amp; !ret.array &amp;&amp; ret.idlType === &quot;any&quot;) error(&quot;Type any cannot be made nullable&quot;);
+            return ret;
+        };
+        
+        var union_type = function () {
+            all_ws();
+            if (!consume(OTHER, &quot;(&quot;)) return;
+            var ret = { sequence: false, generic: null, nullable: false, array: false, union: true, idlType: [] };
+            var fst = type() || error(&quot;Union type with no content&quot;);
+            ret.idlType.push(fst);
+            while (true) {
+                all_ws();
+                if (!consume(ID, &quot;or&quot;)) break;
+                var typ = type() || error(&quot;No type after 'or' in union type&quot;);
+                ret.idlType.push(typ);
+            }
+            if (!consume(OTHER, &quot;)&quot;)) error(&quot;Unterminated union type&quot;);
+            type_suffix(ret);
+            return ret;
+        };
+        
+        var type = function () {
+            return single_type() || union_type();
+        };
+        
+        var argument = function (store) {
+            var ret = { optional: false, variadic: false };
+            ret.extAttrs = extended_attrs(store);
+            all_ws(store, &quot;pea&quot;);
+            var opt_token = consume(ID, &quot;optional&quot;);
+            if (opt_token) {
+                ret.optional = true;
+                all_ws();
+            }
+            ret.idlType = type();
+            if (!ret.idlType) {
+                if (opt_token) tokens.unshift(opt_token);
+                return;
+            }
+            var type_token = last_token;
+            if (!ret.optional) {
+                all_ws();
+                if (tokens.length &gt;= 3 &amp;&amp;
+                    tokens[0].type === &quot;other&quot; &amp;&amp; tokens[0].value === &quot;.&quot; &amp;&amp;
+                    tokens[1].type === &quot;other&quot; &amp;&amp; tokens[1].value === &quot;.&quot; &amp;&amp;
+                    tokens[2].type === &quot;other&quot; &amp;&amp; tokens[2].value === &quot;.&quot;
+                    ) {
+                    tokens.shift();
+                    tokens.shift();
+                    tokens.shift();
+                    ret.variadic = true;
+                }
+            }
+            all_ws();
+            var name = consume(ID);
+            if (!name) {
+                if (opt_token) tokens.unshift(opt_token);
+                tokens.unshift(type_token);
+                return;
+            }
+            ret.name = name.value;
+            if (ret.optional) {
+                all_ws();
+                ret[&quot;default&quot;] = default_();
+            }
+            return ret;
+        };
+        
+        var argument_list = function (store) {
+            var ret = []
+            ,   arg = argument(store ? ret : null)
+            ;
+            if (!arg) return;
+            ret.push(arg);
+            while (true) {
+                all_ws(store ? ret : null);
+                if (!consume(OTHER, &quot;,&quot;)) return ret;
+                var nxt = argument(store ? ret : null) || error(&quot;Trailing comma in arguments list&quot;);
+                ret.push(nxt);
+            }
+        };
+        
+        var type_pair = function () {
+            all_ws();
+            var k = type();
+            if (!k) return;
+            all_ws()
+            if (!consume(OTHER, &quot;,&quot;)) return;
+            all_ws();
+            var v = type();
+            if (!v) return;
+            return [k, v];
+        };
+        
+        var simple_extended_attr = function (store) {
+            all_ws();
+            var name = consume(ID);
+            if (!name) return;
+            var ret = {
+                name: name.value
+            ,   &quot;arguments&quot;: null
+            };
+            all_ws();
+            var eq = consume(OTHER, &quot;=&quot;);
+            if (eq) {
+                var rhs;
+                all_ws();
+                if (rhs = consume(ID)) {
+                  ret.rhs = rhs
+                }
+                else if (consume(OTHER, &quot;(&quot;)) {
+                    // [Exposed=(Window,Worker)]
+                    rhs = [];
+                    var id = consume(ID);
+                    if (id) {
+                      rhs = [id.value];
+                    }
+                    identifiers(rhs);
+                    consume(OTHER, &quot;)&quot;) || error(&quot;Unexpected token in extended attribute argument list or type pair&quot;);
+                    ret.rhs = {
+                        type: &quot;identifier-list&quot;,
+                        value: rhs
+                    };
+                }
+                if (!ret.rhs) return error(&quot;No right hand side to extended attribute assignment&quot;);
+            }
+            all_ws();
+            if (consume(OTHER, &quot;(&quot;)) {
+                var args, pair;
+                // [Constructor(DOMString str)]
+                if (args = argument_list(store)) {
+                    ret[&quot;arguments&quot;] = args;
+                }
+                // [MapClass(DOMString, DOMString)]
+                else if (pair = type_pair()) {
+                    ret.typePair = pair;
+                }
+                // [Constructor()]
+                else {
+                    ret[&quot;arguments&quot;] = [];
+                }
+                all_ws();
+                consume(OTHER, &quot;)&quot;) || error(&quot;Unexpected token in extended attribute argument list or type pair&quot;);
+            }
+            return ret;
+        };
+        
+        // Note: we parse something simpler than the official syntax. It's all that ever
+        // seems to be used
+        var extended_attrs = function (store) {
+            var eas = [];
+            all_ws(store);
+            if (!consume(OTHER, &quot;[&quot;)) return eas;
+            eas[0] = simple_extended_attr(store) || error(&quot;Extended attribute with not content&quot;);
+            all_ws();
+            while (consume(OTHER, &quot;,&quot;)) {
+                eas.push(simple_extended_attr(store) || error(&quot;Trailing comma in extended attribute&quot;));
+                all_ws();
+            }
+            consume(OTHER, &quot;]&quot;) || error(&quot;No end of extended attribute&quot;);
+            return eas;
+        };
+        
+        var default_ = function () {
+            all_ws();
+            if (consume(OTHER, &quot;=&quot;)) {
+                all_ws();
+                var def = const_value();
+                if (def) {
+                    return def;
+                }
+                else if (consume(OTHER, &quot;[&quot;)) {
+                    if (!consume(OTHER, &quot;]&quot;)) error(&quot;Default sequence value must be empty&quot;);
+                    return { type: &quot;sequence&quot;, value: [] };
+                }
+                else {
+                    var str = consume(STR) || error(&quot;No value for default&quot;);
+                    str.value = str.value.replace(/^&quot;/, &quot;&quot;).replace(/&quot;$/, &quot;&quot;);
+                    return str;
+                }
+            }
+        };
+        
+        var const_ = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            if (!consume(ID, &quot;const&quot;)) return;
+            var ret = { type: &quot;const&quot;, nullable: false };
+            all_ws();
+            var typ = primitive_type();
+            if (!typ) {
+                typ = consume(ID) || error(&quot;No type for const&quot;);
+                typ = typ.value;
+            }
+            ret.idlType = typ;
+            all_ws();
+            if (consume(OTHER, &quot;?&quot;)) {
+                ret.nullable = true;
+                all_ws();
+            }
+            var name = consume(ID) || error(&quot;No name for const&quot;);
+            ret.name = name.value;
+            all_ws();
+            consume(OTHER, &quot;=&quot;) || error(&quot;No value assignment for const&quot;);
+            all_ws();
+            var cnt = const_value();
+            if (cnt) ret.value = cnt;
+            else error(&quot;No value for const&quot;);
+            all_ws();
+            consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated const&quot;);
+            return ret;
+        };
+        
+        var inheritance = function () {
+            all_ws();
+            if (consume(OTHER, &quot;:&quot;)) {
+                all_ws();
+                var inh = consume(ID) || error (&quot;No type in inheritance&quot;);
+                return inh.value;
+            }
+        };
+        
+        var operation_rest = function (ret, store) {
+            all_ws();
+            if (!ret) ret = {};
+            var name = consume(ID);
+            ret.name = name ? name.value : null;
+            all_ws();
+            consume(OTHER, &quot;(&quot;) || error(&quot;Invalid operation&quot;);
+            ret[&quot;arguments&quot;] = argument_list(store) || [];
+            all_ws();
+            consume(OTHER, &quot;)&quot;) || error(&quot;Unterminated operation&quot;);
+            all_ws();
+            consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated operation&quot;);
+            return ret;
+        };
+        
+        var callback = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            var ret;
+            if (!consume(ID, &quot;callback&quot;)) return;
+            all_ws();
+            var tok = consume(ID, &quot;interface&quot;);
+            if (tok) {
+                tokens.unshift(tok);
+                ret = interface_();
+                ret.type = &quot;callback interface&quot;;
+                return ret;
+            }
+            var name = consume(ID) || error(&quot;No name for callback&quot;);
+            ret = { type: &quot;callback&quot;, name: name.value };
+            all_ws();
+            consume(OTHER, &quot;=&quot;) || error(&quot;No assignment in callback&quot;);
+            all_ws();
+            ret.idlType = return_type();
+            all_ws();
+            consume(OTHER, &quot;(&quot;) || error(&quot;No arguments in callback&quot;);
+            ret[&quot;arguments&quot;] = argument_list(store) || [];
+            all_ws();
+            consume(OTHER, &quot;)&quot;) || error(&quot;Unterminated callback&quot;);
+            all_ws();
+            consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated callback&quot;);
+            return ret;
+        };
+
+        var attribute = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            var grabbed = []
+            ,   ret = {
+                type:           &quot;attribute&quot;
+            ,   &quot;static&quot;:       false
+            ,   stringifier:    false
+            ,   inherit:        false
+            ,   readonly:       false
+            };
+            if (consume(ID, &quot;static&quot;)) {
+                ret[&quot;static&quot;] = true;
+                grabbed.push(last_token);
+            }
+            else if (consume(ID, &quot;stringifier&quot;)) {
+                ret.stringifier = true;
+                grabbed.push(last_token);
+            }
+            var w = all_ws();
+            if (w) grabbed.push(w);
+            if (consume(ID, &quot;inherit&quot;)) {
+                if (ret[&quot;static&quot;] || ret.stringifier) error(&quot;Cannot have a static or stringifier inherit&quot;);
+                ret.inherit = true;
+                grabbed.push(last_token);
+                var w = all_ws();
+                if (w) grabbed.push(w);
+            }
+            if (consume(ID, &quot;readonly&quot;)) {
+                ret.readonly = true;
+                grabbed.push(last_token);
+                var w = all_ws();
+                if (w) grabbed.push(w);
+            }
+            if (!consume(ID, &quot;attribute&quot;)) {
+                tokens = grabbed.concat(tokens);
+                return;
+            }
+            all_ws();
+            ret.idlType = type() || error(&quot;No type in attribute&quot;);
+            if (ret.idlType.sequence) error(&quot;Attributes cannot accept sequence types&quot;);
+            all_ws();
+            var name = consume(ID) || error(&quot;No name in attribute&quot;);
+            ret.name = name.value;
+            all_ws();
+            consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated attribute&quot;);
+            return ret;
+        };
+        
+        var return_type = function () {
+            var typ = type();
+            if (!typ) {
+                if (consume(ID, &quot;void&quot;)) {
+                    return &quot;void&quot;;
+                }
+                else error(&quot;No return type&quot;);
+            }
+            return typ;
+        };
+        
+        var operation = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            var ret = {
+                type:           &quot;operation&quot;
+            ,   getter:         false
+            ,   setter:         false
+            ,   creator:        false
+            ,   deleter:        false
+            ,   legacycaller:   false
+            ,   &quot;static&quot;:       false
+            ,   stringifier:    false
+            };
+            while (true) {
+                all_ws();
+                if (consume(ID, &quot;getter&quot;)) ret.getter = true;
+                else if (consume(ID, &quot;setter&quot;)) ret.setter = true;
+                else if (consume(ID, &quot;creator&quot;)) ret.creator = true;
+                else if (consume(ID, &quot;deleter&quot;)) ret.deleter = true;
+                else if (consume(ID, &quot;legacycaller&quot;)) ret.legacycaller = true;
+                else break;
+            }
+            if (ret.getter || ret.setter || ret.creator || ret.deleter || ret.legacycaller) {
+                all_ws();
+                ret.idlType = return_type();
+                operation_rest(ret, store);
+                return ret;
+            }
+            if (consume(ID, &quot;static&quot;)) {
+                ret[&quot;static&quot;] = true;
+                ret.idlType = return_type();
+                operation_rest(ret, store);
+                return ret;
+            }
+            else if (consume(ID, &quot;stringifier&quot;)) {
+                ret.stringifier = true;-
+                all_ws();
+                if (consume(OTHER, &quot;;&quot;)) return ret;
+                ret.idlType = return_type();
+                operation_rest(ret, store);
+                return ret;
+            }
+            ret.idlType = return_type();
+            all_ws();
+            if (consume(ID, &quot;iterator&quot;)) {
+                all_ws();
+                ret.type = &quot;iterator&quot;;
+                if (consume(ID, &quot;object&quot;)) {
+                    ret.iteratorObject = &quot;object&quot;;
+                }
+                else if (consume(OTHER, &quot;=&quot;)) {
+                    all_ws();
+                    var name = consume(ID) || error(&quot;No right hand side in iterator&quot;);
+                    ret.iteratorObject = name.value;
+                }
+                all_ws();
+                consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated iterator&quot;);
+                return ret;
+            }
+            else {
+                operation_rest(ret, store);
+                return ret;
+            }
+        };
+        
+        var identifiers = function (arr) {
+            while (true) {
+                all_ws();
+                if (consume(OTHER, &quot;,&quot;)) {
+                    all_ws();
+                    var name = consume(ID) || error(&quot;Trailing comma in identifiers list&quot;);
+                    arr.push(name.value);
+                }
+                else break;
+            }
+        };
+        
+        var serialiser = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            if (!consume(ID, &quot;serializer&quot;)) return;
+            var ret = { type: &quot;serializer&quot; };
+            all_ws();
+            if (consume(OTHER, &quot;=&quot;)) {
+                all_ws();
+                if (consume(OTHER, &quot;{&quot;)) {
+                    ret.patternMap = true;
+                    all_ws();
+                    var id = consume(ID);
+                    if (id &amp;&amp; id.value === &quot;getter&quot;) {
+                        ret.names = [&quot;getter&quot;];
+                    }
+                    else if (id &amp;&amp; id.value === &quot;inherit&quot;) {
+                        ret.names = [&quot;inherit&quot;];
+                        identifiers(ret.names);
+                    }
+                    else if (id) {
+                        ret.names = [id.value];
+                        identifiers(ret.names);
+                    }
+                    else {
+                        ret.names = [];
+                    }
+                    all_ws();
+                    consume(OTHER, &quot;}&quot;) || error(&quot;Unterminated serializer pattern map&quot;);
+                }
+                else if (consume(OTHER, &quot;[&quot;)) {
+                    ret.patternList = true;
+                    all_ws();
+                    var id = consume(ID);
+                    if (id &amp;&amp; id.value === &quot;getter&quot;) {
+                        ret.names = [&quot;getter&quot;];
+                    }
+                    else if (id) {
+                        ret.names = [id.value];
+                        identifiers(ret.names);
+                    }
+                    else {
+                        ret.names = [];
+                    }
+                    all_ws();
+                    consume(OTHER, &quot;]&quot;) || error(&quot;Unterminated serializer pattern list&quot;);
+                }
+                else {
+                    var name = consume(ID) || error(&quot;Invalid serializer&quot;);
+                    ret.name = name.value;
+                }
+                all_ws();
+                consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated serializer&quot;);
+                return ret;
+            }
+            else if (consume(OTHER, &quot;;&quot;)) {
+                // noop, just parsing
+            }
+            else {
+                ret.idlType = return_type();
+                all_ws();
+                ret.operation = operation_rest(null, store);
+            }
+            return ret;
+        };
+
+        var iterable_type = function() {
+            if (consume(ID, &quot;iterable&quot;)) return &quot;iterable&quot;;
+            else if (consume(ID, &quot;legacyiterable&quot;)) return &quot;legacyiterable&quot;;
+            else if (consume(ID, &quot;maplike&quot;)) return &quot;maplike&quot;;
+            else if (consume(ID, &quot;setlike&quot;)) return &quot;setlike&quot;;
+            else return;
+        }
+
+        var readonly_iterable_type = function() {
+            if (consume(ID, &quot;maplike&quot;)) return &quot;maplike&quot;;
+            else if (consume(ID, &quot;setlike&quot;)) return &quot;setlike&quot;;
+            else return;
+        }
+
+        var iterable = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            var grabbed = [],
+                ret = {type: null, idlType: null, readonly: false};
+            if (consume(ID, &quot;readonly&quot;)) {
+                ret.readonly = true;
+                grabbed.push(last_token);
+                var w = all_ws();
+                if (w) grabbed.push(w);
+            }
+            var consumeItType = ret.readonly ? readonly_iterable_type : iterable_type;
+
+            var ittype = consumeItType();
+            if (!ittype) {
+                tokens = grabbed.concat(tokens);
+                return;
+            }
+
+            var secondTypeRequired = ittype === &quot;maplike&quot;;
+            var secondTypeAllowed = secondTypeRequired || ittype === &quot;iterable&quot;;
+            ret.type = ittype;
+            if (ret.type !== 'maplike' &amp;&amp; ret.type !== 'setlike')
+                delete ret.readonly;
+            all_ws();
+            if (consume(OTHER, &quot;&lt;&quot;)) {
+                ret.idlType = type() || error(&quot;Error parsing &quot; + ittype + &quot; declaration&quot;);
+                all_ws();
+                if (secondTypeAllowed) {
+                    var type2 = null;
+                    if (consume(OTHER, &quot;,&quot;)) {
+                        all_ws();
+                        type2 = type();
+                        all_ws();                        
+                    }
+                    if (type2)
+                        ret.idlType = [ret.idlType, type2];
+                    else if (secondTypeRequired)
+                        error(&quot;Missing second type argument in &quot; + ittype + &quot; declaration&quot;);
+                }
+                if (!consume(OTHER, &quot;&gt;&quot;)) error(&quot;Unterminated &quot; + ittype + &quot; declaration&quot;);
+                all_ws();
+                if (!consume(OTHER, &quot;;&quot;)) error(&quot;Missing semicolon after &quot; + ittype + &quot; declaration&quot;);
+            }
+            else
+                error(&quot;Error parsing &quot; + ittype + &quot; declaration&quot;);
+
+            return ret;            
+        }        
+        
+        var interface_ = function (isPartial, store) {
+            all_ws(isPartial ? null : store, &quot;pea&quot;);
+            if (!consume(ID, &quot;interface&quot;)) return;
+            all_ws();
+            var name = consume(ID) || error(&quot;No name for interface&quot;);
+            var mems = []
+            ,   ret = {
+                type:   &quot;interface&quot;
+            ,   name:   name.value
+            ,   partial:    false
+            ,   members:    mems
+            };
+            if (!isPartial) ret.inheritance = inheritance() || null;
+            all_ws();
+            consume(OTHER, &quot;{&quot;) || error(&quot;Bodyless interface&quot;);
+            while (true) {
+                all_ws(store ? mems : null);
+                if (consume(OTHER, &quot;}&quot;)) {
+                    all_ws();
+                    consume(OTHER, &quot;;&quot;) || error(&quot;Missing semicolon after interface&quot;);
+                    return ret;
+                }
+                var ea = extended_attrs(store ? mems : null);
+                all_ws();
+                var cnt = const_(store ? mems : null);
+                if (cnt) {
+                    cnt.extAttrs = ea;
+                    ret.members.push(cnt);
+                    continue;
+                }
+                var mem = (opt.allowNestedTypedefs &amp;&amp; typedef(store ? mems : null)) ||
+                          iterable(store ? mems : null) ||
+                          serialiser(store ? mems : null) ||
+                          attribute(store ? mems : null) ||
+                          operation(store ? mems : null) ||
+                          error(&quot;Unknown member&quot;);
+                mem.extAttrs = ea;
+                ret.members.push(mem);
+            }
+        };
+        
+        var partial = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            if (!consume(ID, &quot;partial&quot;)) return;
+            var thing = dictionary(true, store) ||
+                        interface_(true, store) ||
+                        error(&quot;Partial doesn't apply to anything&quot;);
+            thing.partial = true;
+            return thing;
+        };
+        
+        var dictionary = function (isPartial, store) {
+            all_ws(isPartial ? null : store, &quot;pea&quot;);
+            if (!consume(ID, &quot;dictionary&quot;)) return;
+            all_ws();
+            var name = consume(ID) || error(&quot;No name for dictionary&quot;);
+            var mems = []
+            ,   ret = {
+                type:   &quot;dictionary&quot;
+            ,   name:   name.value
+            ,   partial:    false
+            ,   members:    mems
+            };
+            if (!isPartial) ret.inheritance = inheritance() || null;
+            all_ws();
+            consume(OTHER, &quot;{&quot;) || error(&quot;Bodyless dictionary&quot;);
+            while (true) {
+                all_ws(store ? mems : null);
+                if (consume(OTHER, &quot;}&quot;)) {
+                    all_ws();
+                    consume(OTHER, &quot;;&quot;) || error(&quot;Missing semicolon after dictionary&quot;);
+                    return ret;
+                }
+                var ea = extended_attrs(store ? mems : null);
+                all_ws(store ? mems : null, &quot;pea&quot;);
+                var required = consume(ID, &quot;required&quot;);
+                var typ = type() || error(&quot;No type for dictionary member&quot;);
+                all_ws();
+                var name = consume(ID) || error(&quot;No name for dictionary member&quot;);
+                var dflt = default_();
+                if (required &amp;&amp; dflt) error(&quot;Required member must not have a default&quot;);
+                ret.members.push({
+                    type:       &quot;field&quot;
+                ,   name:       name.value
+                ,   required:   !!required
+                ,   idlType:    typ
+                ,   extAttrs:   ea
+                ,   &quot;default&quot;:  dflt
+                });
+                all_ws();
+                consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated dictionary member&quot;);
+            }
+        };
+        
+        var exception = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            if (!consume(ID, &quot;exception&quot;)) return;
+            all_ws();
+            var name = consume(ID) || error(&quot;No name for exception&quot;);
+            var mems = []
+            ,   ret = {
+                type:   &quot;exception&quot;
+            ,   name:   name.value
+            ,   members:    mems
+            };
+            ret.inheritance = inheritance() || null;
+            all_ws();
+            consume(OTHER, &quot;{&quot;) || error(&quot;Bodyless exception&quot;);
+            while (true) {
+                all_ws(store ? mems : null);
+                if (consume(OTHER, &quot;}&quot;)) {
+                    all_ws();
+                    consume(OTHER, &quot;;&quot;) || error(&quot;Missing semicolon after exception&quot;);
+                    return ret;
+                }
+                var ea = extended_attrs(store ? mems : null);
+                all_ws(store ? mems : null, &quot;pea&quot;);
+                var cnt = const_();
+                if (cnt) {
+                    cnt.extAttrs = ea;
+                    ret.members.push(cnt);
+                }
+                else {
+                    var typ = type();
+                    all_ws();
+                    var name = consume(ID);
+                    all_ws();
+                    if (!typ || !name || !consume(OTHER, &quot;;&quot;)) error(&quot;Unknown member in exception body&quot;);
+                    ret.members.push({
+                        type:       &quot;field&quot;
+                    ,   name:       name.value
+                    ,   idlType:    typ
+                    ,   extAttrs:   ea
+                    });
+                }
+            }
+        };
+        
+        var enum_ = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            if (!consume(ID, &quot;enum&quot;)) return;
+            all_ws();
+            var name = consume(ID) || error(&quot;No name for enum&quot;);
+            var vals = []
+            ,   ret = {
+                type:   &quot;enum&quot;
+            ,   name:   name.value
+            ,   values: vals
+            };
+            all_ws();
+            consume(OTHER, &quot;{&quot;) || error(&quot;No curly for enum&quot;);
+            var saw_comma = false;
+            while (true) {
+                all_ws(store ? vals : null);
+                if (consume(OTHER, &quot;}&quot;)) {
+                    all_ws();
+                    consume(OTHER, &quot;;&quot;) || error(&quot;No semicolon after enum&quot;);
+                    return ret;
+                }
+                var val = consume(STR) || error(&quot;Unexpected value in enum&quot;);
+                ret.values.push(val.value.replace(/&quot;/g, &quot;&quot;));
+                all_ws(store ? vals : null);
+                if (consume(OTHER, &quot;,&quot;)) {
+                    if (store) vals.push({ type: &quot;,&quot; });
+                    all_ws(store ? vals : null);
+                    saw_comma = true;
+                }
+                else {
+                    saw_comma = false;
+                }
+            }
+        };
+        
+        var typedef = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            if (!consume(ID, &quot;typedef&quot;)) return;
+            var ret = {
+                type:   &quot;typedef&quot;
+            };
+            all_ws();
+            ret.typeExtAttrs = extended_attrs();
+            all_ws(store, &quot;tpea&quot;);
+            ret.idlType = type() || error(&quot;No type in typedef&quot;);
+            all_ws();
+            var name = consume(ID) || error(&quot;No name in typedef&quot;);
+            ret.name = name.value;
+            all_ws();
+            consume(OTHER, &quot;;&quot;) || error(&quot;Unterminated typedef&quot;);
+            return ret;
+        };
+        
+        var implements_ = function (store) {
+            all_ws(store, &quot;pea&quot;);
+            var target = consume(ID);
+            if (!target) return;
+            var w = all_ws();
+            if (consume(ID, &quot;implements&quot;)) {
+                var ret = {
+                    type:   &quot;implements&quot;
+                ,   target: target.value
+                };
+                all_ws();
+                var imp = consume(ID) || error(&quot;Incomplete implements statement&quot;);
+                ret[&quot;implements&quot;] = imp.value;
+                all_ws();
+                consume(OTHER, &quot;;&quot;) || error(&quot;No terminating ; for implements statement&quot;);
+                return ret;
+            }
+            else {
+                // rollback
+                tokens.unshift(w);
+                tokens.unshift(target);
+            }
+        };
+        
+        var definition = function (store) {
+            return  callback(store)             ||
+                    interface_(false, store)    ||
+                    partial(store)              ||
+                    dictionary(false, store)    ||
+                    exception(store)            ||
+                    enum_(store)                ||
+                    typedef(store)              ||
+                    implements_(store)
+                    ;
+        };
+        
+        var definitions = function (store) {
+            if (!tokens.length) return [];
+            var defs = [];
+            while (true) {
+                var ea = extended_attrs(store ? defs : null)
+                ,   def = definition(store ? defs : null);
+                if (!def) {
+                    if (ea.length) error(&quot;Stray extended attributes&quot;);
+                    break;
+                }
+                def.extAttrs = ea;
+                defs.push(def);
+            }
+            return defs;
+        };
+        var res = definitions(opt.ws);
+        if (tokens.length) error(&quot;Unrecognised tokens&quot;);
+        return res;
+    };
+
+    var inNode = typeof module !== &quot;undefined&quot; &amp;&amp; module.exports
+    ,   obj = {
+            parse:  function (str, opt) {
+                if (!opt) opt = {};
+                var tokens = tokenise(str);
+                return parse(tokens, opt);
+            }
+    };
+
+    if (inNode) module.exports = obj;
+    else        self.WebIDL2 = obj;
+}());
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsresourceswebidl2libwriterjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/writer.js (0 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/writer.js                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/resources/webidl2/lib/writer.js        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -0,0 +1,236 @@
</span><ins>+
+(function () {
+
+    var write = function (ast, opt) {
+        var curPea = &quot;&quot;
+        ,   curTPea = &quot;&quot;
+        ,   opt = opt || {}
+        ,   noop = function (str) { return str; }
+        ,   optNames = &quot;type&quot;.split(&quot; &quot;)
+        ,   context = []
+        ;
+        for (var i = 0, n = optNames.length; i &lt; n; i++) {
+            var o = optNames[i];
+            if (!opt[o]) opt[o] = noop;
+        }
+        
+        var literal = function (it) {
+            return it.value;
+        };
+        var wsPea = function (it) {
+            curPea += it.value;
+            return &quot;&quot;;
+        };
+        var wsTPea = function (it) {
+            curTPea += it.value;
+            return &quot;&quot;;
+        };
+        var lineComment = function (it) {
+            return &quot;//&quot; + it.value + &quot;\n&quot;;
+        };
+        var multilineComment = function (it) {
+            return &quot;/*&quot; + it.value + &quot;*/&quot;;
+        };
+        var type = function (it) {
+            if (typeof it === &quot;string&quot;) return opt.type(it); // XXX should maintain some context
+            if (it.union) return &quot;(&quot; + it.idlType.map(type).join(&quot; or &quot;) + &quot;)&quot;;
+            var ret = &quot;&quot;;
+            if (it.sequence) ret += &quot;sequence&lt;&quot;;
+            ret += type(it.idlType);
+            if (it.array) {
+                for (var i = 0, n = it.nullableArray.length; i &lt; n; i++) {
+                    var val = it.nullableArray[i];
+                    if (val) ret += &quot;?&quot;;
+                    ret += &quot;[]&quot;;
+                }
+            }
+            if (it.sequence) ret += &quot;&gt;&quot;;
+            if (it.nullable) ret += &quot;?&quot;;
+
+            return ret;
+        };
+        var const_value = function (it) {
+            var tp = it. type;
+            if (tp === &quot;boolean&quot;) return it.value ? &quot;true&quot; : &quot;false&quot;;
+            else if (tp === &quot;null&quot;) return &quot;null&quot;;
+            else if (tp === &quot;Infinity&quot;) return (it.negative ? &quot;-&quot; : &quot;&quot;) + &quot;Infinity&quot;;
+            else if (tp === &quot;NaN&quot;) return &quot;NaN&quot;;
+            else if (tp === &quot;number&quot;) return it.value;
+            else return '&quot;' + it.value + '&quot;';
+        };
+        var argument = function (arg, pea) {
+            var ret = extended_attributes(arg.extAttrs, pea);
+            if (arg.optional) ret += &quot;optional &quot;;
+            ret += type(arg.idlType);
+            if (arg.variadic) ret += &quot;...&quot;;
+            ret += &quot; &quot; + arg.name;
+            if (arg[&quot;default&quot;]) ret += &quot; = &quot; + const_value(arg[&quot;default&quot;]);
+            return ret;
+        };
+        var args = function (its) {
+            var res = &quot;&quot;
+            ,   pea = &quot;&quot;
+            ;
+            for (var i = 0, n = its.length; i &lt; n; i++) {
+                var arg = its[i];
+                if (arg.type === &quot;ws&quot;) res += arg.value;
+                else if (arg.type === &quot;ws-pea&quot;) pea += arg.value;
+                else {
+                    res += argument(arg, pea);
+                    if (i &lt; n - 1) res += &quot;,&quot;;
+                    pea = &quot;&quot;;
+                }
+            }
+            return res;
+        };
+        var make_ext_at = function (it) {
+            if (it[&quot;arguments&quot;] === null) return it.name;
+            context.unshift(it);
+            var ret = it.name + &quot;(&quot; + (it[&quot;arguments&quot;].length ? args(it[&quot;arguments&quot;]) : &quot;&quot;) + &quot;)&quot;;
+            context.shift(); // XXX need to add more contexts, but not more than needed for ReSpec
+            return ret;
+        };
+        var extended_attributes = function (eats, pea) {
+            if (!eats || !eats.length) return &quot;&quot;;
+            return &quot;[&quot; + eats.map(make_ext_at).join(&quot;, &quot;) + &quot;]&quot; + pea;
+        };
+        
+        var modifiers = &quot;getter setter creator deleter legacycaller stringifier static&quot;.split(&quot; &quot;);
+        var operation = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            if (it.stringifier &amp;&amp; !it.idlType) return &quot;stringifier;&quot;;
+            for (var i = 0, n = modifiers.length; i &lt; n; i++) {
+                var mod = modifiers[i];
+                if (it[mod]) ret += mod + &quot; &quot;;
+            }
+            ret += type(it.idlType) + &quot; &quot;;
+            if (it.name) ret += it.name;
+            ret += &quot;(&quot; + args(it[&quot;arguments&quot;]) + &quot;);&quot;;
+            return ret;
+        };
+
+        var attribute = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            if (it[&quot;static&quot;]) ret += &quot;static &quot;;
+            if (it.stringifier) ret += &quot;stringifier &quot;;
+            if (it.readonly) ret += &quot;readonly &quot;;
+            if (it.inherit) ret += &quot;inherit &quot;;
+            ret += &quot;attribute &quot; + type(it.idlType) + &quot; &quot; + it.name + &quot;;&quot;;
+            return ret;
+        };
+        
+        var interface_ = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            if (it.partial) ret += &quot;partial &quot;;
+            ret += &quot;interface &quot; + it.name + &quot; &quot;;
+            if (it.inheritance) ret += &quot;: &quot; + it.inheritance + &quot; &quot;;
+            ret += &quot;{&quot; + iterate(it.members) + &quot;};&quot;;
+            return ret;
+        };
+        
+        var dictionary = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            if (it.partial) ret += &quot;partial &quot;;
+            ret += &quot;dictionary &quot; + it.name + &quot; &quot;;
+            ret += &quot;{&quot; + iterate(it.members) + &quot;};&quot;;
+            return ret;
+        };
+        var field = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            ret += type(it.idlType) + &quot; &quot; + it.name;
+            if (it[&quot;default&quot;]) ret += &quot; = &quot; + const_value(it[&quot;default&quot;]);
+            ret += &quot;;&quot;;
+            return ret;
+        };
+        var exception = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            ret += &quot;exception &quot; + it.name + &quot; &quot;;
+            if (it.inheritance) ret += &quot;: &quot; + it.inheritance + &quot; &quot;;
+            ret += &quot;{&quot; + iterate(it.members) + &quot;};&quot;;
+            return ret;
+        };
+        var const_ = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            return ret + &quot;const &quot; + type(it.idlType) + &quot; &quot; + it.name + &quot; = &quot; + const_value(it.value) + &quot;;&quot;;
+        };
+        var typedef = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            ret += &quot;typedef &quot; + extended_attributes(it.typeExtAttrs, curTPea);
+            curTPea = &quot;&quot;;
+            return ret + type(it.idlType) + &quot; &quot; + it.name + &quot;;&quot;;
+        };
+        var implements_ = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            return ret + it.target + &quot; implements &quot; + it[&quot;implements&quot;] + &quot;;&quot;;
+        };
+        var callback = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            return ret + &quot;callback &quot; + it.name + &quot; = &quot; + type(it.idlType) +
+                   &quot;(&quot; + args(it[&quot;arguments&quot;]) + &quot;);&quot;;
+        };
+        var enum_ = function (it) {
+            var ret = extended_attributes(it.extAttrs, curPea);
+            curPea = &quot;&quot;;
+            ret += &quot;enum &quot; + it.name + &quot; {&quot;;
+            for (var i = 0, n = it.values.length; i &lt; n; i++) {
+                var v = it.values[i];
+                if (typeof v === &quot;string&quot;) ret += '&quot;' + v + '&quot;';
+                else if (v.type === &quot;ws&quot;) ret += v.value;
+                else if (v.type === &quot;,&quot;) ret += &quot;,&quot;;
+            }
+            return ret + &quot;};&quot;;
+        };
+        
+        var table = {
+            ws:                     literal
+        ,   &quot;ws-pea&quot;:               wsPea
+        ,   &quot;ws-tpea&quot;:              wsTPea
+        ,   &quot;line-comment&quot;:         lineComment
+        ,   &quot;multiline-comment&quot;:    multilineComment
+        ,   &quot;interface&quot;:            interface_
+        ,   operation:              operation
+        ,   attribute:              attribute
+        ,   dictionary:             dictionary
+        ,   field:                  field
+        ,   exception:              exception
+        ,   &quot;const&quot;:                const_
+        ,   typedef:                typedef
+        ,   &quot;implements&quot;:           implements_
+        ,   callback:               callback
+        ,   &quot;enum&quot;:                 enum_
+        };
+        var dispatch = function (it) {
+            return table[it.type](it);
+        };
+        var iterate = function (things) {
+            if (!things) return;
+            var ret = &quot;&quot;;
+            for (var i = 0, n = things.length; i &lt; n; i++) ret += dispatch(things[i]);
+            return ret;
+        };
+        return iterate(ast);
+    };
+
+
+    var inNode = typeof module !== &quot;undefined&quot; &amp;&amp; module.exports
+    ,   obj = {
+            write:  function (ast, opt) {
+                if (!opt) opt = {};
+                return write(ast, opt);
+            }
+    };
+
+    if (inNode) module.exports = obj;
+    else        window.WebIDL2Writer = obj;
+    
+}());
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsurlinterfacesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/url/interfaces-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/url/interfaces-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/url/interfaces-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -44,5 +44,15 @@
</span><span class="cx"> PASS URLSearchParams interface: operation getAll(USVString) 
</span><span class="cx"> PASS URLSearchParams interface: operation has(USVString) 
</span><span class="cx"> PASS URLSearchParams interface: operation set(USVString,USVString) 
</span><ins>+FAIL Testing Symbol.iterator property of iterable interface URLSearchParams assert_equals: @@iterator function does not have the right name expected &quot;entries&quot; but got &quot;[Symbol.Iterator]&quot;
+FAIL Testing pair iterable interface URLSearchParams assert_equals: entries method is not the same as @@iterator expected function &quot;function entries() {
+    [native code]
+}&quot; but got function &quot;function [Symbol.Iterator]() {
+    [native code]
+}&quot;
</ins><span class="cx"> PASS URLSearchParams interface: stringifier 
</span><ins>+PASS URLSearchParams interface: operation entries() 
+PASS URLSearchParams interface: operation keys() 
+PASS URLSearchParams interface: operation values() 
+PASS URLSearchParams interface: operation forEach(function,any) 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsurlurlconstructorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -279,7 +279,8 @@
</span><span class="cx"> PASS Parsing: &lt;http://%30%78%63%30%2e%30%32%35%30.01&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> PASS Parsing: &lt;http://%30%78%63%30%2e%30%32%35%30.01%2e&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http://192.168.0.257&gt; against &lt;http://other.com/&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> PASS Parsing: &lt;http://%3g%78%63%30%2e%30%32%35%30%2E.01&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> PASS Parsing: &lt;http://192.168.0.1 hello&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> PASS Parsing: &lt;http://0Xc0.0250.01&gt; against &lt;http://other.com/&gt; 
</span><span class="lines">@@ -365,7 +366,8 @@
</span><span class="cx"> PASS Parsing: &lt;??a=b&amp;c=d&gt; against &lt;http://example.org/foo/bar&gt; 
</span><span class="cx"> PASS Parsing: &lt;http:&gt; against &lt;http://example.org/foo/bar&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http:&gt; against &lt;https://example.org/foo/bar&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> PASS Parsing: &lt;sc:&gt; against &lt;https://example.org/foo/bar&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http://foo.bar/baz?qux#foobar&gt; against &lt;about:blank&gt; assert_equals: searchParams expected &quot;&quot; but got &quot;qux=&quot;
</span><span class="cx"> PASS Parsing: &lt;http://192.168.257&gt; against &lt;http://other.com/&gt; 
</span><span class="lines">@@ -375,16 +377,20 @@
</span><span class="cx"> PASS Parsing: &lt;http://999999999&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> PASS Parsing: &lt;http://999999999.com&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http://10000000000&gt; against &lt;http://other.com/&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> PASS Parsing: &lt;http://10000000000.com&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> PASS Parsing: &lt;http://4294967295&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http://4294967296&gt; against &lt;http://other.com/&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> PASS Parsing: &lt;http://0xffffffff&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http://0xffffffff1&gt; against &lt;http://other.com/&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> FAIL Parsing: &lt;http://256.256.256.256&gt; against &lt;http://other.com/&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> PASS Parsing: &lt;http://256.256.256.256.256&gt; against &lt;http://other.com/&gt; 
</span><span class="cx"> PASS Parsing: &lt;file:///C%3A/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;file:///C%7C/&gt; against &lt;about:blank&gt; 
</span><span class="lines">@@ -398,9 +404,11 @@
</span><span class="cx"> PASS Parsing: &lt;..&gt; against &lt;file:///1:/&gt; 
</span><span class="cx"> PASS Parsing: &lt;http://[1:0::]&gt; against &lt;http://example.net/&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http://?&gt; against &lt;about:blank&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> FAIL Parsing: &lt;http://#&gt; against &lt;about:blank&gt; assert_throws: function &quot;function () {
</span><del>-          bURL(expected.input, expected.bas...&quot; did not throw
</del><ins>+          bURL(expected.input, expected.base)
+        }&quot; did not throw
</ins><span class="cx"> PASS Parsing: &lt;sc://ñ&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://ñ?x&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://ñ#x&gt; against &lt;about:blank&gt; 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsurlurlencodedparserexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/url/urlencoded-parser-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/url/urlencoded-parser-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/url/urlencoded-parser-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -8,22 +8,22 @@
</span><span class="cx"> PASS URLSearchParams constructed with: %EF%BB%BFtest=%EF%BB%BF 
</span><span class="cx"> FAIL request.formData() with input: %EF%BB%BFtest=%EF%BB%BF undefined is not a function (near '...s-1252&quot;} }).formData()...')
</span><span class="cx"> FAIL response.formData() with input: %EF%BB%BFtest=%EF%BB%BF promise_test: Unhandled rejection with value: &quot;Not implemented&quot;
</span><del>-FAIL URLSearchParams constructed with: %FE%FF assert_array_equals: property 0, expected &quot;��&quot; but got &quot;&quot;
</del><ins>+FAIL URLSearchParams constructed with: %FE%FF assert_array_equals: property 0, expected &quot;\ufffd\ufffd&quot; but got &quot;&quot;
</ins><span class="cx"> FAIL request.formData() with input: %FE%FF undefined is not a function (near '...s-1252&quot;} }).formData()...')
</span><span class="cx"> FAIL response.formData() with input: %FE%FF promise_test: Unhandled rejection with value: &quot;Not implemented&quot;
</span><del>-FAIL URLSearchParams constructed with: %FF%FE assert_array_equals: property 0, expected &quot;��&quot; but got &quot;&quot;
</del><ins>+FAIL URLSearchParams constructed with: %FF%FE assert_array_equals: property 0, expected &quot;\ufffd\ufffd&quot; but got &quot;&quot;
</ins><span class="cx"> FAIL request.formData() with input: %FF%FE undefined is not a function (near '...s-1252&quot;} }).formData()...')
</span><span class="cx"> FAIL response.formData() with input: %FF%FE promise_test: Unhandled rejection with value: &quot;Not implemented&quot;
</span><span class="cx"> PASS URLSearchParams constructed with: †&amp;†=x 
</span><span class="cx"> FAIL request.formData() with input: †&amp;†=x undefined is not a function (near '...s-1252&quot;} }).formData()...')
</span><span class="cx"> FAIL response.formData() with input: †&amp;†=x promise_test: Unhandled rejection with value: &quot;Not implemented&quot;
</span><del>-FAIL URLSearchParams constructed with: %C2 assert_array_equals: property 0, expected &quot;�&quot; but got &quot;&quot;
</del><ins>+FAIL URLSearchParams constructed with: %C2 assert_array_equals: property 0, expected &quot;\ufffd&quot; but got &quot;&quot;
</ins><span class="cx"> FAIL request.formData() with input: %C2 undefined is not a function (near '...s-1252&quot;} }).formData()...')
</span><span class="cx"> FAIL response.formData() with input: %C2 promise_test: Unhandled rejection with value: &quot;Not implemented&quot;
</span><del>-FAIL URLSearchParams constructed with: %C2x assert_array_equals: property 0, expected &quot;�x&quot; but got &quot;&quot;
</del><ins>+FAIL URLSearchParams constructed with: %C2x assert_array_equals: property 0, expected &quot;\ufffdx&quot; but got &quot;&quot;
</ins><span class="cx"> FAIL request.formData() with input: %C2x undefined is not a function (near '...s-1252&quot;} }).formData()...')
</span><span class="cx"> FAIL response.formData() with input: %C2x promise_test: Unhandled rejection with value: &quot;Not implemented&quot;
</span><del>-FAIL URLSearchParams constructed with: _charset_=windows-1252&amp;test=%C2x assert_array_equals: property 1, expected &quot;�x&quot; but got &quot;&quot;
</del><ins>+FAIL URLSearchParams constructed with: _charset_=windows-1252&amp;test=%C2x assert_array_equals: property 1, expected &quot;\ufffdx&quot; but got &quot;&quot;
</ins><span class="cx"> FAIL request.formData() with input: _charset_=windows-1252&amp;test=%C2x undefined is not a function (near '...s-1252&quot;} }).formData()...')
</span><span class="cx"> FAIL response.formData() with input: _charset_=windows-1252&amp;test=%C2x promise_test: Unhandled rejection with value: &quot;Not implemented&quot;
</span><span class="cx"> PASS URLSearchParams constructed with:  
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsusertimingtest_user_timing_mark_and_measure_exception_when_invoke_with_timing_attributesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/user-timing/test_user_timing_mark_and_measure_exception_when_invoke_with_timing_attributes-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/user-timing/test_user_timing_mark_and_measure_exception_when_invoke_with_timing_attributes-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/user-timing/test_user_timing_mark_and_measure_exception_when_invoke_with_timing_attributes-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -4,6 +4,6 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> PASS window.performance is defined 
</span><del>-FAIL performance.mark and performance.measure should throw if used with timing attribute values assert_throws: function &quot;function () { window.performance.measure(timingAttributes...&quot; did not throw
</del><ins>+FAIL performance.mark and performance.measure should throw if used with timing attribute values assert_throws: function &quot;function () { window.performance.measure(timingAttributes[i]); }&quot; did not throw
</ins><span class="cx"> PASS performance.mark and performance.measure should not throw if used with timing attribute values in workers 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestswebrtcRTCDataChannelEventconstructorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDataChannelEvent-constructor-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDataChannelEvent-constructor-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDataChannelEvent-constructor-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL RTCDataChannelEvent constructor without a required argument. Can't find variable: RTCDataChannelEvent
</span><del>-FAIL RTCDataChannelEvent constructor with channel passed as null. assert_throws: function &quot;function () { new RTCDataChannelEvent('type', { channel: ...&quot; threw object &quot;ReferenceError: Can't find variable: RTCDataChannelEvent&quot; (&quot;ReferenceError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
-FAIL RTCDataChannelEvent constructor with a channel passed as undefined. assert_throws: function &quot;function () { new RTCDataChannelEvent('type', { channel: ...&quot; threw object &quot;ReferenceError: Can't find variable: RTCDataChannelEvent&quot; (&quot;ReferenceError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
</del><ins>+FAIL RTCDataChannelEvent constructor with channel passed as null. assert_throws: function &quot;function () { new RTCDataChannelEvent('type', { channel: null }); }&quot; threw object &quot;ReferenceError: Can't find variable: RTCDataChannelEvent&quot; (&quot;ReferenceError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
+FAIL RTCDataChannelEvent constructor with a channel passed as undefined. assert_throws: function &quot;function () { new RTCDataChannelEvent('type', { channel: undefined }); }&quot; threw object &quot;ReferenceError: Can't find variable: RTCDataChannelEvent&quot; (&quot;ReferenceError&quot;) expected object &quot;TypeError&quot; (&quot;TypeError&quot;)
</ins><span class="cx"> FAIL RTCDataChannelEvent constructor with full arguments. Can't find variable: RTCDataChannelEvent
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorimportedw3cwebplatformtestshtmlbrowsersbrowsingthewebhistorytraversalpersisteduserstaterestorationscrollrestorationfragmentscrollingcrossoriginexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/platform/ios-simulator/imported/w3c/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 2422: Error: assert_equals: should scroll to fragment expected 800 but got 0
</del><ins>+CONSOLE MESSAGE: line 2451: Error: assert_equals: should scroll to fragment expected 800 but got 0
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> Harness Error (TIMEOUT), message = null
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorwk2importedw3cwebplatformtestshtmldomreflectionembeddedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator-wk2/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator-wk2/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/platform/ios-simulator-wk2/imported/w3c/web-platform-tests/html/dom/reflection-embedded-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -19,19 +19,19 @@
</span><span class="cx"> CONSOLE MESSAGE: line 707: The language 'null' is not a valid BCP 47 language tag.
</span><span class="cx"> CONSOLE MESSAGE: line 707: The language 'test-toString' is not a valid BCP 47 language tag.
</span><span class="cx"> CONSOLE MESSAGE: line 707: The language 'test-valueOf' is not a valid BCP 47 language tag.
</span><del>-CONSOLE MESSAGE: line 1380: The language contains a null character and is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'undefined' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '7' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '1.5' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'true' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'false' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '[object Object]' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'Infinity' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language '-Infinity' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language contains a null character and is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'null' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'test-toString' is not a valid BCP 47 language tag.
-CONSOLE MESSAGE: line 1380: The language 'test-valueOf' is not a valid BCP 47 language tag.
</del><ins>+CONSOLE MESSAGE: line 1409: The language contains a null character and is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'undefined' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '7' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '1.5' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'true' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'false' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '[object Object]' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'Infinity' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language '-Infinity' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language contains a null character and is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'null' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'test-toString' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 1409: The language 'test-valueOf' is not a valid BCP 47 language tag.
</ins><span class="cx"> Implementers looking to fix bugs might want to use the original version of this suite's test framework, which conveniently aggregates similar errors and only reports failures. This file is (part of) the authoritative conformance test suite, and is suitable for incorporation into automated test suites.
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1importedw3cwebplatformtestsXMLHttpRequestsendnetworkerrorsynceventssubexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/XMLHttpRequest/send-network-error-sync-events.sub-expected.txt        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -2,5 +2,6 @@
</span><span class="cx"> 
</span><span class="cx"> FAIL XmlHttpRequest: The send() method: Throw a &quot;throw an &quot;NetworkError&quot; exception when Network error happens (synchronous flag is set) assert_throws: function &quot;function ()
</span><span class="cx">             {
</span><del>-                xhr.send(&quot;Test ...&quot; threw object &quot;AbortError (DOM Exception 20): The operation was aborted.&quot; that is not a DOMException NetworkError: property &quot;code&quot; is equal to 20, expected 19
</del><ins>+                xhr.send(&quot;Test Message&quot;);
+            }&quot; threw object &quot;AbortError (DOM Exception 20): The operation was aborted.&quot; that is not a DOMException NetworkError: property &quot;code&quot; is equal to 20, expected 19
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/Tools/ChangeLog        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2017-02-08  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Update web-platform-tests resources
+        https://bugs.webkit.org/show_bug.cgi?id=168026
+
+        Reviewed by Youenn Fablet.
+
+        Stop copying testharness.js from resources/ to web-platform-tests/resources.
+
+        * Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:
+        (WebPlatformTestServer._copy_webkit_test_files):
+
</ins><span class="cx"> 2017-02-08  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Custom protocols should not continue loading after a network process crash
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpylayout_testsserversweb_platform_test_serverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py (211929 => 211930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py        2017-02-09 05:22:51 UTC (rev 211929)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py        2017-02-09 05:52:02 UTC (rev 211930)
</span><span class="lines">@@ -124,8 +124,6 @@
</span><span class="cx"> 
</span><span class="cx">         wpt_testharnessjs_file = self._filesystem.join(self._doc_root, &quot;resources&quot;, &quot;testharness.js&quot;)
</span><span class="cx">         layout_tests_testharnessjs_file = self._filesystem.join(self._layout_root, &quot;resources&quot;, &quot;testharness.js&quot;)
</span><del>-        # FIXME: Next line to be removed once all bots have wpt_testharnessjs_file updated correctly. See https://bugs.webkit.org/show_bug.cgi?id=152257.
-        self._filesystem.copyfile(layout_tests_testharnessjs_file, wpt_testharnessjs_file)
</del><span class="cx">         if (not self._filesystem.compare(wpt_testharnessjs_file, layout_tests_testharnessjs_file)):
</span><span class="cx">             _log.warning(&quot;\n//////////\nWPT tests are not using the same testharness.js file as other WebKit Layout tests.\nWebKit testharness.js might need to be updated according WPT testharness.js.\n//////////\n&quot;)
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>