<!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>[207687] trunk/Source/WebCore</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/207687">207687</a></dd>
<dt>Author</dt> <dd>darin@apple.com</dd>
<dt>Date</dt> <dd>2016-10-21 11:32:04 -0700 (Fri, 21 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Move some more assorted classes from ExceptionCode to Exception
https://bugs.webkit.org/show_bug.cgi?id=163775

Reviewed by Chris Dumez.

* Modules/fetch/WorkerGlobalScopeFetch.cpp:
(WebCore::WorkerGlobalScopeFetch::fetch): Remove unnecessary calls to
WorkerGlobalScope::scriptExcutionObject, which just returns the scope itself.

* Modules/notifications/Notification.cpp: Added now-needed include.
* Modules/webdatabase/DOMWindowWebDatabase.cpp: Ditto.

* WebCore.xcodeproj/project.pbxproj: Added WindowOrWorkerGlobalScope.idl.

* bindings/js/JSDedicatedWorkerGlobalScopeCustom.cpp:
(WebCore::JSDedicatedWorkerGlobalScope::postMessage): Pass a reference instead
of a pointer to handlePostMessage.
* bindings/js/JSMessagePortCustom.cpp:
(WebCore::JSMessagePort::postMessage): Ditto.

* bindings/js/JSMessagePortCustom.h: Use pragma once. Change handlePostMessage
to take a reference to the object instead of a pointer, and also to use
propagateException since postMessage now uses ExceptionOr.

* bindings/js/JSWorkerCustom.cpp:
(WebCore::JSWorker::postMessage): Pass a reference instead of a pointer to
handlePostMessage.
(WebCore::constructJSWorker): Use the version of toJSNewlyCreated that handles
propagating an exception from ExceptionOr.

* bindings/js/JSWorkerGlobalScopeCustom.cpp:
(WebCore::JSWorkerGlobalScope::visitAdditionalChildren): Use auto.
Remove unnecessary round trip through the scriptExecutionContext function.
(WebCore::JSWorkerGlobalScope::importScripts): Use reserveInitialCapacity and
uncheckedAppend to build up the vector of strings. Use propagateException
to deal with ExceptionOr result.

* dom/MessagePort.cpp:
(WebCore::MessagePort::MessagePort): Initialize boolean data members in the
class definition instead of here.
(WebCore::MessagePort::postMessage): Use ExceptionOr.
(WebCore::MessagePort::entangle): Use an rvalue reference.
(WebCore::MessagePort::dispatchMessages): Use ExceptionOr.
(WebCore::MessagePort::disentanglePorts): Ditto. Also use a more efficient
idiom that does half as much hashing as the old algorithm, and got rid an
unneeded local variable.
(WebCore::MessagePort::entanglePorts): Use an rvalue reference.
* dom/MessagePort.h: Updated for above changes.

* fileapi/FileReader.cpp:
(WebCore::FileReader::create): Use auto.
(WebCore::FileReader::FileReader): Initialize scalars in the class definition.
(WebCore::FileReader::~FileReader): Call cancel on the loader directly
instead of sharing code with the stop function.
(WebCore::FileReader::stop): Moved the body of the terminate function here.
(WebCore::FileReader::readAsArrayBuffer): Use ExceptionOr.
(WebCore::FileReader::readAsBinaryString): Ditto.
(WebCore::FileReader::readAsText): Ditto.
(WebCore::FileReader::readAsDataURL): Ditto.
(WebCore::FileReader::readInternal): Ditto. Also add a cast now that
we derive privately from FileReaderLoaderClient.
(WebCore::FileReader::abort): Call stop instead of terminate.
(WebCore::FileReader::terminate): Deleted. Moved code into stop.
(WebCore::FileReader::didReceiveData): Moved comment to where the constant is.
* fileapi/FileReader.h: Updated for above changes. Made more functions private
and used final instead of override.
* fileapi/FileReader.idl: Use non-legacy exceptions.

* fileapi/FileReaderSync.cpp:
(WebCore::FileReaderSync::readAsArrayBuffer): Use ExceptionOr.
(WebCore::FileReaderSync::readAsBinaryString): Ditto.
(WebCore::FileReaderSync::readAsText): Ditto.
(WebCore::FileReaderSync::readAsDataURL): Ditto.
(WebCore::FileReaderSync::startLoading): Ditto.
(WebCore::FileReaderSync::startLoadingString): Added. Helper to cut down on
repeated code in functions above.
* fileapi/FileReaderSync.h: Updated for above changes.
* fileapi/FileReaderSync.idl: Use non-legacy exceptions.

* page/Base64Utilities.cpp:
(WebCore::Base64Utilities::btoa): Use ExceptionOr.
(WebCore::Base64Utilities::atob): Ditto.
* page/Base64Utilities.h: Updated for above changes.

* page/DOMWindow.cpp:
(WebCore::DOMWindow::navigator): Pass a reference to the frame.
(WebCore::DOMWindow::postMessage): Use ExceptionOr when calling
MessagePort::disentanglePorts. Also udpated for changes to the
PostMessageTimer.

* page/Navigator.cpp:
(WebCore::Navigator::Navigator): Take a reference.
(WebCore::shouldHideFourDot): Ditto
(WebCore::Navigator::appVersion): Pass a reference.
(WebCore::Navigator::plugins): Return a reference.
(WebCore::Navigator::mimeTypes): Ditto.
* page/Navigator.h: Updated for above changes. Also marked the
class final and moved derivation from RefCounted to NavigatorBase.

* page/NavigatorBase.h: Addded derivation from RefCounted since
both derived classes want that, and the destructor is already virtual.

* page/WindowOrWorkerGlobalScope.idl: Use non-legacy exceptions.

* page/WorkerNavigator.cpp:
(WebCore::WorkerNavigator::~WorkerNavigator): Deleted.

* page/WorkerNavigator.h: Moved derivation from RefCounted to
NavigatorBase. Also marked class final.

* workers/AbstractWorker.cpp:
(WebCore::AbstractWorker::resolveURL): Use ExceptionOr.
* workers/AbstractWorker.h: Updated for above changes.

* workers/DedicatedWorkerGlobalScope.cpp:
(WebCore::DedicatedWorkerGlobalScope::create): Use RefPtr&amp;&amp;
instead of PassRefPtr.
(WebCore::DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope):
Ditto.
(WebCore::DedicatedWorkerGlobalScope::postMessage): Use ExceptionOr.
(WebCore::DedicatedWorkerGlobalScope::importScripts): Ditto.
* workers/DedicatedWorkerGlobalScope.h: Updated for above changes.
* workers/DedicatedWorkerGlobalScope.idl: Use non-legacy exceptions.

* workers/Worker.cpp:
(WebCore::Worker::create): Use ExceptionOr.
(WebCore::Worker::postMessage): Ditto.
* workers/Worker.h: Updated for above changes.
* workers/Worker.idl: Use non-legacy exception.

* workers/WorkerGlobalScope.cpp:
(WebCore::WorkerGlobalScope::WorkerGlobalScope): Moved initialization
of m_closing to class definition.
(WebCore::WorkerGlobalScope::~WorkerGlobalScope): Removed call to
deleted notifyObserversOfStop function.
(WebCore::WorkerGlobalScope::importScripts): Use ExceptionOr. Also use
reserveInitialCapacity and uncheckedAppend to build a vector.
(WebCore::WorkerGlobalScope::addConsoleMessage): Use an rvalue reference.
Also moved the body of one of the addMessageToWorkerConsole overloads into
one of the overloads of this function, and changed the other to call addMessage.
(WebCore::WorkerGlobalScope::addMessage): Moved the body of the other
addMessageToWorkerConsole here.
(WebCore::WorkerGlobalScope::addMessageToWorkerConsole): Deleted.
(WebCore::WorkerGlobalScope::Observer::Observer): Deleted.
(WebCore::WorkerGlobalScope::Observer::~Observer): Deleted.
(WebCore::WorkerGlobalScope::Observer::stopObserving): Deleted.
(WebCore::WorkerGlobalScope::registerObserver): Deleted.
(WebCore::WorkerGlobalScope::unregisterObserver): Deleted.
(WebCore::WorkerGlobalScope::notifyObserversOfStop): Deleted.
* workers/WorkerGlobalScope.h: Removed unneeded includes. Moved many virtual
function overrides into the private section. Marked many functions final instead
of just override. Removed unused Observer class and m_workerObservers set.

* workers/WorkerThread.cpp:
(WebCore::WorkerThread::stop): Removed call to deleted
WorkerGlobalScope::notifyObserversOfStop function.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchWorkerGlobalScopeFetchcpp">trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesnotificationsNotificationcpp">trunk/Source/WebCore/Modules/notifications/Notification.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDOMWindowWebDatabasecpp">trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDedicatedWorkerGlobalScopeCustomcpp">trunk/Source/WebCore/bindings/js/JSDedicatedWorkerGlobalScopeCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMessagePortCustomcpp">trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMessagePortCustomh">trunk/Source/WebCore/bindings/js/JSMessagePortCustom.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWorkerCustomcpp">trunk/Source/WebCore/bindings/js/JSWorkerCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWorkerGlobalScopeCustomcpp">trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp</a></li>
<li><a href="#trunkSourceWebCoredomMessagePortcpp">trunk/Source/WebCore/dom/MessagePort.cpp</a></li>
<li><a href="#trunkSourceWebCoredomMessagePorth">trunk/Source/WebCore/dom/MessagePort.h</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReadercpp">trunk/Source/WebCore/fileapi/FileReader.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderh">trunk/Source/WebCore/fileapi/FileReader.h</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderidl">trunk/Source/WebCore/fileapi/FileReader.idl</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderSynccpp">trunk/Source/WebCore/fileapi/FileReaderSync.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderSynch">trunk/Source/WebCore/fileapi/FileReaderSync.h</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderSyncidl">trunk/Source/WebCore/fileapi/FileReaderSync.idl</a></li>
<li><a href="#trunkSourceWebCorepageBase64Utilitiescpp">trunk/Source/WebCore/page/Base64Utilities.cpp</a></li>
<li><a href="#trunkSourceWebCorepageBase64Utilitiesh">trunk/Source/WebCore/page/Base64Utilities.h</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.cpp</a></li>
<li><a href="#trunkSourceWebCorepageNavigatorcpp">trunk/Source/WebCore/page/Navigator.cpp</a></li>
<li><a href="#trunkSourceWebCorepageNavigatorh">trunk/Source/WebCore/page/Navigator.h</a></li>
<li><a href="#trunkSourceWebCorepageNavigatorBaseh">trunk/Source/WebCore/page/NavigatorBase.h</a></li>
<li><a href="#trunkSourceWebCorepageWindowOrWorkerGlobalScopeidl">trunk/Source/WebCore/page/WindowOrWorkerGlobalScope.idl</a></li>
<li><a href="#trunkSourceWebCorepageWorkerNavigatorcpp">trunk/Source/WebCore/page/WorkerNavigator.cpp</a></li>
<li><a href="#trunkSourceWebCorepageWorkerNavigatorh">trunk/Source/WebCore/page/WorkerNavigator.h</a></li>
<li><a href="#trunkSourceWebCoreworkersAbstractWorkercpp">trunk/Source/WebCore/workers/AbstractWorker.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersAbstractWorkerh">trunk/Source/WebCore/workers/AbstractWorker.h</a></li>
<li><a href="#trunkSourceWebCoreworkersDedicatedWorkerGlobalScopecpp">trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersDedicatedWorkerGlobalScopeh">trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h</a></li>
<li><a href="#trunkSourceWebCoreworkersDedicatedWorkerGlobalScopeidl">trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.idl</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkercpp">trunk/Source/WebCore/workers/Worker.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerh">trunk/Source/WebCore/workers/Worker.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkeridl">trunk/Source/WebCore/workers/Worker.idl</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerGlobalScopecpp">trunk/Source/WebCore/workers/WorkerGlobalScope.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerGlobalScopeh">trunk/Source/WebCore/workers/WorkerGlobalScope.h</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerThreadcpp">trunk/Source/WebCore/workers/WorkerThread.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/ChangeLog        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -1,3 +1,162 @@
</span><ins>+2016-10-21  Darin Adler  &lt;darin@apple.com&gt;
+
+        Move some more assorted classes from ExceptionCode to Exception
+        https://bugs.webkit.org/show_bug.cgi?id=163775
+
+        Reviewed by Chris Dumez.
+
+        * Modules/fetch/WorkerGlobalScopeFetch.cpp:
+        (WebCore::WorkerGlobalScopeFetch::fetch): Remove unnecessary calls to
+        WorkerGlobalScope::scriptExcutionObject, which just returns the scope itself.
+
+        * Modules/notifications/Notification.cpp: Added now-needed include.
+        * Modules/webdatabase/DOMWindowWebDatabase.cpp: Ditto.
+
+        * WebCore.xcodeproj/project.pbxproj: Added WindowOrWorkerGlobalScope.idl.
+
+        * bindings/js/JSDedicatedWorkerGlobalScopeCustom.cpp:
+        (WebCore::JSDedicatedWorkerGlobalScope::postMessage): Pass a reference instead
+        of a pointer to handlePostMessage.
+        * bindings/js/JSMessagePortCustom.cpp:
+        (WebCore::JSMessagePort::postMessage): Ditto.
+
+        * bindings/js/JSMessagePortCustom.h: Use pragma once. Change handlePostMessage
+        to take a reference to the object instead of a pointer, and also to use
+        propagateException since postMessage now uses ExceptionOr.
+
+        * bindings/js/JSWorkerCustom.cpp:
+        (WebCore::JSWorker::postMessage): Pass a reference instead of a pointer to
+        handlePostMessage.
+        (WebCore::constructJSWorker): Use the version of toJSNewlyCreated that handles
+        propagating an exception from ExceptionOr.
+
+        * bindings/js/JSWorkerGlobalScopeCustom.cpp:
+        (WebCore::JSWorkerGlobalScope::visitAdditionalChildren): Use auto.
+        Remove unnecessary round trip through the scriptExecutionContext function.
+        (WebCore::JSWorkerGlobalScope::importScripts): Use reserveInitialCapacity and
+        uncheckedAppend to build up the vector of strings. Use propagateException
+        to deal with ExceptionOr result.
+
+        * dom/MessagePort.cpp:
+        (WebCore::MessagePort::MessagePort): Initialize boolean data members in the
+        class definition instead of here.
+        (WebCore::MessagePort::postMessage): Use ExceptionOr.
+        (WebCore::MessagePort::entangle): Use an rvalue reference.
+        (WebCore::MessagePort::dispatchMessages): Use ExceptionOr.
+        (WebCore::MessagePort::disentanglePorts): Ditto. Also use a more efficient
+        idiom that does half as much hashing as the old algorithm, and got rid an
+        unneeded local variable.
+        (WebCore::MessagePort::entanglePorts): Use an rvalue reference.
+        * dom/MessagePort.h: Updated for above changes.
+
+        * fileapi/FileReader.cpp:
+        (WebCore::FileReader::create): Use auto.
+        (WebCore::FileReader::FileReader): Initialize scalars in the class definition.
+        (WebCore::FileReader::~FileReader): Call cancel on the loader directly
+        instead of sharing code with the stop function.
+        (WebCore::FileReader::stop): Moved the body of the terminate function here.
+        (WebCore::FileReader::readAsArrayBuffer): Use ExceptionOr.
+        (WebCore::FileReader::readAsBinaryString): Ditto.
+        (WebCore::FileReader::readAsText): Ditto.
+        (WebCore::FileReader::readAsDataURL): Ditto.
+        (WebCore::FileReader::readInternal): Ditto. Also add a cast now that
+        we derive privately from FileReaderLoaderClient.
+        (WebCore::FileReader::abort): Call stop instead of terminate.
+        (WebCore::FileReader::terminate): Deleted. Moved code into stop.
+        (WebCore::FileReader::didReceiveData): Moved comment to where the constant is.
+        * fileapi/FileReader.h: Updated for above changes. Made more functions private
+        and used final instead of override.
+        * fileapi/FileReader.idl: Use non-legacy exceptions.
+
+        * fileapi/FileReaderSync.cpp:
+        (WebCore::FileReaderSync::readAsArrayBuffer): Use ExceptionOr.
+        (WebCore::FileReaderSync::readAsBinaryString): Ditto.
+        (WebCore::FileReaderSync::readAsText): Ditto.
+        (WebCore::FileReaderSync::readAsDataURL): Ditto.
+        (WebCore::FileReaderSync::startLoading): Ditto.
+        (WebCore::FileReaderSync::startLoadingString): Added. Helper to cut down on
+        repeated code in functions above.
+        * fileapi/FileReaderSync.h: Updated for above changes.
+        * fileapi/FileReaderSync.idl: Use non-legacy exceptions.
+
+        * page/Base64Utilities.cpp:
+        (WebCore::Base64Utilities::btoa): Use ExceptionOr.
+        (WebCore::Base64Utilities::atob): Ditto.
+        * page/Base64Utilities.h: Updated for above changes.
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::navigator): Pass a reference to the frame.
+        (WebCore::DOMWindow::postMessage): Use ExceptionOr when calling
+        MessagePort::disentanglePorts. Also udpated for changes to the
+        PostMessageTimer.
+
+        * page/Navigator.cpp:
+        (WebCore::Navigator::Navigator): Take a reference.
+        (WebCore::shouldHideFourDot): Ditto
+        (WebCore::Navigator::appVersion): Pass a reference.
+        (WebCore::Navigator::plugins): Return a reference.
+        (WebCore::Navigator::mimeTypes): Ditto.
+        * page/Navigator.h: Updated for above changes. Also marked the
+        class final and moved derivation from RefCounted to NavigatorBase.
+
+        * page/NavigatorBase.h: Addded derivation from RefCounted since
+        both derived classes want that, and the destructor is already virtual.
+
+        * page/WindowOrWorkerGlobalScope.idl: Use non-legacy exceptions.
+
+        * page/WorkerNavigator.cpp:
+        (WebCore::WorkerNavigator::~WorkerNavigator): Deleted.
+
+        * page/WorkerNavigator.h: Moved derivation from RefCounted to
+        NavigatorBase. Also marked class final.
+
+        * workers/AbstractWorker.cpp:
+        (WebCore::AbstractWorker::resolveURL): Use ExceptionOr.
+        * workers/AbstractWorker.h: Updated for above changes.
+
+        * workers/DedicatedWorkerGlobalScope.cpp:
+        (WebCore::DedicatedWorkerGlobalScope::create): Use RefPtr&amp;&amp;
+        instead of PassRefPtr.
+        (WebCore::DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope):
+        Ditto.
+        (WebCore::DedicatedWorkerGlobalScope::postMessage): Use ExceptionOr.
+        (WebCore::DedicatedWorkerGlobalScope::importScripts): Ditto.
+        * workers/DedicatedWorkerGlobalScope.h: Updated for above changes.
+        * workers/DedicatedWorkerGlobalScope.idl: Use non-legacy exceptions.
+
+        * workers/Worker.cpp:
+        (WebCore::Worker::create): Use ExceptionOr.
+        (WebCore::Worker::postMessage): Ditto.
+        * workers/Worker.h: Updated for above changes.
+        * workers/Worker.idl: Use non-legacy exception.
+
+        * workers/WorkerGlobalScope.cpp:
+        (WebCore::WorkerGlobalScope::WorkerGlobalScope): Moved initialization
+        of m_closing to class definition.
+        (WebCore::WorkerGlobalScope::~WorkerGlobalScope): Removed call to
+        deleted notifyObserversOfStop function.
+        (WebCore::WorkerGlobalScope::importScripts): Use ExceptionOr. Also use
+        reserveInitialCapacity and uncheckedAppend to build a vector.
+        (WebCore::WorkerGlobalScope::addConsoleMessage): Use an rvalue reference.
+        Also moved the body of one of the addMessageToWorkerConsole overloads into
+        one of the overloads of this function, and changed the other to call addMessage.
+        (WebCore::WorkerGlobalScope::addMessage): Moved the body of the other
+        addMessageToWorkerConsole here.
+        (WebCore::WorkerGlobalScope::addMessageToWorkerConsole): Deleted.
+        (WebCore::WorkerGlobalScope::Observer::Observer): Deleted.
+        (WebCore::WorkerGlobalScope::Observer::~Observer): Deleted.
+        (WebCore::WorkerGlobalScope::Observer::stopObserving): Deleted.
+        (WebCore::WorkerGlobalScope::registerObserver): Deleted.
+        (WebCore::WorkerGlobalScope::unregisterObserver): Deleted.
+        (WebCore::WorkerGlobalScope::notifyObserversOfStop): Deleted.
+        * workers/WorkerGlobalScope.h: Removed unneeded includes. Moved many virtual
+        function overrides into the private section. Marked many functions final instead
+        of just override. Removed unused Observer class and m_workerObservers set.
+
+        * workers/WorkerThread.cpp:
+        (WebCore::WorkerThread::stop): Removed call to deleted
+        WorkerGlobalScope::notifyObserversOfStop function.
+
</ins><span class="cx"> 2016-10-21  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Tighten ComputedStyleExtractor to use Element instead of Node
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchWorkerGlobalScopeFetchcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -38,9 +38,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WorkerGlobalScopeFetch::fetch(WorkerGlobalScope&amp; scope, FetchRequest&amp; request, Ref&lt;DeferredPromise&gt;&amp;&amp; promise)
</span><span class="cx"> {
</span><del>-    if (!scope.scriptExecutionContext())
-        return;
-    FetchResponse::fetch(*scope.scriptExecutionContext(), request, WTFMove(promise));
</del><ins>+    FetchResponse::fetch(scope, request, WTFMove(promise));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesnotificationsNotificationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/notifications/Notification.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/notifications/Notification.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/Modules/notifications/Notification.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;Event.h&quot;
</span><span class="cx"> #include &quot;EventNames.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;NotificationCenter.h&quot;
</span><span class="cx"> #include &quot;NotificationController.h&quot;
</span><span class="cx"> #include &quot;NotificationPermissionCallback.h&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDOMWindowWebDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;Database.h&quot;
</span><span class="cx"> #include &quot;DatabaseManager.h&quot;
</span><span class="cx"> #include &quot;Document.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -10643,6 +10643,7 @@
</span><span class="cx">                 9362640A0DE1137D009D5A00 /* CSSReflectionDirection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSReflectionDirection.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 936DD03A09CEAC270056AE8C /* Range.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Range.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 9370918C1416D86B00477333 /* textAreaResizeCorner@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = &quot;textAreaResizeCorner@2x.png&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                9371080D1DB754550060744E /* WindowOrWorkerGlobalScope.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WindowOrWorkerGlobalScope.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 9377AB9F15DEFEEF0031FD04 /* Pagination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pagination.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 937F4CCB1A2D48C100BB39F5 /* QuickLookMacSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuickLookMacSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 937F4CCD1A2D4B0100BB39F5 /* NSMenuSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSMenuSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -17663,6 +17664,7 @@
</span><span class="cx">                                 BC8243E70D0CFD7500460C8F /* WindowFeatures.h */,
</span><span class="cx">                                 7E99AF520B13846468FB01A5 /* WindowFocusAllowedIndicator.cpp */,
</span><span class="cx">                                 7E99AF540B13846468FB01A5 /* WindowFocusAllowedIndicator.h */,
</span><ins>+                                9371080D1DB754550060744E /* WindowOrWorkerGlobalScope.idl */,
</ins><span class="cx">                                 E1271A130EEEC80400F61213 /* WorkerNavigator.cpp */,
</span><span class="cx">                                 E1271A0A0EEEC77A00F61213 /* WorkerNavigator.h */,
</span><span class="cx">                                 E1271A510EEECD1C00F61213 /* WorkerNavigator.idl */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDedicatedWorkerGlobalScopeCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDedicatedWorkerGlobalScopeCustom.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDedicatedWorkerGlobalScopeCustom.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/bindings/js/JSDedicatedWorkerGlobalScopeCustom.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> 
</span><span class="cx"> JSC::JSValue JSDedicatedWorkerGlobalScope::postMessage(JSC::ExecState&amp; state)
</span><span class="cx"> {
</span><del>-    return handlePostMessage(state, &amp;wrapped());
</del><ins>+    return handlePostMessage(state, wrapped());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMessagePortCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/bindings/js/JSMessagePortCustom.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx"> 
</span><span class="cx"> JSC::JSValue JSMessagePort::postMessage(JSC::ExecState&amp; state)
</span><span class="cx"> {
</span><del>-    return handlePostMessage(state, &amp;wrapped());
</del><ins>+    return handlePostMessage(state, wrapped());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void extractTransferables(JSC::ExecState&amp; state, JSC::JSValue value, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp; portArray, Vector&lt;RefPtr&lt;JSC::ArrayBuffer&gt;&gt;&amp; arrayBuffers)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMessagePortCustomh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMessagePortCustom.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMessagePortCustom.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/bindings/js/JSMessagePortCustom.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -29,8 +29,7 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef JSMessagePortCustom_h
-#define JSMessagePortCustom_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;MessagePort.h&quot;
</span><span class="cx"> #include &lt;runtime/Error.h&gt;
</span><span class="lines">@@ -40,33 +39,26 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-    typedef int ExceptionCode;
</del><ins>+void extractTransferables(JSC::ExecState&amp;, JSC::JSValue, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;, Vector&lt;RefPtr&lt;JSC::ArrayBuffer&gt;&gt;&amp;);
</ins><span class="cx"> 
</span><del>-    void extractTransferables(JSC::ExecState&amp;, JSC::JSValue, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;, Vector&lt;RefPtr&lt;JSC::ArrayBuffer&gt;&gt;&amp;);
</del><ins>+// Helper function to convert from JS postMessage arguments to WebCore postMessage arguments.
+template&lt;typename T&gt; inline JSC::JSValue handlePostMessage(JSC::ExecState&amp; state, T&amp; object)
+{
+    JSC::VM&amp; vm = state.vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
</ins><span class="cx"> 
</span><del>-    // Helper function to convert from JS postMessage arguments to WebCore postMessage arguments.
-    template &lt;typename T&gt;
-    inline JSC::JSValue handlePostMessage(JSC::ExecState&amp; state, T* impl)
-    {
-        JSC::VM&amp; vm = state.vm();
-        auto scope = DECLARE_THROW_SCOPE(vm);
</del><ins>+    if (UNLIKELY(state.argumentCount() &lt; 1))
+        return throwException(&amp;state, scope, createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx"> 
</span><del>-        if (UNLIKELY(state.argumentCount() &lt; 1))
-            return throwException(&amp;state, scope, createNotEnoughArgumentsError(&amp;state));
</del><ins>+    Vector&lt;RefPtr&lt;MessagePort&gt;&gt; messagePortArray;
+    Vector&lt;RefPtr&lt;JSC::ArrayBuffer&gt;&gt; arrayBufferArray;
+    extractTransferables(state, state.argument(1), messagePortArray, arrayBufferArray);
</ins><span class="cx"> 
</span><del>-        
-        Vector&lt;RefPtr&lt;MessagePort&gt;&gt; messagePortArray;
-        Vector&lt;RefPtr&lt;JSC::ArrayBuffer&gt;&gt; arrayBufferArray;
-        extractTransferables(state, state.argument(1), messagePortArray, arrayBufferArray);
-        
-        auto message = SerializedScriptValue::create(state, state.uncheckedArgument(0), messagePortArray, WTFMove(arrayBufferArray));
-        RETURN_IF_EXCEPTION(scope, JSC::JSValue());
</del><ins>+    auto message = SerializedScriptValue::create(state, state.uncheckedArgument(0), messagePortArray, WTFMove(arrayBufferArray));
+    RETURN_IF_EXCEPTION(scope, JSC::JSValue());
</ins><span class="cx"> 
</span><del>-        ExceptionCode ec = 0;
-        impl-&gt;postMessage(WTFMove(message), WTFMove(messagePortArray), ec);
-        setDOMException(&amp;state, ec);
-        return JSC::jsUndefined();
-    }
</del><ins>+    propagateException(state, scope, object.postMessage(WTFMove(message), WTFMove(messagePortArray)));
+    return JSC::jsUndefined();
+}
</ins><span class="cx"> 
</span><span class="cx"> }
</span><del>-#endif // JSMessagePortCustom_h
</del></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWorkerCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWorkerCustom.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWorkerCustom.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/bindings/js/JSWorkerCustom.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><del>-
</del><span class="cx"> #include &quot;JSWorker.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="lines">@@ -42,34 +41,29 @@
</span><span class="cx"> 
</span><span class="cx"> JSC::JSValue JSWorker::postMessage(JSC::ExecState&amp; state)
</span><span class="cx"> {
</span><del>-    return handlePostMessage(state, &amp;wrapped());
</del><ins>+    return handlePostMessage(state, wrapped());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue JSC_HOST_CALL constructJSWorker(ExecState&amp; exec)
</del><ins>+EncodedJSValue JSC_HOST_CALL constructJSWorker(ExecState&amp; state)
</ins><span class="cx"> {
</span><del>-    VM&amp; vm = exec.vm();
</del><ins>+    VM&amp; vm = state.vm();
</ins><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><del>-    DOMConstructorObject* jsConstructor = jsCast&lt;DOMConstructorObject*&gt;(exec.callee());
</del><ins>+    ASSERT(jsCast&lt;DOMConstructorObject*&gt;(state.callee()));
+    ASSERT(jsCast&lt;DOMConstructorObject*&gt;(state.callee())-&gt;globalObject());
+    auto&amp; globalObject = *jsCast&lt;DOMConstructorObject*&gt;(state.callee())-&gt;globalObject();
</ins><span class="cx"> 
</span><del>-    if (!exec.argumentCount())
-        return throwVMError(&amp;exec, scope, createNotEnoughArgumentsError(&amp;exec));
</del><ins>+    if (!state.argumentCount())
+        return throwVMError(&amp;state, scope, createNotEnoughArgumentsError(&amp;state));
</ins><span class="cx"> 
</span><del>-    String scriptURL = exec.uncheckedArgument(0).toWTFString(&amp;exec);
</del><ins>+    String scriptURL = state.uncheckedArgument(0).toWTFString(&amp;state);
</ins><span class="cx">     RETURN_IF_EXCEPTION(scope, encodedJSValue());
</span><span class="cx"> 
</span><span class="cx">     // See section 4.8.2 step 14 of WebWorkers for why this is the lexicalGlobalObject.
</span><del>-    DOMWindow&amp; window = asJSDOMWindow(exec.lexicalGlobalObject())-&gt;wrapped();
</del><ins>+    auto&amp; window = asJSDOMWindow(state.lexicalGlobalObject())-&gt;wrapped();
</ins><span class="cx"> 
</span><del>-    ExceptionCode ec = 0;
</del><span class="cx">     ASSERT(window.document());
</span><del>-    RefPtr&lt;Worker&gt; worker = Worker::create(*window.document(), scriptURL, ec);
-    if (ec) {
-        setDOMException(&amp;exec, ec);
-        return JSValue::encode(JSValue());
-    }
-
-    return JSValue::encode(toJSNewlyCreated(&amp;exec, jsConstructor-&gt;globalObject(), WTFMove(worker)));
</del><ins>+    return JSValue::encode(toJSNewlyCreated(state, globalObject, scope, Worker::create(*window.document(), scriptURL)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWorkerGlobalScopeCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -52,11 +52,12 @@
</span><span class="cx"> 
</span><span class="cx"> void JSWorkerGlobalScope::visitAdditionalChildren(SlotVisitor&amp; visitor)
</span><span class="cx"> {
</span><del>-    if (WorkerLocation* location = wrapped().optionalLocation())
</del><ins>+    if (auto* location = wrapped().optionalLocation())
</ins><span class="cx">         visitor.addOpaqueRoot(location);
</span><del>-    if (WorkerNavigator* navigator = wrapped().optionalNavigator())
</del><ins>+    if (auto* navigator = wrapped().optionalNavigator())
</ins><span class="cx">         visitor.addOpaqueRoot(navigator);
</span><del>-    visitor.addOpaqueRoot(wrapped().scriptExecutionContext());
</del><ins>+    ScriptExecutionContext&amp; context = wrapped();
+    visitor.addOpaqueRoot(&amp;context);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSWorkerGlobalScope::importScripts(ExecState&amp; state)
</span><span class="lines">@@ -68,14 +69,13 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;String&gt; urls;
</span><ins>+    urls.reserveInitialCapacity(state.argumentCount());
</ins><span class="cx">     for (unsigned i = 0; i &lt; state.argumentCount(); ++i) {
</span><del>-        urls.append(valueToUSVString(&amp;state, state.uncheckedArgument(i)));
</del><ins>+        urls.uncheckedAppend(valueToUSVString(&amp;state, state.uncheckedArgument(i)));
</ins><span class="cx">         RETURN_IF_EXCEPTION(scope, JSValue());
</span><span class="cx">     }
</span><del>-    ExceptionCode ec = 0;
</del><span class="cx"> 
</span><del>-    wrapped().importScripts(urls, ec);
-    setDOMException(&amp;state, ec);
</del><ins>+    propagateException(state, scope, wrapped().importScripts(urls));
</ins><span class="cx">     return jsUndefined();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomMessagePortcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MessagePort.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MessagePort.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/dom/MessagePort.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -37,9 +37,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> MessagePort::MessagePort(ScriptExecutionContext&amp; scriptExecutionContext)
</span><del>-    : m_started(false)
-    , m_closed(false)
-    , m_scriptExecutionContext(&amp;scriptExecutionContext)
</del><ins>+    : m_scriptExecutionContext(&amp;scriptExecutionContext)
</ins><span class="cx"> {
</span><span class="cx">     m_scriptExecutionContext-&gt;createdMessagePort(*this);
</span><span class="cx"> 
</span><span class="lines">@@ -53,10 +51,10 @@
</span><span class="cx">         m_scriptExecutionContext-&gt;destroyedMessagePort(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MessagePort::postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; MessagePort::postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports)
</ins><span class="cx"> {
</span><span class="cx">     if (!isEntangled())
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx">     ASSERT(m_scriptExecutionContext);
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;MessagePortChannelArray&gt; channels;
</span><span class="lines">@@ -63,16 +61,16 @@
</span><span class="cx">     // Make sure we aren't connected to any of the passed-in ports.
</span><span class="cx">     if (!ports.isEmpty()) {
</span><span class="cx">         for (auto&amp; dataPort : ports) {
</span><del>-            if (dataPort == this || m_entangledChannel-&gt;isConnectedTo(dataPort.get())) {
-                ec = DATA_CLONE_ERR;
-                return;
-            }
</del><ins>+            if (dataPort == this || m_entangledChannel-&gt;isConnectedTo(dataPort.get()))
+                return Exception { DATA_CLONE_ERR };
</ins><span class="cx">         }
</span><del>-        channels = MessagePort::disentanglePorts(WTFMove(ports), ec);
-        if (ec)
-            return;
</del><ins>+        auto disentangleResult = MessagePort::disentanglePorts(WTFMove(ports));
+        if (disentangleResult.hasException())
+            return disentangleResult.releaseException();
+        channels = disentangleResult.releaseReturnValue();
</ins><span class="cx">     }
</span><span class="cx">     m_entangledChannel-&gt;postMessageToRemote(WTFMove(message), WTFMove(channels));
</span><ins>+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;MessagePortChannel&gt; MessagePort::disentangle()
</span><span class="lines">@@ -118,7 +116,7 @@
</span><span class="cx">     m_closed = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MessagePort::entangle(std::unique_ptr&lt;MessagePortChannel&gt; remote)
</del><ins>+void MessagePort::entangle(std::unique_ptr&lt;MessagePortChannel&gt;&amp;&amp; remote)
</ins><span class="cx"> {
</span><span class="cx">     // Only invoked to set our initial entanglement.
</span><span class="cx">     ASSERT(!m_entangledChannel);
</span><span class="lines">@@ -152,9 +150,8 @@
</span><span class="cx">         if (is&lt;WorkerGlobalScope&gt;(*m_scriptExecutionContext) &amp;&amp; downcast&lt;WorkerGlobalScope&gt;(*m_scriptExecutionContext).isClosing())
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        Vector&lt;RefPtr&lt;MessagePort&gt;&gt; ports = MessagePort::entanglePorts(*m_scriptExecutionContext, WTFMove(channels));
-        Ref&lt;Event&gt; event = MessageEvent::create(WTFMove(ports), WTFMove(message));
-        dispatchEvent(event);
</del><ins>+        auto ports = MessagePort::entanglePorts(*m_scriptExecutionContext, WTFMove(channels));
+        dispatchEvent(MessageEvent::create(WTFMove(ports), WTFMove(message)));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -174,33 +171,26 @@
</span><span class="cx">     return m_entangledChannel ? m_entangledChannel-&gt;locallyEntangledPort(m_scriptExecutionContext) : nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;MessagePortChannelArray&gt; MessagePort::disentanglePorts(Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;std::unique_ptr&lt;MessagePortChannelArray&gt;&gt; MessagePort::disentanglePorts(Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports)
</ins><span class="cx"> {
</span><span class="cx">     if (ports.isEmpty())
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><del>-    // HashSet used to efficiently check for duplicates in the passed-in array.
</del><ins>+    // Walk the incoming array - if there are any duplicate ports, or null ports or cloned ports, throw an error (per section 8.3.3 of the HTML5 spec).
</ins><span class="cx">     HashSet&lt;MessagePort*&gt; portSet;
</span><del>-
-    // Walk the incoming array - if there are any duplicate ports, or null ports or cloned ports, throw an error (per section 8.3.3 of the HTML5 spec).
</del><span class="cx">     for (auto&amp; port : ports) {
</span><del>-        if (!port || port-&gt;isNeutered() || portSet.contains(port.get())) {
-            ec = DATA_CLONE_ERR;
-            return nullptr;
-        }
-        portSet.add(port.get());
</del><ins>+        if (!port || port-&gt;isNeutered() || !portSet.add(port.get()).isNewEntry)
+            return Exception { DATA_CLONE_ERR };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Passed-in ports passed validity checks, so we can disentangle them.
</span><span class="cx">     auto portArray = std::make_unique&lt;MessagePortChannelArray&gt;(ports.size());
</span><del>-    for (unsigned int i = 0 ; i &lt; ports.size() ; ++i) {
-        std::unique_ptr&lt;MessagePortChannel&gt; channel = ports[i]-&gt;disentangle();
-        (*portArray)[i] = WTFMove(channel);
-    }
-    return portArray;
</del><ins>+    for (unsigned i = 0 ; i &lt; ports.size(); ++i)
+        (*portArray)[i] = ports[i]-&gt;disentangle();
+    return WTFMove(portArray);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Vector&lt;RefPtr&lt;MessagePort&gt;&gt; MessagePort::entanglePorts(ScriptExecutionContext&amp; context, std::unique_ptr&lt;MessagePortChannelArray&gt; channels)
</del><ins>+Vector&lt;RefPtr&lt;MessagePort&gt;&gt; MessagePort::entanglePorts(ScriptExecutionContext&amp; context, std::unique_ptr&lt;MessagePortChannelArray&gt;&amp;&amp; channels)
</ins><span class="cx"> {
</span><span class="cx">     if (!channels || !channels-&gt;size())
</span><span class="cx">         return { };
</span></span></pre></div>
<a id="trunkSourceWebCoredomMessagePorth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/MessagePort.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/MessagePort.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/dom/MessagePort.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -24,85 +24,75 @@
</span><span class="cx">  *
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef MessagePort_h
-#define MessagePort_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><del>-#include &quot;EventListener.h&quot;
</del><span class="cx"> #include &quot;EventTarget.h&quot;
</span><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;MessagePortChannel.h&quot;
</span><del>-#include &lt;memory&gt;
-#include &lt;wtf/Forward.h&gt;
-#include &lt;wtf/RefPtr.h&gt;
-#include &lt;wtf/Vector.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-    class Event;
-    class Frame;
-    class MessagePort;
-    class ScriptExecutionContext;
</del><ins>+class Frame;
</ins><span class="cx"> 
</span><del>-    class MessagePort final : public RefCounted&lt;MessagePort&gt;, public EventTargetWithInlineData {
-    public:
-        static Ref&lt;MessagePort&gt; create(ScriptExecutionContext&amp; scriptExecutionContext) { return adoptRef(*new MessagePort(scriptExecutionContext)); }
-        virtual ~MessagePort();
</del><ins>+class MessagePort final : public RefCounted&lt;MessagePort&gt;, public EventTargetWithInlineData {
+public:
+    static Ref&lt;MessagePort&gt; create(ScriptExecutionContext&amp; scriptExecutionContext) { return adoptRef(*new MessagePort(scriptExecutionContext)); }
+    virtual ~MessagePort();
</ins><span class="cx"> 
</span><del>-        void postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    ExceptionOr&lt;void&gt; postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-        void start();
-        void close();
</del><ins>+    void start();
+    void close();
</ins><span class="cx"> 
</span><del>-        void entangle(std::unique_ptr&lt;MessagePortChannel&gt;);
-        std::unique_ptr&lt;MessagePortChannel&gt; disentangle();
</del><ins>+    void entangle(std::unique_ptr&lt;MessagePortChannel&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-        // Returns 0 if there is an exception, or if the passed-in array is 0/empty.
-        static std::unique_ptr&lt;MessagePortChannelArray&gt; disentanglePorts(Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    // Returns nullptr if the passed-in vector is empty.
+    static ExceptionOr&lt;std::unique_ptr&lt;MessagePortChannelArray&gt;&gt; disentanglePorts(Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-        static Vector&lt;RefPtr&lt;MessagePort&gt;&gt; entanglePorts(ScriptExecutionContext&amp;, std::unique_ptr&lt;MessagePortChannelArray&gt;);
</del><ins>+    static Vector&lt;RefPtr&lt;MessagePort&gt;&gt; entanglePorts(ScriptExecutionContext&amp;, std::unique_ptr&lt;MessagePortChannelArray&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-        void messageAvailable();
-        bool started() const { return m_started; }
</del><ins>+    void messageAvailable();
+    bool started() const { return m_started; }
</ins><span class="cx"> 
</span><del>-        void contextDestroyed();
</del><ins>+    void contextDestroyed();
</ins><span class="cx"> 
</span><del>-        EventTargetInterface eventTargetInterface() const override { return MessagePortEventTargetInterfaceType; }
-        ScriptExecutionContext* scriptExecutionContext() const override { return m_scriptExecutionContext; }
</del><ins>+    ScriptExecutionContext* scriptExecutionContext() const final { return m_scriptExecutionContext; }
</ins><span class="cx"> 
</span><del>-        void dispatchMessages();
</del><ins>+    void dispatchMessages();
</ins><span class="cx"> 
</span><del>-        using RefCounted&lt;MessagePort&gt;::ref;
-        using RefCounted&lt;MessagePort&gt;::deref;
</del><ins>+    bool hasPendingActivity();
</ins><span class="cx"> 
</span><del>-        bool hasPendingActivity();
</del><ins>+    // Returns null if there is no entangled port, or if the entangled port is run by a different thread.
+    // This is used solely to enable a GC optimization. Some platforms may not be able to determine ownership
+    // of the remote port (since it may live cross-process) - those platforms may always return null.
+    MessagePort* locallyEntangledPort();
</ins><span class="cx"> 
</span><del>-        // Returns null if there is no entangled port, or if the entangled port is run by a different thread.
-        // This is used solely to enable a GC optimization. Some platforms may not be able to determine ownership
-        // of the remote port (since it may live cross-process) - those platforms may always return null.
-        MessagePort* locallyEntangledPort();
</del><ins>+    using RefCounted::ref;
+    using RefCounted::deref;
</ins><span class="cx"> 
</span><del>-        // A port starts out its life entangled, and remains entangled until it is closed or is cloned.
-        bool isEntangled() { return !m_closed &amp;&amp; !isNeutered(); }
</del><ins>+private:
+    explicit MessagePort(ScriptExecutionContext&amp;);
</ins><span class="cx"> 
</span><del>-        // A port gets neutered when it is transferred to a new owner via postMessage().
-        bool isNeutered() { return !m_entangledChannel; }
</del><ins>+    void refEventTarget() final { ref(); }
+    void derefEventTarget() final { deref(); }
</ins><span class="cx"> 
</span><del>-        bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) override;
</del><ins>+    bool isMessagePort() const final { return true; }
+    EventTargetInterface eventTargetInterface() const final { return MessagePortEventTargetInterfaceType; }
</ins><span class="cx"> 
</span><del>-    private:
-        explicit MessagePort(ScriptExecutionContext&amp;);
</del><ins>+    bool addEventListener(const AtomicString&amp; eventType, Ref&lt;EventListener&gt;&amp;&amp;, const AddEventListenerOptions&amp;) final;
</ins><span class="cx"> 
</span><del>-        void refEventTarget() override { ref(); }
-        void derefEventTarget() override { deref(); }
-        bool isMessagePort() const override { return true; }
</del><ins>+    std::unique_ptr&lt;MessagePortChannel&gt; disentangle();
</ins><span class="cx"> 
</span><del>-        std::unique_ptr&lt;MessagePortChannel&gt; m_entangledChannel;
</del><ins>+    // A port starts out its life entangled, and remains entangled until it is closed or is cloned.
+    bool isEntangled() const { return !m_closed &amp;&amp; !isNeutered(); }
</ins><span class="cx"> 
</span><del>-        bool m_started;
-        bool m_closed;
</del><ins>+    // A port gets neutered when it is transferred to a new owner via postMessage().
+    bool isNeutered() const { return !m_entangledChannel; }
</ins><span class="cx"> 
</span><del>-        ScriptExecutionContext* m_scriptExecutionContext;
-    };
</del><ins>+    std::unique_ptr&lt;MessagePortChannel&gt; m_entangledChannel;
+    bool m_started { false };
+    bool m_closed { false };
+    ScriptExecutionContext* m_scriptExecutionContext;
+};
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // MessagePort_h
</del></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReader.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReader.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/fileapi/FileReader.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -43,11 +43,12 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+// Fire the progress event at least every 50ms.
</ins><span class="cx"> static const auto progressNotificationInterval = 50ms;
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;FileReader&gt; FileReader::create(ScriptExecutionContext&amp; context)
</span><span class="cx"> {
</span><del>-    Ref&lt;FileReader&gt; fileReader = adoptRef(*new FileReader(context));
</del><ins>+    auto fileReader = adoptRef(*new FileReader(context));
</ins><span class="cx">     fileReader-&gt;suspendIfNeeded();
</span><span class="cx">     return fileReader;
</span><span class="cx"> }
</span><span class="lines">@@ -54,15 +55,13 @@
</span><span class="cx"> 
</span><span class="cx"> FileReader::FileReader(ScriptExecutionContext&amp; context)
</span><span class="cx">     : ActiveDOMObject(&amp;context)
</span><del>-    , m_state(EMPTY)
-    , m_aborting(false)
-    , m_readType(FileReaderLoader::ReadAsBinaryString)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FileReader::~FileReader()
</span><span class="cx"> {
</span><del>-    terminate();
</del><ins>+    if (m_loader)
+        m_loader-&gt;cancel();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool FileReader::canSuspendForDocumentSuspension() const
</span><span class="lines">@@ -78,57 +77,59 @@
</span><span class="cx"> 
</span><span class="cx"> void FileReader::stop()
</span><span class="cx"> {
</span><del>-    terminate();
</del><ins>+    if (m_loader) {
+        m_loader-&gt;cancel();
+        m_loader = nullptr;
+    }
+    m_state = DONE;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReader::readAsArrayBuffer(Blob* blob, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; FileReader::readAsArrayBuffer(Blob* blob)
</ins><span class="cx"> {
</span><span class="cx">     if (!blob)
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><span class="cx">     LOG(FileAPI, &quot;FileReader: reading as array buffer: %s %s\n&quot;, blob-&gt;url().string().utf8().data(), is&lt;File&gt;(*blob) ? downcast&lt;File&gt;(*blob).path().utf8().data() : &quot;&quot;);
</span><span class="cx"> 
</span><del>-    readInternal(*blob, FileReaderLoader::ReadAsArrayBuffer, ec);
</del><ins>+    return readInternal(*blob, FileReaderLoader::ReadAsArrayBuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReader::readAsBinaryString(Blob* blob, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; FileReader::readAsBinaryString(Blob* blob)
</ins><span class="cx"> {
</span><span class="cx">     if (!blob)
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><span class="cx">     LOG(FileAPI, &quot;FileReader: reading as binary: %s %s\n&quot;, blob-&gt;url().string().utf8().data(), is&lt;File&gt;(*blob) ? downcast&lt;File&gt;(*blob).path().utf8().data() : &quot;&quot;);
</span><span class="cx"> 
</span><del>-    readInternal(*blob, FileReaderLoader::ReadAsBinaryString, ec);
</del><ins>+    return readInternal(*blob, FileReaderLoader::ReadAsBinaryString);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReader::readAsText(Blob* blob, const String&amp; encoding, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; FileReader::readAsText(Blob* blob, const String&amp; encoding)
</ins><span class="cx"> {
</span><span class="cx">     if (!blob)
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><span class="cx">     LOG(FileAPI, &quot;FileReader: reading as text: %s %s\n&quot;, blob-&gt;url().string().utf8().data(), is&lt;File&gt;(*blob) ? downcast&lt;File&gt;(*blob).path().utf8().data() : &quot;&quot;);
</span><span class="cx"> 
</span><span class="cx">     m_encoding = encoding;
</span><del>-    readInternal(*blob, FileReaderLoader::ReadAsText, ec);
</del><ins>+    return readInternal(*blob, FileReaderLoader::ReadAsText);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReader::readAsDataURL(Blob* blob, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; FileReader::readAsDataURL(Blob* blob)
</ins><span class="cx"> {
</span><span class="cx">     if (!blob)
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><span class="cx">     LOG(FileAPI, &quot;FileReader: reading as data URL: %s %s\n&quot;, blob-&gt;url().string().utf8().data(), is&lt;File&gt;(*blob) ? downcast&lt;File&gt;(*blob).path().utf8().data() : &quot;&quot;);
</span><span class="cx"> 
</span><del>-    readInternal(*blob, FileReaderLoader::ReadAsDataURL, ec);
</del><ins>+    return readInternal(*blob, FileReaderLoader::ReadAsDataURL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReader::readInternal(Blob&amp; blob, FileReaderLoader::ReadType type, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; FileReader::readInternal(Blob&amp; blob, FileReaderLoader::ReadType type)
</ins><span class="cx"> {
</span><span class="cx">     // If multiple concurrent read methods are called on the same FileReader, INVALID_STATE_ERR should be thrown when the state is LOADING.
</span><del>-    if (m_state == LOADING) {
-        ec = INVALID_STATE_ERR;
-        return;
-    }
</del><ins>+    if (m_state == LOADING)
+        return Exception { INVALID_STATE_ERR };
</ins><span class="cx"> 
</span><span class="cx">     setPendingActivity(this);
</span><span class="cx"> 
</span><span class="lines">@@ -137,10 +138,12 @@
</span><span class="cx">     m_state = LOADING;
</span><span class="cx">     m_error = nullptr;
</span><span class="cx"> 
</span><del>-    m_loader = std::make_unique&lt;FileReaderLoader&gt;(m_readType, this);
</del><ins>+    m_loader = std::make_unique&lt;FileReaderLoader&gt;(m_readType, static_cast&lt;FileReaderLoaderClient*&gt;(this));
</ins><span class="cx">     m_loader-&gt;setEncoding(m_encoding);
</span><span class="cx">     m_loader-&gt;setDataType(m_blob-&gt;type());
</span><span class="cx">     m_loader-&gt;start(scriptExecutionContext(), blob);
</span><ins>+
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FileReader::abort()
</span><span class="lines">@@ -155,7 +158,7 @@
</span><span class="cx">     scriptExecutionContext()-&gt;postTask([this] (ScriptExecutionContext&amp;) {
</span><span class="cx">         ASSERT(m_state != DONE);
</span><span class="cx"> 
</span><del>-        terminate();
</del><ins>+        stop();
</ins><span class="cx">         m_aborting = false;
</span><span class="cx"> 
</span><span class="cx">         m_error = FileError::create(FileError::ABORT_ERR);
</span><span class="lines">@@ -169,15 +172,6 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReader::terminate()
-{
-    if (m_loader) {
-        m_loader-&gt;cancel();
-        m_loader = nullptr;
-    }
-    m_state = DONE;
-}
-
</del><span class="cx"> void FileReader::didStartLoading()
</span><span class="cx"> {
</span><span class="cx">     fireEvent(eventNames().loadstartEvent);
</span><span class="lines">@@ -185,13 +179,11 @@
</span><span class="cx"> 
</span><span class="cx"> void FileReader::didReceiveData()
</span><span class="cx"> {
</span><del>-    // Fire the progress event at least every 50ms.
</del><span class="cx">     auto now = std::chrono::steady_clock::now();
</span><span class="cx">     if (!m_lastProgressNotificationTime.time_since_epoch().count()) {
</span><span class="cx">         m_lastProgressNotificationTime = now;
</span><span class="cx">         return;
</span><span class="cx">     }
</span><del>-
</del><span class="cx">     if (now - m_lastProgressNotificationTime &gt; progressNotificationInterval) {
</span><span class="cx">         fireEvent(eventNames().progressEvent);
</span><span class="cx">         m_lastProgressNotificationTime = now;
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReader.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReader.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/fileapi/FileReader.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -28,18 +28,15 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef FileReader_h
-#define FileReader_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;ActiveDOMObject.h&quot;
</span><span class="cx"> #include &quot;EventTarget.h&quot;
</span><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;FileError.h&quot;
</span><span class="cx"> #include &quot;FileReaderLoader.h&quot;
</span><span class="cx"> #include &quot;FileReaderLoaderClient.h&quot;
</span><span class="cx"> #include &lt;chrono&gt;
</span><del>-#include &lt;wtf/Forward.h&gt;
-#include &lt;wtf/RefCounted.h&gt;
-#include &lt;wtf/text/WTFString.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> class ArrayBuffer;
</span><span class="lines">@@ -50,9 +47,7 @@
</span><span class="cx"> class Blob;
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> 
</span><del>-typedef int ExceptionCode;
-
-class FileReader final : public RefCounted&lt;FileReader&gt;, public ActiveDOMObject, public EventTargetWithInlineData, public FileReaderLoaderClient {
</del><ins>+class FileReader final : public RefCounted&lt;FileReader&gt;, public ActiveDOMObject, public EventTargetWithInlineData, private FileReaderLoaderClient {
</ins><span class="cx"> public:
</span><span class="cx">     static Ref&lt;FileReader&gt; create(ScriptExecutionContext&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -64,10 +59,10 @@
</span><span class="cx">         DONE = 2
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    void readAsArrayBuffer(Blob*, ExceptionCode&amp;);
-    void readAsBinaryString(Blob*, ExceptionCode&amp;);
-    void readAsText(Blob*, const String&amp; encoding, ExceptionCode&amp;);
-    void readAsDataURL(Blob*, ExceptionCode&amp;);
</del><ins>+    ExceptionOr&lt;void&gt; readAsArrayBuffer(Blob*);
+    ExceptionOr&lt;void&gt; readAsBinaryString(Blob*);
+    ExceptionOr&lt;void&gt; readAsText(Blob*, const String&amp; encoding);
+    ExceptionOr&lt;void&gt; readAsDataURL(Blob*);
</ins><span class="cx">     void abort();
</span><span class="cx"> 
</span><span class="cx">     void doAbort();
</span><span class="lines">@@ -78,40 +73,34 @@
</span><span class="cx">     RefPtr&lt;JSC::ArrayBuffer&gt; arrayBufferResult() const;
</span><span class="cx">     String stringResult();
</span><span class="cx"> 
</span><del>-    // EventTarget
-    EventTargetInterface eventTargetInterface() const override { return FileReaderEventTargetInterfaceType; }
-    ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }
</del><ins>+    using RefCounted::ref;
+    using RefCounted::deref;
</ins><span class="cx"> 
</span><del>-    // FileReaderLoaderClient
-    void didStartLoading() override;
-    void didReceiveData() override;
-    void didFinishLoading() override;
-    void didFail(int errorCode) override;
-
-    using RefCounted&lt;FileReader&gt;::ref;
-    using RefCounted&lt;FileReader&gt;::deref;
-
</del><span class="cx"> private:
</span><span class="cx">     explicit FileReader(ScriptExecutionContext&amp;);
</span><span class="cx"> 
</span><del>-    // ActiveDOMObject API.
-    const char* activeDOMObjectName() const override;
-    bool canSuspendForDocumentSuspension() const override;
-    void stop() override;
</del><ins>+    const char* activeDOMObjectName() const final;
+    bool canSuspendForDocumentSuspension() const final;
+    void stop() final;
</ins><span class="cx"> 
</span><del>-    // EventTarget
-    void refEventTarget() override { ref(); }
-    void derefEventTarget() override { deref(); }
</del><ins>+    EventTargetInterface eventTargetInterface() const final { return FileReaderEventTargetInterfaceType; }
+    ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
+    void refEventTarget() final { ref(); }
+    void derefEventTarget() final { deref(); }
</ins><span class="cx"> 
</span><del>-    void terminate();
-    void readInternal(Blob&amp;, FileReaderLoader::ReadType, ExceptionCode&amp;);
</del><ins>+    void didStartLoading() final;
+    void didReceiveData() final;
+    void didFinishLoading() final;
+    void didFail(int errorCode) final;
+
+    ExceptionOr&lt;void&gt; readInternal(Blob&amp;, FileReaderLoader::ReadType);
</ins><span class="cx">     void fireErrorEvent(int httpStatusCode);
</span><span class="cx">     void fireEvent(const AtomicString&amp; type);
</span><span class="cx"> 
</span><del>-    ReadyState m_state;
-    bool m_aborting;
</del><ins>+    ReadyState m_state { EMPTY };
+    bool m_aborting { false };
</ins><span class="cx">     RefPtr&lt;Blob&gt; m_blob;
</span><del>-    FileReaderLoader::ReadType m_readType;
</del><ins>+    FileReaderLoader::ReadType m_readType { FileReaderLoader::ReadAsBinaryString };
</ins><span class="cx">     String m_encoding;
</span><span class="cx">     std::unique_ptr&lt;FileReaderLoader&gt; m_loader;
</span><span class="cx">     RefPtr&lt;FileError&gt; m_error;
</span><span class="lines">@@ -119,5 +108,3 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // FileReader_h
</del></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReader.idl (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReader.idl        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/fileapi/FileReader.idl        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -43,10 +43,10 @@
</span><span class="cx"> 
</span><span class="cx">     // FIXME: In all four methods found below, the blob parameter should not be nullable.
</span><span class="cx">     // async read methods
</span><del>-    [MayThrowLegacyException] void readAsArrayBuffer(Blob? blob);
-    [MayThrowLegacyException] void readAsBinaryString(Blob? blob);
-    [MayThrowLegacyException] void readAsText(Blob? blob, optional DOMString encoding);
-    [MayThrowLegacyException] void readAsDataURL(Blob? blob);
</del><ins>+    [MayThrowException] void readAsArrayBuffer(Blob? blob);
+    [MayThrowException] void readAsBinaryString(Blob? blob);
+    [MayThrowException] void readAsText(Blob? blob, optional DOMString encoding);
+    [MayThrowException] void readAsDataURL(Blob? blob);
</ins><span class="cx"> 
</span><span class="cx">     void abort();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderSynccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReaderSync.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReaderSync.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/fileapi/FileReaderSync.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -44,41 +44,49 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;ArrayBuffer&gt; FileReaderSync::readAsArrayBuffer(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;RefPtr&lt;ArrayBuffer&gt;&gt; FileReaderSync::readAsArrayBuffer(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob)
</ins><span class="cx"> {
</span><span class="cx">     FileReaderLoader loader(FileReaderLoader::ReadAsArrayBuffer, 0);
</span><del>-    startLoading(scriptExecutionContext, loader, blob, ec);
-
</del><ins>+    auto result = startLoading(scriptExecutionContext, loader, blob);
+    if (result.hasException())
+        return result.releaseException();
</ins><span class="cx">     return loader.arrayBufferResult();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String FileReaderSync::readAsBinaryString(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;String&gt; FileReaderSync::readAsBinaryString(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob)
</ins><span class="cx"> {
</span><span class="cx">     FileReaderLoader loader(FileReaderLoader::ReadAsBinaryString, 0);
</span><del>-    startLoading(scriptExecutionContext, loader, blob, ec);
-    return loader.stringResult();
</del><ins>+    return startLoadingString(scriptExecutionContext, loader, blob);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-String FileReaderSync::readAsText(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob, const String&amp; encoding, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;String&gt; FileReaderSync::readAsText(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob, const String&amp; encoding)
</ins><span class="cx"> {
</span><span class="cx">     FileReaderLoader loader(FileReaderLoader::ReadAsText, 0);
</span><span class="cx">     loader.setEncoding(encoding);
</span><del>-    startLoading(scriptExecutionContext, loader, blob, ec);
-    return loader.stringResult();
</del><ins>+    return startLoadingString(scriptExecutionContext, loader, blob);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-String FileReaderSync::readAsDataURL(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;String&gt; FileReaderSync::readAsDataURL(ScriptExecutionContext&amp; scriptExecutionContext, Blob&amp; blob)
</ins><span class="cx"> {
</span><span class="cx">     FileReaderLoader loader(FileReaderLoader::ReadAsDataURL, 0);
</span><span class="cx">     loader.setDataType(blob.type());
</span><del>-    startLoading(scriptExecutionContext, loader, blob, ec);
-    return loader.stringResult();
</del><ins>+    return startLoadingString(scriptExecutionContext, loader, blob);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FileReaderSync::startLoading(ScriptExecutionContext&amp; scriptExecutionContext, FileReaderLoader&amp; loader, Blob&amp; blob, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; FileReaderSync::startLoading(ScriptExecutionContext&amp; scriptExecutionContext, FileReaderLoader&amp; loader, Blob&amp; blob)
</ins><span class="cx"> {
</span><span class="cx">     loader.start(&amp;scriptExecutionContext, blob);
</span><del>-    ec = FileException::ErrorCodeToExceptionCode(loader.errorCode());
</del><ins>+    if (ExceptionCode code = FileException::ErrorCodeToExceptionCode(loader.errorCode()))
+        return Exception { code };
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ExceptionOr&lt;String&gt; FileReaderSync::startLoadingString(ScriptExecutionContext&amp; scriptExecutionContext, FileReaderLoader&amp; loader, Blob&amp; blob)
+{
+    auto result = startLoading(scriptExecutionContext, loader, blob);
+    if (result.hasException())
+        return result.releaseException();
+    return loader.stringResult();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderSynch"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReaderSync.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReaderSync.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/fileapi/FileReaderSync.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -28,12 +28,9 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef FileReaderSync_h
-#define FileReaderSync_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><del>-#include &lt;wtf/Forward.h&gt;
-#include &lt;wtf/RefCounted.h&gt;
-#include &lt;wtf/text/WTFString.h&gt;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> class ArrayBuffer;
</span><span class="lines">@@ -45,8 +42,6 @@
</span><span class="cx"> class FileReaderLoader;
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> 
</span><del>-typedef int ExceptionCode;
-
</del><span class="cx"> class FileReaderSync : public RefCounted&lt;FileReaderSync&gt; {
</span><span class="cx"> public:
</span><span class="cx">     static Ref&lt;FileReaderSync&gt; create()
</span><span class="lines">@@ -54,19 +49,16 @@
</span><span class="cx">         return adoptRef(*new FileReaderSync);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual ~FileReaderSync() { }
</del><ins>+    ExceptionOr&lt;RefPtr&lt;JSC::ArrayBuffer&gt;&gt; readAsArrayBuffer(ScriptExecutionContext&amp;, Blob&amp;);
+    ExceptionOr&lt;String&gt; readAsBinaryString(ScriptExecutionContext&amp;, Blob&amp;);
+    ExceptionOr&lt;String&gt; readAsText(ScriptExecutionContext&amp;, Blob&amp;, const String&amp; encoding);
+    ExceptionOr&lt;String&gt; readAsDataURL(ScriptExecutionContext&amp;, Blob&amp;);
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;JSC::ArrayBuffer&gt; readAsArrayBuffer(ScriptExecutionContext&amp;, Blob&amp;, ExceptionCode&amp;);
-    String readAsBinaryString(ScriptExecutionContext&amp;, Blob&amp;, ExceptionCode&amp;);
-    String readAsText(ScriptExecutionContext&amp;, Blob&amp;, const String&amp; encoding, ExceptionCode&amp;);
-    String readAsDataURL(ScriptExecutionContext&amp;, Blob&amp;, ExceptionCode&amp;);
-
</del><span class="cx"> private:
</span><span class="cx">     FileReaderSync();
</span><span class="cx"> 
</span><del>-    void startLoading(ScriptExecutionContext&amp;, FileReaderLoader&amp;, Blob&amp;, ExceptionCode&amp;);
</del><ins>+    ExceptionOr&lt;void&gt; startLoading(ScriptExecutionContext&amp;, FileReaderLoader&amp;, Blob&amp;);
+    ExceptionOr&lt;String&gt; startLoadingString(ScriptExecutionContext&amp;, FileReaderLoader&amp;, Blob&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // FileReaderSync_h
</del></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderSyncidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReaderSync.idl (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/FileReaderSync.idl        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/fileapi/FileReaderSync.idl        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -31,9 +31,10 @@
</span><span class="cx"> [
</span><span class="cx">     Constructor,
</span><span class="cx">     Exposed=Worker,
</span><ins>+    ImplementationLacksVTable,
</ins><span class="cx"> ] interface FileReaderSync {
</span><del>-    [CallWith=ScriptExecutionContext, MayThrowLegacyException] ArrayBuffer readAsArrayBuffer(Blob blob);
-    [CallWith=ScriptExecutionContext, MayThrowLegacyException] DOMString readAsBinaryString(Blob blob);
-    [CallWith=ScriptExecutionContext, MayThrowLegacyException] DOMString readAsText(Blob blob, optional DOMString encoding = &quot;&quot;);
-    [CallWith=ScriptExecutionContext, MayThrowLegacyException] DOMString readAsDataURL(Blob blob);
</del><ins>+    [CallWith=ScriptExecutionContext, MayThrowException] ArrayBuffer readAsArrayBuffer(Blob blob);
+    [CallWith=ScriptExecutionContext, MayThrowException] DOMString readAsBinaryString(Blob blob);
+    [CallWith=ScriptExecutionContext, MayThrowException] DOMString readAsText(Blob blob, optional DOMString encoding = &quot;&quot;);
+    [CallWith=ScriptExecutionContext, MayThrowException] DOMString readAsDataURL(Blob blob);
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorepageBase64Utilitiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Base64Utilities.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Base64Utilities.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/Base64Utilities.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -26,38 +26,30 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;Base64Utilities.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &lt;wtf/text/Base64.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-String Base64Utilities::btoa(const String&amp; stringToEncode, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;String&gt; Base64Utilities::btoa(const String&amp; stringToEncode)
</ins><span class="cx"> {
</span><span class="cx">     if (stringToEncode.isNull())
</span><span class="cx">         return String();
</span><span class="cx"> 
</span><del>-    if (!stringToEncode.containsOnlyLatin1()) {
-        ec = INVALID_CHARACTER_ERR;
-        return String();
-    }
</del><ins>+    if (!stringToEncode.containsOnlyLatin1())
+        return Exception { INVALID_CHARACTER_ERR };
</ins><span class="cx"> 
</span><span class="cx">     return base64Encode(stringToEncode.latin1());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String Base64Utilities::atob(const String&amp; encodedString, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;String&gt; Base64Utilities::atob(const String&amp; encodedString)
</ins><span class="cx"> {
</span><span class="cx">     if (encodedString.isNull())
</span><span class="cx">         return String();
</span><span class="cx"> 
</span><del>-    if (!encodedString.containsOnlyLatin1()) {
-        ec = INVALID_CHARACTER_ERR;
-        return String();
-    }
-
</del><span class="cx">     Vector&lt;char&gt; out;
</span><del>-    if (!base64Decode(encodedString, out, Base64ValidatePadding | Base64IgnoreSpacesAndNewLines)) {
-        ec = INVALID_CHARACTER_ERR;
-        return String();
-    }
</del><ins>+    if (!base64Decode(encodedString, out, Base64ValidatePadding | Base64IgnoreSpacesAndNewLines))
+        return Exception { INVALID_CHARACTER_ERR };
</ins><span class="cx"> 
</span><span class="cx">     return String(out.data(), out.size());
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageBase64Utilitiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Base64Utilities.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Base64Utilities.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/Base64Utilities.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -25,15 +25,14 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include &quot;ExceptionCode.h&quot;
-#include &lt;wtf/text/WTFString.h&gt;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class Base64Utilities {
</span><span class="cx"> public:
</span><del>-    static String btoa(const String&amp; stringToEncode, ExceptionCode&amp;);
-    static String atob(const String&amp; encodedString, ExceptionCode&amp;);
</del><ins>+    static ExceptionOr&lt;String&gt; btoa(const String&amp;);
+    static ExceptionOr&lt;String&gt; atob(const String&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -750,7 +750,7 @@
</span><span class="cx">     if (!isCurrentlyDisplayedInFrame())
</span><span class="cx">         return nullptr;
</span><span class="cx">     if (!m_navigator)
</span><del>-        m_navigator = Navigator::create(m_frame);
</del><ins>+        m_navigator = Navigator::create(*m_frame);
</ins><span class="cx">     return m_navigator.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -914,10 +914,9 @@
</span><span class="cx">             return Exception { SYNTAX_ERR };
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ExceptionCode ec = 0;
-    auto channels = MessagePort::disentanglePorts(WTFMove(ports), ec);
-    if (ec)
-        return Exception { ec };
</del><ins>+    auto channels = MessagePort::disentanglePorts(WTFMove(ports));
+    if (channels.hasException())
+        return channels.releaseException();
</ins><span class="cx"> 
</span><span class="cx">     // Capture the source of the message.  We need to do this synchronously
</span><span class="cx">     // in order to capture the source of the message correctly.
</span><span class="lines">@@ -931,7 +930,7 @@
</span><span class="cx">         stackTrace = createScriptCallStack(JSMainThreadExecState::currentState(), ScriptCallStack::maxCallStackSizeToCapture);
</span><span class="cx"> 
</span><span class="cx">     // Schedule the message.
</span><del>-    auto* timer = new PostMessageTimer(*this, PassRefPtr&lt;SerializedScriptValue&gt; { WTFMove(message) }, sourceOrigin, source, WTFMove(channels), WTFMove(target), WTFMove(stackTrace));
</del><ins>+    auto* timer = new PostMessageTimer(*this, WTFMove(message), sourceOrigin, source, channels.releaseReturnValue(), WTFMove(target), WTFMove(stackTrace));
</ins><span class="cx">     timer-&gt;startOneShot(0);
</span><span class="cx"> 
</span><span class="cx">     return { };
</span></span></pre></div>
<a id="trunkSourceWebCorepageNavigatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Navigator.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Navigator.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/Navigator.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -43,8 +43,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-Navigator::Navigator(Frame* frame)
-    : DOMWindowProperty(frame)
</del><ins>+Navigator::Navigator(Frame&amp; frame)
+    : DOMWindowProperty(&amp;frame)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -56,14 +56,14 @@
</span><span class="cx"> // appear in the appVersion string. This is to avoid problems with old versions of a
</span><span class="cx"> // library called OpenCube QuickMenu, which as of this writing is still being used on
</span><span class="cx"> // sites such as nwa.com -- the library thinks Safari is Netscape 4 if we don't do this!
</span><del>-static bool shouldHideFourDot(Frame* frame)
</del><ins>+static bool shouldHideFourDot(Frame&amp; frame)
</ins><span class="cx"> {
</span><del>-    const String* sourceURL = frame-&gt;script().sourceURL();
</del><ins>+    auto* sourceURL = frame.script().sourceURL();
</ins><span class="cx">     if (!sourceURL)
</span><span class="cx">         return false;
</span><span class="cx">     if (!(sourceURL-&gt;endsWith(&quot;/dqm_script.js&quot;) || sourceURL-&gt;endsWith(&quot;/dqm_loader.js&quot;) || sourceURL-&gt;endsWith(&quot;/tdqm_loader.js&quot;)))
</span><span class="cx">         return false;
</span><del>-    return frame-&gt;settings().needsSiteSpecificQuirks();
</del><ins>+    return frame.settings().needsSiteSpecificQuirks();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String Navigator::appVersion() const
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">     if (!m_frame)
</span><span class="cx">         return String();
</span><span class="cx">     String appVersion = NavigatorBase::appVersion();
</span><del>-    if (shouldHideFourDot(m_frame))
</del><ins>+    if (shouldHideFourDot(*m_frame))
</ins><span class="cx">         appVersion.replace(&quot;4.&quot;, &quot;4_&quot;);
</span><span class="cx">     return appVersion;
</span><span class="cx"> }
</span><span class="lines">@@ -80,27 +80,27 @@
</span><span class="cx"> {
</span><span class="cx">     if (!m_frame)
</span><span class="cx">         return String();
</span><del>-        
</del><ins>+
</ins><span class="cx">     // If the frame is already detached, FrameLoader::userAgent may malfunction, because it calls a client method
</span><span class="cx">     // that uses frame's WebView (at least, in Mac WebKit).
</span><span class="cx">     if (!m_frame-&gt;page())
</span><span class="cx">         return String();
</span><del>-        
</del><ins>+
</ins><span class="cx">     return m_frame-&gt;loader().userAgent(m_frame-&gt;document()-&gt;url());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DOMPluginArray* Navigator::plugins() const
</del><ins>+DOMPluginArray&amp; Navigator::plugins()
</ins><span class="cx"> {
</span><span class="cx">     if (!m_plugins)
</span><span class="cx">         m_plugins = DOMPluginArray::create(m_frame);
</span><del>-    return m_plugins.get();
</del><ins>+    return *m_plugins;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-DOMMimeTypeArray* Navigator::mimeTypes() const
</del><ins>+DOMMimeTypeArray&amp; Navigator::mimeTypes()
</ins><span class="cx"> {
</span><span class="cx">     if (!m_mimeTypes)
</span><span class="cx">         m_mimeTypes = DOMMimeTypeArray::create(m_frame);
</span><del>-    return m_mimeTypes.get();
</del><ins>+    return *m_mimeTypes;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Navigator::cookieEnabled() const
</span><span class="lines">@@ -114,7 +114,7 @@
</span><span class="cx">     auto* document = m_frame-&gt;document();
</span><span class="cx">     if (!document)
</span><span class="cx">         return false;
</span><del>-    
</del><ins>+
</ins><span class="cx">     return cookiesEnabled(*document);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -132,15 +132,16 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><ins>+
</ins><span class="cx"> bool Navigator::standalone() const
</span><span class="cx"> {
</span><span class="cx">     return m_frame &amp;&amp; m_frame-&gt;settings().standalone();
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void Navigator::getStorageUpdates()
</span><span class="cx"> {
</span><del>-    // FIXME: Remove this method or rename to yieldForStorageUpdates.
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepageNavigatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Navigator.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Navigator.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/Navigator.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -17,47 +17,38 @@
</span><span class="cx">     Boston, MA 02110-1301, USA.
</span><span class="cx"> */
</span><span class="cx"> 
</span><del>-#ifndef Navigator_h
-#define Navigator_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;DOMWindowProperty.h&quot;
</span><span class="cx"> #include &quot;NavigatorBase.h&quot;
</span><span class="cx"> #include &quot;ScriptWrappable.h&quot;
</span><span class="cx"> #include &quot;Supplementable.h&quot;
</span><del>-#include &lt;wtf/Forward.h&gt;
-#include &lt;wtf/RefCounted.h&gt;
-#include &lt;wtf/RefPtr.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class DOMMimeTypeArray;
</span><span class="cx"> class DOMPluginArray;
</span><del>-class Frame;
-class PluginData;
</del><span class="cx"> 
</span><del>-typedef int ExceptionCode;
-
-class Navigator : public NavigatorBase, public ScriptWrappable, public RefCounted&lt;Navigator&gt;, public DOMWindowProperty, public Supplementable&lt;Navigator&gt; {
</del><ins>+class Navigator final : public NavigatorBase, public ScriptWrappable, public DOMWindowProperty, public Supplementable&lt;Navigator&gt; {
</ins><span class="cx"> public:
</span><del>-    static Ref&lt;Navigator&gt; create(Frame* frame) { return adoptRef(*new Navigator(frame)); }
</del><ins>+    static Ref&lt;Navigator&gt; create(Frame&amp; frame) { return adoptRef(*new Navigator(frame)); }
</ins><span class="cx">     virtual ~Navigator();
</span><span class="cx"> 
</span><span class="cx">     String appVersion() const;
</span><del>-    DOMPluginArray* plugins() const;
-    DOMMimeTypeArray* mimeTypes() const;
</del><ins>+    DOMPluginArray&amp; plugins();
+    DOMMimeTypeArray&amp; mimeTypes();
</ins><span class="cx">     bool cookieEnabled() const;
</span><span class="cx">     bool javaEnabled() const;
</span><del>-    virtual String userAgent() const;
</del><ins>+    String userAgent() const final;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     bool standalone() const;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    // Relinquishes the storage lock, if one exists.
</del><span class="cx">     void getStorageUpdates();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    explicit Navigator(Frame*);
</del><ins>+    explicit Navigator(Frame&amp;);
</ins><span class="cx"> 
</span><span class="cx">     mutable RefPtr&lt;DOMPluginArray&gt; m_plugins;
</span><span class="cx">     mutable RefPtr&lt;DOMMimeTypeArray&gt; m_mimeTypes;
</span><span class="lines">@@ -64,5 +55,3 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span><del>-
-#endif
</del></span></pre></div>
<a id="trunkSourceWebCorepageNavigatorBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/NavigatorBase.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/NavigatorBase.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/NavigatorBase.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -23,16 +23,18 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
</span><span class="cx"> */
</span><span class="cx"> 
</span><del>-#ifndef NavigatorBase_h
-#define NavigatorBase_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><ins>+#include &lt;wtf/RefCounted.h&gt;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class NavigatorBase {
</del><ins>+class NavigatorBase : public RefCounted&lt;NavigatorBase&gt; {
</ins><span class="cx"> public:
</span><ins>+    virtual ~NavigatorBase();
+
</ins><span class="cx">     static String appName();
</span><span class="cx">     String appVersion() const;
</span><span class="cx">     virtual String userAgent() const = 0;
</span><span class="lines">@@ -52,11 +54,6 @@
</span><span class="cx"> #if ENABLE(NAVIGATOR_HWCONCURRENCY)
</span><span class="cx">     static int hardwareConcurrency();
</span><span class="cx"> #endif
</span><del>-
-protected:
-    virtual ~NavigatorBase();
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // NavigatorBase_h
</del></span></pre></div>
<a id="trunkSourceWebCorepageWindowOrWorkerGlobalScopeidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/WindowOrWorkerGlobalScope.idl (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/WindowOrWorkerGlobalScope.idl        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/WindowOrWorkerGlobalScope.idl        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -35,7 +35,6 @@
</span><span class="cx">     void clearInterval(optional long handle = 0);
</span><span class="cx"> 
</span><span class="cx">     // Base64 utility methods.
</span><del>-    [MayThrowLegacyException] DOMString atob(DOMString string);
-    [MayThrowLegacyException] DOMString btoa(DOMString string);
</del><ins>+    [MayThrowException] DOMString atob(DOMString string);
+    [MayThrowException] DOMString btoa(DOMString string);
</ins><span class="cx"> };
</span><del>-
</del></span></pre></div>
<a id="trunkSourceWebCorepageWorkerNavigatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/WorkerNavigator.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/WorkerNavigator.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/WorkerNavigator.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -34,10 +34,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WorkerNavigator::~WorkerNavigator()
-{
-}
-
</del><span class="cx"> String WorkerNavigator::userAgent() const
</span><span class="cx"> {
</span><span class="cx">     return m_userAgent;
</span></span></pre></div>
<a id="trunkSourceWebCorepageWorkerNavigatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/WorkerNavigator.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/WorkerNavigator.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/page/WorkerNavigator.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -23,22 +23,19 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx"> */
</span><span class="cx"> 
</span><del>-#ifndef WorkerNavigator_h
-#define WorkerNavigator_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;NavigatorBase.h&quot;
</span><span class="cx"> #include &quot;Supplementable.h&quot;
</span><del>-#include &lt;wtf/RefCounted.h&gt;
</del><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class WorkerNavigator : public NavigatorBase, public RefCounted&lt;WorkerNavigator&gt;, public Supplementable&lt;WorkerNavigator&gt; {
</del><ins>+class WorkerNavigator final : public NavigatorBase, public Supplementable&lt;WorkerNavigator&gt; {
</ins><span class="cx"> public:
</span><span class="cx">     static Ref&lt;WorkerNavigator&gt; create(const String&amp; userAgent) { return adoptRef(*new WorkerNavigator(userAgent)); }
</span><del>-    virtual ~WorkerNavigator();
</del><span class="cx"> 
</span><del>-    virtual String userAgent() const;
</del><ins>+    String userAgent() const final;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     explicit WorkerNavigator(const String&amp;);
</span><span class="lines">@@ -47,5 +44,3 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // WorkerNavigator_h
</del></span></pre></div>
<a id="trunkSourceWebCoreworkersAbstractWorkercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/AbstractWorker.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/AbstractWorker.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/AbstractWorker.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -38,36 +38,26 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-AbstractWorker::~AbstractWorker()
</del><ins>+ExceptionOr&lt;URL&gt; AbstractWorker::resolveURL(const String&amp; url, bool shouldBypassMainWorldContentSecurityPolicy)
</ins><span class="cx"> {
</span><del>-}
</del><ins>+    if (url.isEmpty())
+        return Exception { SYNTAX_ERR };
</ins><span class="cx"> 
</span><del>-URL AbstractWorker::resolveURL(const String&amp; url, bool shouldBypassMainWorldContentSecurityPolicy, ExceptionCode&amp; ec)
-{
-    if (url.isEmpty()) {
-        ec = SYNTAX_ERR;
-        return URL();
-    }
</del><ins>+    auto&amp; context = *scriptExecutionContext();
</ins><span class="cx"> 
</span><del>-    // FIXME: This should use the dynamic global scope (bug #27887)
-    URL scriptURL = scriptExecutionContext()-&gt;completeURL(url);
-    if (!scriptURL.isValid()) {
-        ec = SYNTAX_ERR;
-        return URL();
-    }
</del><ins>+    // FIXME: This should use the dynamic global scope (bug #27887).
+    URL scriptURL = context.completeURL(url);
+    if (!scriptURL.isValid())
+        return Exception { SYNTAX_ERR };
</ins><span class="cx"> 
</span><del>-    if (!scriptExecutionContext()-&gt;securityOrigin()-&gt;canRequest(scriptURL)) {
-        ec = SECURITY_ERR;
-        return URL();
-    }
</del><ins>+    if (!context.securityOrigin()-&gt;canRequest(scriptURL))
+        return Exception { SECURITY_ERR };
</ins><span class="cx"> 
</span><del>-    ASSERT(scriptExecutionContext()-&gt;contentSecurityPolicy());
-    if (!shouldBypassMainWorldContentSecurityPolicy &amp;&amp; !scriptExecutionContext()-&gt;contentSecurityPolicy()-&gt;allowChildContextFromSource(scriptURL)) {
-        ec = SECURITY_ERR;
-        return URL();
-    }
</del><ins>+    ASSERT(context.contentSecurityPolicy());
+    if (!shouldBypassMainWorldContentSecurityPolicy &amp;&amp; !context.contentSecurityPolicy()-&gt;allowChildContextFromSource(scriptURL))
+        return Exception { SECURITY_ERR };
</ins><span class="cx"> 
</span><del>-    return scriptURL;
</del><ins>+    return WTFMove(scriptURL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersAbstractWorkerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/AbstractWorker.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/AbstractWorker.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/AbstractWorker.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -30,33 +30,29 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include &quot;ActiveDOMObject.h&quot;
-#include &quot;EventListener.h&quot;
</del><span class="cx"> #include &quot;EventTarget.h&quot;
</span><del>-#include &lt;wtf/RefCounted.h&gt;
-#include &lt;wtf/text/AtomicStringHash.h&gt;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-    class URL;
</del><ins>+class URL;
</ins><span class="cx"> 
</span><del>-    class AbstractWorker : public RefCounted&lt;AbstractWorker&gt;, public EventTargetWithInlineData {
-    public:
-        using RefCounted&lt;AbstractWorker&gt;::ref;
-        using RefCounted&lt;AbstractWorker&gt;::deref;
</del><ins>+class AbstractWorker : public RefCounted&lt;AbstractWorker&gt;, public EventTargetWithInlineData {
+public:
+    using RefCounted::ref;
+    using RefCounted::deref;
</ins><span class="cx"> 
</span><del>-        virtual ~AbstractWorker();
</del><ins>+protected:
+    AbstractWorker() = default;
</ins><span class="cx"> 
</span><del>-    protected:
-        AbstractWorker() = default;
</del><ins>+    // Helper function that converts a URL to an absolute URL and checks the result for validity.
+    ExceptionOr&lt;URL&gt; resolveURL(const String&amp; url, bool shouldBypassMainWorldContentSecurityPolicy);
</ins><span class="cx"> 
</span><del>-        // Helper function that converts a URL to an absolute URL and checks the result for validity.
-        URL resolveURL(const String&amp; url, bool shouldBypassMainWorldContentSecurityPolicy, ExceptionCode&amp;);
-        intptr_t asID() const { return reinterpret_cast&lt;intptr_t&gt;(this); }
</del><ins>+    intptr_t asID() const { return reinterpret_cast&lt;intptr_t&gt;(this); }
</ins><span class="cx"> 
</span><del>-    private:
-        void refEventTarget() final { ref(); }
-        void derefEventTarget() final { deref(); }
-    };
</del><ins>+private:
+    void refEventTarget() final { ref(); }
+    void derefEventTarget() final { deref(); }
+};
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDedicatedWorkerGlobalScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -41,16 +41,16 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-Ref&lt;DedicatedWorkerGlobalScope&gt; DedicatedWorkerGlobalScope::create(const URL&amp; url, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
</del><ins>+Ref&lt;DedicatedWorkerGlobalScope&gt; DedicatedWorkerGlobalScope::create(const URL&amp; url, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, const ContentSecurityPolicyResponseHeaders&amp; contentSecurityPolicyResponseHeaders, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
</ins><span class="cx"> {
</span><del>-    Ref&lt;DedicatedWorkerGlobalScope&gt; context = adoptRef(*new DedicatedWorkerGlobalScope(url, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, topOrigin, connectionProxy, socketProvider));
</del><ins>+    auto context = adoptRef(*new DedicatedWorkerGlobalScope(url, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), connectionProxy, socketProvider));
</ins><span class="cx">     if (!shouldBypassMainWorldContentSecurityPolicy)
</span><span class="cx">         context-&gt;applyContentSecurityPolicyResponseHeaders(contentSecurityPolicyResponseHeaders);
</span><span class="cx">     return context;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope(const URL&amp; url, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
-    : WorkerGlobalScope(url, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, topOrigin, connectionProxy, socketProvider)
</del><ins>+DedicatedWorkerGlobalScope::DedicatedWorkerGlobalScope(const URL&amp; url, const String&amp; userAgent, DedicatedWorkerThread&amp; thread, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy* connectionProxy, SocketProvider* socketProvider)
+    : WorkerGlobalScope(url, userAgent, thread, shouldBypassMainWorldContentSecurityPolicy, WTFMove(topOrigin), connectionProxy, socketProvider)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -63,19 +63,21 @@
</span><span class="cx">     return DedicatedWorkerGlobalScopeEventTargetInterfaceType;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DedicatedWorkerGlobalScope::postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; DedicatedWorkerGlobalScope::postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports)
</ins><span class="cx"> {
</span><span class="cx">     // Disentangle the port in preparation for sending it to the remote context.
</span><del>-    auto channels = MessagePort::disentanglePorts(WTFMove(ports), ec);
-    if (ec)
-        return;
-    thread().workerObjectProxy().postMessageToWorkerObject(WTFMove(message), WTFMove(channels));
</del><ins>+    auto channels = MessagePort::disentanglePorts(WTFMove(ports));
+    if (channels.hasException())
+        return channels.releaseException();
+    thread().workerObjectProxy().postMessageToWorkerObject(WTFMove(message), channels.releaseReturnValue());
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DedicatedWorkerGlobalScope::importScripts(const Vector&lt;String&gt;&amp; urls, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; DedicatedWorkerGlobalScope::importScripts(const Vector&lt;String&gt;&amp; urls)
</ins><span class="cx"> {
</span><del>-    Base::importScripts(urls, ec);
</del><ins>+    auto result = Base::importScripts(urls);
</ins><span class="cx">     thread().workerObjectProxy().reportPendingActivity(hasPendingActivity());
</span><ins>+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> DedicatedWorkerThread&amp; DedicatedWorkerGlobalScope::thread()
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDedicatedWorkerGlobalScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -31,34 +31,32 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include &quot;MessagePort.h&quot;
</del><span class="cx"> #include &quot;WorkerGlobalScope.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-    class ContentSecurityPolicyResponseHeaders;
-    class DedicatedWorkerThread;
</del><ins>+class ContentSecurityPolicyResponseHeaders;
+class DedicatedWorkerThread;
+class MessagePort;
+class SerializedScriptValue;
</ins><span class="cx"> 
</span><del>-    class DedicatedWorkerGlobalScope : public WorkerGlobalScope {
-    public:
-        typedef WorkerGlobalScope Base;
-        static Ref&lt;DedicatedWorkerGlobalScope&gt; create(const URL&amp;, const String&amp; userAgent, DedicatedWorkerThread&amp;, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
-        virtual ~DedicatedWorkerGlobalScope();
</del><ins>+class DedicatedWorkerGlobalScope final : public WorkerGlobalScope {
+public:
+    static Ref&lt;DedicatedWorkerGlobalScope&gt; create(const URL&amp;, const String&amp; userAgent, DedicatedWorkerThread&amp;, const ContentSecurityPolicyResponseHeaders&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
+    virtual ~DedicatedWorkerGlobalScope();
</ins><span class="cx"> 
</span><del>-        bool isDedicatedWorkerGlobalScope() const override { return true; }
</del><ins>+    ExceptionOr&lt;void&gt; postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp;, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-        // Overridden to allow us to check our pending activity after executing imported script.
-        void importScripts(const Vector&lt;String&gt;&amp; urls, ExceptionCode&amp;) override;
</del><ins>+    DedicatedWorkerThread&amp; thread();
</ins><span class="cx"> 
</span><del>-        // EventTarget
-        EventTargetInterface eventTargetInterface() const override;
</del><ins>+private:
+    using Base = WorkerGlobalScope;
</ins><span class="cx"> 
</span><del>-        void postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp;, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    DedicatedWorkerGlobalScope(const URL&amp;, const String&amp; userAgent, DedicatedWorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</ins><span class="cx"> 
</span><del>-        DedicatedWorkerThread&amp; thread();
</del><ins>+    bool isDedicatedWorkerGlobalScope() const final { return true; }
+    ExceptionOr&lt;void&gt; importScripts(const Vector&lt;String&gt;&amp; urls) final;
+    EventTargetInterface eventTargetInterface() const final;
+};
</ins><span class="cx"> 
</span><del>-    private:
-        DedicatedWorkerGlobalScope(const URL&amp;, const String&amp; userAgent, DedicatedWorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, PassRefPtr&lt;SecurityOrigin&gt; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
-    };
-
</del><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersDedicatedWorkerGlobalScopeidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.idl (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.idl        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/DedicatedWorkerGlobalScope.idl        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx">     Exposed=DedicatedWorker,
</span><span class="cx">     JSGenerateToNativeObject,
</span><span class="cx"> ] interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
</span><del>-    [Custom, MayThrowLegacyException] void postMessage(any message, optional Array messagePorts);
</del><ins>+    [Custom, MayThrowException] void postMessage(any message, optional Array messagePorts);
</ins><span class="cx"> 
</span><span class="cx">     attribute EventHandler onmessage;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/Worker.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/Worker.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/Worker.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx">     ASSERT_UNUSED(addResult, addResult.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;Worker&gt; Worker::create(ScriptExecutionContext&amp; context, const String&amp; url, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;Ref&lt;Worker&gt;&gt; Worker::create(ScriptExecutionContext&amp; context, const String&amp; url)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><span class="lines">@@ -71,14 +71,14 @@
</span><span class="cx">     // We don't currently support nested workers, so workers can only be created from documents.
</span><span class="cx">     ASSERT_WITH_SECURITY_IMPLICATION(context.isDocument());
</span><span class="cx"> 
</span><del>-    Ref&lt;Worker&gt; worker = adoptRef(*new Worker(context));
</del><ins>+    auto worker = adoptRef(*new Worker(context));
</ins><span class="cx"> 
</span><span class="cx">     worker-&gt;suspendIfNeeded();
</span><span class="cx"> 
</span><span class="cx">     bool shouldBypassMainWorldContentSecurityPolicy = context.shouldBypassMainWorldContentSecurityPolicy();
</span><del>-    URL scriptURL = worker-&gt;resolveURL(url, shouldBypassMainWorldContentSecurityPolicy, ec);
-    if (scriptURL.isEmpty())
-        return nullptr;
</del><ins>+    auto scriptURL = worker-&gt;resolveURL(url, shouldBypassMainWorldContentSecurityPolicy);
+    if (scriptURL.hasException())
+        return scriptURL.releaseException();
</ins><span class="cx"> 
</span><span class="cx">     worker-&gt;m_shouldBypassMainWorldContentSecurityPolicy = shouldBypassMainWorldContentSecurityPolicy;
</span><span class="cx"> 
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx"> 
</span><span class="cx">     worker-&gt;m_scriptLoader = WorkerScriptLoader::create();
</span><span class="cx">     auto contentSecurityPolicyEnforcement = shouldBypassMainWorldContentSecurityPolicy ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceChildSrcDirective;
</span><del>-    worker-&gt;m_scriptLoader-&gt;loadAsynchronously(&amp;context, scriptURL, FetchOptions::Mode::SameOrigin, contentSecurityPolicyEnforcement, worker.ptr());
</del><ins>+    worker-&gt;m_scriptLoader-&gt;loadAsynchronously(&amp;context, scriptURL.releaseReturnValue(), FetchOptions::Mode::SameOrigin, contentSecurityPolicyEnforcement, worker.ptr());
</ins><span class="cx">     return WTFMove(worker);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -99,13 +99,14 @@
</span><span class="cx">     m_contextProxy-&gt;workerObjectDestroyed();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Worker::postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; Worker::postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp; ports)
</ins><span class="cx"> {
</span><span class="cx">     // Disentangle the port in preparation for sending it to the remote context.
</span><del>-    auto channels = MessagePort::disentanglePorts(WTFMove(ports), ec);
-    if (ec)
-        return;
-    m_contextProxy-&gt;postMessageToWorkerGlobalScope(WTFMove(message), WTFMove(channels));
</del><ins>+    auto channels = MessagePort::disentanglePorts(WTFMove(ports));
+    if (channels.hasException())
+        return channels.releaseException();
+    m_contextProxy-&gt;postMessageToWorkerGlobalScope(WTFMove(message), channels.releaseReturnValue());
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Worker::terminate()
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/Worker.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/Worker.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/Worker.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -31,56 +31,48 @@
</span><span class="cx"> #include &quot;EventTarget.h&quot;
</span><span class="cx"> #include &quot;MessagePort.h&quot;
</span><span class="cx"> #include &quot;WorkerScriptLoaderClient.h&quot;
</span><del>-#include &lt;wtf/Forward.h&gt;
</del><span class="cx"> #include &lt;wtf/Optional.h&gt;
</span><del>-#include &lt;wtf/RefPtr.h&gt;
</del><span class="cx"> #include &lt;wtf/text/AtomicStringHash.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-    class ScriptExecutionContext;
-    class WorkerGlobalScopeProxy;
-    class WorkerScriptLoader;
</del><ins>+class ScriptExecutionContext;
+class WorkerGlobalScopeProxy;
+class WorkerScriptLoader;
</ins><span class="cx"> 
</span><del>-    typedef int ExceptionCode;
</del><ins>+class Worker final : public AbstractWorker, public ActiveDOMObject, private WorkerScriptLoaderClient {
+public:
+    static ExceptionOr&lt;Ref&lt;Worker&gt;&gt; create(ScriptExecutionContext&amp;, const String&amp; url);
+    virtual ~Worker();
</ins><span class="cx"> 
</span><del>-    class Worker final : public AbstractWorker, public ActiveDOMObject, private WorkerScriptLoaderClient {
-    public:
-        static RefPtr&lt;Worker&gt; create(ScriptExecutionContext&amp;, const String&amp; url, ExceptionCode&amp;);
-        virtual ~Worker();
</del><ins>+    ExceptionOr&lt;void&gt; postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-        EventTargetInterface eventTargetInterface() const override { return WorkerEventTargetInterfaceType; }
</del><ins>+    void terminate();
</ins><span class="cx"> 
</span><del>-        void postMessage(RefPtr&lt;SerializedScriptValue&gt;&amp;&amp; message, Vector&lt;RefPtr&lt;MessagePort&gt;&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    bool hasPendingActivity() const final;
</ins><span class="cx"> 
</span><del>-        void terminate();
</del><ins>+    ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
</ins><span class="cx"> 
</span><del>-        // EventTarget API.
-        ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
</del><ins>+private:
+    explicit Worker(ScriptExecutionContext&amp;);
</ins><span class="cx"> 
</span><del>-        // ActiveDOMObject API.
-        bool hasPendingActivity() const override;
</del><ins>+    EventTargetInterface eventTargetInterface() const final { return WorkerEventTargetInterfaceType; }
</ins><span class="cx"> 
</span><del>-    private:
-        explicit Worker(ScriptExecutionContext&amp;);
</del><ins>+    void notifyNetworkStateChange(bool isOnline);
</ins><span class="cx"> 
</span><del>-        void notifyNetworkStateChange(bool isOnline);
</del><ins>+    void didReceiveResponse(unsigned long identifier, const ResourceResponse&amp;) final;
+    void notifyFinished() final;
</ins><span class="cx"> 
</span><del>-        // WorkerScriptLoaderClient callbacks
-        void didReceiveResponse(unsigned long identifier, const ResourceResponse&amp;) override;
-        void notifyFinished() override;
</del><ins>+    bool canSuspendForDocumentSuspension() const final;
+    void stop() final;
+    const char* activeDOMObjectName() const final;
</ins><span class="cx"> 
</span><del>-        // ActiveDOMObject API.
-        bool canSuspendForDocumentSuspension() const override;
-        void stop() override;
-        const char* activeDOMObjectName() const override;
</del><ins>+    friend void networkStateChanged(bool isOnLine);
</ins><span class="cx"> 
</span><del>-        friend void networkStateChanged(bool isOnLine);
</del><ins>+    RefPtr&lt;WorkerScriptLoader&gt; m_scriptLoader;
+    WorkerGlobalScopeProxy* m_contextProxy; // The proxy outlives the worker to perform thread shutdown.
+    Optional&lt;ContentSecurityPolicyResponseHeaders&gt; m_contentSecurityPolicyResponseHeaders;
+    bool m_shouldBypassMainWorldContentSecurityPolicy { false };
+};
</ins><span class="cx"> 
</span><del>-        RefPtr&lt;WorkerScriptLoader&gt; m_scriptLoader;
-        WorkerGlobalScopeProxy* m_contextProxy; // The proxy outlives the worker to perform thread shutdown.
-        Optional&lt;ContentSecurityPolicyResponseHeaders&gt; m_contentSecurityPolicyResponseHeaders;
-        bool m_shouldBypassMainWorldContentSecurityPolicy { false };
-    };
-
</del><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkeridl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/Worker.idl (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/Worker.idl        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/Worker.idl        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> ] interface Worker : EventTarget {
</span><span class="cx">     attribute EventHandler onmessage;
</span><span class="cx"> 
</span><del>-    [Custom, MayThrowLegacyException] void postMessage(SerializedScriptValue message, optional Array messagePorts);
</del><ins>+    [Custom, MayThrowException] void postMessage(SerializedScriptValue message, optional Array messagePorts);
</ins><span class="cx"> 
</span><span class="cx">     void terminate();
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -30,8 +30,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ContentSecurityPolicy.h&quot;
</span><span class="cx"> #include &quot;Crypto.h&quot;
</span><del>-#include &quot;DOMTimer.h&quot;
-#include &quot;Event.h&quot;
</del><span class="cx"> #include &quot;ExceptionCode.h&quot;
</span><span class="cx"> #include &quot;IDBConnectionProxy.h&quot;
</span><span class="cx"> #include &quot;InspectorConsoleInstrumentation.h&quot;
</span><span class="lines">@@ -40,7 +38,6 @@
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="cx"> #include &quot;SecurityOriginPolicy.h&quot;
</span><span class="cx"> #include &quot;SocketProvider.h&quot;
</span><del>-#include &quot;URL.h&quot;
</del><span class="cx"> #include &quot;WorkerLoaderProxy.h&quot;
</span><span class="cx"> #include &quot;WorkerLocation.h&quot;
</span><span class="cx"> #include &quot;WorkerNavigator.h&quot;
</span><span class="lines">@@ -47,9 +44,7 @@
</span><span class="cx"> #include &quot;WorkerReportingProxy.h&quot;
</span><span class="cx"> #include &quot;WorkerScriptLoader.h&quot;
</span><span class="cx"> #include &quot;WorkerThread.h&quot;
</span><del>-#include &quot;WorkerThreadableLoader.h&quot;
</del><span class="cx"> #include &lt;inspector/ConsoleMessage.h&gt;
</span><del>-#include &lt;inspector/ScriptCallStack.h&gt;
</del><span class="cx"> 
</span><span class="cx"> using namespace Inspector;
</span><span class="cx"> 
</span><span class="lines">@@ -60,7 +55,6 @@
</span><span class="cx">     , m_userAgent(userAgent)
</span><span class="cx">     , m_script(std::make_unique&lt;WorkerScriptController&gt;(this))
</span><span class="cx">     , m_thread(thread)
</span><del>-    , m_closing(false)
</del><span class="cx">     , m_shouldBypassMainWorldContentSecurityPolicy(shouldBypassMainWorldContentSecurityPolicy)
</span><span class="cx">     , m_eventQueue(*this)
</span><span class="cx">     , m_topOrigin(topOrigin)
</span><span class="lines">@@ -90,9 +84,6 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(currentThread() == thread().threadID());
</span><span class="cx"> 
</span><del>-    // Make sure we have no observers.
-    notifyObserversOfStop();
-
</del><span class="cx">     // Notify proxy that we are going away. This can free the WorkerThread object, so do not access it after this.
</span><span class="cx">     thread().workerReportingProxy().workerGlobalScopeDestroyed();
</span><span class="cx"> }
</span><span class="lines">@@ -123,13 +114,16 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_SOCKETS)
</span><ins>+
</ins><span class="cx"> SocketProvider* WorkerGlobalScope::socketProvider()
</span><span class="cx"> {
</span><span class="cx">     return m_socketProvider.get();
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><ins>+
</ins><span class="cx"> IDBClient::IDBConnectionProxy* WorkerGlobalScope::idbConnectionProxy()
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
</span><span class="lines">@@ -146,6 +140,7 @@
</span><span class="cx">     m_connectionProxy-&gt;forgetActivityForCurrentThread();
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><span class="cx"> WorkerLocation&amp; WorkerGlobalScope::location() const
</span><span class="lines">@@ -204,49 +199,43 @@
</span><span class="cx">     DOMTimer::removeById(*this, timeoutId);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerGlobalScope::importScripts(const Vector&lt;String&gt;&amp; urls, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; WorkerGlobalScope::importScripts(const Vector&lt;String&gt;&amp; urls)
</ins><span class="cx"> {
</span><del>-    ASSERT(scriptExecutionContext());
</del><span class="cx">     ASSERT(contentSecurityPolicy());
</span><span class="cx"> 
</span><del>-    auto&amp; context = *scriptExecutionContext();
-    ec = 0;
</del><span class="cx">     Vector&lt;URL&gt; completedURLs;
</span><ins>+    completedURLs.reserveInitialCapacity(urls.size());
</ins><span class="cx">     for (auto&amp; entry : urls) {
</span><del>-        URL url = context.completeURL(entry);
-        if (!url.isValid()) {
-            ec = SYNTAX_ERR;
-            return;
-        }
-        completedURLs.append(WTFMove(url));
</del><ins>+        URL url = completeURL(entry);
+        if (!url.isValid())
+            return Exception { SYNTAX_ERR };
+        completedURLs.uncheckedAppend(WTFMove(url));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; url : completedURLs) {
</span><span class="cx">         // FIXME: Convert this to check the isolated world's Content Security Policy once webkit.org/b/104520 is solved.
</span><del>-        bool shouldBypassMainWorldContentSecurityPolicy = context.shouldBypassMainWorldContentSecurityPolicy();
-        if (!shouldBypassMainWorldContentSecurityPolicy &amp;&amp; !context.contentSecurityPolicy()-&gt;allowScriptFromSource(url)) {
-            ec = NETWORK_ERR;
-            return;
-        }
</del><ins>+        bool shouldBypassMainWorldContentSecurityPolicy = this-&gt;shouldBypassMainWorldContentSecurityPolicy();
+        if (!shouldBypassMainWorldContentSecurityPolicy &amp;&amp; !contentSecurityPolicy()-&gt;allowScriptFromSource(url))
+            return Exception { NETWORK_ERR };
</ins><span class="cx"> 
</span><del>-        Ref&lt;WorkerScriptLoader&gt; scriptLoader = WorkerScriptLoader::create();
-        scriptLoader-&gt;loadSynchronously(&amp;context, url, FetchOptions::Mode::NoCors, shouldBypassMainWorldContentSecurityPolicy ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceScriptSrcDirective);
</del><ins>+        auto scriptLoader = WorkerScriptLoader::create();
+        scriptLoader-&gt;loadSynchronously(this, url, FetchOptions::Mode::NoCors, shouldBypassMainWorldContentSecurityPolicy ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceScriptSrcDirective);
</ins><span class="cx"> 
</span><span class="cx">         // If the fetching attempt failed, throw a NETWORK_ERR exception and abort all these steps.
</span><del>-        if (scriptLoader-&gt;failed()) {
-            ec = NETWORK_ERR;
-            return;
-        }
</del><ins>+        if (scriptLoader-&gt;failed())
+            return Exception { NETWORK_ERR };
</ins><span class="cx"> 
</span><del>-        InspectorInstrumentation::scriptImported(&amp;context, scriptLoader-&gt;identifier(), scriptLoader-&gt;script());
</del><ins>+        InspectorInstrumentation::scriptImported(this, scriptLoader-&gt;identifier(), scriptLoader-&gt;script());
</ins><span class="cx"> 
</span><span class="cx">         NakedPtr&lt;JSC::Exception&gt; exception;
</span><span class="cx">         m_script-&gt;evaluate(ScriptSourceCode(scriptLoader-&gt;script(), scriptLoader-&gt;responseURL()), exception);
</span><span class="cx">         if (exception) {
</span><span class="cx">             m_script-&gt;setException(exception);
</span><del>-            return;
</del><ins>+            return { };
</ins><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EventTarget* WorkerGlobalScope::errorEventTarget()
</span><span class="lines">@@ -259,7 +248,7 @@
</span><span class="cx">     thread().workerReportingProxy().postExceptionToWorkerObject(errorMessage, lineNumber, columnNumber, sourceURL);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerGlobalScope::addConsoleMessage(std::unique_ptr&lt;Inspector::ConsoleMessage&gt; message)
</del><ins>+void WorkerGlobalScope::addConsoleMessage(std::unique_ptr&lt;Inspector::ConsoleMessage&gt;&amp;&amp; message)
</ins><span class="cx"> {
</span><span class="cx">     if (!isContextThread()) {
</span><span class="cx">         postTask(AddConsoleMessageTask(message-&gt;source(), message-&gt;level(), message-&gt;message()));
</span><span class="lines">@@ -267,46 +256,28 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     thread().workerReportingProxy().postConsoleMessageToWorkerObject(message-&gt;source(), message-&gt;level(), message-&gt;message(), message-&gt;line(), message-&gt;column(), message-&gt;url());
</span><del>-    addMessageToWorkerConsole(WTFMove(message));
</del><ins>+    InspectorInstrumentation::addMessageToConsole(this, WTFMove(message));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerGlobalScope::addConsoleMessage(MessageSource source, MessageLevel level, const String&amp; message, unsigned long requestIdentifier)
</span><span class="cx"> {
</span><del>-    if (!isContextThread()) {
-        postTask(AddConsoleMessageTask(source, level, message));
-        return;
-    }
-
-    thread().workerReportingProxy().postConsoleMessageToWorkerObject(source, level, message, 0, 0, String());
-    addMessageToWorkerConsole(source, level, message, String(), 0, 0, nullptr, nullptr, requestIdentifier);
</del><ins>+    addMessage(source, level, message, { }, 0, 0, nullptr, nullptr, requestIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerGlobalScope::addMessage(MessageSource source, MessageLevel level, const String&amp; message, const String&amp; sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr&lt;ScriptCallStack&gt;&amp;&amp; callStack, JSC::ExecState* state, unsigned long requestIdentifier)
</del><ins>+void WorkerGlobalScope::addMessage(MessageSource source, MessageLevel level, const String&amp; messageText, const String&amp; sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr&lt;ScriptCallStack&gt;&amp;&amp; callStack, JSC::ExecState* state, unsigned long requestIdentifier)
</ins><span class="cx"> {
</span><span class="cx">     if (!isContextThread()) {
</span><del>-        postTask(AddConsoleMessageTask(source, level, message));
</del><ins>+        postTask(AddConsoleMessageTask(source, level, messageText));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    thread().workerReportingProxy().postConsoleMessageToWorkerObject(source, level, message, lineNumber, columnNumber, sourceURL);
-    addMessageToWorkerConsole(source, level, message, sourceURL, lineNumber, columnNumber, WTFMove(callStack), state, requestIdentifier);
-}
</del><ins>+    thread().workerReportingProxy().postConsoleMessageToWorkerObject(source, level, messageText, lineNumber, columnNumber, sourceURL);
</ins><span class="cx"> 
</span><del>-void WorkerGlobalScope::addMessageToWorkerConsole(MessageSource source, MessageLevel level, const String&amp; messageText, const String&amp; suggestedURL, unsigned suggestedLineNumber, unsigned suggestedColumnNumber, RefPtr&lt;ScriptCallStack&gt;&amp;&amp; callStack, JSC::ExecState* state, unsigned long requestIdentifier)
-{
</del><span class="cx">     std::unique_ptr&lt;Inspector::ConsoleMessage&gt; message;
</span><del>-
</del><span class="cx">     if (callStack)
</span><span class="cx">         message = std::make_unique&lt;Inspector::ConsoleMessage&gt;(source, MessageType::Log, level, messageText, WTFMove(callStack), requestIdentifier);
</span><span class="cx">     else
</span><del>-        message = std::make_unique&lt;Inspector::ConsoleMessage&gt;(source, MessageType::Log, level, messageText, suggestedURL, suggestedLineNumber, suggestedColumnNumber, state, requestIdentifier);
-
-    addMessageToWorkerConsole(WTFMove(message));
-}
-
-void WorkerGlobalScope::addMessageToWorkerConsole(std::unique_ptr&lt;Inspector::ConsoleMessage&gt; message)
-{
-    ASSERT(isContextThread());
</del><ins>+        message = std::make_unique&lt;Inspector::ConsoleMessage&gt;(source, MessageType::Log, level, messageText, sourceURL, lineNumber, columnNumber, state, requestIdentifier);
</ins><span class="cx">     InspectorInstrumentation::addMessageToConsole(this, WTFMove(message));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -320,53 +291,6 @@
</span><span class="cx">     return m_script-&gt;isExecutionForbidden();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WorkerGlobalScope::Observer::Observer(WorkerGlobalScope* context)
-    : m_context(context)
-{
-    ASSERT(m_context &amp;&amp; m_context-&gt;isContextThread());
-    m_context-&gt;registerObserver(this);
-}
-
-WorkerGlobalScope::Observer::~Observer()
-{
-    if (!m_context)
-        return;
-    ASSERT(m_context-&gt;isContextThread());
-    m_context-&gt;unregisterObserver(this);
-}
-
-void WorkerGlobalScope::Observer::stopObserving()
-{
-    if (!m_context)
-        return;
-    ASSERT(m_context-&gt;isContextThread());
-    m_context-&gt;unregisterObserver(this);
-    m_context = nullptr;
-}
-
-void WorkerGlobalScope::registerObserver(Observer* observer)
-{
-    ASSERT(observer);
-    m_workerObservers.add(observer);
-}
-
-void WorkerGlobalScope::unregisterObserver(Observer* observer)
-{
-    ASSERT(observer);
-    m_workerObservers.remove(observer);
-}
-
-void WorkerGlobalScope::notifyObserversOfStop()
-{
-    HashSet&lt;Observer*&gt;::iterator iter = m_workerObservers.begin();
-    while (iter != m_workerObservers.end()) {
-        WorkerGlobalScope::Observer* observer = *iter;
-        observer-&gt;stopObserving();
-        observer-&gt;notifyStop();
-        iter = m_workerObservers.begin();
-    }
-}
-
</del><span class="cx"> WorkerEventQueue&amp; WorkerGlobalScope::eventQueue() const
</span><span class="cx"> {
</span><span class="cx">     return m_eventQueue;
</span><span class="lines">@@ -373,9 +297,11 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(SUBTLE_CRYPTO)
</span><ins>+
</ins><span class="cx"> bool WorkerGlobalScope::wrapCryptoKey(const Vector&lt;uint8_t&gt;&amp; key, Vector&lt;uint8_t&gt;&amp; wrappedKey)
</span><span class="cx"> {
</span><del>-    bool result = false, done = false;
</del><ins>+    bool result = false;
+    bool done = false;
</ins><span class="cx">     m_thread.workerLoaderProxy().postTaskToLoader([&amp;result, &amp;key, &amp;wrappedKey, &amp;done, workerGlobalScope = this](ScriptExecutionContext&amp; context) {
</span><span class="cx">         result = context.wrapCryptoKey(key, wrappedKey);
</span><span class="cx">         done = true;
</span><span class="lines">@@ -384,7 +310,7 @@
</span><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> 
</span><del>-    MessageQueueWaitResult waitResult = MessageQueueMessageReceived;
</del><ins>+    auto waitResult = MessageQueueMessageReceived;
</ins><span class="cx">     while (!done &amp;&amp; waitResult != MessageQueueTerminated)
</span><span class="cx">         waitResult = m_thread.runLoop().runInMode(this, WorkerRunLoop::defaultMode());
</span><span class="cx"> 
</span><span class="lines">@@ -402,18 +328,19 @@
</span><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> 
</span><del>-    MessageQueueWaitResult waitResult = MessageQueueMessageReceived;
</del><ins>+    auto waitResult = MessageQueueMessageReceived;
</ins><span class="cx">     while (!done &amp;&amp; waitResult != MessageQueueTerminated)
</span><span class="cx">         waitResult = m_thread.runLoop().runInMode(this, WorkerRunLoop::defaultMode());
</span><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif // ENABLE(SUBTLE_CRYPTO)
</span><span class="cx"> 
</span><del>-Crypto&amp; WorkerGlobalScope::crypto() const
</del><ins>+Crypto&amp; WorkerGlobalScope::crypto()
</ins><span class="cx"> {
</span><span class="cx">     if (!m_crypto)
</span><del>-        m_crypto = Crypto::create(*scriptExecutionContext());
</del><ins>+        m_crypto = Crypto::create(*this);
</ins><span class="cx">     return *m_crypto;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.h (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.h        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.h        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2008-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Base64Utilities.h&quot;
</span><del>-#include &quot;EventListener.h&quot;
</del><span class="cx"> #include &quot;EventTarget.h&quot;
</span><span class="cx"> #include &quot;ScriptExecutionContext.h&quot;
</span><span class="cx"> #include &quot;URL.h&quot;
</span><span class="lines">@@ -34,10 +33,6 @@
</span><span class="cx"> #include &quot;WorkerEventQueue.h&quot;
</span><span class="cx"> #include &quot;WorkerScriptController.h&quot;
</span><span class="cx"> #include &lt;memory&gt;
</span><del>-#include &lt;wtf/HashSet.h&gt;
-#include &lt;wtf/RefCounted.h&gt;
-#include &lt;wtf/RefPtr.h&gt;
-#include &lt;wtf/TypeCasts.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> class ConsoleMessage;
</span><span class="lines">@@ -60,30 +55,15 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WorkerGlobalScope();
</span><span class="cx"> 
</span><del>-    bool isWorkerGlobalScope() const override { return true; }
-
-    ScriptExecutionContext* scriptExecutionContext() const final { return const_cast&lt;WorkerGlobalScope*&gt;(this); }
-
</del><span class="cx">     virtual bool isDedicatedWorkerGlobalScope() const { return false; }
</span><span class="cx"> 
</span><span class="cx">     const URL&amp; url() const final { return m_url; }
</span><del>-    URL completeURL(const String&amp;) const final;
</del><span class="cx"> 
</span><del>-    String userAgent(const URL&amp;) const override;
-
-    void disableEval(const String&amp; errorMessage) override;
-
</del><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">     IDBClient::IDBConnectionProxy* idbConnectionProxy() final;
</span><span class="cx">     void stopIndexedDatabase();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if ENABLE(WEB_SOCKETS)
-    SocketProvider* socketProvider() final;
-#endif
-
-    bool shouldBypassMainWorldContentSecurityPolicy() const final { return m_shouldBypassMainWorldContentSecurityPolicy; }
-
</del><span class="cx">     WorkerScriptController* script() { return m_script.get(); }
</span><span class="cx">     void clearScript() { m_script = nullptr; }
</span><span class="cx"> 
</span><span class="lines">@@ -93,55 +73,65 @@
</span><span class="cx"> 
</span><span class="cx">     void postTask(Task&amp;&amp;) final; // Executes the task on context's thread asynchronously.
</span><span class="cx"> 
</span><del>-    // WorkerGlobalScope
</del><span class="cx">     WorkerGlobalScope&amp; self() { return *this; }
</span><span class="cx">     WorkerLocation&amp; location() const;
</span><span class="cx">     void close();
</span><span class="cx"> 
</span><del>-    // WorkerUtils
-    virtual void importScripts(const Vector&lt;String&gt;&amp; urls, ExceptionCode&amp;);
</del><ins>+    virtual ExceptionOr&lt;void&gt; importScripts(const Vector&lt;String&gt;&amp; urls);
</ins><span class="cx">     WorkerNavigator&amp; navigator() const;
</span><span class="cx"> 
</span><del>-    // Timers
</del><span class="cx">     int setTimeout(std::unique_ptr&lt;ScheduledAction&gt;, int timeout);
</span><span class="cx">     void clearTimeout(int timeoutId);
</span><span class="cx">     int setInterval(std::unique_ptr&lt;ScheduledAction&gt;, int timeout);
</span><span class="cx">     void clearInterval(int timeoutId);
</span><span class="cx"> 
</span><del>-    bool isContextThread() const override;
-    bool isJSExecutionForbidden() const override;
</del><ins>+    bool isContextThread() const final;
</ins><span class="cx"> 
</span><del>-    // These methods are used for GC marking. See JSWorkerGlobalScope::visitChildrenVirtual(SlotVisitor&amp;) in
-    // JSWorkerGlobalScopeCustom.cpp.
</del><span class="cx">     WorkerNavigator* optionalNavigator() const { return m_navigator.get(); }
</span><span class="cx">     WorkerLocation* optionalLocation() const { return m_location.get(); }
</span><span class="cx"> 
</span><del>-    using RefCounted&lt;WorkerGlobalScope&gt;::ref;
-    using RefCounted&lt;WorkerGlobalScope&gt;::deref;
</del><ins>+    using RefCounted::ref;
+    using RefCounted::deref;
</ins><span class="cx"> 
</span><span class="cx">     bool isClosing() { return m_closing; }
</span><span class="cx"> 
</span><del>-    // An observer interface to be notified when the worker thread is getting stopped.
-    class Observer {
-        WTF_MAKE_NONCOPYABLE(Observer);
-    public:
-        Observer(WorkerGlobalScope*);
-        virtual ~Observer();
-        virtual void notifyStop() = 0;
-        void stopObserving();
-    private:
-        WorkerGlobalScope* m_context;
-    };
-    friend class Observer;
-    void registerObserver(Observer*);
-    void unregisterObserver(Observer*);
-    void notifyObserversOfStop();
</del><ins>+    void addConsoleMessage(std::unique_ptr&lt;Inspector::ConsoleMessage&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-    SecurityOrigin* topOrigin() const override { return m_topOrigin.get(); }
</del><ins>+    Crypto&amp; crypto();
</ins><span class="cx"> 
</span><del>-    void addConsoleMessage(std::unique_ptr&lt;Inspector::ConsoleMessage&gt;);
-    void addConsoleMessage(MessageSource, MessageLevel, const String&amp; message, unsigned long requestIdentifier = 0) override;
</del><ins>+protected:
+    WorkerGlobalScope(const URL&amp;, const String&amp; userAgent, WorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
</ins><span class="cx"> 
</span><ins>+    void applyContentSecurityPolicyResponseHeaders(const ContentSecurityPolicyResponseHeaders&amp;);
+
+private:
+    void refScriptExecutionContext() final { ref(); }
+    void derefScriptExecutionContext() final { deref(); }
+
+    void refEventTarget() final { ref(); }
+    void derefEventTarget() final { deref(); }
+
+    void logExceptionToConsole(const String&amp; errorMessage, const String&amp; sourceURL, int lineNumber, int columnNumber, RefPtr&lt;Inspector::ScriptCallStack&gt;&amp;&amp;) final;
+    void addMessage(MessageSource, MessageLevel, const String&amp; message, const String&amp; sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr&lt;Inspector::ScriptCallStack&gt;&amp;&amp;, JSC::ExecState*, unsigned long requestIdentifier) final;
+    void addConsoleMessage(MessageSource, MessageLevel, const String&amp; message, unsigned long requestIdentifier) final;
+
+    bool isWorkerGlobalScope() const final { return true; }
+
+    ScriptExecutionContext* scriptExecutionContext() const final { return const_cast&lt;WorkerGlobalScope*&gt;(this); }
+    URL completeURL(const String&amp;) const final;
+    String userAgent(const URL&amp;) const final;
+    void disableEval(const String&amp; errorMessage) final;
+    EventTarget* errorEventTarget() final;
+    WorkerEventQueue&amp; eventQueue() const final;
+
+#if ENABLE(WEB_SOCKETS)
+    SocketProvider* socketProvider() final;
+#endif
+
+    bool shouldBypassMainWorldContentSecurityPolicy() const final { return m_shouldBypassMainWorldContentSecurityPolicy; }
+    bool isJSExecutionForbidden() const final;
+    SecurityOrigin* topOrigin() const final { return m_topOrigin.get(); }
+
</ins><span class="cx"> #if ENABLE(SUBTLE_CRYPTO)
</span><span class="cx">     // The following two functions are side effects of providing extra protection to serialized
</span><span class="cx">     // CryptoKey data that went through the structured clone algorithm to local storage such as
</span><span class="lines">@@ -154,29 +144,6 @@
</span><span class="cx">     bool unwrapCryptoKey(const Vector&lt;uint8_t&gt;&amp; wrappedKey, Vector&lt;uint8_t&gt;&amp; key) final;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Crypto&amp; crypto() const;
-
-protected:
-    WorkerGlobalScope(const URL&amp;, const String&amp; userAgent, WorkerThread&amp;, bool shouldBypassMainWorldContentSecurityPolicy, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; topOrigin, IDBClient::IDBConnectionProxy*, SocketProvider*);
-    void applyContentSecurityPolicyResponseHeaders(const ContentSecurityPolicyResponseHeaders&amp;);
-
-    void logExceptionToConsole(const String&amp; errorMessage, const String&amp; sourceURL, int lineNumber, int columnNumber, RefPtr&lt;Inspector::ScriptCallStack&gt;&amp;&amp;) override;
-    void addMessageToWorkerConsole(std::unique_ptr&lt;Inspector::ConsoleMessage&gt;);
-    void addMessageToWorkerConsole(MessageSource, MessageLevel, const String&amp; message, const String&amp; sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr&lt;Inspector::ScriptCallStack&gt;&amp;&amp;, JSC::ExecState* = nullptr, unsigned long requestIdentifier = 0);
-
-private:
-    void refScriptExecutionContext() override { ref(); }
-    void derefScriptExecutionContext() override { deref(); }
-
-    void refEventTarget() final { ref(); }
-    void derefEventTarget() final { deref(); }
-
-    void addMessage(MessageSource, MessageLevel, const String&amp; message, const String&amp; sourceURL, unsigned lineNumber, unsigned columnNumber, RefPtr&lt;Inspector::ScriptCallStack&gt;&amp;&amp;, JSC::ExecState* = nullptr, unsigned long requestIdentifier = 0) override;
-
-    EventTarget* errorEventTarget() override;
-
-    WorkerEventQueue&amp; eventQueue() const final;
-
</del><span class="cx">     URL m_url;
</span><span class="cx">     String m_userAgent;
</span><span class="cx"> 
</span><span class="lines">@@ -186,11 +153,9 @@
</span><span class="cx">     std::unique_ptr&lt;WorkerScriptController&gt; m_script;
</span><span class="cx">     WorkerThread&amp; m_thread;
</span><span class="cx"> 
</span><del>-    bool m_closing;
</del><ins>+    bool m_closing { false };
</ins><span class="cx">     bool m_shouldBypassMainWorldContentSecurityPolicy;
</span><span class="cx"> 
</span><del>-    HashSet&lt;Observer*&gt; m_workerObservers;
-
</del><span class="cx">     mutable WorkerEventQueue m_eventQueue;
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;SecurityOrigin&gt; m_topOrigin;
</span><span class="lines">@@ -198,6 +163,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">     RefPtr&lt;IDBClient::IDBConnectionProxy&gt; m_connectionProxy;
</span><span class="cx"> #endif
</span><ins>+
</ins><span class="cx"> #if ENABLE(WEB_SOCKETS)
</span><span class="cx">     RefPtr&lt;SocketProvider&gt; m_socketProvider;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerThread.cpp (207686 => 207687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerThread.cpp        2016-10-21 18:20:07 UTC (rev 207686)
+++ trunk/Source/WebCore/workers/WorkerThread.cpp        2016-10-21 18:32:04 UTC (rev 207687)
</span><span class="lines">@@ -217,7 +217,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">             workerGlobalScope.stopActiveDOMObjects();
</span><del>-            workerGlobalScope.notifyObserversOfStop();
</del><span class="cx"> 
</span><span class="cx">             // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,
</span><span class="cx">             // which become dangling once Heap is destroyed.
</span></span></pre>
</div>
</div>

</body>
</html>