<!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>[208672] trunk/Source</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/208672">208672</a></dd>
<dt>Author</dt> <dd>darin@apple.com</dd>
<dt>Date</dt> <dd>2016-11-13 19:22:31 -0800 (Sun, 13 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Fix exception handling in SQL database code, streamline and update code
https://bugs.webkit.org/show_bug.cgi?id=164685

Reviewed by Sam Weinig.

Source/WebCore:

Removed some old abstraction layers that were no longer in use. For example,
i n many cases, calls were going through DatabaseManager, which called through
an abstract class AbstractDatabaseServer to a concrete class DatabaseServer,
which then called through to DatabaseTracker. Clients now mostly just call
DatabaseTracker directly.

* CMakeLists.txt: Removed DatabaseServer.cpp and SQLTransactionClient.cpp.

* Modules/webdatabase/AbstractDatabaseServer.h: Removed.

* Modules/webdatabase/DOMWindowWebDatabase.cpp:
(WebCore::DOMWindowWebDatabase::openDatabase): Use ExceptionOr instead of
DatabaseError to communicate DOM exceptions from DatabaseManager.

* Modules/webdatabase/Database.cpp:
(WebCore::Database::Database): Use a reference instead of a RefPtr&amp;&amp; for database
context. Use unsigned instead of unsigned long. Modernize code to use more
initialization rather than assignment, to initialize scalar data members in the
class definition, and to use HashMap::ensure.
(WebCore::Database::databaseThread): Added. This class asserts that there is a
thread in the constructor, and so it is useful to have a helper for all the other
functions that assumes the thread is present and returns a reference rather than
a pointer.
(WebCore::Database::~Database): Updated since m_scriptExecutionContext is now
a Ref instead of a RefPtr.
(WebCore::Database::openAndVerifyVersion): Use ExceptionOr and databaseThread.
(WebCore::Database::close): Use databaseThread.
(WebCore::Database::performClose): Ditto.
(WebCore::DoneCreatingDatabaseOnExitCaller::DoneCreatingDatabaseOnExitCaller):
Use a reference. Removed unused m_openSuccceeded.
(WebCore::DoneCreatingDatabaseOnExitCaller::~DoneCreatingDatabaseOnExitCaller):
Use DatabaseTracker::singleton by its new name.
(WebCore::DoneCreatingDatabaseOnExitCaller::setOpenSucceeded): Deleted.
(WebCore::Database::performOpenAndVerify): Use ExceptionOr and update for above.
(WebCore::Database::closeDatabase): Updated for name change.
(WebCore::Database::scheduleTransaction): Updated for above, simplified and
streamlined.
(WebCore::Database::scheduleTransactionStep): Use databaseThread.
(WebCore::Database::transactionClient): Deleted. This object is no longer needed.
(WebCore::Database::transactionCoordinator): Use databaseThread.
(WebCore::Database::markAsDeletedAndClose): Removed unnecessary null check for
databaseThread, which can never be null.
(WebCore::Database::estimatedSize): Use unsigned, not unsigned long.
(WebCore::Database::disableAuthorizer): Removed assertion about RefPtr that is
now a Ref and never could have been null.
(WebCore::Database::enableAuthorizer): Ditto.
(WebCore::Database::setAuthorizerPermissions): Ditto.
(WebCore::Database::lastActionChangedDatabase): Ditto.
(WebCore::Database::lastActionWasInsert): Ditto.
(WebCore::Database::resetDeletes): Ditto.
(WebCore::Database::hadDeletes): Ditto.
(WebCore::Database::resetAuthorizer): Removed null check for a RefPtr that is now
a Ref and never could have been null.
(WebCore::Database::runTransaction): Simplified a bit.
(WebCore::Database::tableNames): Use databaseThread.
(WebCore::Database::securityOrigin): Changed to return a reference instead of a
pointer because all the callers need it to do that. If called on the wrong thread,
this will now do a RELEASE_ASSERT_NOT_REACHED. In the old code it would return a
null pointer and then the caller would dereference it a moment later, so it would
still be a crash.
(WebCore::Database::maximumSize): Removed const since it's not really needed and
the DatabaseTracker wants a non-const reference to this database.
(WebCore::Database::didCommitWriteTransaction): Added. Moved this code here from
SQLTransactionClient. There is no abstraction layer, so no reason to not have
this code, quite comparable to the rest of the code in the class, here. I am
assuming this served some more useful purpose back when we had a different back end
for Chromium?
(WebCore::Database::didExceedQuota): Ditto.
* Modules/webdatabase/Database.h: Updated for above changes. Made some functions
return references instead of pointers. Use Ref instead of RefPtr for some things that
can never be null.
* Modules/webdatabase/Database.idl: Added ImplementationLacksVTable because the
Database class is not polymorphic.

* Modules/webdatabase/DatabaseContext.cpp:
(WebCore::DatabaseContext::DatabaseContext): Take a reference instead of a pointer.
Moved data member initialization into class definition. Remove code that tries to do
debug accounting and databasecontext registration and instead just make sure to keep
the ScriptExecutionContext pointing at the DatabaseContext.
(WebCore::DatabaseContext::~DatabaseContext): Ditto.
(WebCore::DatabaseContext::stopDatabases): Ditto.
* Modules/webdatabase/DatabaseContext.h: Updated for the above. Also used the
scriptExecutionContext function inherited from the base class intead of adding our
own, and added a existingDatabaseThread() function, letting us get at the database
thread efficiently without creating a new one.

* Modules/webdatabase/DatabaseError.h: Removed. We now use DOM exceptions directly
instead of our own error enumeration that has to be translated to a DOM exception.

* Modules/webdatabase/DatabaseManager.cpp: Moved the ProposedDatabase class here
from the header file, and had it use references instead of pointers.
(WebCore::DatabaseManager::DatabaseManager): Deleted. There was nothing left to
initialize once the refactoring was done.
(WebCore::DatabaseManager::initialize): Call DatabaseTracker directly instead of
calling through m_server.
(WebCore::DatabaseManager::setClient): Ditto.
(WebCore::DatabaseManager::databaseDirectoryPath): Deleted. Callers will use the
function in DatabaseTracker directly.
(WebCore::DatabaseManager::setDatabaseDirectoryPath): Ditto.
(WebCore::DatabaseManager::existingDatabaseContextFor): Deleted. Callers will use
the ScriptExecutionContext::databaseContext function instead.
(WebCore::DatabaseManager::databaseContext): Renamed from databaseContextFor.
(WebCore::DatabaseManager::registerDatabaseContext): Deleted.
(WebCore::DatabaseManager::unregisterDatabaseContext): Deleted.
(WebCore::DatabaseManager::didConstructDatabaseContext): Deleted.
(WebCore::DatabaseManager::didDestructDatabaseContext): Deleted.
(WebCore::DatabaseManager::exceptionCodeForDatabaseError): Deleted.
(WebCore::logOpenDatabaseError): Tweaked conditionals a bit.
(WebCore::DatabaseManager::openDatabaseBackend): Use ExceptionOr. Changed to call
tryToOpenDatabaseBackend function here in this class rather than using m_server.
(WebCore::DatabaseManager::tryToOpenDatabaseBackend): Added. Moved here from the
DatabaseServer class.
(WebCore::DatabaseManager::addProposedDatabase): Take a reference.
(WebCore::DatabaseManager::removeProposedDatabase): Ditto.
(WebCore::DatabaseManager::openDatabase): Use ExceptionOr.
(WebCore::DatabaseManager::hasOpenDatabases): Use ScriptContext::databaseContext
directly instead of using helper functions in this class.
(WebCore::DatabaseManager::stopDatabases): Ditto.
(WebCore::DatabaseManager::fullPathForDatabase): Take a reference and also call
DatabaseTracker directly instead of calling through m_server.
(WebCore::DatabaseManager::hasEntryForOrigin): Deleted. Callers will use the
function in DatabaseTracker directly.
(WebCore::DatabaseManager::origins): Ditto.
(WebCore::DatabaseManager::databaseNamesForOrigin): Ditto.
(WebCore::DatabaseManager::detailsForNameAndOrigin): Call DatabaseTracker directly
instead of calling through m_server.
(WebCore::DatabaseManager::usageForOrigin): Deleted. Callers will use the
function in DatabaseTracker directly.
(WebCore::DatabaseManager::quotaForOrigin): Ditto.
(WebCore::DatabaseManager::setQuota): Ditto.
(WebCore::DatabaseManager::deleteAllDatabasesImmediately): Ditto.
(WebCore::DatabaseManager::deleteOrigin): Ditto.
(WebCore::DatabaseManager::deleteDatabase): Ditto.
(WebCore::DatabaseManager::closeAllDatabases): Ditto.
(WebCore::DatabaseManager::logErrorMessage): Take a reference.
* Modules/webdatabase/DatabaseManager.h: Updated for changes above.

* Modules/webdatabase/DatabaseManagerClient.h: Use references for security origins.
Also changed #if for iOS so that other platforms can call the iOS-specific functions
and they have inline empty bodies; lets us clean up call sites to not need conditionals.

* Modules/webdatabase/DatabaseServer.cpp: Removed.
* Modules/webdatabase/DatabaseServer.h: Removed.

* Modules/webdatabase/DatabaseTask.cpp:
(WebCore::isolatedCopy): Added. Helper functions for making isolated copies of
exceptions, which can contain strings.
(WebCore::DatabaseOpenTask::DatabaseOpenTask): Use ExceptionOr&lt;void&gt; instead of
a DatabaseError, a String, and a success boolean.
(WebCore::DatabaseOpenTask::doPerformTask): Updated to use ExceptoinOr.
(WebCore::DatabaseTableNamesTask::DatabaseTableNamesTask): Renamed.
(WebCore::DatabaseTableNamesTask::doPerformTask): Added a comment.
* Modules/webdatabase/DatabaseTask.h: Updated for above changes.

* Modules/webdatabase/DatabaseThread.cpp:
(WebCore::DatabaseThread::DatabaseThread): Initialized data members in the class
definition. Removed m_transactionClient.
(WebCore::DatabaseThread::recordDatabaseOpen): Take a reference.
(WebCore::DatabaseThread::recordDatabaseClosed): Ditto.
(WebCore::DatabaseThread::scheduleTask): Use an rvalue reference.
(WebCore::DatabaseThread::scheduleImmediateTask): Ditto.
(WebCore::DatabaseThread::unscheduleDatabaseTasks): Use a lambda instead of a
class for the same-database predicate.
* Modules/webdatabase/DatabaseThread.h: Updated for above.

* Modules/webdatabase/DatabaseTracker.cpp:
(WebCore::isolatedCopy): Added. Helper for making an isolated copy of a vector
of strings.
(WebCore::DatabaseTracker::singleton): Renamed from tracker.
(WebCore::DatabaseTracker::DatabaseTracker): Moved the code from
setDatabaseDirectoryPath in here.
(WebCore::DatabaseTracker::setDatabaseDirectoryPath): Deleted.
(WebCore::DatabaseTracker::databaseDirectoryPath): Deleted.
(WebCore::DatabaseTracker::hasAdequateQuotaForOrigin): Use ExceptionOr.
(WebCore::DatabaseTracker::canEstablishDatabase): Ditto.
(WebCore::DatabaseTracker::retryCanEstablishDatabase): Ditto.
(WebCore::DatabaseTracker::hasEntryForOriginNoLock): Take a reference.
(WebCore::DatabaseTracker::hasEntryForOrigin): Deleted.
(WebCore::DatabaseTracker::hasEntryForDatabase): Take a reference.
(WebCore::DatabaseTracker::maximumSize): Renamed from getMaxSizeForDatabase
and changed to take a reference.
(WebCore::DatabaseTracker::originPath): Take a reference.
(WebCore::DatabaseTracker::fullPathForDatabaseNoLock): Ditto.
(WebCore::DatabaseTracker::fullPathForDatabase): Ditto.
(WebCore::DatabaseTracker::origins): Changed to use a return value instead
of using an out argument.
(WebCore::DatabaseTracker::databaseNamesNoLock): Ditto. Also renamed from
databaseNamesForOriginNoLock.
(WebCore::DatabaseTracker::databaseNames): Ditto. Also renamed from
databaseNamesForOrigin.
(WebCore::DatabaseTracker::detailsForNameAndOrigin): Take a reference.
(WebCore::DatabaseTracker::setDatabaseDetails): Ditto.
(WebCore::DatabaseTracker::doneCreatingDatabase): Ditto.
(WebCore::DatabaseTracker::addOpenDatabase): Ditto.
(WebCore::DatabaseTracker::removeOpenDatabase): Ditto.
(WebCore::DatabaseTracker::getOpenDatabases): Deleted.
(WebCore::DatabaseTracker::originLockFor): Take a reference.
(WebCore::DatabaseTracker::deleteOriginLockFor): Take a reference.
(WebCore::DatabaseTracker::usage): Renamed from usageForOrigin. Take a reference.
(WebCore::DatabaseTracker::quotaNoLock): Renamed from quotaForOriginNoLock.
Take a reference.
(WebCore::DatabaseTracker::quota): Renamed from quatoForOrigin. Take a reference.
(WebCore::DatabaseTracker::setQuota): Take a reference.
(WebCore::DatabaseTracker::addDatabase): Ditto.
(WebCore::DatabaseTracker::deleteAllDatabasesImmediately): Updated now that
origins has a return value.
(WebCore::DatabaseTracker::deleteDatabasesModifiedSince): Ditto.
(WebCore::DatabaseTracker::deleteOrigin): Take a reference.
(WebCore::DatabaseTracker::isDeletingDatabaseOrOriginFor): Ditto.
(WebCore::DatabaseTracker::recordCreatingDatabase): Updated to take a reference,
use unique_ptr, and use HashCountedSet.
(WebCore::DatabaseTracker::doneCreatingDatabase): Ditto.
(WebCore::DatabaseTracker::creatingDatabase): Ditto.
(WebCore::DatabaseTracker::canDeleteDatabase): Take a reference.
(WebCore::DatabaseTracker::recordDeletingDatabase): Updated to take a reference,
and use unique_ptr.
(WebCore::DatabaseTracker::doneDeletingDatabase): Ditto.
(WebCore::DatabaseTracker::isDeletingDatabase): Ditto.
(WebCore::DatabaseTracker::canDeleteOrigin): Take a reference.
(WebCore::DatabaseTracker::isDeletingOrigin): Ditto.
(WebCore::DatabaseTracker::recordDeletingOrigin): Ditto.
(WebCore::DatabaseTracker::doneDeletingOrigin): Ditto.
(WebCore::DatabaseTracker::deleteDatabase): Ditto.
(WebCore::DatabaseTracker::deleteDatabaseFile): Ditto.
(WebCore::DatabaseTracker::removeDeletedOpenedDatabases): Ditto.
(WebCore::DatabaseTracker::scheduleNotifyDatabaseChanged): Ditto.
(WebCore::DatabaseTracker::notifyDatabasesChanged): Ditto.
* Modules/webdatabase/DatabaseTracker.h: Updated for above changes.

* Modules/webdatabase/SQLStatement.cpp:
(WebCore::SQLStatement::SQLStatement): Updated since Database::scriptExecutionContext
now returns a reference.

* Modules/webdatabase/SQLTransaction.cpp:
(WebCore::SQLTransaction::SQLTransaction): Moved data member initialization to
the calss definition. Also updated since Database::scriptExecutionContext now
returns a reference.
(WebCore::SQLTransaction::executeSQL): Use ExceptionOr.
(WebCore::SQLTransaction::checkAndHandleClosedDatabase): Updated since
databaseContext now returns a reference.
(WebCore::SQLTransaction::deliverQuotaIncreaseCallback): Updated to call
didExceedQuota on the database instead of the transaction client.
(WebCore::SQLTransaction::postflightAndCommit): Updated to call
didCommitWriteTransaction on the database instead of the transaction client.
(WebCore::SQLTransaction::acquireOriginLock): Updated for name change of
DatabaseTracker::tracker to DatbaseTracker::singleton.
* Modules/webdatabase/SQLTransaction.h: Updated for above.
* Modules/webdatabase/SQLTransaction.idl: Added MayThrowException to
executeSql. Not technically needed since it's a custom binding.

* Modules/webdatabase/SQLTransactionBackend.cpp:
(WebCore::SQLTransactionBackend::doCleanup): Updated assertion to use
Database::databaseThread.
(WebCore::SQLTransactionBackend::notifyDatabaseThreadIsShuttingDown): Ditto.

* Modules/webdatabase/SQLTransactionClient.cpp: Removed.
* Modules/webdatabase/SQLTransactionClient.h: Removed.

* Modules/webdatabase/SQLTransactionCoordinator.cpp:
(WebCore::getDatabaseIdentifier): Updated to pass a reference.

* WebCore.xcodeproj/project.pbxproj: Removed various deleted files.
Also let Xcode change the whitespace on some lines.

* bindings/js/JSSQLTransactionCustom.cpp:
(WebCore::JSSQLTransaction::executeSql): Use ExceptionOr, specifically by
using the propagateException function.

* dom/ScriptExecutionContext.h: Added databaseContext function. Before, we
had setDatabaseContext, but no way to inspect the pointer that was stored.

* inspector/InspectorDatabaseAgent.cpp: Removed IGNORE_EXCEPTION in a call
to executeSQL, which no longer has an ExceptionCode out argument.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::stopLoading): Pass a reference in the call to
DatabaseManager::stopDatabases.

Source/WebKit/mac:

* Storage/WebDatabaseManager.mm:
(-[WebDatabaseManager origins]): Updated to use DatabaseTracker and pass
a reference.
(-[WebDatabaseManager databasesWithOrigin:]): Ditto.
(-[WebDatabaseManager detailsForDatabase:withOrigin:]): Pass reference,
but continue to use DatabaseManager.
(-[WebDatabaseManager deleteOrigin:]): Use DatabaseTracker and pass a
reference.
(-[WebDatabaseManager deleteDatabase:withOrigin:]): Ditto.

* Storage/WebDatabaseManagerClient.h: Updated to take references.
* Storage/WebDatabaseManagerClient.mm:
(WebDatabaseManagerClient::WebDatabaseManagerClient): Initialize data
members in the class definition.
(DidModifyOriginData::dispatchToMainThread): Take references.
(DidModifyOriginData::DidModifyOriginData): Ditto.
(WebDatabaseManagerClient::dispatchDidModifyOrigin): Ditto.
(WebDatabaseManagerClient::dispatchDidModifyDatabase): Ditto.
(WebDatabaseManagerClient::dispatchDidAddNewOrigin): Ditto. Also use
DatabaseTracker::singleton instead of tracker.

* Storage/WebDatabaseQuotaManager.mm:
(-[WebDatabaseQuotaManager initWithOrigin:]): Reject nil pointer argument.
(-[WebDatabaseQuotaManager usage]): Use reference instead of pointer.
(-[WebDatabaseQuotaManager quota]): Ditto.
(-[WebDatabaseQuotaManager setQuota:]): Ditto.
* WebCoreSupport/WebSecurityOrigin.mm:
(-[WebSecurityOrigin initWithURL:]): Tweaked code a bit.
(-[WebSecurityOrigin usage]): Use DatabaseTracker and pass a reference.
(-[WebSecurityOrigin quota]): Ditto.
(-[WebSecurityOrigin setQuota:]): Ditto.
* WebView/WebFrame.mm:
(-[WebFrame _cacheabilityDictionary]): Pass a reference.

Source/WebKit/win:

* WebDatabaseManager.cpp:
(WebDatabaseManager::origins): Use DatabaseTracker.
(WebDatabaseManager::databasesWithOrigin): Ditto.
(WebDatabaseManager::detailsForDatabase): Use reference.
(WebDatabaseManager::deleteAllDatabases): Use DatabaseTracker.
(WebDatabaseManager::deleteOrigin): Ditto.
(WebDatabaseManager::deleteDatabase): Ditto.
(WebDatabaseManager::dispatchDidModifyOrigin): Use reference
and DatabaseTracker.
(WebDatabaseManager::setQuota): Ditto.
(WebDatabaseManager::dispatchDidModifyDatabase): Ditto.
* WebDatabaseManager.h: Updated client functions to take a reference.

* WebSecurityOrigin.cpp:
(WebSecurityOrigin::usage): Update to use DatabaseTracker.
(WebSecurityOrigin::quota): Ditto.
(WebSecurityOrigin::setQuota): Ditto.

Source/WebKit2:

* UIProcess/API/efl/ewk_database_manager.cpp:
(EwkDatabaseManager::getDatabaseOrigins): Update for change to the
DatabaseTracker::origins function.
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::fetchData): Use DatabaseTracker.
(WebKit::WebsiteDataStore::removeData): Ditto.
* WebProcess/InjectedBundle/API/c/WKBundle.cpp:
(WKBundleSetDatabaseQuota): Ditto.
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::exceededDatabaseQuota): Ditto.
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::processWillSuspendImminently): Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDOMWindowWebDatabasecpp">trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabasecpp">trunk/Source/WebCore/Modules/webdatabase/Database.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseh">trunk/Source/WebCore/Modules/webdatabase/Database.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseidl">trunk/Source/WebCore/Modules/webdatabase/Database.idl</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseContextcpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseContexth">trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseManagerh">trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseManagerClienth">trunk/Source/WebCore/Modules/webdatabase/DatabaseManagerClient.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseTaskcpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseTaskh">trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseThreadcpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseThreadh">trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseTrackercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseTrackerh">trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLStatementcpp">trunk/Source/WebCore/Modules/webdatabase/SQLStatement.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLTransactioncpp">trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLTransactionh">trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLTransactionidl">trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.idl</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLTransactionBackendcpp">trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLTransactionCoordinatorcpp">trunk/Source/WebCore/Modules/webdatabase/SQLTransactionCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSSQLTransactionCustomcpp">trunk/Source/WebCore/bindings/js/JSSQLTransactionCustom.cpp</a></li>
<li><a href="#trunkSourceWebCoredomExceptionh">trunk/Source/WebCore/dom/Exception.h</a></li>
<li><a href="#trunkSourceWebCoredomExceptionOrh">trunk/Source/WebCore/dom/ExceptionOr.h</a></li>
<li><a href="#trunkSourceWebCoredomScriptExecutionContextcpp">trunk/Source/WebCore/dom/ScriptExecutionContext.cpp</a></li>
<li><a href="#trunkSourceWebCoredomScriptExecutionContexth">trunk/Source/WebCore/dom/ScriptExecutionContext.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorDatabaseAgentcpp">trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderFrameLoadercpp">trunk/Source/WebCore/loader/FrameLoader.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageTrackercpp">trunk/Source/WebKit/Storage/StorageTracker.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageTrackerh">trunk/Source/WebKit/Storage/StorageTracker.h</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebDatabaseManagermm">trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebDatabaseManagerClienth">trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.h</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebDatabaseManagerClientmm">trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebDatabaseQuotaManagermm">trunk/Source/WebKit/mac/Storage/WebDatabaseQuotaManager.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebSecurityOriginmm">trunk/Source/WebKit/mac/WebCoreSupport/WebSecurityOrigin.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebFramemm">trunk/Source/WebKit/mac/WebView/WebFrame.mm</a></li>
<li><a href="#trunkSourceWebKitwinChangeLog">trunk/Source/WebKit/win/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitwinWebDatabaseManagercpp">trunk/Source/WebKit/win/WebDatabaseManager.cpp</a></li>
<li><a href="#trunkSourceWebKitwinWebDatabaseManagerh">trunk/Source/WebKit/win/WebDatabaseManager.h</a></li>
<li><a href="#trunkSourceWebKitwinWebSecurityOrigincpp">trunk/Source/WebKit/win/WebSecurityOrigin.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIeflewk_database_managercpp">trunk/Source/WebKit2/UIProcess/API/efl/ewk_database_manager.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebsiteDataWebsiteDataStorecpp">trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPIcWKBundlecpp">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcesscpp">trunk/Source/WebKit2/WebProcess/WebProcess.cpp</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseAbstractDatabaseServerh">trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseErrorh">trunk/Source/WebCore/Modules/webdatabase/DatabaseError.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseServercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseServerh">trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLTransactionClientcpp">trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseSQLTransactionClienth">trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -998,7 +998,6 @@
</span><span class="cx">     Modules/webdatabase/DatabaseAuthorizer.cpp
</span><span class="cx">     Modules/webdatabase/DatabaseContext.cpp
</span><span class="cx">     Modules/webdatabase/DatabaseManager.cpp
</span><del>-    Modules/webdatabase/DatabaseServer.cpp
</del><span class="cx">     Modules/webdatabase/DatabaseTask.cpp
</span><span class="cx">     Modules/webdatabase/DatabaseThread.cpp
</span><span class="cx">     Modules/webdatabase/DatabaseTracker.cpp
</span><span class="lines">@@ -1009,7 +1008,6 @@
</span><span class="cx">     Modules/webdatabase/SQLStatement.cpp
</span><span class="cx">     Modules/webdatabase/SQLTransaction.cpp
</span><span class="cx">     Modules/webdatabase/SQLTransactionBackend.cpp
</span><del>-    Modules/webdatabase/SQLTransactionClient.cpp
</del><span class="cx">     Modules/webdatabase/SQLTransactionCoordinator.cpp
</span><span class="cx">     Modules/webdatabase/SQLTransactionStateMachine.cpp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/ChangeLog        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,3 +1,288 @@
</span><ins>+2016-11-13  Darin Adler  &lt;darin@apple.com&gt;
+
+        Fix exception handling in SQL database code, streamline and update code
+        https://bugs.webkit.org/show_bug.cgi?id=164685
+
+        Reviewed by Sam Weinig.
+
+        Removed some old abstraction layers that were no longer in use. For example,
+        i n many cases, calls were going through DatabaseManager, which called through
+        an abstract class AbstractDatabaseServer to a concrete class DatabaseServer,
+        which then called through to DatabaseTracker. Clients now mostly just call
+        DatabaseTracker directly.
+
+        * CMakeLists.txt: Removed DatabaseServer.cpp and SQLTransactionClient.cpp.
+
+        * Modules/webdatabase/AbstractDatabaseServer.h: Removed.
+
+        * Modules/webdatabase/DOMWindowWebDatabase.cpp:
+        (WebCore::DOMWindowWebDatabase::openDatabase): Use ExceptionOr instead of
+        DatabaseError to communicate DOM exceptions from DatabaseManager.
+
+        * Modules/webdatabase/Database.cpp:
+        (WebCore::Database::Database): Use a reference instead of a RefPtr&amp;&amp; for database
+        context. Use unsigned instead of unsigned long. Modernize code to use more
+        initialization rather than assignment, to initialize scalar data members in the
+        class definition, and to use HashMap::ensure.
+        (WebCore::Database::databaseThread): Added. This class asserts that there is a
+        thread in the constructor, and so it is useful to have a helper for all the other
+        functions that assumes the thread is present and returns a reference rather than
+        a pointer.
+        (WebCore::Database::~Database): Updated since m_scriptExecutionContext is now
+        a Ref instead of a RefPtr.
+        (WebCore::Database::openAndVerifyVersion): Use ExceptionOr and databaseThread.
+        (WebCore::Database::close): Use databaseThread.
+        (WebCore::Database::performClose): Ditto.
+        (WebCore::DoneCreatingDatabaseOnExitCaller::DoneCreatingDatabaseOnExitCaller):
+        Use a reference. Removed unused m_openSuccceeded.
+        (WebCore::DoneCreatingDatabaseOnExitCaller::~DoneCreatingDatabaseOnExitCaller):
+        Use DatabaseTracker::singleton by its new name.
+        (WebCore::DoneCreatingDatabaseOnExitCaller::setOpenSucceeded): Deleted.
+        (WebCore::Database::performOpenAndVerify): Use ExceptionOr and update for above.
+        (WebCore::Database::closeDatabase): Updated for name change.
+        (WebCore::Database::scheduleTransaction): Updated for above, simplified and
+        streamlined.
+        (WebCore::Database::scheduleTransactionStep): Use databaseThread.
+        (WebCore::Database::transactionClient): Deleted. This object is no longer needed.
+        (WebCore::Database::transactionCoordinator): Use databaseThread.
+        (WebCore::Database::markAsDeletedAndClose): Removed unnecessary null check for
+        databaseThread, which can never be null.
+        (WebCore::Database::estimatedSize): Use unsigned, not unsigned long.
+        (WebCore::Database::disableAuthorizer): Removed assertion about RefPtr that is
+        now a Ref and never could have been null.
+        (WebCore::Database::enableAuthorizer): Ditto.
+        (WebCore::Database::setAuthorizerPermissions): Ditto.
+        (WebCore::Database::lastActionChangedDatabase): Ditto.
+        (WebCore::Database::lastActionWasInsert): Ditto.
+        (WebCore::Database::resetDeletes): Ditto.
+        (WebCore::Database::hadDeletes): Ditto.
+        (WebCore::Database::resetAuthorizer): Removed null check for a RefPtr that is now
+        a Ref and never could have been null.
+        (WebCore::Database::runTransaction): Simplified a bit.
+        (WebCore::Database::tableNames): Use databaseThread.
+        (WebCore::Database::securityOrigin): Changed to return a reference instead of a
+        pointer because all the callers need it to do that. If called on the wrong thread,
+        this will now do a RELEASE_ASSERT_NOT_REACHED. In the old code it would return a
+        null pointer and then the caller would dereference it a moment later, so it would
+        still be a crash.
+        (WebCore::Database::maximumSize): Removed const since it's not really needed and
+        the DatabaseTracker wants a non-const reference to this database.
+        (WebCore::Database::didCommitWriteTransaction): Added. Moved this code here from
+        SQLTransactionClient. There is no abstraction layer, so no reason to not have
+        this code, quite comparable to the rest of the code in the class, here. I am
+        assuming this served some more useful purpose back when we had a different back end
+        for Chromium?
+        (WebCore::Database::didExceedQuota): Ditto.
+        * Modules/webdatabase/Database.h: Updated for above changes. Made some functions
+        return references instead of pointers. Use Ref instead of RefPtr for some things that
+        can never be null.
+        * Modules/webdatabase/Database.idl: Added ImplementationLacksVTable because the
+        Database class is not polymorphic.
+
+        * Modules/webdatabase/DatabaseContext.cpp:
+        (WebCore::DatabaseContext::DatabaseContext): Take a reference instead of a pointer.
+        Moved data member initialization into class definition. Remove code that tries to do
+        debug accounting and databasecontext registration and instead just make sure to keep
+        the ScriptExecutionContext pointing at the DatabaseContext.
+        (WebCore::DatabaseContext::~DatabaseContext): Ditto.
+        (WebCore::DatabaseContext::stopDatabases): Ditto.
+        * Modules/webdatabase/DatabaseContext.h: Updated for the above. Also used the
+        scriptExecutionContext function inherited from the base class intead of adding our
+        own, and added a existingDatabaseThread() function, letting us get at the database
+        thread efficiently without creating a new one.
+
+        * Modules/webdatabase/DatabaseError.h: Removed. We now use DOM exceptions directly
+        instead of our own error enumeration that has to be translated to a DOM exception.
+
+        * Modules/webdatabase/DatabaseManager.cpp: Moved the ProposedDatabase class here
+        from the header file, and had it use references instead of pointers.
+        (WebCore::DatabaseManager::DatabaseManager): Deleted. There was nothing left to
+        initialize once the refactoring was done.
+        (WebCore::DatabaseManager::initialize): Call DatabaseTracker directly instead of
+        calling through m_server.
+        (WebCore::DatabaseManager::setClient): Ditto.
+        (WebCore::DatabaseManager::databaseDirectoryPath): Deleted. Callers will use the
+        function in DatabaseTracker directly.
+        (WebCore::DatabaseManager::setDatabaseDirectoryPath): Ditto.
+        (WebCore::DatabaseManager::existingDatabaseContextFor): Deleted. Callers will use
+        the ScriptExecutionContext::databaseContext function instead.
+        (WebCore::DatabaseManager::databaseContext): Renamed from databaseContextFor.
+        (WebCore::DatabaseManager::registerDatabaseContext): Deleted.
+        (WebCore::DatabaseManager::unregisterDatabaseContext): Deleted.
+        (WebCore::DatabaseManager::didConstructDatabaseContext): Deleted.
+        (WebCore::DatabaseManager::didDestructDatabaseContext): Deleted.
+        (WebCore::DatabaseManager::exceptionCodeForDatabaseError): Deleted.
+        (WebCore::logOpenDatabaseError): Tweaked conditionals a bit.
+        (WebCore::DatabaseManager::openDatabaseBackend): Use ExceptionOr. Changed to call
+        tryToOpenDatabaseBackend function here in this class rather than using m_server.
+        (WebCore::DatabaseManager::tryToOpenDatabaseBackend): Added. Moved here from the
+        DatabaseServer class.
+        (WebCore::DatabaseManager::addProposedDatabase): Take a reference.
+        (WebCore::DatabaseManager::removeProposedDatabase): Ditto.
+        (WebCore::DatabaseManager::openDatabase): Use ExceptionOr.
+        (WebCore::DatabaseManager::hasOpenDatabases): Use ScriptContext::databaseContext
+        directly instead of using helper functions in this class.
+        (WebCore::DatabaseManager::stopDatabases): Ditto.
+        (WebCore::DatabaseManager::fullPathForDatabase): Take a reference and also call
+        DatabaseTracker directly instead of calling through m_server.
+        (WebCore::DatabaseManager::hasEntryForOrigin): Deleted. Callers will use the
+        function in DatabaseTracker directly.
+        (WebCore::DatabaseManager::origins): Ditto.
+        (WebCore::DatabaseManager::databaseNamesForOrigin): Ditto.
+        (WebCore::DatabaseManager::detailsForNameAndOrigin): Call DatabaseTracker directly
+        instead of calling through m_server.
+        (WebCore::DatabaseManager::usageForOrigin): Deleted. Callers will use the
+        function in DatabaseTracker directly.
+        (WebCore::DatabaseManager::quotaForOrigin): Ditto.
+        (WebCore::DatabaseManager::setQuota): Ditto.
+        (WebCore::DatabaseManager::deleteAllDatabasesImmediately): Ditto.
+        (WebCore::DatabaseManager::deleteOrigin): Ditto.
+        (WebCore::DatabaseManager::deleteDatabase): Ditto.
+        (WebCore::DatabaseManager::closeAllDatabases): Ditto.
+        (WebCore::DatabaseManager::logErrorMessage): Take a reference.
+        * Modules/webdatabase/DatabaseManager.h: Updated for changes above.
+
+        * Modules/webdatabase/DatabaseManagerClient.h: Use references for security origins.
+        Also changed #if for iOS so that other platforms can call the iOS-specific functions
+        and they have inline empty bodies; lets us clean up call sites to not need conditionals.
+
+        * Modules/webdatabase/DatabaseServer.cpp: Removed.
+        * Modules/webdatabase/DatabaseServer.h: Removed.
+
+        * Modules/webdatabase/DatabaseTask.cpp:
+        (WebCore::isolatedCopy): Added. Helper functions for making isolated copies of
+        exceptions, which can contain strings.
+        (WebCore::DatabaseOpenTask::DatabaseOpenTask): Use ExceptionOr&lt;void&gt; instead of
+        a DatabaseError, a String, and a success boolean.
+        (WebCore::DatabaseOpenTask::doPerformTask): Updated to use ExceptoinOr.
+        (WebCore::DatabaseTableNamesTask::DatabaseTableNamesTask): Renamed.
+        (WebCore::DatabaseTableNamesTask::doPerformTask): Added a comment.
+        * Modules/webdatabase/DatabaseTask.h: Updated for above changes.
+
+        * Modules/webdatabase/DatabaseThread.cpp:
+        (WebCore::DatabaseThread::DatabaseThread): Initialized data members in the class
+        definition. Removed m_transactionClient.
+        (WebCore::DatabaseThread::recordDatabaseOpen): Take a reference.
+        (WebCore::DatabaseThread::recordDatabaseClosed): Ditto.
+        (WebCore::DatabaseThread::scheduleTask): Use an rvalue reference.
+        (WebCore::DatabaseThread::scheduleImmediateTask): Ditto.
+        (WebCore::DatabaseThread::unscheduleDatabaseTasks): Use a lambda instead of a
+        class for the same-database predicate.
+        * Modules/webdatabase/DatabaseThread.h: Updated for above.
+
+        * Modules/webdatabase/DatabaseTracker.cpp:
+        (WebCore::isolatedCopy): Added. Helper for making an isolated copy of a vector
+        of strings.
+        (WebCore::DatabaseTracker::singleton): Renamed from tracker.
+        (WebCore::DatabaseTracker::DatabaseTracker): Moved the code from
+        setDatabaseDirectoryPath in here.
+        (WebCore::DatabaseTracker::setDatabaseDirectoryPath): Deleted.
+        (WebCore::DatabaseTracker::databaseDirectoryPath): Deleted.
+        (WebCore::DatabaseTracker::hasAdequateQuotaForOrigin): Use ExceptionOr.
+        (WebCore::DatabaseTracker::canEstablishDatabase): Ditto.
+        (WebCore::DatabaseTracker::retryCanEstablishDatabase): Ditto.
+        (WebCore::DatabaseTracker::hasEntryForOriginNoLock): Take a reference.
+        (WebCore::DatabaseTracker::hasEntryForOrigin): Deleted.
+        (WebCore::DatabaseTracker::hasEntryForDatabase): Take a reference.
+        (WebCore::DatabaseTracker::maximumSize): Renamed from getMaxSizeForDatabase
+        and changed to take a reference.
+        (WebCore::DatabaseTracker::originPath): Take a reference.
+        (WebCore::DatabaseTracker::fullPathForDatabaseNoLock): Ditto.
+        (WebCore::DatabaseTracker::fullPathForDatabase): Ditto.
+        (WebCore::DatabaseTracker::origins): Changed to use a return value instead
+        of using an out argument.
+        (WebCore::DatabaseTracker::databaseNamesNoLock): Ditto. Also renamed from
+        databaseNamesForOriginNoLock.
+        (WebCore::DatabaseTracker::databaseNames): Ditto. Also renamed from
+        databaseNamesForOrigin.
+        (WebCore::DatabaseTracker::detailsForNameAndOrigin): Take a reference.
+        (WebCore::DatabaseTracker::setDatabaseDetails): Ditto.
+        (WebCore::DatabaseTracker::doneCreatingDatabase): Ditto.
+        (WebCore::DatabaseTracker::addOpenDatabase): Ditto.
+        (WebCore::DatabaseTracker::removeOpenDatabase): Ditto.
+        (WebCore::DatabaseTracker::getOpenDatabases): Deleted.
+        (WebCore::DatabaseTracker::originLockFor): Take a reference.
+        (WebCore::DatabaseTracker::deleteOriginLockFor): Take a reference.
+        (WebCore::DatabaseTracker::usage): Renamed from usageForOrigin. Take a reference.
+        (WebCore::DatabaseTracker::quotaNoLock): Renamed from quotaForOriginNoLock.
+        Take a reference.
+        (WebCore::DatabaseTracker::quota): Renamed from quatoForOrigin. Take a reference.
+        (WebCore::DatabaseTracker::setQuota): Take a reference.
+        (WebCore::DatabaseTracker::addDatabase): Ditto.
+        (WebCore::DatabaseTracker::deleteAllDatabasesImmediately): Updated now that
+        origins has a return value.
+        (WebCore::DatabaseTracker::deleteDatabasesModifiedSince): Ditto.
+        (WebCore::DatabaseTracker::deleteOrigin): Take a reference.
+        (WebCore::DatabaseTracker::isDeletingDatabaseOrOriginFor): Ditto.
+        (WebCore::DatabaseTracker::recordCreatingDatabase): Updated to take a reference,
+        use unique_ptr, and use HashCountedSet.
+        (WebCore::DatabaseTracker::doneCreatingDatabase): Ditto.
+        (WebCore::DatabaseTracker::creatingDatabase): Ditto.
+        (WebCore::DatabaseTracker::canDeleteDatabase): Take a reference.
+        (WebCore::DatabaseTracker::recordDeletingDatabase): Updated to take a reference,
+        and use unique_ptr.
+        (WebCore::DatabaseTracker::doneDeletingDatabase): Ditto.
+        (WebCore::DatabaseTracker::isDeletingDatabase): Ditto.
+        (WebCore::DatabaseTracker::canDeleteOrigin): Take a reference.
+        (WebCore::DatabaseTracker::isDeletingOrigin): Ditto.
+        (WebCore::DatabaseTracker::recordDeletingOrigin): Ditto.
+        (WebCore::DatabaseTracker::doneDeletingOrigin): Ditto.
+        (WebCore::DatabaseTracker::deleteDatabase): Ditto.
+        (WebCore::DatabaseTracker::deleteDatabaseFile): Ditto.
+        (WebCore::DatabaseTracker::removeDeletedOpenedDatabases): Ditto.
+        (WebCore::DatabaseTracker::scheduleNotifyDatabaseChanged): Ditto.
+        (WebCore::DatabaseTracker::notifyDatabasesChanged): Ditto.
+        * Modules/webdatabase/DatabaseTracker.h: Updated for above changes.
+
+        * Modules/webdatabase/SQLStatement.cpp:
+        (WebCore::SQLStatement::SQLStatement): Updated since Database::scriptExecutionContext
+        now returns a reference.
+
+        * Modules/webdatabase/SQLTransaction.cpp:
+        (WebCore::SQLTransaction::SQLTransaction): Moved data member initialization to
+        the calss definition. Also updated since Database::scriptExecutionContext now
+        returns a reference.
+        (WebCore::SQLTransaction::executeSQL): Use ExceptionOr.
+        (WebCore::SQLTransaction::checkAndHandleClosedDatabase): Updated since
+        databaseContext now returns a reference.
+        (WebCore::SQLTransaction::deliverQuotaIncreaseCallback): Updated to call
+        didExceedQuota on the database instead of the transaction client.
+        (WebCore::SQLTransaction::postflightAndCommit): Updated to call
+        didCommitWriteTransaction on the database instead of the transaction client.
+        (WebCore::SQLTransaction::acquireOriginLock): Updated for name change of
+        DatabaseTracker::tracker to DatbaseTracker::singleton.
+        * Modules/webdatabase/SQLTransaction.h: Updated for above.
+        * Modules/webdatabase/SQLTransaction.idl: Added MayThrowException to
+        executeSql. Not technically needed since it's a custom binding.
+
+        * Modules/webdatabase/SQLTransactionBackend.cpp:
+        (WebCore::SQLTransactionBackend::doCleanup): Updated assertion to use
+        Database::databaseThread.
+        (WebCore::SQLTransactionBackend::notifyDatabaseThreadIsShuttingDown): Ditto.
+
+        * Modules/webdatabase/SQLTransactionClient.cpp: Removed.
+        * Modules/webdatabase/SQLTransactionClient.h: Removed.
+
+        * Modules/webdatabase/SQLTransactionCoordinator.cpp:
+        (WebCore::getDatabaseIdentifier): Updated to pass a reference.
+
+        * WebCore.xcodeproj/project.pbxproj: Removed various deleted files.
+        Also let Xcode change the whitespace on some lines.
+
+        * bindings/js/JSSQLTransactionCustom.cpp:
+        (WebCore::JSSQLTransaction::executeSql): Use ExceptionOr, specifically by
+        using the propagateException function.
+
+        * dom/ScriptExecutionContext.h: Added databaseContext function. Before, we
+        had setDatabaseContext, but no way to inspect the pointer that was stored.
+
+        * inspector/InspectorDatabaseAgent.cpp: Removed IGNORE_EXCEPTION in a call
+        to executeSQL, which no longer has an ExceptionCode out argument.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::stopLoading): Pass a reference in the call to
+        DatabaseManager::stopDatabases.
+
</ins><span class="cx"> 2016-11-13  Dan Bernstein  &lt;mitz@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Try to fix building with newer versions of clang.
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseAbstractDatabaseServerh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,80 +0,0 @@
</span><del>-/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#pragma once
-
-#include &quot;DatabaseBasicTypes.h&quot;
-#include &quot;DatabaseDetails.h&quot;
-#include &quot;DatabaseError.h&quot;
-#include &lt;wtf/RefPtr.h&gt;
-#include &lt;wtf/Vector.h&gt;
-#include &lt;wtf/text/WTFString.h&gt;
-
-namespace WebCore {
-
-class Database;
-class DatabaseContext;
-class DatabaseManagerClient;
-class SecurityOrigin;
-
-class AbstractDatabaseServer {
-public:
-    virtual void initialize(const String&amp; databasePath) = 0;
-
-    virtual void setClient(DatabaseManagerClient*) = 0;
-    virtual String databaseDirectoryPath() const = 0;
-    virtual void setDatabaseDirectoryPath(const String&amp;) = 0;
-
-    virtual String fullPathForDatabase(SecurityOrigin*, const String&amp; name, bool createIfDoesNotExist = true) = 0;
-
-    enum OpenAttempt {
-        FirstTryToOpenDatabase,
-        RetryOpenDatabase
-    };
-
-    virtual RefPtr&lt;Database&gt; openDatabase(RefPtr&lt;DatabaseContext&gt;&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage, OpenAttempt = FirstTryToOpenDatabase) = 0;
-
-    virtual void closeAllDatabases() = 0;
-
-    virtual bool hasEntryForOrigin(SecurityOrigin*) = 0;
-    virtual void origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result) = 0;
-    virtual bool databaseNamesForOrigin(SecurityOrigin*, Vector&lt;String&gt;&amp; result) = 0;
-    virtual DatabaseDetails detailsForNameAndOrigin(const String&amp;, SecurityOrigin*) = 0;
-
-    virtual unsigned long long usageForOrigin(SecurityOrigin*) = 0;
-    virtual unsigned long long quotaForOrigin(SecurityOrigin*) = 0;
-
-    virtual void setQuota(SecurityOrigin*, unsigned long long) = 0;
-
-    virtual void deleteAllDatabasesImmediately() = 0;
-    virtual bool deleteOrigin(SecurityOrigin*) = 0;
-    virtual bool deleteDatabase(SecurityOrigin*, const String&amp; name) = 0;
-
-protected:
-    AbstractDatabaseServer() { }
-    virtual ~AbstractDatabaseServer() { }
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDOMWindowWebDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DOMWindowWebDatabase.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -51,12 +51,13 @@
</span><span class="cx">         return Exception { SECURITY_ERR };
</span><span class="cx">     if (!securityOrigin-&gt;canAccessDatabase(document-&gt;topOrigin()))
</span><span class="cx">         return Exception { SECURITY_ERR };
</span><del>-    auto error = DatabaseError::None;
-    auto database = manager.openDatabase(window.document(), name, version, displayName, estimatedSize, WTFMove(creationCallback), error);
-    if (error != DatabaseError::None)
-        return Exception { DatabaseManager::exceptionCodeForDatabaseError(error) };
-    ASSERT(database);
-    return WTFMove(database);
</del><ins>+    auto result = manager.openDatabase(*window.document(), name, version, displayName, estimatedSize, WTFMove(creationCallback));
+    if (result.hasException()) {
+        // FIXME: To preserve our past behavior, this discards the error string in the exception.
+        // At a later time we may decide that we want to use the error strings, and if so we can just return the exception as is.
+        return Exception { result.releaseException().code() };
+    }
+    return RefPtr&lt;Database&gt; { result.releaseReturnValue() };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/Database.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/Database.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/Database.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -79,9 +79,9 @@
</span><span class="cx"> // The only databases instances not tracked by the tracker's open database
</span><span class="cx"> // list are the ones that have not been added yet, or the ones that we
</span><span class="cx"> // attempted an open on but failed to. Such instances only exist in the
</span><del>-// DatabaseServer's factory methods for creating database backends.
</del><ins>+// factory functions for creating database backends.
</ins><span class="cx"> //
</span><del>-// The factory methods will either call openAndVerifyVersion() or
</del><ins>+// The factory functions will either call openAndVerifyVersion() or
</ins><span class="cx"> // performOpenAndVerify(). These methods will add the newly instantiated
</span><span class="cx"> // database backend if they succeed in opening the requested database.
</span><span class="cx"> // In the case of failure to open the database, the factory methods will
</span><span class="lines">@@ -202,41 +202,36 @@
</span><span class="cx">     return guid;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Database::Database(RefPtr&lt;DatabaseContext&gt;&amp;&amp; databaseContext, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize)
-    : m_scriptExecutionContext(databaseContext-&gt;scriptExecutionContext())
-    , m_databaseContext(WTFMove(databaseContext))
-    , m_deleted(false)
-    , m_name(name.isolatedCopy())
</del><ins>+Database::Database(DatabaseContext&amp; context, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize)
+    : m_scriptExecutionContext(*context.scriptExecutionContext())
+    , m_contextThreadSecurityOrigin(m_scriptExecutionContext-&gt;securityOrigin()-&gt;isolatedCopy())
+    , m_databaseThreadSecurityOrigin(m_scriptExecutionContext-&gt;securityOrigin()-&gt;isolatedCopy())
+    , m_databaseContext(context)
+    , m_name((name.isNull() ? emptyString() : name).isolatedCopy())
</ins><span class="cx">     , m_expectedVersion(expectedVersion.isolatedCopy())
</span><span class="cx">     , m_displayName(displayName.isolatedCopy())
</span><span class="cx">     , m_estimatedSize(estimatedSize)
</span><del>-    , m_opened(false)
-    , m_new(false)
-    , m_transactionInProgress(false)
-    , m_isTransactionQueueEnabled(true)
</del><ins>+    , m_filename(DatabaseManager::singleton().fullPathForDatabase(*m_scriptExecutionContext-&gt;securityOrigin(), m_name))
+    , m_databaseAuthorizer(DatabaseAuthorizer::create(unqualifiedInfoTableName))
</ins><span class="cx"> {
</span><del>-    m_contextThreadSecurityOrigin = m_databaseContext-&gt;securityOrigin()-&gt;isolatedCopy();
-
-    m_databaseAuthorizer = DatabaseAuthorizer::create(unqualifiedInfoTableName);
-
-    if (m_name.isNull())
-        m_name = emptyString();
-
</del><span class="cx">     {
</span><span class="cx">         std::lock_guard&lt;StaticLock&gt; locker(guidMutex);
</span><span class="cx"> 
</span><del>-        m_guid = guidForOriginAndName(securityOrigin()-&gt;toString(), name);
-        std::unique_ptr&lt;HashSet&lt;Database*&gt;&gt;&amp; hashSet = guidToDatabaseMap().add(m_guid, nullptr).iterator-&gt;value;
-        if (!hashSet)
-            hashSet = std::make_unique&lt;HashSet&lt;Database*&gt;&gt;();
-        hashSet-&gt;add(this);
</del><ins>+        m_guid = guidForOriginAndName(securityOrigin().toString(), name);
+        guidToDatabaseMap().ensure(m_guid, [] {
+            return std::make_unique&lt;HashSet&lt;Database*&gt;&gt;();
+        }).iterator-&gt;value-&gt;add(this);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_filename = DatabaseManager::singleton().fullPathForDatabase(securityOrigin(), m_name);
</del><ins>+    m_databaseContext-&gt;databaseThread();
</ins><span class="cx"> 
</span><del>-    m_databaseThreadSecurityOrigin = m_contextThreadSecurityOrigin-&gt;isolatedCopy();
</del><ins>+    ASSERT(m_databaseContext-&gt;existingDatabaseThread());
+}
</ins><span class="cx"> 
</span><del>-    ASSERT(m_databaseContext-&gt;databaseThread());
</del><ins>+DatabaseThread&amp; Database::databaseThread()
+{
+    ASSERT(m_databaseContext-&gt;existingDatabaseThread());
+    return *m_databaseContext-&gt;existingDatabaseThread();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Database::~Database()
</span><span class="lines">@@ -243,7 +238,7 @@
</span><span class="cx"> {
</span><span class="cx">     // The reference to the ScriptExecutionContext needs to be cleared on the JavaScript thread.  If we're on that thread already, we can just let the RefPtr's destruction do the dereffing.
</span><span class="cx">     if (!m_scriptExecutionContext-&gt;isContextThread()) {
</span><del>-        Ref&lt;ScriptExecutionContext&gt; passedContext = m_scriptExecutionContext.releaseNonNull();
</del><ins>+        auto passedContext = m_scriptExecutionContext.copyRef();
</ins><span class="cx">         auto&amp; contextRef = passedContext.get();
</span><span class="cx">         contextRef.postTask({ScriptExecutionContext::Task::CleanupTask, [passedContext = WTFMove(passedContext)] (ScriptExecutionContext&amp; context) {
</span><span class="cx">             ASSERT_UNUSED(context, &amp;context == passedContext.ptr());
</span><span class="lines">@@ -262,18 +257,19 @@
</span><span class="cx">     ASSERT(!m_opened);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Database::openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError&amp; error, String&amp; errorMessage)
</del><ins>+ExceptionOr&lt;void&gt; Database::openAndVerifyVersion(bool setVersionInNewDatabase)
</ins><span class="cx"> {
</span><span class="cx">     DatabaseTaskSynchronizer synchronizer;
</span><del>-    if (!databaseContext()-&gt;databaseThread() || databaseContext()-&gt;databaseThread()-&gt;terminationRequested(&amp;synchronizer))
-        return false;
</del><ins>+    auto&amp; thread = databaseThread();
+    if (thread.terminationRequested(&amp;synchronizer))
+        return Exception { INVALID_STATE_ERR };
</ins><span class="cx"> 
</span><del>-    bool success = false;
-    auto task = std::make_unique&lt;DatabaseOpenTask&gt;(*this, setVersionInNewDatabase, synchronizer, error, errorMessage, success);
-    databaseContext()-&gt;databaseThread()-&gt;scheduleImmediateTask(WTFMove(task));
</del><ins>+    ExceptionOr&lt;void&gt; result;
+    auto task = std::make_unique&lt;DatabaseOpenTask&gt;(*this, setVersionInNewDatabase, synchronizer, result);
+    thread.scheduleImmediateTask(WTFMove(task));
</ins><span class="cx">     synchronizer.waitForTaskCompletion();
</span><span class="cx"> 
</span><del>-    return success;
</del><ins>+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::interrupt()
</span><span class="lines">@@ -284,16 +280,15 @@
</span><span class="cx"> 
</span><span class="cx"> void Database::close()
</span><span class="cx"> {
</span><del>-    if (!databaseContext()-&gt;databaseThread())
-        return;
</del><ins>+    auto&amp; thread = databaseThread();
</ins><span class="cx"> 
</span><span class="cx">     DatabaseTaskSynchronizer synchronizer;
</span><del>-    if (databaseContext()-&gt;databaseThread()-&gt;terminationRequested(&amp;synchronizer)) {
</del><ins>+    if (thread.terminationRequested(&amp;synchronizer)) {
</ins><span class="cx">         LOG(StorageAPI, &quot;Database handle %p is on a terminated DatabaseThread, cannot be marked for normal closure\n&quot;, this);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    databaseContext()-&gt;databaseThread()-&gt;scheduleImmediateTask(std::make_unique&lt;DatabaseCloseTask&gt;(*this, synchronizer));
</del><ins>+    thread.scheduleImmediateTask(std::make_unique&lt;DatabaseCloseTask&gt;(*this, synchronizer));
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: iOS depends on this function blocking until the database is closed as part
</span><span class="cx">     // of closing all open databases from a process assertion expiration handler.
</span><span class="lines">@@ -303,8 +298,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Database::performClose()
</span><span class="cx"> {
</span><del>-    ASSERT(databaseContext()-&gt;databaseThread());
-    ASSERT(currentThread() == databaseContext()-&gt;databaseThread()-&gt;getThreadID());
</del><ins>+    ASSERT(currentThread() == databaseThread().getThreadID());
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         LockHolder locker(m_transactionInProgressMutex);
</span><span class="lines">@@ -312,10 +306,8 @@
</span><span class="cx">         // Clean up transactions that have not been scheduled yet:
</span><span class="cx">         // Transaction phase 1 cleanup. See comment on &quot;What happens if a
</span><span class="cx">         // transaction is interrupted?&quot; at the top of SQLTransactionBackend.cpp.
</span><del>-        while (!m_transactionQueue.isEmpty()) {
-            auto transaction = m_transactionQueue.takeFirst();
-            transaction-&gt;notifyDatabaseThreadIsShuttingDown();
-        }
</del><ins>+        while (!m_transactionQueue.isEmpty())
+            m_transactionQueue.takeFirst()-&gt;notifyDatabaseThreadIsShuttingDown();
</ins><span class="cx"> 
</span><span class="cx">         m_isTransactionQueueEnabled = false;
</span><span class="cx">         m_transactionInProgress = false;
</span><span class="lines">@@ -330,35 +322,30 @@
</span><span class="cx">     // unschedule any DatabaseTasks that refer to it before the database gets
</span><span class="cx">     // deleted.
</span><span class="cx">     Ref&lt;Database&gt; protectedThis(*this);
</span><del>-    databaseContext()-&gt;databaseThread()-&gt;recordDatabaseClosed(this);
-    databaseContext()-&gt;databaseThread()-&gt;unscheduleDatabaseTasks(this);
</del><ins>+    auto&amp; thread = databaseThread();
+    thread.recordDatabaseClosed(*this);
+    thread.unscheduleDatabaseTasks(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class DoneCreatingDatabaseOnExitCaller {
</span><span class="cx"> public:
</span><del>-    DoneCreatingDatabaseOnExitCaller(Database* database)
</del><ins>+    DoneCreatingDatabaseOnExitCaller(Database&amp; database)
</ins><span class="cx">         : m_database(database)
</span><del>-        , m_openSucceeded(false)
</del><span class="cx">     {
</span><span class="cx">     }
</span><ins>+
</ins><span class="cx">     ~DoneCreatingDatabaseOnExitCaller()
</span><span class="cx">     {
</span><del>-        DatabaseTracker::tracker().doneCreatingDatabase(m_database);
</del><ins>+        DatabaseTracker::singleton().doneCreatingDatabase(m_database);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void setOpenSucceeded() { m_openSucceeded = true; }
-
</del><span class="cx"> private:
</span><del>-    Database* m_database;
-    bool m_openSucceeded;
</del><ins>+    Database&amp; m_database;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-bool Database::performOpenAndVerify(bool shouldSetVersionInNewDatabase, DatabaseError&amp; error, String&amp; errorMessage)
</del><ins>+ExceptionOr&lt;void&gt; Database::performOpenAndVerify(bool shouldSetVersionInNewDatabase)
</ins><span class="cx"> {
</span><del>-    DoneCreatingDatabaseOnExitCaller onExitCaller(this);
-    ASSERT(errorMessage.isEmpty());
-    ASSERT(error == DatabaseError::None); // Better not have any errors already.
-    error = DatabaseError::InvalidDatabaseState; // Presumed failure. We'll clear it if we succeed below.
</del><ins>+    DoneCreatingDatabaseOnExitCaller onExitCaller(*this);
</ins><span class="cx"> 
</span><span class="cx">     const int maxSqliteBusyWaitTime = 30000;
</span><span class="cx"> 
</span><span class="lines">@@ -371,10 +358,8 @@
</span><span class="cx"> 
</span><span class="cx">     SQLiteTransactionInProgressAutoCounter transactionCounter;
</span><span class="cx"> 
</span><del>-    if (!m_sqliteDatabase.open(m_filename, true)) {
-        errorMessage = formatErrorMessage(&quot;unable to open database&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
-        return false;
-    }
</del><ins>+    if (!m_sqliteDatabase.open(m_filename, true))
+        return Exception { INVALID_STATE_ERR, formatErrorMessage(&quot;unable to open database&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()) };
</ins><span class="cx">     if (!m_sqliteDatabase.turnOnIncrementalAutoVacuum())
</span><span class="cx">         LOG_ERROR(&quot;Unable to turn on incremental auto-vacuum (%d %s)&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</span><span class="cx"> 
</span><span class="lines">@@ -395,9 +380,9 @@
</span><span class="cx">             SQLiteTransaction transaction(m_sqliteDatabase);
</span><span class="cx">             transaction.begin();
</span><span class="cx">             if (!transaction.inProgress()) {
</span><del>-                errorMessage = formatErrorMessage(&quot;unable to open database, failed to start transaction&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</del><ins>+                String message = formatErrorMessage(&quot;unable to open database, failed to start transaction&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</ins><span class="cx">                 m_sqliteDatabase.close();
</span><del>-                return false;
</del><ins>+                return Exception { INVALID_STATE_ERR, WTFMove(message) };
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             String tableName(unqualifiedInfoTableName);
</span><span class="lines">@@ -405,16 +390,16 @@
</span><span class="cx">                 m_new = true;
</span><span class="cx"> 
</span><span class="cx">                 if (!m_sqliteDatabase.executeCommand(&quot;CREATE TABLE &quot; + tableName + &quot; (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,value TEXT NOT NULL ON CONFLICT FAIL);&quot;)) {
</span><del>-                    errorMessage = formatErrorMessage(&quot;unable to open database, failed to create 'info' table&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</del><ins>+                    String message = formatErrorMessage(&quot;unable to open database, failed to create 'info' table&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</ins><span class="cx">                     transaction.rollback();
</span><span class="cx">                     m_sqliteDatabase.close();
</span><del>-                    return false;
</del><ins>+                return Exception { INVALID_STATE_ERR, WTFMove(message) };
</ins><span class="cx">                 }
</span><span class="cx">             } else if (!getVersionFromDatabase(currentVersion, false)) {
</span><del>-                errorMessage = formatErrorMessage(&quot;unable to open database, failed to read current version&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</del><ins>+                String message = formatErrorMessage(&quot;unable to open database, failed to read current version&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</ins><span class="cx">                 transaction.rollback();
</span><span class="cx">                 m_sqliteDatabase.close();
</span><del>-                return false;
</del><ins>+                return Exception { INVALID_STATE_ERR, WTFMove(message) };
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (currentVersion.length()) {
</span><span class="lines">@@ -422,10 +407,10 @@
</span><span class="cx">             } else if (!m_new || shouldSetVersionInNewDatabase) {
</span><span class="cx">                 LOG(StorageAPI, &quot;Setting version %s in database %s that was just created&quot;, m_expectedVersion.ascii().data(), databaseDebugName().ascii().data());
</span><span class="cx">                 if (!setVersionInDatabase(m_expectedVersion, false)) {
</span><del>-                    errorMessage = formatErrorMessage(&quot;unable to open database, failed to write current version&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</del><ins>+                    String message = formatErrorMessage(&quot;unable to open database, failed to write current version&quot;, m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg());
</ins><span class="cx">                     transaction.rollback();
</span><span class="cx">                     m_sqliteDatabase.close();
</span><del>-                    return false;
</del><ins>+                    return Exception { INVALID_STATE_ERR, WTFMove(message) };
</ins><span class="cx">                 }
</span><span class="cx">                 currentVersion = m_expectedVersion;
</span><span class="cx">             }
</span><span class="lines">@@ -442,29 +427,21 @@
</span><span class="cx">     // If the expected version isn't the empty string, ensure that the current database version we have matches that version. Otherwise, set an exception.
</span><span class="cx">     // If the expected version is the empty string, then we always return with whatever version of the database we have.
</span><span class="cx">     if ((!m_new || shouldSetVersionInNewDatabase) &amp;&amp; m_expectedVersion.length() &amp;&amp; m_expectedVersion != currentVersion) {
</span><del>-        errorMessage = &quot;unable to open database, version mismatch, '&quot; + m_expectedVersion + &quot;' does not match the currentVersion of '&quot; + currentVersion + &quot;'&quot;;
</del><span class="cx">         m_sqliteDatabase.close();
</span><del>-        return false;
</del><ins>+        return Exception { INVALID_STATE_ERR, &quot;unable to open database, version mismatch, '&quot; + m_expectedVersion + &quot;' does not match the currentVersion of '&quot; + currentVersion + &quot;'&quot; };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(m_databaseAuthorizer);
-    m_sqliteDatabase.setAuthorizer(m_databaseAuthorizer);
</del><ins>+    m_sqliteDatabase.setAuthorizer(m_databaseAuthorizer.ptr());
</ins><span class="cx"> 
</span><del>-    // See comment at the top this file regarding calling addOpenDatabase().
-    DatabaseTracker::tracker().addOpenDatabase(static_cast&lt;Database*&gt;(this));
</del><ins>+    DatabaseTracker::singleton().addOpenDatabase(*this);
</ins><span class="cx">     m_opened = true;
</span><span class="cx"> 
</span><del>-    // Declare success:
-    error = DatabaseError::None; // Clear the presumed error from above.
-    onExitCaller.setOpenSucceeded();
-
</del><span class="cx">     if (m_new &amp;&amp; !shouldSetVersionInNewDatabase)
</span><span class="cx">         m_expectedVersion = emptyString(); // The caller provided a creationCallback which will set the expected version.
</span><span class="cx"> 
</span><del>-    if (databaseContext()-&gt;databaseThread())
-        databaseContext()-&gt;databaseThread()-&gt;recordDatabaseOpen(this);
</del><ins>+    databaseThread().recordDatabaseOpen(*this);
</ins><span class="cx"> 
</span><del>-    return true;
</del><ins>+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::closeDatabase()
</span><span class="lines">@@ -474,8 +451,10 @@
</span><span class="cx"> 
</span><span class="cx">     m_sqliteDatabase.close();
</span><span class="cx">     m_opened = false;
</span><ins>+
</ins><span class="cx">     // See comment at the top this file regarding calling removeOpenDatabase().
</span><del>-    DatabaseTracker::tracker().removeOpenDatabase(this);
</del><ins>+    DatabaseTracker::singleton().removeOpenDatabase(*this);
+
</ins><span class="cx">     {
</span><span class="cx">         std::lock_guard&lt;StaticLock&gt; locker(guidMutex);
</span><span class="cx"> 
</span><span class="lines">@@ -561,28 +540,27 @@
</span><span class="cx"> void Database::scheduleTransaction()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_transactionInProgressMutex.tryLock()); // Locked by caller.
</span><del>-    RefPtr&lt;SQLTransaction&gt; transaction;
</del><span class="cx"> 
</span><del>-    if (m_isTransactionQueueEnabled &amp;&amp; !m_transactionQueue.isEmpty())
-        transaction = m_transactionQueue.takeFirst();
</del><ins>+    if (!m_isTransactionQueueEnabled || m_transactionQueue.isEmpty()) {
+        m_transactionInProgress = false;
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    if (transaction &amp;&amp; databaseContext()-&gt;databaseThread()) {
-        auto task = std::make_unique&lt;DatabaseTransactionTask&gt;(WTFMove(transaction));
-        LOG(StorageAPI, &quot;Scheduling DatabaseTransactionTask %p for transaction %p\n&quot;, task.get(), task-&gt;transaction());
-        m_transactionInProgress = true;
-        databaseContext()-&gt;databaseThread()-&gt;scheduleTask(WTFMove(task));
-    } else
-        m_transactionInProgress = false;
</del><ins>+    m_transactionInProgress = true;
+
+    auto transaction = m_transactionQueue.takeFirst();
+    auto task = std::make_unique&lt;DatabaseTransactionTask&gt;(WTFMove(transaction));
+    LOG(StorageAPI, &quot;Scheduling DatabaseTransactionTask %p for transaction %p\n&quot;, task.get(), task-&gt;transaction());
+    databaseThread().scheduleTask(WTFMove(task));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::scheduleTransactionStep(SQLTransaction&amp; transaction)
</span><span class="cx"> {
</span><del>-    if (!databaseContext()-&gt;databaseThread())
-        return;
</del><ins>+    auto&amp; thread = databaseThread();
</ins><span class="cx"> 
</span><span class="cx">     auto task = std::make_unique&lt;DatabaseTransactionTask&gt;(&amp;transaction);
</span><span class="cx">     LOG(StorageAPI, &quot;Scheduling DatabaseTransactionTask %p for the transaction step\n&quot;, task.get());
</span><del>-    databaseContext()-&gt;databaseThread()-&gt;scheduleTask(WTFMove(task));
</del><ins>+    thread.scheduleTask(WTFMove(task));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::inProgressTransactionCompleted()
</span><span class="lines">@@ -598,16 +576,11 @@
</span><span class="cx">     return m_transactionInProgress || !m_transactionQueue.isEmpty();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SQLTransactionClient* Database::transactionClient() const
</del><ins>+SQLTransactionCoordinator* Database::transactionCoordinator()
</ins><span class="cx"> {
</span><del>-    return databaseContext()-&gt;databaseThread()-&gt;transactionClient();
</del><ins>+    return databaseThread().transactionCoordinator();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-SQLTransactionCoordinator* Database::transactionCoordinator() const
-{
-    return databaseContext()-&gt;databaseThread()-&gt;transactionCoordinator();
-}
-
</del><span class="cx"> String Database::version() const
</span><span class="cx"> {
</span><span class="cx">     if (m_deleted)
</span><span class="lines">@@ -621,7 +594,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Database::markAsDeletedAndClose()
</span><span class="cx"> {
</span><del>-    if (m_deleted || !databaseContext()-&gt;databaseThread())
</del><ins>+    if (m_deleted)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     LOG(StorageAPI, &quot;Marking %s (%p) as deleted&quot;, stringIdentifier().ascii().data(), this);
</span><span class="lines">@@ -657,7 +630,7 @@
</span><span class="cx">     return m_displayName.isolatedCopy();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long Database::estimatedSize() const
</del><ins>+unsigned Database::estimatedSize() const
</ins><span class="cx"> {
</span><span class="cx">     return m_estimatedSize;
</span><span class="cx"> }
</span><span class="lines">@@ -676,50 +649,42 @@
</span><span class="cx"> 
</span><span class="cx"> void Database::disableAuthorizer()
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseAuthorizer);
</del><span class="cx">     m_databaseAuthorizer-&gt;disable();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::enableAuthorizer()
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseAuthorizer);
</del><span class="cx">     m_databaseAuthorizer-&gt;enable();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::setAuthorizerPermissions(int permissions)
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseAuthorizer);
</del><span class="cx">     m_databaseAuthorizer-&gt;setPermissions(permissions);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Database::lastActionChangedDatabase()
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseAuthorizer);
</del><span class="cx">     return m_databaseAuthorizer-&gt;lastActionChangedDatabase();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Database::lastActionWasInsert()
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseAuthorizer);
</del><span class="cx">     return m_databaseAuthorizer-&gt;lastActionWasInsert();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::resetDeletes()
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseAuthorizer);
</del><span class="cx">     m_databaseAuthorizer-&gt;resetDeletes();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Database::hadDeletes()
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseAuthorizer);
</del><span class="cx">     return m_databaseAuthorizer-&gt;hadDeletes();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::resetAuthorizer()
</span><span class="cx"> {
</span><del>-    if (m_databaseAuthorizer)
-        m_databaseAuthorizer-&gt;reset();
</del><ins>+    m_databaseAuthorizer-&gt;reset();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Database::runTransaction(RefPtr&lt;SQLTransactionCallback&gt;&amp;&amp; callback, RefPtr&lt;SQLTransactionErrorCallback&gt;&amp;&amp; errorCallback, RefPtr&lt;VoidCallback&gt;&amp;&amp; successCallback, RefPtr&lt;SQLTransactionWrapper&gt;&amp;&amp; wrapper, bool readOnly)
</span><span class="lines">@@ -735,8 +700,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto transaction = SQLTransaction::create(*this, WTFMove(callback), WTFMove(successCallback), errorCallback.copyRef(), WTFMove(wrapper), readOnly);
-    m_transactionQueue.append(transaction.ptr());
</del><ins>+    m_transactionQueue.append(SQLTransaction::create(*this, WTFMove(callback), WTFMove(successCallback), errorCallback.copyRef(), WTFMove(wrapper), readOnly));
</ins><span class="cx">     if (!m_transactionInProgress)
</span><span class="cx">         scheduleTransaction();
</span><span class="cx"> }
</span><span class="lines">@@ -802,35 +766,53 @@
</span><span class="cx">     // in dealing with them. However, if the code changes, this may not be true anymore.
</span><span class="cx">     Vector&lt;String&gt; result;
</span><span class="cx">     DatabaseTaskSynchronizer synchronizer;
</span><del>-    if (!databaseContext()-&gt;databaseThread() || databaseContext()-&gt;databaseThread()-&gt;terminationRequested(&amp;synchronizer))
</del><ins>+    auto&amp; thread = databaseThread();
+    if (thread.terminationRequested(&amp;synchronizer))
</ins><span class="cx">         return result;
</span><span class="cx"> 
</span><span class="cx">     auto task = std::make_unique&lt;DatabaseTableNamesTask&gt;(*this, synchronizer, result);
</span><del>-    databaseContext()-&gt;databaseThread()-&gt;scheduleImmediateTask(WTFMove(task));
</del><ins>+    thread.scheduleImmediateTask(WTFMove(task));
</ins><span class="cx">     synchronizer.waitForTaskCompletion();
</span><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SecurityOrigin* Database::securityOrigin() const
</del><ins>+SecurityOrigin&amp; Database::securityOrigin()
</ins><span class="cx"> {
</span><span class="cx">     if (m_scriptExecutionContext-&gt;isContextThread())
</span><span class="cx">         return m_contextThreadSecurityOrigin.get();
</span><del>-    if (currentThread() == databaseContext()-&gt;databaseThread()-&gt;getThreadID())
</del><ins>+    auto&amp; thread = databaseThread();
+    if (currentThread() == thread.getThreadID())
</ins><span class="cx">         return m_databaseThreadSecurityOrigin.get();
</span><del>-    return 0;
</del><ins>+    RELEASE_ASSERT_NOT_REACHED();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long Database::maximumSize() const
</del><ins>+unsigned long long Database::maximumSize()
</ins><span class="cx"> {
</span><del>-    return DatabaseTracker::tracker().getMaxSizeForDatabase(this);
</del><ins>+    return DatabaseTracker::singleton().maximumSize(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Database::didCommitWriteTransaction()
+{
+    DatabaseTracker::singleton().scheduleNotifyDatabaseChanged(securityOrigin(), stringIdentifier());
+}
+
+bool Database::didExceedQuota()
+{
+    ASSERT(databaseContext().scriptExecutionContext()-&gt;isContextThread());
+    auto&amp; tracker = DatabaseTracker::singleton();
+    auto oldQuota = tracker.quota(securityOrigin());
+    databaseContext().databaseExceededQuota(stringIdentifier(), details());
+    return tracker.quota(securityOrigin()) &gt; oldQuota;
+}
+
</ins><span class="cx"> #if !LOG_DISABLED || !ERROR_DISABLED
</span><ins>+
</ins><span class="cx"> String Database::databaseDebugName() const
</span><span class="cx"> {
</span><span class="cx">     return m_contextThreadSecurityOrigin-&gt;toString() + &quot;::&quot; + m_name;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/Database.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/Database.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/Database.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -29,33 +29,32 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DatabaseBasicTypes.h&quot;
</span><del>-#include &quot;DatabaseError.h&quot;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;SQLiteDatabase.h&quot;
</span><span class="cx"> #include &lt;wtf/Deque.h&gt;
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><del>-#include &lt;wtf/text/WTFString.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class DatabaseCallback;
</span><ins>+class DatabaseContext;
</ins><span class="cx"> class DatabaseDetails;
</span><del>-class DatabaseContext;
</del><ins>+class DatabaseThread;
</ins><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> class SecurityOrigin;
</span><span class="cx"> class SQLTransaction;
</span><span class="cx"> class SQLTransactionBackend;
</span><span class="cx"> class SQLTransactionCallback;
</span><del>-class SQLTransactionClient;
</del><span class="cx"> class SQLTransactionCoordinator;
</span><span class="cx"> class SQLTransactionErrorCallback;
</span><span class="cx"> class SQLTransactionWrapper;
</span><span class="cx"> class VoidCallback;
</span><span class="cx"> 
</span><del>-class Database final : public ThreadSafeRefCounted&lt;Database&gt; {
</del><ins>+class Database : public ThreadSafeRefCounted&lt;Database&gt; {
</ins><span class="cx"> public:
</span><del>-    virtual ~Database();
</del><ins>+    ~Database();
</ins><span class="cx"> 
</span><del>-    virtual bool openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage);
</del><ins>+    ExceptionOr&lt;void&gt; openAndVerifyVersion(bool setVersionInNewDatabase);
</ins><span class="cx">     void close();
</span><span class="cx"> 
</span><span class="cx">     void interrupt();
</span><span class="lines">@@ -63,7 +62,7 @@
</span><span class="cx">     bool opened() const { return m_opened; }
</span><span class="cx">     bool isNew() const { return m_new; }
</span><span class="cx"> 
</span><del>-    unsigned long long maximumSize() const;
</del><ins>+    unsigned long long maximumSize();
</ins><span class="cx"> 
</span><span class="cx">     void scheduleTransactionStep(SQLTransaction&amp;);
</span><span class="cx">     void inProgressTransactionCompleted();
</span><span class="lines">@@ -73,9 +72,11 @@
</span><span class="cx">     bool hasPendingCreationEvent() const { return m_hasPendingCreationEvent; }
</span><span class="cx">     void setHasPendingCreationEvent(bool value) { m_hasPendingCreationEvent = value; }
</span><span class="cx"> 
</span><del>-    SQLTransactionClient* transactionClient() const;
-    SQLTransactionCoordinator* transactionCoordinator() const;
</del><ins>+    void didCommitWriteTransaction();
+    bool didExceedQuota();
</ins><span class="cx"> 
</span><ins>+    SQLTransactionCoordinator* transactionCoordinator();
+
</ins><span class="cx">     // Direct support for the DOM API
</span><span class="cx">     String version() const;
</span><span class="cx">     void changeVersion(const String&amp; oldVersion, const String&amp; newVersion, RefPtr&lt;SQLTransactionCallback&gt;&amp;&amp;, RefPtr&lt;SQLTransactionErrorCallback&gt;&amp;&amp;, RefPtr&lt;VoidCallback&gt;&amp;&amp; successCallback);
</span><span class="lines">@@ -85,7 +86,7 @@
</span><span class="cx">     // Internal engine support
</span><span class="cx">     String stringIdentifier() const;
</span><span class="cx">     String displayName() const;
</span><del>-    unsigned long estimatedSize() const;
</del><ins>+    unsigned estimatedSize() const;
</ins><span class="cx">     String fileName() const;
</span><span class="cx">     DatabaseDetails details() const;
</span><span class="cx">     SQLiteDatabase&amp; sqliteDatabase() { return m_sqliteDatabase; }
</span><span class="lines">@@ -99,16 +100,16 @@
</span><span class="cx">     bool hadDeletes();
</span><span class="cx">     void resetAuthorizer();
</span><span class="cx"> 
</span><del>-    DatabaseContext* databaseContext() const { return m_databaseContext.get(); }
-
-    ScriptExecutionContext* scriptExecutionContext() { return m_scriptExecutionContext.get(); }
</del><ins>+    DatabaseContext&amp; databaseContext() { return m_databaseContext; }
+    DatabaseThread&amp; databaseThread();
+    ScriptExecutionContext&amp; scriptExecutionContext() { return m_scriptExecutionContext; }
</ins><span class="cx">     void logErrorMessage(const String&amp; message);
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;String&gt; tableNames();
</span><span class="cx"> 
</span><del>-    virtual SecurityOrigin* securityOrigin() const;
</del><ins>+    SecurityOrigin&amp; securityOrigin();
</ins><span class="cx"> 
</span><del>-    virtual void markAsDeletedAndClose();
</del><ins>+    void markAsDeletedAndClose();
</ins><span class="cx">     bool deleted() const { return m_deleted; }
</span><span class="cx"> 
</span><span class="cx">     void scheduleTransactionCallback(SQLTransaction*);
</span><span class="lines">@@ -116,7 +117,7 @@
</span><span class="cx">     void incrementalVacuumIfNeeded();
</span><span class="cx"> 
</span><span class="cx">     // Called from DatabaseTask
</span><del>-    bool performOpenAndVerify(bool shouldSetVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage);
</del><ins>+    ExceptionOr&lt;void&gt; performOpenAndVerify(bool shouldSetVersionInNewDatabase);
</ins><span class="cx">     Vector&lt;String&gt; performGetTableNames();
</span><span class="cx"> 
</span><span class="cx">     // Called from DatabaseTask and DatabaseThread
</span><span class="lines">@@ -123,7 +124,7 @@
</span><span class="cx">     void performClose();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    Database(RefPtr&lt;DatabaseContext&gt;&amp;&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize);
</del><ins>+    Database(DatabaseContext&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize);
</ins><span class="cx"> 
</span><span class="cx">     void closeDatabase();
</span><span class="cx"> 
</span><span class="lines">@@ -131,7 +132,7 @@
</span><span class="cx">     bool setVersionInDatabase(const String&amp; version, bool shouldCacheVersion = true);
</span><span class="cx">     void setExpectedVersion(const String&amp;);
</span><span class="cx">     const String&amp; expectedVersion() const { return m_expectedVersion; }
</span><del>-    String getCachedVersion()const;
</del><ins>+    String getCachedVersion() const;
</ins><span class="cx">     void setCachedVersion(const String&amp;);
</span><span class="cx">     bool getActualVersionForTransaction(String&amp; version);
</span><span class="cx"> 
</span><span class="lines">@@ -143,36 +144,35 @@
</span><span class="cx">     String databaseDebugName() const;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    RefPtr&lt;ScriptExecutionContext&gt; m_scriptExecutionContext;
-    RefPtr&lt;SecurityOrigin&gt; m_contextThreadSecurityOrigin;
-    RefPtr&lt;SecurityOrigin&gt; m_databaseThreadSecurityOrigin;
-    RefPtr&lt;DatabaseContext&gt; m_databaseContext;
</del><ins>+    Ref&lt;ScriptExecutionContext&gt; m_scriptExecutionContext;
+    Ref&lt;SecurityOrigin&gt; m_contextThreadSecurityOrigin;
+    Ref&lt;SecurityOrigin&gt; m_databaseThreadSecurityOrigin;
+    Ref&lt;DatabaseContext&gt; m_databaseContext;
</ins><span class="cx"> 
</span><del>-    bool m_deleted;
</del><ins>+    bool m_deleted { false };
</ins><span class="cx">     bool m_hasPendingCreationEvent { false };
</span><span class="cx"> 
</span><span class="cx">     String m_name;
</span><span class="cx">     String m_expectedVersion;
</span><span class="cx">     String m_displayName;
</span><del>-    unsigned long m_estimatedSize;
</del><ins>+    unsigned m_estimatedSize;
</ins><span class="cx">     String m_filename;
</span><span class="cx"> 
</span><span class="cx">     DatabaseGuid m_guid;
</span><del>-    bool m_opened;
-    bool m_new;
</del><ins>+    bool m_opened { false };
+    bool m_new { false };
</ins><span class="cx"> 
</span><span class="cx">     SQLiteDatabase m_sqliteDatabase;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;DatabaseAuthorizer&gt; m_databaseAuthorizer;
</del><ins>+    Ref&lt;DatabaseAuthorizer&gt; m_databaseAuthorizer;
</ins><span class="cx"> 
</span><del>-    Deque&lt;RefPtr&lt;SQLTransaction&gt;&gt; m_transactionQueue;
</del><ins>+    Deque&lt;Ref&lt;SQLTransaction&gt;&gt; m_transactionQueue;
</ins><span class="cx">     Lock m_transactionInProgressMutex;
</span><del>-    bool m_transactionInProgress;
-    bool m_isTransactionQueueEnabled;
</del><ins>+    bool m_transactionInProgress { false };
+    bool m_isTransactionQueueEnabled { true };
</ins><span class="cx"> 
</span><span class="cx">     friend class ChangeVersionWrapper;
</span><span class="cx">     friend class DatabaseManager;
</span><del>-    friend class DatabaseServer; // FIXME: remove this when the backend has been split out.
</del><span class="cx">     friend class SQLTransaction;
</span><span class="cx">     friend class SQLTransactionBackend;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/Database.idl (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/Database.idl        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/Database.idl        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -26,7 +26,9 @@
</span><span class="cx">  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-interface Database {
</del><ins>+[
+    ImplementationLacksVTable
+] interface Database {
</ins><span class="cx">     readonly attribute DOMString version;
</span><span class="cx">     void changeVersion(DOMString oldVersion, DOMString newVersion, optional SQLTransactionCallback? callback, optional SQLTransactionErrorCallback? errorCallback, optional VoidCallback? successCallback);
</span><span class="cx">     void transaction(SQLTransactionCallback callback, optional SQLTransactionErrorCallback? errorCallback, optional VoidCallback? successCallback);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -94,23 +94,14 @@
</span><span class="cx"> // DatabaseContext will outlive both regardless of which of the 2 destructs first.
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-DatabaseContext::DatabaseContext(ScriptExecutionContext* context)
-    : ActiveDOMObject(context)
-    , m_hasOpenDatabases(false)
-    , m_isRegistered(true) // will register on construction below.
-    , m_hasRequestedTermination(false)
</del><ins>+DatabaseContext::DatabaseContext(ScriptExecutionContext&amp; context)
+    : ActiveDOMObject(&amp;context)
</ins><span class="cx"> {
</span><span class="cx">     // ActiveDOMObject expects this to be called to set internal flags.
</span><span class="cx">     suspendIfNeeded();
</span><span class="cx"> 
</span><del>-    context-&gt;setDatabaseContext(this);
-
-    // For debug accounting only. We must do this before we register the
-    // instance. The assertions assume this.
-    auto&amp; databaseManager = DatabaseManager::singleton();
-    databaseManager.didConstructDatabaseContext();
-
-    databaseManager.registerDatabaseContext(this);
</del><ins>+    ASSERT(!context.databaseContext());
+    context.setDatabaseContext(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> DatabaseContext::~DatabaseContext()
</span><span class="lines">@@ -117,10 +108,7 @@
</span><span class="cx"> {
</span><span class="cx">     stopDatabases();
</span><span class="cx">     ASSERT(!m_databaseThread || m_databaseThread-&gt;terminationRequested());
</span><del>-
-    // For debug accounting only. We must call this last. The assertions assume
-    // this.
-    DatabaseManager::singleton().didDestructDatabaseContext();
</del><ins>+    ASSERT(!scriptExecutionContext() || !scriptExecutionContext()-&gt;databaseContext());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // This is called if the associated ScriptExecutionContext is destroyed while
</span><span class="lines">@@ -171,9 +159,12 @@
</span><span class="cx"> 
</span><span class="cx"> bool DatabaseContext::stopDatabases(DatabaseTaskSynchronizer* synchronizer)
</span><span class="cx"> {
</span><del>-    if (m_isRegistered) {
-        DatabaseManager::singleton().unregisterDatabaseContext(this);
-        m_isRegistered = false;
</del><ins>+    // FIXME: What guarantees this is never called after the script execution context is null?
+    ASSERT(scriptExecutionContext());
+
+    if (scriptExecutionContext()-&gt;databaseContext()) {
+        ASSERT(scriptExecutionContext()-&gt;databaseContext() == this);
+        scriptExecutionContext()-&gt;setDatabaseContext(nullptr);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Though we initiate termination of the DatabaseThread here in
</span><span class="lines">@@ -191,6 +182,7 @@
</span><span class="cx">         m_hasRequestedTermination = true;
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><ins>+
</ins><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~DatabaseContext();
</span><span class="cx"> 
</span><ins>+    DatabaseThread* existingDatabaseThread() const { return m_databaseThread.get(); }
</ins><span class="cx">     DatabaseThread* databaseThread();
</span><span class="cx"> 
</span><span class="cx">     void setHasOpenDatabases() { m_hasOpenDatabases = true; }
</span><span class="lines">@@ -58,13 +59,13 @@
</span><span class="cx">     bool allowDatabaseAccess() const;
</span><span class="cx">     void databaseExceededQuota(const String&amp; name, DatabaseDetails);
</span><span class="cx"> 
</span><del>-    ScriptExecutionContext* scriptExecutionContext() const { return m_scriptExecutionContext; }
</del><ins>+    using ActiveDOMObject::scriptExecutionContext;
</ins><span class="cx">     SecurityOrigin* securityOrigin() const;
</span><span class="cx"> 
</span><span class="cx">     bool isContextThread() const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    explicit DatabaseContext(ScriptExecutionContext*);
</del><ins>+    explicit DatabaseContext(ScriptExecutionContext&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void stopDatabases() { stopDatabases(nullptr); }
</span><span class="cx"> 
</span><span class="lines">@@ -74,9 +75,8 @@
</span><span class="cx">     const char* activeDOMObjectName() const override { return &quot;DatabaseContext&quot;; }
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;DatabaseThread&gt; m_databaseThread;
</span><del>-    bool m_hasOpenDatabases; // This never changes back to false, even after the database thread is closed.
-    bool m_isRegistered;
-    bool m_hasRequestedTermination;
</del><ins>+    bool m_hasOpenDatabases { false }; // This never changes back to false, even after the database thread is closed.
+    bool m_hasRequestedTermination { false };
</ins><span class="cx"> 
</span><span class="cx">     friend class DatabaseManager;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseErrorh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/Modules/webdatabase/DatabaseError.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseError.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseError.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,39 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#pragma once
-
-namespace WebCore {
-
-enum class DatabaseError {
-    None = 0,
-    DatabaseIsBeingDeleted,
-    DatabaseSizeExceededQuota,
-    DatabaseSizeOverflowed,
-    GenericSecurityError,
-    InvalidDatabaseState
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -26,12 +26,11 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;DatabaseManager.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;AbstractDatabaseServer.h&quot;
</del><span class="cx"> #include &quot;Database.h&quot;
</span><span class="cx"> #include &quot;DatabaseCallback.h&quot;
</span><span class="cx"> #include &quot;DatabaseContext.h&quot;
</span><del>-#include &quot;DatabaseServer.h&quot;
</del><span class="cx"> #include &quot;DatabaseTask.h&quot;
</span><ins>+#include &quot;DatabaseTracker.h&quot;
</ins><span class="cx"> #include &quot;ExceptionCode.h&quot;
</span><span class="cx"> #include &quot;InspectorInstrumentation.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="lines">@@ -43,17 +42,31 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-DatabaseManager::ProposedDatabase::ProposedDatabase(DatabaseManager&amp; manager, SecurityOrigin* origin, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
</del><ins>+class DatabaseManager::ProposedDatabase {
+public:
+    ProposedDatabase(DatabaseManager&amp;, SecurityOrigin&amp;, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize);
+    ~ProposedDatabase();
+
+    SecurityOrigin&amp; origin() { return m_origin; }
+    DatabaseDetails&amp; details() { return m_details; }
+
+private:
+    DatabaseManager&amp; m_manager;
+    Ref&lt;SecurityOrigin&gt; m_origin;
+    DatabaseDetails m_details;
+};
+
+DatabaseManager::ProposedDatabase::ProposedDatabase(DatabaseManager&amp; manager, SecurityOrigin&amp; origin, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
</ins><span class="cx">     : m_manager(manager)
</span><del>-    , m_origin(origin-&gt;isolatedCopy())
</del><ins>+    , m_origin(origin.isolatedCopy())
</ins><span class="cx">     , m_details(name.isolatedCopy(), displayName.isolatedCopy(), estimatedSize, 0, 0, 0)
</span><span class="cx"> {
</span><del>-    m_manager.addProposedDatabase(this);
</del><ins>+    m_manager.addProposedDatabase(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-DatabaseManager::ProposedDatabase::~ProposedDatabase()
</del><ins>+inline DatabaseManager::ProposedDatabase::~ProposedDatabase()
</ins><span class="cx"> {
</span><del>-    m_manager.removeProposedDatabase(this);
</del><ins>+    m_manager.removeProposedDatabase(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> DatabaseManager&amp; DatabaseManager::singleton()
</span><span class="lines">@@ -62,39 +75,17 @@
</span><span class="cx">     return instance;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DatabaseManager::DatabaseManager()
-    : m_server(new DatabaseServer)
-    , m_client(nullptr)
-    , m_databaseIsAvailable(true)
-#if !ASSERT_DISABLED
-    , m_databaseContextRegisteredCount(0)
-    , m_databaseContextInstanceCount(0)
-#endif
-{
-    ASSERT(m_server); // We should always have a server to work with.
-}
-
</del><span class="cx"> void DatabaseManager::initialize(const String&amp; databasePath)
</span><span class="cx"> {
</span><del>-    m_server-&gt;initialize(databasePath);
</del><ins>+    DatabaseTracker::initializeTracker(databasePath);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DatabaseManager::setClient(DatabaseManagerClient* client)
</span><span class="cx"> {
</span><span class="cx">     m_client = client;
</span><del>-    m_server-&gt;setClient(client);
</del><ins>+    DatabaseTracker::singleton().setClient(client);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-String DatabaseManager::databaseDirectoryPath() const
-{
-    return m_server-&gt;databaseDirectoryPath();
-}
-
-void DatabaseManager::setDatabaseDirectoryPath(const String&amp; path)
-{
-    m_server-&gt;setDatabaseDirectoryPath(path);
-}
-
</del><span class="cx"> bool DatabaseManager::isAvailable()
</span><span class="cx"> {
</span><span class="cx">     return m_databaseIsAvailable;
</span><span class="lines">@@ -105,188 +96,116 @@
</span><span class="cx">     m_databaseIsAvailable = available;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;DatabaseContext&gt; DatabaseManager::existingDatabaseContextFor(ScriptExecutionContext* context)
</del><ins>+Ref&lt;DatabaseContext&gt; DatabaseManager::databaseContext(ScriptExecutionContext&amp; context)
</ins><span class="cx"> {
</span><del>-    std::lock_guard&lt;Lock&gt; lock(m_mutex);
-
-    ASSERT(m_databaseContextRegisteredCount &gt;= 0);
-    ASSERT(m_databaseContextInstanceCount &gt;= 0);
-    ASSERT(m_databaseContextRegisteredCount &lt;= m_databaseContextInstanceCount);
-
-    RefPtr&lt;DatabaseContext&gt; databaseContext = adoptRef(m_contextMap.get(context));
-    if (databaseContext) {
-        // If we're instantiating a new DatabaseContext, the new instance would
-        // carry a new refCount of 1. The client expects this and will simply
-        // adoptRef the databaseContext without ref'ing it.
-        //     However, instead of instantiating a new instance, we're reusing
-        // an existing one that corresponds to the specified ScriptExecutionContext.
-        // Hence, that new refCount need to be attributed to the reused instance
-        // to ensure that the refCount is accurate when the client adopts the ref.
-        // We do this by ref'ing the reused databaseContext before returning it.
-        databaseContext-&gt;ref();
-    }
-    return databaseContext;
</del><ins>+    if (auto databaseContext = context.databaseContext())
+        return *databaseContext;
+    return adoptRef(*new DatabaseContext(context));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;DatabaseContext&gt; DatabaseManager::databaseContextFor(ScriptExecutionContext* context)
-{
-    RefPtr&lt;DatabaseContext&gt; databaseContext = existingDatabaseContextFor(context);
-    if (!databaseContext)
-        databaseContext = adoptRef(*new DatabaseContext(context));
-    return databaseContext;
-}
</del><ins>+#if LOG_DISABLED
</ins><span class="cx"> 
</span><del>-void DatabaseManager::registerDatabaseContext(DatabaseContext* databaseContext)
</del><ins>+static inline void logOpenDatabaseError(ScriptExecutionContext&amp;, const String&amp;)
</ins><span class="cx"> {
</span><del>-    std::lock_guard&lt;Lock&gt; lock(m_mutex);
-
-    ScriptExecutionContext* context = databaseContext-&gt;scriptExecutionContext();
-    m_contextMap.set(context, databaseContext);
-#if !ASSERT_DISABLED
-    m_databaseContextRegisteredCount++;
-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseManager::unregisterDatabaseContext(DatabaseContext* databaseContext)
-{
-    std::lock_guard&lt;Lock&gt; lock(m_mutex);
</del><ins>+#else
</ins><span class="cx"> 
</span><del>-    ScriptExecutionContext* context = databaseContext-&gt;scriptExecutionContext();
-    ASSERT(m_contextMap.get(context));
-#if !ASSERT_DISABLED
-    m_databaseContextRegisteredCount--;
-#endif
-    m_contextMap.remove(context);
-}
-
-#if !ASSERT_DISABLED
-void DatabaseManager::didConstructDatabaseContext()
</del><ins>+static void logOpenDatabaseError(ScriptExecutionContext&amp; context, const String&amp; name)
</ins><span class="cx"> {
</span><del>-    std::lock_guard&lt;Lock&gt; lock(m_mutex);
-
-    m_databaseContextInstanceCount++;
</del><ins>+    LOG(StorageAPI, &quot;Database %s for origin %s not allowed to be established&quot;, name.utf8().data(),
+        context.securityOrigin()-&gt;toString().utf8().data());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseManager::didDestructDatabaseContext()
-{
-    std::lock_guard&lt;Lock&gt; lock(m_mutex);
-
-    m_databaseContextInstanceCount--;
-    ASSERT(m_databaseContextRegisteredCount &lt;= m_databaseContextInstanceCount);
-}
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-ExceptionCode DatabaseManager::exceptionCodeForDatabaseError(DatabaseError error)
</del><ins>+ExceptionOr&lt;Ref&lt;Database&gt;&gt; DatabaseManager::openDatabaseBackend(ScriptExecutionContext&amp; context, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize, bool setVersionInNewDatabase)
</ins><span class="cx"> {
</span><del>-    switch (error) {
-    case DatabaseError::None:
-        return 0;
-    case DatabaseError::DatabaseIsBeingDeleted:
-    case DatabaseError::DatabaseSizeExceededQuota:
-    case DatabaseError::DatabaseSizeOverflowed:
-    case DatabaseError::GenericSecurityError:
-        return SECURITY_ERR;
-    case DatabaseError::InvalidDatabaseState:
-        return INVALID_STATE_ERR;
-    }
-    ASSERT_NOT_REACHED();
-    return 0; // Make some older compilers happy.
-}
</del><ins>+    auto databaseContext = this-&gt;databaseContext(context);
</ins><span class="cx"> 
</span><del>-static void logOpenDatabaseError(ScriptExecutionContext* context, const String&amp; name)
-{
-    UNUSED_PARAM(context);
-    UNUSED_PARAM(name);
-    LOG(StorageAPI, &quot;Database %s for origin %s not allowed to be established&quot;, name.ascii().data(),
-        context-&gt;securityOrigin()-&gt;toString().ascii().data());
-}
</del><ins>+    auto backend = tryToOpenDatabaseBackend(databaseContext, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, FirstTryToOpenDatabase);
</ins><span class="cx"> 
</span><del>-RefPtr&lt;Database&gt; DatabaseManager::openDatabaseBackend(ScriptExecutionContext* context, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp; error, String&amp; errorMessage)
-{
-    ASSERT(error == DatabaseError::None);
-
-    RefPtr&lt;DatabaseContext&gt; databaseContext = databaseContextFor(context);
-
-    RefPtr&lt;Database&gt; backend = m_server-&gt;openDatabase(databaseContext, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage);
-
-    if (!backend) {
-        ASSERT(error != DatabaseError::None);
-
-        switch (error) {
-        case DatabaseError::DatabaseIsBeingDeleted:
-        case DatabaseError::DatabaseSizeOverflowed:
-        case DatabaseError::GenericSecurityError:
-            logOpenDatabaseError(context, name);
-            return nullptr;
-
-        case DatabaseError::InvalidDatabaseState:
-            logErrorMessage(context, errorMessage);
-            return nullptr;
-
-        case DatabaseError::DatabaseSizeExceededQuota:
</del><ins>+    if (backend.hasException()) {
+        auto exception = backend.releaseException();
+        if (exception.code() != QUOTA_EXCEEDED_ERR)
+            backend = WTFMove(exception); // FIXME: Bad to have to move exception out and back in.
+        else {
</ins><span class="cx">             // Notify the client that we've exceeded the database quota.
</span><span class="cx">             // The client may want to increase the quota, and we'll give it
</span><span class="cx">             // one more try after if that is the case.
</span><span class="cx">             {
</span><del>-                ProposedDatabase proposedDb(*this, context-&gt;securityOrigin(), name, displayName, estimatedSize);
-                databaseContext-&gt;databaseExceededQuota(name, proposedDb.details());
</del><ins>+                // FIXME: What guarantees context.securityOrigin() is non-null?
+                ProposedDatabase proposedDatabase { *this, *context.securityOrigin(), name, displayName, estimatedSize };
+                databaseContext-&gt;databaseExceededQuota(name, proposedDatabase.details());
</ins><span class="cx">             }
</span><del>-            error = DatabaseError::None;
-
-            backend = m_server-&gt;openDatabase(databaseContext, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage, AbstractDatabaseServer::RetryOpenDatabase);
-            break;
-
-        default:
-            ASSERT_NOT_REACHED();
</del><ins>+            backend = tryToOpenDatabaseBackend(databaseContext, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, RetryOpenDatabase);
</ins><span class="cx">         }
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-        if (!backend) {
-            ASSERT(error != DatabaseError::None);
-
-            if (error == DatabaseError::InvalidDatabaseState) {
-                logErrorMessage(context, errorMessage);
-                return nullptr;
-            }
-
</del><ins>+    if (backend.hasException()) {
+        auto exception = backend.releaseException();
+        if (exception.code() == INVALID_STATE_ERR)
+            logErrorMessage(context, exception.message());
+        else
</ins><span class="cx">             logOpenDatabaseError(context, name);
</span><del>-            return nullptr;
-        }
</del><ins>+        backend = WTFMove(exception); // FIXME: Bad to have to move exception out and back in.
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return backend;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseManager::addProposedDatabase(ProposedDatabase* proposedDb)
</del><ins>+ExceptionOr&lt;Ref&lt;Database&gt;&gt; DatabaseManager::tryToOpenDatabaseBackend(DatabaseContext&amp; backendContext, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize, bool setVersionInNewDatabase,
+    OpenAttempt attempt)
</ins><span class="cx"> {
</span><del>-    std::lock_guard&lt;Lock&gt; lock(m_mutex);
</del><ins>+    ExceptionOr&lt;void&gt; preflightResult;
+    switch (attempt) {
+    case FirstTryToOpenDatabase:
+        preflightResult = DatabaseTracker::singleton().canEstablishDatabase(backendContext, name, estimatedSize);
+        break;
+    case RetryOpenDatabase:
+        preflightResult = DatabaseTracker::singleton().retryCanEstablishDatabase(backendContext, name, estimatedSize);
+        break;
+    }
+    if (preflightResult.hasException())
+        return preflightResult.releaseException();
</ins><span class="cx"> 
</span><del>-    m_proposedDatabases.add(proposedDb);
</del><ins>+    auto database = adoptRef(*new Database(backendContext, name, expectedVersion, displayName, estimatedSize));
+
+    auto openResult = database-&gt;openAndVerifyVersion(setVersionInNewDatabase);
+    if (openResult.hasException())
+        return openResult.releaseException();
+
+    // FIXME: What guarantees backendContext.securityOrigin() is non-null?
+    DatabaseTracker::singleton().setDatabaseDetails(*backendContext.securityOrigin(), name, displayName, estimatedSize);
+    return WTFMove(database);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseManager::removeProposedDatabase(ProposedDatabase* proposedDb)
</del><ins>+void DatabaseManager::addProposedDatabase(ProposedDatabase&amp; database)
</ins><span class="cx"> {
</span><del>-    std::lock_guard&lt;Lock&gt; lock(m_mutex);
</del><ins>+    std::lock_guard&lt;Lock&gt; lock { m_proposedDatabasesMutex };
+    m_proposedDatabases.add(&amp;database);
+}
</ins><span class="cx"> 
</span><del>-    m_proposedDatabases.remove(proposedDb);
</del><ins>+void DatabaseManager::removeProposedDatabase(ProposedDatabase&amp; database)
+{
+    std::lock_guard&lt;Lock&gt; lock { m_proposedDatabasesMutex };
+    m_proposedDatabases.remove(&amp;database);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;Database&gt; DatabaseManager::openDatabase(ScriptExecutionContext* context,
-    const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName,
-    unsigned long estimatedSize, RefPtr&lt;DatabaseCallback&gt;&amp;&amp; creationCallback,
-    DatabaseError&amp; error)
</del><ins>+ExceptionOr&lt;Ref&lt;Database&gt;&gt; DatabaseManager::openDatabase(ScriptExecutionContext&amp; context, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize, RefPtr&lt;DatabaseCallback&gt;&amp;&amp; creationCallback)
</ins><span class="cx"> {
</span><span class="cx">     ScriptController::initializeThreading();
</span><del>-    ASSERT(error == DatabaseError::None);
</del><span class="cx"> 
</span><span class="cx">     bool setVersionInNewDatabase = !creationCallback;
</span><del>-    String errorMessage;
-    RefPtr&lt;Database&gt; database = openDatabaseBackend(context, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage);
-    if (!database)
-        return nullptr;
</del><ins>+    auto openResult = openDatabaseBackend(context, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase);
+    if (openResult.hasException())
+        return openResult.releaseException();
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;DatabaseContext&gt; databaseContext = databaseContextFor(context);
</del><ins>+    RefPtr&lt;Database&gt; database = openResult.releaseReturnValue();
+
+    auto databaseContext = this-&gt;databaseContext(context);
</ins><span class="cx">     databaseContext-&gt;setHasOpenDatabases();
</span><del>-    InspectorInstrumentation::didOpenDatabase(context, database.copyRef(), context-&gt;securityOrigin()-&gt;host(), name, expectedVersion);
</del><ins>+    InspectorInstrumentation::didOpenDatabase(&amp;context, database.copyRef(), context.securityOrigin()-&gt;host(), name, expectedVersion);
</ins><span class="cx"> 
</span><span class="cx">     if (database-&gt;isNew() &amp;&amp; creationCallback.get()) {
</span><span class="cx">         LOG(StorageAPI, &quot;Scheduling DatabaseCreationCallbackTask for database %p\n&quot;, database.get());
</span><span class="lines">@@ -297,110 +216,54 @@
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(database);
-    return database;
</del><ins>+    return database.releaseNonNull();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseManager::hasOpenDatabases(ScriptExecutionContext* context)
</del><ins>+bool DatabaseManager::hasOpenDatabases(ScriptExecutionContext&amp; context)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;DatabaseContext&gt; databaseContext = existingDatabaseContextFor(context);
-    if (!databaseContext)
-        return false;
-    return databaseContext-&gt;hasOpenDatabases();
</del><ins>+    auto databaseContext = context.databaseContext();
+    return databaseContext &amp;&amp; databaseContext-&gt;hasOpenDatabases();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseManager::stopDatabases(ScriptExecutionContext* context, DatabaseTaskSynchronizer* synchronizer)
</del><ins>+void DatabaseManager::stopDatabases(ScriptExecutionContext&amp; context, DatabaseTaskSynchronizer* synchronizer)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;DatabaseContext&gt; databaseContext = existingDatabaseContextFor(context);
-    if (!databaseContext || !databaseContext-&gt;stopDatabases(synchronizer))
</del><ins>+    auto databaseContext = context.databaseContext();
+    if (!databaseContext || !databaseContext-&gt;stopDatabases(synchronizer)) {
</ins><span class="cx">         if (synchronizer)
</span><span class="cx">             synchronizer-&gt;taskCompleted();
</span><ins>+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-String DatabaseManager::fullPathForDatabase(SecurityOrigin* origin, const String&amp; name, bool createIfDoesNotExist)
</del><ins>+String DatabaseManager::fullPathForDatabase(SecurityOrigin&amp; origin, const String&amp; name, bool createIfDoesNotExist)
</ins><span class="cx"> {
</span><span class="cx">     {
</span><del>-        std::lock_guard&lt;Lock&gt; lock(m_mutex);
-
</del><ins>+        std::lock_guard&lt;Lock&gt; lock { m_proposedDatabasesMutex };
</ins><span class="cx">         for (auto* proposedDatabase : m_proposedDatabases) {
</span><del>-            if (proposedDatabase-&gt;details().name() == name &amp;&amp; proposedDatabase-&gt;origin()-&gt;equal(origin))
</del><ins>+            if (proposedDatabase-&gt;details().name() == name &amp;&amp; proposedDatabase-&gt;origin().equal(&amp;origin))
</ins><span class="cx">                 return String();
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-
-    return m_server-&gt;fullPathForDatabase(origin, name, createIfDoesNotExist);
</del><ins>+    return DatabaseTracker::singleton().fullPathForDatabase(origin, name, createIfDoesNotExist);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseManager::hasEntryForOrigin(SecurityOrigin* origin)
</del><ins>+DatabaseDetails DatabaseManager::detailsForNameAndOrigin(const String&amp; name, SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><del>-    return m_server-&gt;hasEntryForOrigin(origin);
-}
-
-void DatabaseManager::origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result)
-{
-    m_server-&gt;origins(result);
-}
-
-bool DatabaseManager::databaseNamesForOrigin(SecurityOrigin* origin, Vector&lt;String&gt;&amp; result)
-{
-    return m_server-&gt;databaseNamesForOrigin(origin, result);
-}
-
-DatabaseDetails DatabaseManager::detailsForNameAndOrigin(const String&amp; name, SecurityOrigin* origin)
-{
</del><span class="cx">     {
</span><del>-        std::lock_guard&lt;Lock&gt; lock(m_mutex);
-
</del><ins>+        std::lock_guard&lt;Lock&gt; lock { m_proposedDatabasesMutex };
</ins><span class="cx">         for (auto* proposedDatabase : m_proposedDatabases) {
</span><del>-            if (proposedDatabase-&gt;details().name() == name &amp;&amp; proposedDatabase-&gt;origin()-&gt;equal(origin)) {
</del><ins>+            if (proposedDatabase-&gt;details().name() == name &amp;&amp; proposedDatabase-&gt;origin().equal(&amp;origin)) {
</ins><span class="cx">                 ASSERT(proposedDatabase-&gt;details().threadID() == std::this_thread::get_id() || isMainThread());
</span><del>-
</del><span class="cx">                 return proposedDatabase-&gt;details();
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return m_server-&gt;detailsForNameAndOrigin(name, origin);
</del><ins>+    return DatabaseTracker::singleton().detailsForNameAndOrigin(name, origin);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long DatabaseManager::usageForOrigin(SecurityOrigin* origin)
</del><ins>+void DatabaseManager::logErrorMessage(ScriptExecutionContext&amp; context, const String&amp; message)
</ins><span class="cx"> {
</span><del>-    return m_server-&gt;usageForOrigin(origin);
</del><ins>+    context.addConsoleMessage(MessageSource::Storage, MessageLevel::Error, message);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long DatabaseManager::quotaForOrigin(SecurityOrigin* origin)
-{
-    return m_server-&gt;quotaForOrigin(origin);
-}
-
-void DatabaseManager::setQuota(SecurityOrigin* origin, unsigned long long quotaSize)
-{
-    m_server-&gt;setQuota(origin, quotaSize);
-}
-
-void DatabaseManager::deleteAllDatabasesImmediately()
-{
-    m_server-&gt;deleteAllDatabasesImmediately();
-}
-
-bool DatabaseManager::deleteOrigin(SecurityOrigin* origin)
-{
-    return m_server-&gt;deleteOrigin(origin);
-}
-
-bool DatabaseManager::deleteDatabase(SecurityOrigin* origin, const String&amp; name)
-{
-    return m_server-&gt;deleteDatabase(origin, name);
-}
-
-void DatabaseManager::closeAllDatabases()
-{
-    m_server-&gt;closeAllDatabases();
-}
-
-void DatabaseManager::logErrorMessage(ScriptExecutionContext* context, const String&amp; message)
-{
-    context-&gt;addConsoleMessage(MessageSource::Storage, MessageLevel::Error, message);
-}
-
</del><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DatabaseBasicTypes.h&quot;
</span><span class="cx"> #include &quot;DatabaseDetails.h&quot;
</span><del>-#include &quot;DatabaseError.h&quot;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &lt;wtf/Assertions.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="lines">@@ -36,17 +36,17 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class AbstractDatabaseServer;
</del><span class="cx"> class Database;
</span><span class="cx"> class DatabaseCallback;
</span><span class="cx"> class DatabaseContext;
</span><span class="cx"> class DatabaseManagerClient;
</span><span class="cx"> class DatabaseTaskSynchronizer;
</span><ins>+class Exception;
</ins><span class="cx"> class SecurityOrigin;
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> 
</span><span class="cx"> class DatabaseManager {
</span><del>-    WTF_MAKE_NONCOPYABLE(DatabaseManager); WTF_MAKE_FAST_ALLOCATED;
</del><ins>+    WTF_MAKE_NONCOPYABLE(DatabaseManager);
</ins><span class="cx">     friend class WTF::NeverDestroyed&lt;DatabaseManager&gt;;
</span><span class="cx"> public:
</span><span class="cx">     WEBCORE_EXPORT static DatabaseManager&amp; singleton();
</span><span class="lines">@@ -53,8 +53,6 @@
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void initialize(const String&amp; databasePath);
</span><span class="cx">     WEBCORE_EXPORT void setClient(DatabaseManagerClient*);
</span><del>-    String databaseDirectoryPath() const;
-    void setDatabaseDirectoryPath(const String&amp;);
</del><span class="cx"> 
</span><span class="cx">     bool isAvailable();
</span><span class="cx">     WEBCORE_EXPORT void setIsAvailable(bool);
</span><span class="lines">@@ -61,92 +59,36 @@
</span><span class="cx"> 
</span><span class="cx">     // This gets a DatabaseContext for the specified ScriptExecutionContext.
</span><span class="cx">     // If one doesn't already exist, it will create a new one.
</span><del>-    RefPtr&lt;DatabaseContext&gt; databaseContextFor(ScriptExecutionContext*);
</del><ins>+    Ref&lt;DatabaseContext&gt; databaseContext(ScriptExecutionContext&amp;);
</ins><span class="cx"> 
</span><del>-    // These 2 methods are for DatabaseContext (un)registration, and should only
-    // be called by the DatabaseContext constructor and destructor.
-    void registerDatabaseContext(DatabaseContext*);
-    void unregisterDatabaseContext(DatabaseContext*);
</del><ins>+    ExceptionOr&lt;Ref&lt;Database&gt;&gt; openDatabase(ScriptExecutionContext&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize, RefPtr&lt;DatabaseCallback&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><del>-#if !ASSERT_DISABLED
-    void didConstructDatabaseContext();
-    void didDestructDatabaseContext();
-#else
-    void didConstructDatabaseContext() { }
-    void didDestructDatabaseContext() { }
-#endif
</del><ins>+    WEBCORE_EXPORT bool hasOpenDatabases(ScriptExecutionContext&amp;);
+    void stopDatabases(ScriptExecutionContext&amp;, DatabaseTaskSynchronizer*);
</ins><span class="cx"> 
</span><del>-    static ExceptionCode exceptionCodeForDatabaseError(DatabaseError);
</del><ins>+    String fullPathForDatabase(SecurityOrigin&amp;, const String&amp; name, bool createIfDoesNotExist = true);
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;Database&gt; openDatabase(ScriptExecutionContext*, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, RefPtr&lt;DatabaseCallback&gt;&amp;&amp;, DatabaseError&amp;);
</del><ins>+    WEBCORE_EXPORT DatabaseDetails detailsForNameAndOrigin(const String&amp;, SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><del>-    WEBCORE_EXPORT bool hasOpenDatabases(ScriptExecutionContext*);
-
-    WEBCORE_EXPORT void closeAllDatabases();
-
-    void stopDatabases(ScriptExecutionContext*, DatabaseTaskSynchronizer*);
-
-    String fullPathForDatabase(SecurityOrigin*, const String&amp; name, bool createIfDoesNotExist = true);
-
-    bool hasEntryForOrigin(SecurityOrigin*);
-    WEBCORE_EXPORT void origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result);
-    WEBCORE_EXPORT bool databaseNamesForOrigin(SecurityOrigin*, Vector&lt;String&gt;&amp; result);
-    WEBCORE_EXPORT DatabaseDetails detailsForNameAndOrigin(const String&amp;, SecurityOrigin*);
-
-    WEBCORE_EXPORT unsigned long long usageForOrigin(SecurityOrigin*);
-    WEBCORE_EXPORT unsigned long long quotaForOrigin(SecurityOrigin*);
-
-    WEBCORE_EXPORT void setQuota(SecurityOrigin*, unsigned long long);
-
-    WEBCORE_EXPORT void deleteAllDatabasesImmediately();
-    WEBCORE_EXPORT bool deleteOrigin(SecurityOrigin*);
-    WEBCORE_EXPORT bool deleteDatabase(SecurityOrigin*, const String&amp; name);
-
</del><span class="cx"> private:
</span><del>-    class ProposedDatabase {
-    public:
-        ProposedDatabase(DatabaseManager&amp;, SecurityOrigin*,
-            const String&amp; name, const String&amp; displayName, unsigned long estimatedSize);
-        ~ProposedDatabase();
-
-        SecurityOrigin* origin() { return m_origin.get(); }
-        DatabaseDetails&amp; details() { return m_details; }
-
-    private:
-        DatabaseManager&amp; m_manager;
-        RefPtr&lt;SecurityOrigin&gt; m_origin;
-        DatabaseDetails m_details;
-    };
-
-    DatabaseManager();
</del><ins>+    DatabaseManager() = default;
</ins><span class="cx">     ~DatabaseManager() = delete;
</span><span class="cx"> 
</span><del>-    // This gets a DatabaseContext for the specified ScriptExecutionContext if
-    // it already exist previously. Otherwise, it returns 0.
-    RefPtr&lt;DatabaseContext&gt; existingDatabaseContextFor(ScriptExecutionContext*);
</del><ins>+    enum OpenAttempt { FirstTryToOpenDatabase, RetryOpenDatabase };
+    ExceptionOr&lt;Ref&lt;Database&gt;&gt; openDatabaseBackend(ScriptExecutionContext&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize, bool setVersionInNewDatabase);
+    static ExceptionOr&lt;Ref&lt;Database&gt;&gt; tryToOpenDatabaseBackend(DatabaseContext&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned estimatedSize, bool setVersionInNewDatabase, OpenAttempt);
</ins><span class="cx"> 
</span><del>-    RefPtr&lt;Database&gt; openDatabaseBackend(ScriptExecutionContext*, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage);
</del><ins>+    class ProposedDatabase;
+    void addProposedDatabase(ProposedDatabase&amp;);
+    void removeProposedDatabase(ProposedDatabase&amp;);
</ins><span class="cx"> 
</span><del>-    void addProposedDatabase(ProposedDatabase*);
-    void removeProposedDatabase(ProposedDatabase*);
</del><ins>+    static void logErrorMessage(ScriptExecutionContext&amp;, const String&amp; message);
</ins><span class="cx"> 
</span><del>-    static void logErrorMessage(ScriptExecutionContext*, const String&amp; message);
</del><ins>+    DatabaseManagerClient* m_client { nullptr };
+    bool m_databaseIsAvailable { true };
</ins><span class="cx"> 
</span><del>-    AbstractDatabaseServer* m_server;
-    DatabaseManagerClient* m_client;
-    bool m_databaseIsAvailable;
-
-    // Access to the following fields require locking m_lock below:
-    typedef HashMap&lt;ScriptExecutionContext*, DatabaseContext*&gt; ContextMap;
-    ContextMap m_contextMap;
-#if !ASSERT_DISABLED
-    int m_databaseContextRegisteredCount;
-    int m_databaseContextInstanceCount;
-#endif
</del><ins>+    Lock m_proposedDatabasesMutex;
</ins><span class="cx">     HashSet&lt;ProposedDatabase*&gt; m_proposedDatabases;
</span><del>-
-    // This mutex protects m_contextMap, and m_proposedDatabases.
-    Lock m_mutex;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseManagerClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseManagerClient.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseManagerClient.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseManagerClient.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -34,13 +34,17 @@
</span><span class="cx"> class DatabaseManagerClient {
</span><span class="cx"> public:
</span><span class="cx">     virtual ~DatabaseManagerClient() { }
</span><del>-    virtual void dispatchDidModifyOrigin(SecurityOrigin*) = 0;
-    virtual void dispatchDidModifyDatabase(SecurityOrigin*, const String&amp; databaseName) = 0;
</del><ins>+    virtual void dispatchDidModifyOrigin(SecurityOrigin&amp;) = 0;
+    virtual void dispatchDidModifyDatabase(SecurityOrigin&amp;, const String&amp; databaseName) = 0;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><del>-    virtual void dispatchDidAddNewOrigin(SecurityOrigin*) = 0;
</del><ins>+    virtual void dispatchDidAddNewOrigin(SecurityOrigin&amp;) = 0;
</ins><span class="cx">     virtual void dispatchDidDeleteDatabase() = 0;
</span><span class="cx">     virtual void dispatchDidDeleteDatabaseOrigin() = 0;
</span><ins>+#else
+    static void dispatchDidAddNewOrigin(SecurityOrigin&amp;) { }
+    static void dispatchDidDeleteDatabase() { }
+    static void dispatchDidDeleteDatabaseOrigin() { }
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseServercpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,145 +0,0 @@
</span><del>-/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;DatabaseServer.h&quot;
-
-#include &quot;Database.h&quot;
-#include &quot;DatabaseContext.h&quot;
-#include &quot;DatabaseTracker.h&quot;
-
-namespace WebCore {
-
-void DatabaseServer::initialize(const String&amp; databasePath)
-{
-    DatabaseTracker::initializeTracker(databasePath);
-}
-
-void DatabaseServer::setClient(DatabaseManagerClient* client)
-{
-    DatabaseTracker::tracker().setClient(client);
-}
-
-String DatabaseServer::databaseDirectoryPath() const
-{
-    return DatabaseTracker::tracker().databaseDirectoryPath();
-}
-
-void DatabaseServer::setDatabaseDirectoryPath(const String&amp; path)
-{
-    DatabaseTracker::tracker().setDatabaseDirectoryPath(path);
-}
-
-String DatabaseServer::fullPathForDatabase(SecurityOrigin* origin, const String&amp; name, bool createIfDoesNotExist)
-{
-    return DatabaseTracker::tracker().fullPathForDatabase(origin, name, createIfDoesNotExist);
-}
-
-bool DatabaseServer::hasEntryForOrigin(SecurityOrigin* origin)
-{
-    return DatabaseTracker::tracker().hasEntryForOrigin(origin);
-}
-
-void DatabaseServer::origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result)
-{
-    DatabaseTracker::tracker().origins(result);
-}
-
-bool DatabaseServer::databaseNamesForOrigin(SecurityOrigin* origin, Vector&lt;String&gt;&amp; result)
-{
-    return DatabaseTracker::tracker().databaseNamesForOrigin(origin, result);
-}
-
-DatabaseDetails DatabaseServer::detailsForNameAndOrigin(const String&amp; name, SecurityOrigin* origin)
-{
-    return DatabaseTracker::tracker().detailsForNameAndOrigin(name, origin);
-}
-
-unsigned long long DatabaseServer::usageForOrigin(SecurityOrigin* origin)
-{
-    return DatabaseTracker::tracker().usageForOrigin(origin);
-}
-
-unsigned long long DatabaseServer::quotaForOrigin(SecurityOrigin* origin)
-{
-    return DatabaseTracker::tracker().quotaForOrigin(origin);
-}
-
-void DatabaseServer::setQuota(SecurityOrigin* origin, unsigned long long quotaSize)
-{
-    DatabaseTracker::tracker().setQuota(origin, quotaSize);
-}
-
-void DatabaseServer::deleteAllDatabasesImmediately()
-{
-    DatabaseTracker::tracker().deleteAllDatabasesImmediately();
-}
-
-bool DatabaseServer::deleteOrigin(SecurityOrigin* origin)
-{
-    return DatabaseTracker::tracker().deleteOrigin(origin);
-}
-
-bool DatabaseServer::deleteDatabase(SecurityOrigin* origin, const String&amp; name)
-{
-    return DatabaseTracker::tracker().deleteDatabase(origin, name);
-}
-
-void DatabaseServer::closeAllDatabases()
-{
-    DatabaseTracker::tracker().closeAllDatabases();
-}
-
-RefPtr&lt;Database&gt; DatabaseServer::openDatabase(RefPtr&lt;DatabaseContext&gt;&amp; backendContext, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError &amp;error, String&amp; errorMessage,
-    OpenAttempt attempt)
-{
-    RefPtr&lt;Database&gt; database;
-    bool success = false; // Make some older compilers happy.
-
-    switch (attempt) {
-    case FirstTryToOpenDatabase:
-        success = DatabaseTracker::tracker().canEstablishDatabase(backendContext.get(), name, estimatedSize, error);
-        break;
-    case RetryOpenDatabase:
-        success = DatabaseTracker::tracker().retryCanEstablishDatabase(backendContext.get(), name, estimatedSize, error);
-    }
-
-    if (success)
-        database = createDatabase(backendContext, name, expectedVersion, displayName, estimatedSize, setVersionInNewDatabase, error, errorMessage);
-    return database;
-}
-
-RefPtr&lt;Database&gt; DatabaseServer::createDatabase(RefPtr&lt;DatabaseContext&gt;&amp; backendContext, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp; error, String&amp; errorMessage)
-{
-    RefPtr&lt;Database&gt; database = adoptRef(new Database(backendContext.copyRef(), name, expectedVersion, displayName, estimatedSize));
-
-    if (!database-&gt;openAndVerifyVersion(setVersionInNewDatabase, error, errorMessage))
-        return nullptr;
-
-    DatabaseTracker::tracker().setDatabaseDetails(backendContext-&gt;securityOrigin(), name, displayName, estimatedSize);
-    return database;
-}
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseServerh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,68 +0,0 @@
</span><del>-/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#pragma once
-
-#include &quot;AbstractDatabaseServer.h&quot;
-
-namespace WebCore {
-
-class DatabaseServer final: public AbstractDatabaseServer {
-    WTF_MAKE_FAST_ALLOCATED;
-public:
-    DatabaseServer() { };
-    virtual ~DatabaseServer() { }
-
-    void initialize(const String&amp; databasePath) override;
-
-    void setClient(DatabaseManagerClient*) override;
-    String databaseDirectoryPath() const override;
-    void setDatabaseDirectoryPath(const String&amp;) override;
-
-    String fullPathForDatabase(SecurityOrigin*, const String&amp; name, bool createIfDoesNotExist) override;
-
-    RefPtr&lt;Database&gt; openDatabase(RefPtr&lt;DatabaseContext&gt;&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage, OpenAttempt) override;
-
-    void closeAllDatabases() override;
-
-    bool hasEntryForOrigin(SecurityOrigin*) override;
-    void origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result) override;
-    bool databaseNamesForOrigin(SecurityOrigin*, Vector&lt;String&gt;&amp; result) override;
-    DatabaseDetails detailsForNameAndOrigin(const String&amp;, SecurityOrigin*) override;
-
-    unsigned long long usageForOrigin(SecurityOrigin*) override;
-    unsigned long long quotaForOrigin(SecurityOrigin*) override;
-
-    void setQuota(SecurityOrigin*, unsigned long long) override;
-
-    void deleteAllDatabasesImmediately() override;
-    bool deleteOrigin(SecurityOrigin*) override;
-    bool deleteDatabase(SecurityOrigin*, const String&amp; name) override;
-
-protected:
-    RefPtr&lt;Database&gt; createDatabase(RefPtr&lt;DatabaseContext&gt;&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage);
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseTaskcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx">  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span class="cx">  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><ins>+
</ins><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;DatabaseTask.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -35,10 +36,6 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> DatabaseTaskSynchronizer::DatabaseTaskSynchronizer()
</span><del>-    : m_taskCompleted(false)
-#ifndef NDEBUG
-    , m_hasCheckedForTermination(false)
-#endif
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -61,25 +58,18 @@
</span><span class="cx"> DatabaseTask::DatabaseTask(Database&amp; database, DatabaseTaskSynchronizer* synchronizer)
</span><span class="cx">     : m_database(database)
</span><span class="cx">     , m_synchronizer(synchronizer)
</span><del>-#if !LOG_DISABLED
-    , m_complete(false)
-#endif
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> DatabaseTask::~DatabaseTask()
</span><span class="cx"> {
</span><del>-#if !LOG_DISABLED
</del><span class="cx">     ASSERT(m_complete || !m_synchronizer);
</span><del>-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DatabaseTask::performTask()
</span><span class="cx"> {
</span><span class="cx">     // Database tasks are meant to be used only once, so make sure this one hasn't been performed before.
</span><del>-#if !LOG_DISABLED
</del><span class="cx">     ASSERT(!m_complete);
</span><del>-#endif
</del><span class="cx"> 
</span><span class="cx">     LOG(StorageAPI, &quot;Performing %s %p\n&quot;, debugTaskName(), this);
</span><span class="cx"> 
</span><span class="lines">@@ -90,7 +80,7 @@
</span><span class="cx">     if (m_synchronizer)
</span><span class="cx">         m_synchronizer-&gt;taskCompleted();
</span><span class="cx"> 
</span><del>-#if !LOG_DISABLED
</del><ins>+#if !ASSERT_DISABLED
</ins><span class="cx">     m_complete = true;
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="lines">@@ -98,28 +88,25 @@
</span><span class="cx"> // *** DatabaseOpenTask ***
</span><span class="cx"> // Opens the database file and verifies the version matches the expected version.
</span><span class="cx"> 
</span><del>-DatabaseOpenTask::DatabaseOpenTask(Database&amp; database, bool setVersionInNewDatabase, DatabaseTaskSynchronizer&amp; synchronizer, DatabaseError&amp; error, String&amp; errorMessage, bool&amp; success)
</del><ins>+DatabaseOpenTask::DatabaseOpenTask(Database&amp; database, bool setVersionInNewDatabase, DatabaseTaskSynchronizer&amp; synchronizer, ExceptionOr&lt;void&gt;&amp; result)
</ins><span class="cx">     : DatabaseTask(database, &amp;synchronizer)
</span><span class="cx">     , m_setVersionInNewDatabase(setVersionInNewDatabase)
</span><del>-    , m_error(error)
-    , m_errorMessage(errorMessage)
-    , m_success(success)
</del><ins>+    , m_result(result)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DatabaseOpenTask::doPerformTask()
</span><span class="cx"> {
</span><del>-    String errorMessage;
-    m_success = database().performOpenAndVerify(m_setVersionInNewDatabase, m_error, errorMessage);
-    if (!m_success)
-        m_errorMessage = errorMessage.isolatedCopy();
</del><ins>+    m_result = isolatedCopy(database().performOpenAndVerify(m_setVersionInNewDatabase));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !LOG_DISABLED
</span><ins>+
</ins><span class="cx"> const char* DatabaseOpenTask::debugTaskName() const
</span><span class="cx"> {
</span><span class="cx">     return &quot;DatabaseOpenTask&quot;;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // *** DatabaseCloseTask ***
</span><span class="lines">@@ -136,10 +123,12 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !LOG_DISABLED
</span><ins>+
</ins><span class="cx"> const char* DatabaseCloseTask::debugTaskName() const
</span><span class="cx"> {
</span><span class="cx">     return &quot;DatabaseCloseTask&quot;;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // *** DatabaseTransactionTask ***
</span><span class="lines">@@ -173,31 +162,36 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !LOG_DISABLED
</span><ins>+
</ins><span class="cx"> const char* DatabaseTransactionTask::debugTaskName() const
</span><span class="cx"> {
</span><span class="cx">     return &quot;DatabaseTransactionTask&quot;;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // *** DatabaseTableNamesTask ***
</span><span class="cx"> // Retrieves a list of all tables in the database - for WebInspector support.
</span><span class="cx"> 
</span><del>-DatabaseTableNamesTask::DatabaseTableNamesTask(Database&amp; database, DatabaseTaskSynchronizer&amp; synchronizer, Vector&lt;String&gt;&amp; names)
</del><ins>+DatabaseTableNamesTask::DatabaseTableNamesTask(Database&amp; database, DatabaseTaskSynchronizer&amp; synchronizer, Vector&lt;String&gt;&amp; result)
</ins><span class="cx">     : DatabaseTask(database, &amp;synchronizer)
</span><del>-    , m_tableNames(names)
</del><ins>+    , m_result(result)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DatabaseTableNamesTask::doPerformTask()
</span><span class="cx"> {
</span><del>-    m_tableNames = database().performGetTableNames();
</del><ins>+    // FIXME: Why no need for an isolatedCopy here?
+    m_result = database().performGetTableNames();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !LOG_DISABLED
</span><ins>+
</ins><span class="cx"> const char* DatabaseTableNamesTask::debugTaskName() const
</span><span class="cx"> {
</span><span class="cx">     return &quot;DatabaseTableNamesTask&quot;;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -29,12 +29,11 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DatabaseBasicTypes.h&quot;
</span><del>-#include &quot;DatabaseError.h&quot;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;SQLTransactionBackend.h&quot;
</span><span class="cx"> #include &lt;wtf/Condition.h&gt;
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><del>-#include &lt;wtf/text/WTFString.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -57,16 +56,16 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    bool m_taskCompleted;
</del><ins>+    bool m_taskCompleted { false };
</ins><span class="cx">     Lock m_synchronousMutex;
</span><span class="cx">     Condition m_synchronousCondition;
</span><span class="cx"> #ifndef NDEBUG
</span><del>-    bool m_hasCheckedForTermination;
</del><ins>+    bool m_hasCheckedForTermination { false };
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class DatabaseTask {
</span><del>-    WTF_MAKE_NONCOPYABLE(DatabaseTask); WTF_MAKE_FAST_ALLOCATED;
</del><ins>+    WTF_MAKE_FAST_ALLOCATED;
</ins><span class="cx"> public:
</span><span class="cx">     virtual ~DatabaseTask();
</span><span class="cx"> 
</span><span class="lines">@@ -73,7 +72,8 @@
</span><span class="cx">     void performTask();
</span><span class="cx"> 
</span><span class="cx">     Database&amp; database() const { return m_database; }
</span><del>-#ifndef NDEBUG
</del><ins>+
+#if !ASSERT_DISABLED
</ins><span class="cx">     bool hasSynchronizer() const { return m_synchronizer; }
</span><span class="cx">     bool hasCheckedForTermination() const { return m_synchronizer-&gt;hasCheckedForTermination(); }
</span><span class="cx"> #endif
</span><span class="lines">@@ -89,38 +89,41 @@
</span><span class="cx"> 
</span><span class="cx"> #if !LOG_DISABLED
</span><span class="cx">     virtual const char* debugTaskName() const = 0;
</span><del>-    bool m_complete;
</del><span class="cx"> #endif
</span><ins>+
+#if !ASSERT_DISABLED
+    bool m_complete { false };
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-class DatabaseOpenTask : public DatabaseTask {
</del><ins>+class DatabaseOpenTask final : public DatabaseTask {
</ins><span class="cx"> public:
</span><del>-    DatabaseOpenTask(Database&amp;, bool setVersionInNewDatabase, DatabaseTaskSynchronizer&amp;, DatabaseError&amp;, String&amp; errorMessage, bool&amp; success);
</del><ins>+    DatabaseOpenTask(Database&amp;, bool setVersionInNewDatabase, DatabaseTaskSynchronizer&amp;, ExceptionOr&lt;void&gt;&amp; result);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    void doPerformTask() override;
</del><ins>+    void doPerformTask() final;
+
</ins><span class="cx"> #if !LOG_DISABLED
</span><del>-    const char* debugTaskName() const override;
</del><ins>+    const char* debugTaskName() const final;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     bool m_setVersionInNewDatabase;
</span><del>-    DatabaseError&amp; m_error;
-    String&amp; m_errorMessage;
-    bool&amp; m_success;
</del><ins>+    ExceptionOr&lt;void&gt;&amp; m_result;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-class DatabaseCloseTask : public DatabaseTask {
</del><ins>+class DatabaseCloseTask final : public DatabaseTask {
</ins><span class="cx"> public:
</span><span class="cx">     DatabaseCloseTask(Database&amp;, DatabaseTaskSynchronizer&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    void doPerformTask() override;
</del><ins>+    void doPerformTask() final;
+
</ins><span class="cx"> #if !LOG_DISABLED
</span><del>-    const char* debugTaskName() const override;
</del><ins>+    const char* debugTaskName() const final;
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class DatabaseTransactionTask : public DatabaseTask {
</del><ins>+class DatabaseTransactionTask final : public DatabaseTask {
</ins><span class="cx"> public:
</span><span class="cx">     explicit DatabaseTransactionTask(RefPtr&lt;SQLTransaction&gt;&amp;&amp;);
</span><span class="cx">     virtual ~DatabaseTransactionTask();
</span><span class="lines">@@ -128,9 +131,10 @@
</span><span class="cx">     SQLTransaction* transaction() const { return m_transaction.get(); }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    void doPerformTask() override;
</del><ins>+    void doPerformTask() final;
+
</ins><span class="cx"> #if !LOG_DISABLED
</span><del>-    const char* debugTaskName() const override;
</del><ins>+    const char* debugTaskName() const final;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;SQLTransaction&gt; m_transaction;
</span><span class="lines">@@ -137,17 +141,18 @@
</span><span class="cx">     bool m_didPerformTask;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class DatabaseTableNamesTask : public DatabaseTask {
</del><ins>+class DatabaseTableNamesTask final : public DatabaseTask {
</ins><span class="cx"> public:
</span><del>-    DatabaseTableNamesTask(Database&amp;, DatabaseTaskSynchronizer&amp;, Vector&lt;String&gt;&amp; names);
</del><ins>+    DatabaseTableNamesTask(Database&amp;, DatabaseTaskSynchronizer&amp;, Vector&lt;String&gt;&amp; result);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    void doPerformTask() override;
</del><ins>+    void doPerformTask() final;
+
</ins><span class="cx"> #if !LOG_DISABLED
</span><span class="cx">     const char* debugTaskName() const override;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Vector&lt;String&gt;&amp; m_tableNames;
</del><ins>+    Vector&lt;String&gt;&amp; m_result;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -33,7 +33,6 @@
</span><span class="cx"> #include &quot;DatabaseTask.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;SQLTransaction.h&quot;
</span><del>-#include &quot;SQLTransactionClient.h&quot;
</del><span class="cx"> #include &quot;SQLTransactionCoordinator.h&quot;
</span><span class="cx"> #include &lt;wtf/AutodrainedPool.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -40,10 +39,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> DatabaseThread::DatabaseThread()
</span><del>-    : m_threadID(0)
-    , m_transactionClient(std::make_unique&lt;SQLTransactionClient&gt;())
-    , m_transactionCoordinator(std::make_unique&lt;SQLTransactionCoordinator&gt;())
-    , m_cleanupSync(nullptr)
</del><ins>+    : m_transactionCoordinator(std::make_unique&lt;SQLTransactionCoordinator&gt;())
</ins><span class="cx"> {
</span><span class="cx">     m_selfRef = this;
</span><span class="cx"> }
</span><span class="lines">@@ -72,7 +68,7 @@
</span><span class="cx">     return m_threadID;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseThread::requestTermination(DatabaseTaskSynchronizer *cleanupSync)
</del><ins>+void DatabaseThread::requestTermination(DatabaseTaskSynchronizer* cleanupSync)
</ins><span class="cx"> {
</span><span class="cx">     m_cleanupSync = cleanupSync;
</span><span class="cx">     LOG(StorageAPI, &quot;DatabaseThread %p was asked to terminate\n&quot;, this);
</span><span class="lines">@@ -142,52 +138,42 @@
</span><span class="cx">         cleanupSync-&gt;taskCompleted();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseThread::recordDatabaseOpen(Database* database)
</del><ins>+void DatabaseThread::recordDatabaseOpen(Database&amp; database)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lock(m_openDatabaseSetMutex);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(currentThread() == m_threadID);
</span><del>-    ASSERT(database);
-    ASSERT(!m_openDatabaseSet.contains(database));
-    m_openDatabaseSet.add(database);
</del><ins>+    ASSERT(!m_openDatabaseSet.contains(&amp;database));
+    m_openDatabaseSet.add(&amp;database);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseThread::recordDatabaseClosed(Database* database)
</del><ins>+void DatabaseThread::recordDatabaseClosed(Database&amp; database)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lock(m_openDatabaseSetMutex);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(currentThread() == m_threadID);
</span><del>-    ASSERT(database);
-    ASSERT(m_queue.killed() || m_openDatabaseSet.contains(database));
-    m_openDatabaseSet.remove(database);
</del><ins>+    ASSERT(m_queue.killed() || m_openDatabaseSet.contains(&amp;database));
+    m_openDatabaseSet.remove(&amp;database);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseThread::scheduleTask(std::unique_ptr&lt;DatabaseTask&gt; task)
</del><ins>+void DatabaseThread::scheduleTask(std::unique_ptr&lt;DatabaseTask&gt;&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!task-&gt;hasSynchronizer() || task-&gt;hasCheckedForTermination());
</span><span class="cx">     m_queue.append(WTFMove(task));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseThread::scheduleImmediateTask(std::unique_ptr&lt;DatabaseTask&gt; task)
</del><ins>+void DatabaseThread::scheduleImmediateTask(std::unique_ptr&lt;DatabaseTask&gt;&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!task-&gt;hasSynchronizer() || task-&gt;hasCheckedForTermination());
</span><span class="cx">     m_queue.prepend(WTFMove(task));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-class SameDatabasePredicate {
-public:
-    SameDatabasePredicate(const Database* database) : m_database(database) { }
-    bool operator()(const DatabaseTask&amp; task) const { return &amp;task.database() == m_database; }
-private:
-    const Database* m_database;
-};
-
-void DatabaseThread::unscheduleDatabaseTasks(Database* database)
</del><ins>+void DatabaseThread::unscheduleDatabaseTasks(Database&amp; database)
</ins><span class="cx"> {
</span><del>-    // Note that the thread loop is running, so some tasks for the database
-    // may still be executed. This is unavoidable.
-    SameDatabasePredicate predicate(database);
-    m_queue.removeIf(predicate);
</del><ins>+    // The thread loop is running, sp some tasks for this database may still be executed. This is unavoidable.
+    m_queue.removeIf([&amp;database] (const DatabaseTask&amp; task) {
+        return &amp;task.database() == &amp;database;
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool DatabaseThread::hasPendingDatabaseActivity() const
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -29,8 +29,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &lt;memory&gt;
</span><del>-#include &lt;wtf/Deque.h&gt;
-#include &lt;wtf/HashMap.h&gt;
</del><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/MessageQueue.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="lines">@@ -42,7 +40,6 @@
</span><span class="cx"> class DatabaseTask;
</span><span class="cx"> class DatabaseTaskSynchronizer;
</span><span class="cx"> class Document;
</span><del>-class SQLTransactionClient;
</del><span class="cx"> class SQLTransactionCoordinator;
</span><span class="cx"> 
</span><span class="cx"> class DatabaseThread : public ThreadSafeRefCounted&lt;DatabaseThread&gt; {
</span><span class="lines">@@ -54,16 +51,15 @@
</span><span class="cx">     void requestTermination(DatabaseTaskSynchronizer* cleanupSync);
</span><span class="cx">     bool terminationRequested(DatabaseTaskSynchronizer* = nullptr) const;
</span><span class="cx"> 
</span><del>-    void scheduleTask(std::unique_ptr&lt;DatabaseTask&gt;);
-    void scheduleImmediateTask(std::unique_ptr&lt;DatabaseTask&gt;); // This just adds the task to the front of the queue - the caller needs to be extremely careful not to create deadlocks when waiting for completion.
-    void unscheduleDatabaseTasks(Database*);
</del><ins>+    void scheduleTask(std::unique_ptr&lt;DatabaseTask&gt;&amp;&amp;);
+    void scheduleImmediateTask(std::unique_ptr&lt;DatabaseTask&gt;&amp;&amp;); // This just adds the task to the front of the queue - the caller needs to be extremely careful not to create deadlocks when waiting for completion.
+    void unscheduleDatabaseTasks(Database&amp;);
</ins><span class="cx">     bool hasPendingDatabaseActivity() const;
</span><span class="cx"> 
</span><del>-    void recordDatabaseOpen(Database*);
-    void recordDatabaseClosed(Database*);
</del><ins>+    void recordDatabaseOpen(Database&amp;);
+    void recordDatabaseClosed(Database&amp;);
</ins><span class="cx">     ThreadIdentifier getThreadID() { return m_threadID; }
</span><span class="cx"> 
</span><del>-    SQLTransactionClient* transactionClient() { return m_transactionClient.get(); }
</del><span class="cx">     SQLTransactionCoordinator* transactionCoordinator() { return m_transactionCoordinator.get(); }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -73,19 +69,18 @@
</span><span class="cx">     void databaseThread();
</span><span class="cx"> 
</span><span class="cx">     Lock m_threadCreationMutex;
</span><del>-    ThreadIdentifier m_threadID;
</del><ins>+    ThreadIdentifier m_threadID { 0 };
</ins><span class="cx">     RefPtr&lt;DatabaseThread&gt; m_selfRef;
</span><span class="cx"> 
</span><span class="cx">     MessageQueue&lt;DatabaseTask&gt; m_queue;
</span><span class="cx"> 
</span><span class="cx">     // This set keeps track of the open databases that have been used on this thread.
</span><del>-    typedef HashSet&lt;RefPtr&lt;Database&gt;&gt; DatabaseSet;
</del><ins>+    using DatabaseSet = HashSet&lt;RefPtr&lt;Database&gt;&gt;;
</ins><span class="cx">     mutable Lock m_openDatabaseSetMutex;
</span><span class="cx">     DatabaseSet m_openDatabaseSet;
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;SQLTransactionClient&gt; m_transactionClient;
</del><span class="cx">     std::unique_ptr&lt;SQLTransactionCoordinator&gt; m_transactionCoordinator;
</span><del>-    DatabaseTaskSynchronizer* m_cleanupSync;
</del><ins>+    DatabaseTaskSynchronizer* m_cleanupSync { nullptr };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseTrackercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;DatabaseManager.h&quot;
</span><span class="cx"> #include &quot;DatabaseManagerClient.h&quot;
</span><span class="cx"> #include &quot;DatabaseThread.h&quot;
</span><ins>+#include &quot;ExceptionCode.h&quot;
</ins><span class="cx"> #include &quot;FileSystem.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;OriginLock.h&quot;
</span><span class="lines">@@ -58,6 +59,15 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+static Vector&lt;String&gt; isolatedCopy(const Vector&lt;String&gt;&amp; original)
+{
+    Vector&lt;String&gt; copy;
+    copy.reserveInitialCapacity(original.size());
+    for (auto&amp; string : original)
+        copy.uncheckedAppend(string.isolatedCopy());
+    return copy;
+}
+
</ins><span class="cx"> std::unique_ptr&lt;DatabaseTracker&gt; DatabaseTracker::trackerWithDatabasePath(const String&amp; databasePath)
</span><span class="cx"> {
</span><span class="cx">     return std::unique_ptr&lt;DatabaseTracker&gt;(new DatabaseTracker(databasePath));
</span><span class="lines">@@ -70,36 +80,21 @@
</span><span class="cx">     ASSERT(!staticTracker);
</span><span class="cx">     if (staticTracker)
</span><span class="cx">         return;
</span><del>-
</del><span class="cx">     staticTracker = new DatabaseTracker(databasePath);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DatabaseTracker&amp; DatabaseTracker::tracker()
</del><ins>+DatabaseTracker&amp; DatabaseTracker::singleton()
</ins><span class="cx"> {
</span><span class="cx">     if (!staticTracker)
</span><span class="cx">         staticTracker = new DatabaseTracker(emptyString());
</span><del>-
</del><span class="cx">     return *staticTracker;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> DatabaseTracker::DatabaseTracker(const String&amp; databasePath)
</span><del>-    : m_client(nullptr)
</del><ins>+    : m_databaseDirectoryPath(databasePath.isolatedCopy())
</ins><span class="cx"> {
</span><del>-    setDatabaseDirectoryPath(databasePath);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::setDatabaseDirectoryPath(const String&amp; path)
-{
-    LockHolder lockDatabase(m_databaseGuard);
-    ASSERT(!m_database.isOpen());
-    m_databaseDirectoryPath = path.isolatedCopy();
-}
-
-String DatabaseTracker::databaseDirectoryPath() const
-{
-    return m_databaseDirectoryPath.isolatedCopy();
-}
-
</del><span class="cx"> String DatabaseTracker::trackerDatabasePath() const
</span><span class="cx"> {
</span><span class="cx">     return SQLiteFileSystem::appendDatabaseFileNameToPath(m_databaseDirectoryPath.isolatedCopy(), &quot;Databases.db&quot;);
</span><span class="lines">@@ -124,7 +119,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!m_database.open(databasePath)) {
</span><span class="cx">         // FIXME: What do do here?
</span><del>-        LOG_ERROR(&quot;Failed to open databasePath %s.&quot;, databasePath.ascii().data());
</del><ins>+        LOG_ERROR(&quot;Failed to open databasePath %s.&quot;, databasePath.utf8().data());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_database.disableThreadingChecks();
</span><span class="lines">@@ -144,47 +139,41 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::hasAdequateQuotaForOrigin(SecurityOrigin* origin, unsigned long estimatedSize, DatabaseError&amp; err)
</del><ins>+ExceptionOr&lt;void&gt; DatabaseTracker::hasAdequateQuotaForOrigin(SecurityOrigin&amp; origin, unsigned estimatedSize)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    unsigned long long usage = usageForOrigin(origin);
</del><ins>+    auto usage = this-&gt;usage(origin);
</ins><span class="cx"> 
</span><span class="cx">     // If the database will fit, allow its creation.
</span><del>-    unsigned long long requirement = usage + std::max&lt;unsigned long long&gt;(1, estimatedSize);
</del><ins>+    auto requirement = usage + std::max&lt;unsigned long long&gt;(1, estimatedSize);
</ins><span class="cx">     if (requirement &lt; usage) {
</span><span class="cx">         // The estimated size is so big it causes an overflow; don't allow creation.
</span><del>-        err = DatabaseError::DatabaseSizeOverflowed;
-        return false;
</del><ins>+        return Exception { SECURITY_ERR };
</ins><span class="cx">     }
</span><del>-    if (requirement &lt;= quotaForOriginNoLock(origin))
-        return true;
-
-    err = DatabaseError::DatabaseSizeExceededQuota;
-    return false;
</del><ins>+    if (requirement &gt; quotaNoLock(origin))
+        return Exception { QUOTA_EXCEEDED_ERR };
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::canEstablishDatabase(DatabaseContext* context, const String&amp; name, unsigned long estimatedSize, DatabaseError&amp; error)
</del><ins>+ExceptionOr&lt;void&gt; DatabaseTracker::canEstablishDatabase(DatabaseContext&amp; context, const String&amp; name, unsigned estimatedSize)
</ins><span class="cx"> {
</span><del>-    error = DatabaseError::None;
-
</del><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><del>-    SecurityOrigin* origin = context-&gt;securityOrigin();
</del><span class="cx"> 
</span><del>-    if (isDeletingDatabaseOrOriginFor(origin, name)) {
-        error = DatabaseError::DatabaseIsBeingDeleted;
-        return false;
-    }
</del><ins>+    // FIXME: What guarantees this context.securityOrigin() is non-null?
+    auto&amp; origin = *context.securityOrigin();
</ins><span class="cx"> 
</span><ins>+    if (isDeletingDatabaseOrOriginFor(origin, name))
+        return Exception { SECURITY_ERR };
+
</ins><span class="cx">     recordCreatingDatabase(origin, name);
</span><span class="cx"> 
</span><span class="cx">     // If a database already exists, ignore the passed-in estimated size and say it's OK.
</span><span class="cx">     if (hasEntryForDatabase(origin, name))
</span><del>-        return true;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><del>-    if (hasAdequateQuotaForOrigin(origin, estimatedSize, error)) {
-        ASSERT(error == DatabaseError::None);
-        return true;
-    }
</del><ins>+    auto result = hasAdequateQuotaForOrigin(origin, estimatedSize);
+    if (!result.hasException())
+        return { };
</ins><span class="cx"> 
</span><span class="cx">     // If we get here, then we do not have enough quota for one of the
</span><span class="cx">     // following reasons as indicated by the set error:
</span><span class="lines">@@ -199,12 +188,11 @@
</span><span class="cx">     // a chance to update the quota and call retryCanEstablishDatabase() to try
</span><span class="cx">     // again. Hence, we don't call doneCreatingDatabase() yet in that case.
</span><span class="cx"> 
</span><del>-    if (error == DatabaseError::DatabaseSizeOverflowed)
</del><ins>+    auto exception = result.releaseException();
+    if (exception.code() != QUOTA_EXCEEDED_ERR)
</ins><span class="cx">         doneCreatingDatabase(origin, name);
</span><del>-    else
-        ASSERT(error == DatabaseError::DatabaseSizeExceededQuota);
</del><span class="cx"> 
</span><del>-    return false;
</del><ins>+    return WTFMove(exception);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Note: a thought about performance: hasAdequateQuotaForOrigin() was also
</span><span class="lines">@@ -215,30 +203,30 @@
</span><span class="cx"> // hasAdequateQuotaForOrigin() simple and correct (i.e. bug free), and just
</span><span class="cx"> // re-use it. Also note that the path for opening a database involves IO, and
</span><span class="cx"> // hence should not be a performance critical path anyway. 
</span><del>-bool DatabaseTracker::retryCanEstablishDatabase(DatabaseContext* context, const String&amp; name, unsigned long estimatedSize, DatabaseError&amp; error)
</del><ins>+ExceptionOr&lt;void&gt; DatabaseTracker::retryCanEstablishDatabase(DatabaseContext&amp; context, const String&amp; name, unsigned estimatedSize)
</ins><span class="cx"> {
</span><del>-    error = DatabaseError::None;
-
</del><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><del>-    SecurityOrigin* origin = context-&gt;securityOrigin();
</del><span class="cx"> 
</span><ins>+    // FIXME: What guarantees context.securityOrigin() is non-null?
+    auto&amp; origin = *context.securityOrigin();
+
</ins><span class="cx">     // We have already eliminated other types of errors in canEstablishDatabase().
</span><span class="cx">     // The only reason we're in retryCanEstablishDatabase() is because we gave
</span><span class="cx">     // the client a chance to update the quota and are rechecking it here.
</span><span class="cx">     // If we fail this check, the only possible reason this time should be due
</span><span class="cx">     // to inadequate quota.
</span><del>-    if (hasAdequateQuotaForOrigin(origin, estimatedSize, error)) {
-        ASSERT(error == DatabaseError::None);
-        return true;
-    }
</del><ins>+    auto result = hasAdequateQuotaForOrigin(origin, estimatedSize);
+    if (!result.hasException())
+        return { };
</ins><span class="cx"> 
</span><del>-    ASSERT(error == DatabaseError::DatabaseSizeExceededQuota);
</del><ins>+    auto exception = result.releaseException();
+    ASSERT(exception.code() == QUOTA_EXCEEDED_ERR);
</ins><span class="cx">     doneCreatingDatabase(origin, name);
</span><span class="cx"> 
</span><del>-    return false;
</del><ins>+    return WTFMove(exception);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::hasEntryForOriginNoLock(SecurityOrigin* origin)
</del><ins>+bool DatabaseTracker::hasEntryForOriginNoLock(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     openTrackerDatabase(DontCreateIfDoesNotExist);
</span><span class="lines">@@ -251,19 +239,13 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx"> 
</span><span class="cx">     return statement.step() == SQLITE_ROW;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::hasEntryForOrigin(SecurityOrigin* origin)
</del><ins>+bool DatabaseTracker::hasEntryForDatabase(SecurityOrigin&amp; origin, const String&amp; databaseIdentifier)
</ins><span class="cx"> {
</span><del>-    LockHolder lockDatabase(m_databaseGuard);
-    return hasEntryForOriginNoLock(origin);
-}
-
-bool DatabaseTracker::hasEntryForDatabase(SecurityOrigin* origin, const String&amp; databaseIdentifier)
-{
</del><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     openTrackerDatabase(DontCreateIfDoesNotExist);
</span><span class="cx">     if (!m_database.isOpen()) {
</span><span class="lines">@@ -277,22 +259,22 @@
</span><span class="cx">     if (statement.prepare() != SQLITE_OK)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx">     statement.bindText(2, databaseIdentifier);
</span><span class="cx"> 
</span><span class="cx">     return statement.step() == SQLITE_ROW;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long DatabaseTracker::getMaxSizeForDatabase(const Database* database)
</del><ins>+unsigned long long DatabaseTracker::maximumSize(Database&amp; database)
</ins><span class="cx"> {
</span><span class="cx">     // The maximum size for a database is the full quota for its origin, minus the current usage within the origin,
</span><span class="cx">     // plus the current usage of the given database
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><del>-    SecurityOrigin* origin = database-&gt;securityOrigin();
</del><ins>+    auto&amp; origin = database.securityOrigin();
</ins><span class="cx"> 
</span><del>-    unsigned long long quota = quotaForOriginNoLock(origin);
-    unsigned long long diskUsage = usageForOrigin(origin);
-    unsigned long long databaseFileSize = SQLiteFileSystem::getDatabaseFileSize(database-&gt;fileName());
</del><ins>+    unsigned long long quota = quotaNoLock(origin);
+    unsigned long long diskUsage = usage(origin);
+    unsigned long long databaseFileSize = SQLiteFileSystem::getDatabaseFileSize(database.fileName());
</ins><span class="cx">     ASSERT(databaseFileSize &lt;= diskUsage);
</span><span class="cx"> 
</span><span class="cx">     if (diskUsage &gt; quota)
</span><span class="lines">@@ -329,9 +311,9 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String DatabaseTracker::originPath(SecurityOrigin* origin) const
</del><ins>+String DatabaseTracker::originPath(SecurityOrigin&amp; origin) const
</ins><span class="cx"> {
</span><del>-    return SQLiteFileSystem::appendDatabaseFileNameToPath(m_databaseDirectoryPath.isolatedCopy(), SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    return SQLiteFileSystem::appendDatabaseFileNameToPath(m_databaseDirectoryPath.isolatedCopy(), SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static String generateDatabaseFileName()
</span><span class="lines">@@ -344,11 +326,11 @@
</span><span class="cx">     return stringBuilder.toString();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String DatabaseTracker::fullPathForDatabaseNoLock(SecurityOrigin* origin, const String&amp; name, bool createIfNotExists)
</del><ins>+String DatabaseTracker::fullPathForDatabaseNoLock(SecurityOrigin&amp; origin, const String&amp; name, bool createIfNotExists)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx"> 
</span><del>-    String originIdentifier = SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier();
</del><ins>+    String originIdentifier = SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier();
</ins><span class="cx">     String originPath = this-&gt;originPath(origin);
</span><span class="cx"> 
</span><span class="cx">     // Make sure the path for this SecurityOrigin exists
</span><span class="lines">@@ -374,7 +356,7 @@
</span><span class="cx">         return String();
</span><span class="cx"> 
</span><span class="cx">     if (result != SQLITE_DONE) {
</span><del>-        LOG_ERROR(&quot;Failed to retrieve filename from Database Tracker for origin %s, name %s&quot;, originIdentifier.ascii().data(), name.ascii().data());
</del><ins>+        LOG_ERROR(&quot;Failed to retrieve filename from Database Tracker for origin %s, name %s&quot;, originIdentifier.utf8().data(), name.utf8().data());
</ins><span class="cx">         return String();
</span><span class="cx">     }
</span><span class="cx">     statement.finalize();
</span><span class="lines">@@ -391,80 +373,78 @@
</span><span class="cx">     return fullFilePath;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String DatabaseTracker::fullPathForDatabase(SecurityOrigin* origin, const String&amp; name, bool createIfNotExists)
</del><ins>+String DatabaseTracker::fullPathForDatabase(SecurityOrigin&amp; origin, const String&amp; name, bool createIfNotExists)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><span class="cx">     return fullPathForDatabaseNoLock(origin, name, createIfNotExists).isolatedCopy();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; originsResult)
</del><ins>+Vector&lt;Ref&lt;SecurityOrigin&gt;&gt; DatabaseTracker::origins()
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><span class="cx"> 
</span><span class="cx">     openTrackerDatabase(DontCreateIfDoesNotExist);
</span><span class="cx">     if (!m_database.isOpen())
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><span class="cx">     SQLiteStatement statement(m_database, &quot;SELECT origin FROM Origins&quot;);
</span><span class="cx">     if (statement.prepare() != SQLITE_OK) {
</span><span class="cx">         LOG_ERROR(&quot;Failed to prepare statement.&quot;);
</span><del>-        return;
</del><ins>+        return { };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    int result;
-    while ((result = statement.step()) == SQLITE_ROW) {
-        RefPtr&lt;SecurityOrigin&gt; origin = SecurityOrigin::createFromDatabaseIdentifier(statement.getColumnText(0));
-        originsResult.append(origin-&gt;isolatedCopy());
-    }
-    originsResult.shrinkToFit();
</del><ins>+    Vector&lt;Ref&lt;SecurityOrigin&gt;&gt; origins;
+    int stepResult;
+    while ((stepResult = statement.step()) == SQLITE_ROW)
+        origins.append(SecurityOrigin::createFromDatabaseIdentifier(statement.getColumnText(0))-&gt;isolatedCopy());
+    origins.shrinkToFit();
</ins><span class="cx"> 
</span><del>-    if (result != SQLITE_DONE)
</del><ins>+    if (stepResult != SQLITE_DONE)
</ins><span class="cx">         LOG_ERROR(&quot;Failed to read in all origins from the database.&quot;);
</span><ins>+
+    return origins;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::databaseNamesForOriginNoLock(SecurityOrigin* origin, Vector&lt;String&gt;&amp; resultVector)
</del><ins>+Vector&lt;String&gt; DatabaseTracker::databaseNamesNoLock(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     openTrackerDatabase(DontCreateIfDoesNotExist);
</span><span class="cx">     if (!m_database.isOpen())
</span><del>-        return false;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><span class="cx">     SQLiteStatement statement(m_database, &quot;SELECT name FROM Databases where origin=?;&quot;);
</span><del>-
</del><span class="cx">     if (statement.prepare() != SQLITE_OK)
</span><del>-        return false;
</del><ins>+        return { };
</ins><span class="cx"> 
</span><del>-    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx"> 
</span><ins>+    Vector&lt;String&gt; names;
</ins><span class="cx">     int result;
</span><span class="cx">     while ((result = statement.step()) == SQLITE_ROW)
</span><del>-        resultVector.append(statement.getColumnText(0));
</del><ins>+        names.append(statement.getColumnText(0));
+    names.shrinkToFit();
</ins><span class="cx"> 
</span><span class="cx">     if (result != SQLITE_DONE) {
</span><del>-        LOG_ERROR(&quot;Failed to retrieve all database names for origin %s&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
-        return false;
</del><ins>+        LOG_ERROR(&quot;Failed to retrieve all database names for origin %s&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
+        return { };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return true;
</del><ins>+    return names;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::databaseNamesForOrigin(SecurityOrigin* origin, Vector&lt;String&gt;&amp; resultVector)
</del><ins>+Vector&lt;String&gt; DatabaseTracker::databaseNames(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><del>-    Vector&lt;String&gt; temp;
</del><ins>+    Vector&lt;String&gt; names;
</ins><span class="cx">     {
</span><span class="cx">         LockHolder lockDatabase(m_databaseGuard);
</span><del>-        if (!databaseNamesForOriginNoLock(origin, temp))
-          return false;
</del><ins>+        names = databaseNamesNoLock(origin);
</ins><span class="cx">     }
</span><del>-
-    for (auto&amp; databaseName : temp)
-        resultVector.append(databaseName.isolatedCopy());
-    return true;
</del><ins>+    return isolatedCopy(names);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-DatabaseDetails DatabaseTracker::detailsForNameAndOrigin(const String&amp; name, SecurityOrigin* origin)
</del><ins>+DatabaseDetails DatabaseTracker::detailsForNameAndOrigin(const String&amp; name, SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><del>-    String originIdentifier = SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier();
</del><ins>+    String originIdentifier = SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier();
</ins><span class="cx">     String displayName;
</span><span class="cx">     int64_t expectedUsage;
</span><span class="cx"> 
</span><span class="lines">@@ -486,7 +466,7 @@
</span><span class="cx">             return DatabaseDetails();
</span><span class="cx"> 
</span><span class="cx">         if (result != SQLITE_ROW) {
</span><del>-            LOG_ERROR(&quot;Error retrieving details for database %s in origin %s from tracker database&quot;, name.ascii().data(), originIdentifier.ascii().data());
</del><ins>+            LOG_ERROR(&quot;Error retrieving details for database %s in origin %s from tracker database&quot;, name.utf8().data(), originIdentifier.utf8().data());
</ins><span class="cx">             return DatabaseDetails();
</span><span class="cx">         }
</span><span class="cx">         displayName = statement.getColumnText(0);
</span><span class="lines">@@ -499,9 +479,9 @@
</span><span class="cx">     return DatabaseDetails(name, displayName, expectedUsage, SQLiteFileSystem::getDatabaseFileSize(path), SQLiteFileSystem::databaseCreationTime(path), SQLiteFileSystem::databaseModificationTime(path));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::setDatabaseDetails(SecurityOrigin* origin, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize)
</del><ins>+void DatabaseTracker::setDatabaseDetails(SecurityOrigin&amp; origin, const String&amp; name, const String&amp; displayName, unsigned estimatedSize)
</ins><span class="cx"> {
</span><del>-    String originIdentifier = SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier();
</del><ins>+    String originIdentifier = SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier();
</ins><span class="cx">     int64_t guid = 0;
</span><span class="cx"> 
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><span class="lines">@@ -523,13 +503,12 @@
</span><span class="cx"> 
</span><span class="cx">     if (guid == 0) {
</span><span class="cx">         if (result != SQLITE_DONE)
</span><del>-            LOG_ERROR(&quot;Error to determing existence of database %s in origin %s in tracker database&quot;, name.ascii().data(), originIdentifier.ascii().data());
</del><ins>+            LOG_ERROR(&quot;Error to determing existence of database %s in origin %s in tracker database&quot;, name.utf8().data(), originIdentifier.utf8().data());
</ins><span class="cx">         else {
</span><span class="cx">             // This case should never occur - we should never be setting database details for a database that doesn't already exist in the tracker
</span><span class="cx">             // But since the tracker file is an external resource not under complete control of our code, it's somewhat invalid to make this an ASSERT case
</span><span class="cx">             // So we'll print an error instead
</span><del>-            LOG_ERROR(&quot;Could not retrieve guid for database %s in origin %s from the tracker database - it is invalid to set database details on a database that doesn't already exist in the tracker&quot;,
-                       name.ascii().data(), originIdentifier.ascii().data());
</del><ins>+            LOG_ERROR(&quot;Could not retrieve guid for database %s in origin %s from the tracker database - it is invalid to set database details on a database that doesn't already exist in the tracker&quot;, name.utf8().data(), originIdentifier.utf8().data());
</ins><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -543,7 +522,7 @@
</span><span class="cx">     updateStatement.bindInt64(3, guid);
</span><span class="cx"> 
</span><span class="cx">     if (updateStatement.step() != SQLITE_DONE) {
</span><del>-        LOG_ERROR(&quot;Failed to update details for database %s in origin %s&quot;, name.ascii().data(), originIdentifier.ascii().data());
</del><ins>+        LOG_ERROR(&quot;Failed to update details for database %s in origin %s&quot;, name.utf8().data(), originIdentifier.utf8().data());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -551,108 +530,82 @@
</span><span class="cx">         m_client-&gt;dispatchDidModifyDatabase(origin, name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::doneCreatingDatabase(Database* database)
</del><ins>+void DatabaseTracker::doneCreatingDatabase(Database&amp; database)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><del>-    doneCreatingDatabase(database-&gt;securityOrigin(), database-&gt;stringIdentifier());
</del><ins>+    doneCreatingDatabase(database.securityOrigin(), database.stringIdentifier());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::addOpenDatabase(Database* database)
</del><ins>+void DatabaseTracker::addOpenDatabase(Database&amp; database)
</ins><span class="cx"> {
</span><del>-    if (!database)
-        return;
</del><ins>+    LockHolder openDatabaseMapLock(m_openDatabaseMapGuard);
</ins><span class="cx"> 
</span><del>-    {
-        LockHolder openDatabaseMapLock(m_openDatabaseMapGuard);
</del><ins>+    if (!m_openDatabaseMap)
+        m_openDatabaseMap = std::make_unique&lt;DatabaseOriginMap&gt;();
</ins><span class="cx"> 
</span><del>-        if (!m_openDatabaseMap)
-            m_openDatabaseMap = std::make_unique&lt;DatabaseOriginMap&gt;();
</del><ins>+    auto&amp; origin = database.securityOrigin();
</ins><span class="cx"> 
</span><del>-        String name(database-&gt;stringIdentifier());
-        DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(database-&gt;securityOrigin());
-        if (!nameMap) {
-            nameMap = new DatabaseNameMap;
-            m_openDatabaseMap-&gt;set(database-&gt;securityOrigin()-&gt;isolatedCopy(), nameMap);
-        }
</del><ins>+    auto* nameMap = m_openDatabaseMap-&gt;get(&amp;origin);
+    if (!nameMap) {
+        nameMap = new DatabaseNameMap;
+        m_openDatabaseMap-&gt;add(origin.isolatedCopy(), nameMap);
+    }
</ins><span class="cx"> 
</span><del>-        DatabaseSet* databaseSet = nameMap-&gt;get(name);
-        if (!databaseSet) {
-            databaseSet = new DatabaseSet;
-            nameMap-&gt;set(name.isolatedCopy(), databaseSet);
-        }
</del><ins>+    String name = database.stringIdentifier();
+    auto* databaseSet = nameMap-&gt;get(name);
+    if (!databaseSet) {
+        databaseSet = new DatabaseSet;
+        nameMap-&gt;set(name.isolatedCopy(), databaseSet);
+    }
</ins><span class="cx"> 
</span><del>-        databaseSet-&gt;add(database);
</del><ins>+    databaseSet-&gt;add(&amp;database);
</ins><span class="cx"> 
</span><del>-        LOG(StorageAPI, &quot;Added open Database %s (%p)\n&quot;, database-&gt;stringIdentifier().ascii().data(), database);
-    }
</del><ins>+    LOG(StorageAPI, &quot;Added open Database %s (%p)\n&quot;, database.stringIdentifier().utf8().data(), &amp;database);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::removeOpenDatabase(Database* database)
</del><ins>+void DatabaseTracker::removeOpenDatabase(Database&amp; database)
</ins><span class="cx"> {
</span><del>-    if (!database)
</del><ins>+    LockHolder openDatabaseMapLock(m_openDatabaseMapGuard);
+
+    if (!m_openDatabaseMap) {
+        ASSERT_NOT_REACHED();
</ins><span class="cx">         return;
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-    {
-        LockHolder openDatabaseMapLock(m_openDatabaseMapGuard);
</del><ins>+    DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(&amp;database.securityOrigin());
+    if (!nameMap) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
</ins><span class="cx"> 
</span><del>-        if (!m_openDatabaseMap) {
-            ASSERT_NOT_REACHED();
-            return;
-        }
</del><ins>+    String name = database.stringIdentifier();
+    auto* databaseSet = nameMap-&gt;get(name);
+    if (!databaseSet) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
</ins><span class="cx"> 
</span><del>-        String name(database-&gt;stringIdentifier());
-        DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(database-&gt;securityOrigin());
-        if (!nameMap) {
-            ASSERT_NOT_REACHED();
-            return;
-        }
</del><ins>+    databaseSet-&gt;remove(&amp;database);
</ins><span class="cx"> 
</span><del>-        DatabaseSet* databaseSet = nameMap-&gt;get(name);
-        if (!databaseSet) {
-            ASSERT_NOT_REACHED();
-            return;
-        }
</del><ins>+    LOG(StorageAPI, &quot;Removed open Database %s (%p)\n&quot;, database.stringIdentifier().utf8().data(), &amp;database);
</ins><span class="cx"> 
</span><del>-        databaseSet-&gt;remove(database);
-
-        LOG(StorageAPI, &quot;Removed open Database %s (%p)\n&quot;, database-&gt;stringIdentifier().ascii().data(), database);
-
-        if (!databaseSet-&gt;isEmpty())
-            return;
-
-        nameMap-&gt;remove(name);
-        delete databaseSet;
-
-        if (!nameMap-&gt;isEmpty())
-            return;
-
-        m_openDatabaseMap-&gt;remove(database-&gt;securityOrigin());
-        delete nameMap;
-    }
-}
-
-void DatabaseTracker::getOpenDatabases(SecurityOrigin* origin, const String&amp; name, HashSet&lt;RefPtr&lt;Database&gt;&gt;* databases)
-{
-    LockHolder openDatabaseMapLock(m_openDatabaseMapGuard);
-    if (!m_openDatabaseMap)
</del><ins>+    if (!databaseSet-&gt;isEmpty())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(origin);
-    if (!nameMap)
-        return;
</del><ins>+    nameMap-&gt;remove(name);
+    delete databaseSet;
</ins><span class="cx"> 
</span><del>-    DatabaseSet* databaseSet = nameMap-&gt;get(name);
-    if (!databaseSet)
</del><ins>+    if (!nameMap-&gt;isEmpty())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    for (auto&amp; database : *databaseSet)
-        databases-&gt;add(database);
</del><ins>+    m_openDatabaseMap-&gt;remove(&amp;database.securityOrigin());
+    delete nameMap;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;OriginLock&gt; DatabaseTracker::originLockFor(SecurityOrigin* origin)
</del><ins>+RefPtr&lt;OriginLock&gt; DatabaseTracker::originLockFor(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><del>-    String databaseIdentifier = SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier();
</del><ins>+    String databaseIdentifier = SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier();
</ins><span class="cx"> 
</span><span class="cx">     // The originLockMap is accessed from multiple DatabaseThreads since
</span><span class="cx">     // different script contexts can be writing to different databases from
</span><span class="lines">@@ -674,7 +627,7 @@
</span><span class="cx">     return lock;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::deleteOriginLockFor(SecurityOrigin* origin)
</del><ins>+void DatabaseTracker::deleteOriginLockFor(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx"> 
</span><span class="lines">@@ -691,11 +644,11 @@
</span><span class="cx">     // This may or may not be possible depending on whether other threads are
</span><span class="cx">     // also using the OriginLock at the same time. After that, we will delete the lock file.
</span><span class="cx"> 
</span><del>-    m_originLockMap.remove(SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    m_originLockMap.remove(SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx">     OriginLock::deleteLockFile(originPath(origin));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long DatabaseTracker::usageForOrigin(SecurityOrigin* origin)
</del><ins>+unsigned long long DatabaseTracker::usage(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     String originPath = this-&gt;originPath(origin);
</span><span class="cx">     unsigned long long diskUsage = 0;
</span><span class="lines">@@ -707,7 +660,7 @@
</span><span class="cx">     return diskUsage;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long DatabaseTracker::quotaForOriginNoLock(SecurityOrigin* origin)
</del><ins>+unsigned long long DatabaseTracker::quotaNoLock(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     unsigned long long quota = 0;
</span><span class="lines">@@ -721,7 +674,7 @@
</span><span class="cx">         LOG_ERROR(&quot;Failed to prepare statement.&quot;);
</span><span class="cx">         return quota;
</span><span class="cx">     }
</span><del>-    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx"> 
</span><span class="cx">     if (statement.step() == SQLITE_ROW)
</span><span class="cx">         quota = statement.getColumnInt64(0);
</span><span class="lines">@@ -729,17 +682,17 @@
</span><span class="cx">     return quota;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned long long DatabaseTracker::quotaForOrigin(SecurityOrigin* origin)
</del><ins>+unsigned long long DatabaseTracker::quota(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><del>-    return quotaForOriginNoLock(origin);
</del><ins>+    return quotaNoLock(origin);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::setQuota(SecurityOrigin* origin, unsigned long long quota)
</del><ins>+void DatabaseTracker::setQuota(SecurityOrigin&amp; origin, unsigned long long quota)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lockDatabase(m_databaseGuard);
</span><span class="cx"> 
</span><del>-    if (quotaForOriginNoLock(origin) == quota)
</del><ins>+    if (quotaNoLock(origin) == quota)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     openTrackerDatabase(CreateIfDoesNotExist);
</span><span class="lines">@@ -746,25 +699,21 @@
</span><span class="cx">     if (!m_database.isOpen())
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-#if PLATFORM(IOS)
</del><span class="cx">     bool insertedNewOrigin = false;
</span><del>-#endif
</del><span class="cx"> 
</span><span class="cx">     bool originEntryExists = hasEntryForOriginNoLock(origin);
</span><span class="cx">     if (!originEntryExists) {
</span><span class="cx">         SQLiteStatement statement(m_database, &quot;INSERT INTO Origins VALUES (?, ?)&quot;);
</span><span class="cx">         if (statement.prepare() != SQLITE_OK) {
</span><del>-            LOG_ERROR(&quot;Unable to establish origin %s in the tracker&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Unable to establish origin %s in the tracker&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">         } else {
</span><del>-            statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+            statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx">             statement.bindInt64(2, quota);
</span><span class="cx"> 
</span><span class="cx">             if (statement.step() != SQLITE_DONE)
</span><del>-                LOG_ERROR(&quot;Unable to establish origin %s in the tracker&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
-#if PLATFORM(IOS)
</del><ins>+                LOG_ERROR(&quot;Unable to establish origin %s in the tracker&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">             else
</span><span class="cx">                 insertedNewOrigin = true;
</span><del>-#endif
</del><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="cx">         SQLiteStatement statement(m_database, &quot;UPDATE Origins SET quota=? WHERE origin=?&quot;);
</span><span class="lines">@@ -771,25 +720,23 @@
</span><span class="cx">         bool error = statement.prepare() != SQLITE_OK;
</span><span class="cx">         if (!error) {
</span><span class="cx">             statement.bindInt64(1, quota);
</span><del>-            statement.bindText(2, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+            statement.bindText(2, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx"> 
</span><span class="cx">             error = !statement.executeCommand();
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (error)
</span><del>-            LOG_ERROR(&quot;Failed to set quota %llu in tracker database for origin %s&quot;, quota, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Failed to set quota %llu in tracker database for origin %s&quot;, quota, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_client) {
</span><del>-#if PLATFORM(IOS)
</del><span class="cx">         if (insertedNewOrigin)
</span><span class="cx">             m_client-&gt;dispatchDidAddNewOrigin(origin);
</span><del>-#endif
</del><span class="cx">         m_client-&gt;dispatchDidModifyOrigin(origin);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::addDatabase(SecurityOrigin* origin, const String&amp; name, const String&amp; path)
</del><ins>+bool DatabaseTracker::addDatabase(SecurityOrigin&amp; origin, const String&amp; name, const String&amp; path)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     openTrackerDatabase(CreateIfDoesNotExist);
</span><span class="lines">@@ -804,12 +751,12 @@
</span><span class="cx">     if (statement.prepare() != SQLITE_OK)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx">     statement.bindText(2, name);
</span><span class="cx">     statement.bindText(3, path);
</span><span class="cx"> 
</span><span class="cx">     if (!statement.executeCommand()) {
</span><del>-        LOG_ERROR(&quot;Failed to add database %s to origin %s: %s\n&quot;, name.ascii().data(), SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data(), m_database.lastErrorMsg());
</del><ins>+        LOG_ERROR(&quot;Failed to add database %s to origin %s: %s\n&quot;, name.utf8().data(), SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data(), m_database.lastErrorMsg());
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -821,44 +768,35 @@
</span><span class="cx"> 
</span><span class="cx"> void DatabaseTracker::deleteAllDatabasesImmediately()
</span><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt; originsCopy;
-    origins(originsCopy);
-
</del><span class="cx">     // This method is only intended for use by DumpRenderTree / WebKitTestRunner.
</span><span class="cx">     // Actually deleting the databases is necessary to reset to a known state before running
</span><span class="cx">     // each test case, but may be unsafe in deployment use cases (where multiple applications
</span><span class="cx">     // may be accessing the same databases concurrently).
</span><del>-    for (auto&amp; origin : originsCopy)
-        deleteOrigin(origin.get(), DeletionMode::Immediate);
</del><ins>+    for (auto&amp; origin : origins())
+        deleteOrigin(origin, DeletionMode::Immediate);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DatabaseTracker::deleteDatabasesModifiedSince(std::chrono::system_clock::time_point time)
</span><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt; originsCopy;
-    origins(originsCopy);
</del><ins>+    for (auto&amp; origin : origins()) {
+        bool deletedAll = true;
+        for (auto&amp; databaseName : databaseNames(origin)) {
+            auto fullPath = fullPathForDatabase(origin, databaseName, false);
</ins><span class="cx"> 
</span><del>-    for (auto&amp; origin : originsCopy) {
-        Vector&lt;String&gt; databaseNames;
-        if (!databaseNamesForOrigin(origin.get(), databaseNames))
-            continue;
-
-        size_t deletedDatabases = 0;
-
-        for (auto&amp; databaseName : databaseNames) {
-            auto fullPath = fullPathForDatabase(origin.get(), databaseName, false);
-
</del><span class="cx">             time_t modificationTime;
</span><del>-            if (!getFileModificationTime(fullPath, modificationTime))
</del><ins>+            if (!getFileModificationTime(fullPath, modificationTime)) {
+                deletedAll = false;
</ins><span class="cx">                 continue;
</span><ins>+            }
</ins><span class="cx"> 
</span><del>-            if (modificationTime &lt; std::chrono::system_clock::to_time_t(time))
</del><ins>+            if (modificationTime &lt; std::chrono::system_clock::to_time_t(time)) {
+                deletedAll = false;
</ins><span class="cx">                 continue;
</span><ins>+            }
</ins><span class="cx"> 
</span><span class="cx">             deleteDatabase(origin.get(), databaseName);
</span><del>-            ++deletedDatabases;
</del><span class="cx">         }
</span><del>-
-        if (deletedDatabases == databaseNames.size())
</del><ins>+        if (deletedAll)
</ins><span class="cx">             deleteOrigin(origin.get());
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -865,12 +803,12 @@
</span><span class="cx"> 
</span><span class="cx"> // It is the caller's responsibility to make sure that nobody is trying to create, delete, open, or close databases in this origin while the deletion is
</span><span class="cx"> // taking place.
</span><del>-bool DatabaseTracker::deleteOrigin(SecurityOrigin* origin)
</del><ins>+bool DatabaseTracker::deleteOrigin(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     return deleteOrigin(origin, DeletionMode::Default);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::deleteOrigin(SecurityOrigin* origin, DeletionMode deletionMode)
</del><ins>+bool DatabaseTracker::deleteOrigin(SecurityOrigin&amp; origin, DeletionMode deletionMode)
</ins><span class="cx"> {
</span><span class="cx">     Vector&lt;String&gt; databaseNames;
</span><span class="cx">     {
</span><span class="lines">@@ -879,12 +817,13 @@
</span><span class="cx">         if (!m_database.isOpen())
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        if (!databaseNamesForOriginNoLock(origin, databaseNames)) {
-            LOG_ERROR(&quot;Unable to retrieve list of database names for origin %s&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+        databaseNames = databaseNamesNoLock(origin);
+        if (databaseNames.isEmpty()) {
+            LOG_ERROR(&quot;Unable to retrieve list of database names for origin %s&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">         if (!canDeleteOrigin(origin)) {
</span><del>-            LOG_ERROR(&quot;Tried to delete an origin (%s) while either creating database in it or already deleting it&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Tried to delete an origin (%s) while either creating database in it or already deleting it&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">             ASSERT_NOT_REACHED();
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="lines">@@ -895,7 +834,7 @@
</span><span class="cx">     for (auto&amp; name : databaseNames) {
</span><span class="cx">         if (!deleteDatabaseFile(origin, name, deletionMode)) {
</span><span class="cx">             // Even if the file can't be deleted, we want to try and delete the rest, don't return early here.
</span><del>-            LOG_ERROR(&quot;Unable to delete file for database %s in origin %s&quot;, name.ascii().data(), SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Unable to delete file for database %s in origin %s&quot;, name.utf8().data(), SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -906,33 +845,33 @@
</span><span class="cx"> 
</span><span class="cx">         SQLiteStatement statement(m_database, &quot;DELETE FROM Databases WHERE origin=?&quot;);
</span><span class="cx">         if (statement.prepare() != SQLITE_OK) {
</span><del>-            LOG_ERROR(&quot;Unable to prepare deletion of databases from origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Unable to prepare deletion of databases from origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+        statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx"> 
</span><span class="cx">         if (!statement.executeCommand()) {
</span><del>-            LOG_ERROR(&quot;Unable to execute deletion of databases from origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Unable to execute deletion of databases from origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         SQLiteStatement originStatement(m_database, &quot;DELETE FROM Origins WHERE origin=?&quot;);
</span><span class="cx">         if (originStatement.prepare() != SQLITE_OK) {
</span><del>-            LOG_ERROR(&quot;Unable to prepare deletion of origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Unable to prepare deletion of origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        originStatement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+        originStatement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx"> 
</span><span class="cx">         if (!originStatement.executeCommand()) {
</span><del>-            LOG_ERROR(&quot;Unable to execute deletion of databases from origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+            LOG_ERROR(&quot;Unable to execute deletion of databases from origin %s from tracker&quot;, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         SQLiteFileSystem::deleteEmptyDatabaseDirectory(originPath(origin));
</span><span class="cx"> 
</span><del>-        RefPtr&lt;SecurityOrigin&gt; originPossiblyLastReference = origin;
</del><ins>+        Ref&lt;SecurityOrigin&gt; protectedOrigin { origin };
</ins><span class="cx">         bool isEmpty = true;
</span><span class="cx"> 
</span><span class="cx">         openTrackerDatabase(DontCreateIfDoesNotExist);
</span><span class="lines">@@ -954,9 +893,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (m_client) {
</span><span class="cx">             m_client-&gt;dispatchDidModifyOrigin(origin);
</span><del>-#if PLATFORM(IOS)
</del><span class="cx">             m_client-&gt;dispatchDidDeleteDatabaseOrigin();
</span><del>-#endif
</del><span class="cx">             for (auto&amp; name : databaseNames)
</span><span class="cx">                 m_client-&gt;dispatchDidModifyDatabase(origin, name);
</span><span class="cx">         }
</span><span class="lines">@@ -964,7 +901,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::isDeletingDatabaseOrOriginFor(SecurityOrigin *origin, const String&amp; name)
</del><ins>+bool DatabaseTracker::isDeletingDatabaseOrOriginFor(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     // Can't create a database while someone else is deleting it; there's a risk of leaving untracked database debris on the disk.
</span><span class="lines">@@ -971,114 +908,116 @@
</span><span class="cx">     return isDeletingDatabase(origin, name) || isDeletingOrigin(origin);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::recordCreatingDatabase(SecurityOrigin *origin, const String&amp; name)
</del><ins>+void DatabaseTracker::recordCreatingDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    NameCountMap* nameMap = m_beingCreated.get(origin);
-    if (!nameMap) {
-        nameMap = new NameCountMap();
-        m_beingCreated.set(origin-&gt;isolatedCopy(), nameMap);
</del><ins>+
+    // We don't use HashMap::ensure here to avoid making an isolated copy of the origin every time.
+    auto* nameSet = m_beingCreated.get(&amp;origin);
+    if (!nameSet) {
+        auto ownedSet = std::make_unique&lt;HashCountedSet&lt;String&gt;&gt;();
+        nameSet = ownedSet.get();
+        m_beingCreated.add(origin.isolatedCopy(), WTFMove(ownedSet));
</ins><span class="cx">     }
</span><del>-    long count = nameMap-&gt;get(name);
-    nameMap-&gt;set(name.isolatedCopy(), count + 1);
</del><ins>+    nameSet-&gt;add(name.isolatedCopy());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::doneCreatingDatabase(SecurityOrigin *origin, const String&amp; name)
</del><ins>+void DatabaseTracker::doneCreatingDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    NameCountMap* nameMap = m_beingCreated.get(origin);
-    ASSERT(nameMap);
-    if (!nameMap)
</del><ins>+
+    ASSERT(m_beingCreated.contains(&amp;origin));
+
+    auto iterator = m_beingCreated.find(&amp;origin);
+    if (iterator == m_beingCreated.end())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    long count = nameMap-&gt;get(name);
-    ASSERT(count &gt; 0);
-    if (count &lt;= 1) {
-        nameMap-&gt;remove(name);
-        if (nameMap-&gt;isEmpty()) {
-            m_beingCreated.remove(origin);
-            delete nameMap;
-        }
-    } else
-        nameMap-&gt;set(name, count - 1);
</del><ins>+    auto&amp; countedSet = *iterator-&gt;value;
+    ASSERT(countedSet.contains(name));
+
+    if (countedSet.remove(name) &amp;&amp; countedSet.isEmpty())
+        m_beingCreated.remove(iterator);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::creatingDatabase(SecurityOrigin *origin, const String&amp; name)
</del><ins>+bool DatabaseTracker::creatingDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    NameCountMap* nameMap = m_beingCreated.get(origin);
-    return nameMap &amp;&amp; nameMap-&gt;get(name);
</del><ins>+
+    auto iterator = m_beingCreated.find(&amp;origin);
+    return iterator != m_beingCreated.end() &amp;&amp; iterator-&gt;value-&gt;contains(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::canDeleteDatabase(SecurityOrigin *origin, const String&amp; name)
</del><ins>+bool DatabaseTracker::canDeleteDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     return !creatingDatabase(origin, name) &amp;&amp; !isDeletingDatabase(origin, name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::recordDeletingDatabase(SecurityOrigin *origin, const String&amp; name)
</del><ins>+void DatabaseTracker::recordDeletingDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     ASSERT(canDeleteDatabase(origin, name));
</span><del>-    NameSet* nameSet = m_beingDeleted.get(origin);
</del><ins>+
+    // We don't use HashMap::ensure here to avoid making an isolated copy of the origin every time.
+    auto* nameSet = m_beingDeleted.get(&amp;origin);
</ins><span class="cx">     if (!nameSet) {
</span><del>-        nameSet = new NameSet();
-        m_beingDeleted.set(origin-&gt;isolatedCopy(), nameSet);
</del><ins>+        auto ownedSet = std::make_unique&lt;HashSet&lt;String&gt;&gt;();
+        nameSet = ownedSet.get();
+        m_beingDeleted.add(origin.isolatedCopy(), WTFMove(ownedSet));
</ins><span class="cx">     }
</span><span class="cx">     ASSERT(!nameSet-&gt;contains(name));
</span><span class="cx">     nameSet-&gt;add(name.isolatedCopy());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::doneDeletingDatabase(SecurityOrigin *origin, const String&amp; name)
</del><ins>+void DatabaseTracker::doneDeletingDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    NameSet* nameSet = m_beingDeleted.get(origin);
-    ASSERT(nameSet);
-    if (!nameSet)
</del><ins>+    ASSERT(m_beingDeleted.contains(&amp;origin));
+
+    auto iterator = m_beingDeleted.find(&amp;origin);
+    if (iterator == m_beingDeleted.end())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    ASSERT(nameSet-&gt;contains(name));
-    nameSet-&gt;remove(name);
-    if (nameSet-&gt;isEmpty()) {
-        m_beingDeleted.remove(origin);
-        delete nameSet;
-    }
</del><ins>+    ASSERT(iterator-&gt;value-&gt;contains(name));
+    iterator-&gt;value-&gt;remove(name);
+    if (iterator-&gt;value-&gt;isEmpty())
+        m_beingDeleted.remove(iterator);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::isDeletingDatabase(SecurityOrigin *origin, const String&amp; name)
</del><ins>+bool DatabaseTracker::isDeletingDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    NameSet* nameSet = m_beingDeleted.get(origin);
</del><ins>+    auto* nameSet = m_beingDeleted.get(&amp;origin);
</ins><span class="cx">     return nameSet &amp;&amp; nameSet-&gt;contains(name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::canDeleteOrigin(SecurityOrigin *origin)
</del><ins>+bool DatabaseTracker::canDeleteOrigin(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    return !(isDeletingOrigin(origin) || m_beingCreated.get(origin));
</del><ins>+    return !(isDeletingOrigin(origin) || m_beingCreated.get(&amp;origin));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::isDeletingOrigin(SecurityOrigin *origin)
</del><ins>+bool DatabaseTracker::isDeletingOrigin(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><del>-    return m_originsBeingDeleted.contains(origin);
</del><ins>+    return m_originsBeingDeleted.contains(&amp;origin);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::recordDeletingOrigin(SecurityOrigin *origin)
</del><ins>+void DatabaseTracker::recordDeletingOrigin(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     ASSERT(!isDeletingOrigin(origin));
</span><del>-    m_originsBeingDeleted.add(origin-&gt;isolatedCopy());
</del><ins>+    m_originsBeingDeleted.add(origin.isolatedCopy());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::doneDeletingOrigin(SecurityOrigin *origin)
</del><ins>+void DatabaseTracker::doneDeletingOrigin(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseGuard.tryLock());
</span><span class="cx">     ASSERT(isDeletingOrigin(origin));
</span><del>-    m_originsBeingDeleted.remove(origin);
</del><ins>+    m_originsBeingDeleted.remove(&amp;origin);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool DatabaseTracker::deleteDatabase(SecurityOrigin* origin, const String&amp; name)
</del><ins>+bool DatabaseTracker::deleteDatabase(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     {
</span><span class="cx">         LockHolder lockDatabase(m_databaseGuard);
</span><span class="lines">@@ -1095,7 +1034,7 @@
</span><span class="cx"> 
</span><span class="cx">     // We drop the lock here because holding locks during a call to deleteDatabaseFile will deadlock.
</span><span class="cx">     if (!deleteDatabaseFile(origin, name, DeletionMode::Default)) {
</span><del>-        LOG_ERROR(&quot;Unable to delete file for database %s in origin %s&quot;, name.ascii().data(), SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+        LOG_ERROR(&quot;Unable to delete file for database %s in origin %s&quot;, name.utf8().data(), SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">         LockHolder lockDatabase(m_databaseGuard);
</span><span class="cx">         doneDeletingDatabase(origin, name);
</span><span class="cx">         return false;
</span><span class="lines">@@ -1105,16 +1044,16 @@
</span><span class="cx"> 
</span><span class="cx">     SQLiteStatement statement(m_database, &quot;DELETE FROM Databases WHERE origin=? AND name=?&quot;);
</span><span class="cx">     if (statement.prepare() != SQLITE_OK) {
</span><del>-        LOG_ERROR(&quot;Unable to prepare deletion of database %s from origin %s from tracker&quot;, name.ascii().data(), SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+        LOG_ERROR(&quot;Unable to prepare deletion of database %s from origin %s from tracker&quot;, name.utf8().data(), SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">         doneDeletingDatabase(origin, name);
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+    statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx">     statement.bindText(2, name);
</span><span class="cx"> 
</span><span class="cx">     if (!statement.executeCommand()) {
</span><del>-        LOG_ERROR(&quot;Unable to execute deletion of database %s from origin %s from tracker&quot;, name.ascii().data(), SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier().ascii().data());
</del><ins>+        LOG_ERROR(&quot;Unable to execute deletion of database %s from origin %s from tracker&quot;, name.utf8().data(), SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier().utf8().data());
</ins><span class="cx">         doneDeletingDatabase(origin, name);
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -1122,9 +1061,7 @@
</span><span class="cx">     if (m_client) {
</span><span class="cx">         m_client-&gt;dispatchDidModifyOrigin(origin);
</span><span class="cx">         m_client-&gt;dispatchDidModifyDatabase(origin, name);
</span><del>-#if PLATFORM(IOS)
</del><span class="cx">         m_client-&gt;dispatchDidDeleteDatabase();
</span><del>-#endif
</del><span class="cx">     }
</span><span class="cx">     doneDeletingDatabase(origin, name);
</span><span class="cx">     
</span><span class="lines">@@ -1133,7 +1070,7 @@
</span><span class="cx"> 
</span><span class="cx"> // deleteDatabaseFile has to release locks between looking up the list of databases to close and closing them.  While this is in progress, the caller
</span><span class="cx"> // is responsible for making sure no new databases are opened in the file to be deleted.
</span><del>-bool DatabaseTracker::deleteDatabaseFile(SecurityOrigin* origin, const String&amp; name, DeletionMode deletionMode)
</del><ins>+bool DatabaseTracker::deleteDatabaseFile(SecurityOrigin&amp; origin, const String&amp; name, DeletionMode deletionMode)
</ins><span class="cx"> {
</span><span class="cx">     String fullPath = fullPathForDatabase(origin, name, false);
</span><span class="cx">     if (fullPath.isEmpty())
</span><span class="lines">@@ -1146,7 +1083,7 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;Database&gt;&gt; deletedDatabases;
</del><ins>+    Vector&lt;Ref&lt;Database&gt;&gt; deletedDatabases;
</ins><span class="cx"> 
</span><span class="cx">     // Make sure not to hold the any locks when calling
</span><span class="cx">     // Database::markAsDeletedAndClose(), since that can cause a deadlock
</span><span class="lines">@@ -1154,16 +1091,10 @@
</span><span class="cx">     {
</span><span class="cx">         LockHolder openDatabaseMapLock(m_openDatabaseMapGuard);
</span><span class="cx">         if (m_openDatabaseMap) {
</span><del>-            // There are some open databases, lets check if they are for this origin.
-            DatabaseNameMap* nameMap = m_openDatabaseMap-&gt;get(origin);
-            if (nameMap &amp;&amp; nameMap-&gt;size()) {
-                // There are some open databases for this origin, let's check
-                // if they are this database by name.
-                DatabaseSet* databaseSet = nameMap-&gt;get(name);
-                if (databaseSet &amp;&amp; databaseSet-&gt;size()) {
-                    // We have some database open with this name. Mark them as deleted.
</del><ins>+            if (auto* nameMap = m_openDatabaseMap-&gt;get(&amp;origin)) {
+                if (auto* databaseSet = nameMap-&gt;get(name)) {
</ins><span class="cx">                     for (auto&amp; database : *databaseSet)
</span><del>-                        deletedDatabases.append(database);
</del><ins>+                        deletedDatabases.append(*database);
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -1174,7 +1105,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     if (deletionMode == DeletionMode::Deferred) {
</span><del>-        // On the phone, other background processes may still be accessing this database. Deleting the database directly
</del><ins>+        // Other background processes may still be accessing this database. Deleting the database directly
</ins><span class="cx">         // would nuke the POSIX file locks, potentially causing Safari/WebApp to corrupt the new db if it's running in the background.
</span><span class="cx">         // We'll instead truncate the database file to 0 bytes. If another process is operating on this same database file after
</span><span class="cx">         // the truncation, it should get an error since the database file is no longer valid. When Safari is launched
</span><span class="lines">@@ -1192,6 +1123,7 @@
</span><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> #if PLATFORM(IOS)
</span><ins>+
</ins><span class="cx"> void DatabaseTracker::removeDeletedOpenedDatabases()
</span><span class="cx"> {
</span><span class="cx">     // This is called when another app has deleted a database.  Go through all opened databases in this
</span><span class="lines">@@ -1207,10 +1139,9 @@
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     // Keep track of which opened databases have been deleted.
</span><del>-    Vector&lt;RefPtr&lt;Database&gt; &gt; deletedDatabases;
-    typedef HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, Vector&lt;String&gt; &gt; DeletedDatabaseMap;
-    DeletedDatabaseMap deletedDatabaseMap;
-    
</del><ins>+    Vector&lt;RefPtr&lt;Database&gt;&gt; deletedDatabases;
+    Vector&lt;std::pair&lt;Ref&lt;SecurityOrigin&gt;, Vector&lt;String&gt;&gt;&gt; deletedDatabaseNames;
+
</ins><span class="cx">     // Make sure not to hold the m_openDatabaseMapGuard mutex when calling
</span><span class="cx">     // Database::markAsDeletedAndClose(), since that can cause a deadlock
</span><span class="cx">     // during the synchronous DatabaseThread call it triggers.
</span><span class="lines">@@ -1218,7 +1149,7 @@
</span><span class="cx">         LockHolder openDatabaseMapLock(m_openDatabaseMapGuard);
</span><span class="cx">         if (m_openDatabaseMap) {
</span><span class="cx">             for (auto&amp; openDatabase : *m_openDatabaseMap) {
</span><del>-                auto&amp; origin = openDatabase.key;
</del><ins>+                auto&amp; origin = *openDatabase.key;
</ins><span class="cx">                 DatabaseNameMap* databaseNameMap = openDatabase.value;
</span><span class="cx">                 Vector&lt;String&gt; deletedDatabaseNamesForThisOrigin;
</span><span class="cx"> 
</span><span class="lines">@@ -1229,7 +1160,7 @@
</span><span class="cx">                     String databaseFileName;
</span><span class="cx">                     SQLiteStatement statement(m_database, &quot;SELECT path FROM Databases WHERE origin=? AND name=?;&quot;);
</span><span class="cx">                     if (statement.prepare() == SQLITE_OK) {
</span><del>-                        statement.bindText(1, SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier());
</del><ins>+                        statement.bindText(1, SecurityOriginData::fromSecurityOrigin(origin).databaseIdentifier());
</ins><span class="cx">                         statement.bindText(2, databaseName);
</span><span class="cx">                         if (statement.step() == SQLITE_ROW)
</span><span class="cx">                             databaseFileName = statement.getColumnText(0);
</span><span class="lines">@@ -1249,13 +1180,13 @@
</span><span class="cx">                         }
</span><span class="cx">                     }
</span><span class="cx">                     
</span><del>-                    // If the database no longer exists, we should remember to remove it from the OriginQuotaManager later.
-                    if (foundDeletedDatabase &amp;&amp; databaseFileName.isNull())
</del><ins>+                    // If the database no longer exists, we should remember to send that information to the client later.
+                    if (m_client &amp;&amp; foundDeletedDatabase &amp;&amp; databaseFileName.isNull())
</ins><span class="cx">                         deletedDatabaseNamesForThisOrigin.append(databaseName);
</span><span class="cx">                 }
</span><span class="cx">                 
</span><span class="cx">                 if (!deletedDatabaseNamesForThisOrigin.isEmpty())
</span><del>-                    deletedDatabaseMap.set(origin, deletedDatabaseNamesForThisOrigin);
</del><ins>+                    deletedDatabaseNames.append({ origin, WTFMove(deletedDatabaseNamesForThisOrigin) });
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -1263,16 +1194,11 @@
</span><span class="cx">     for (auto&amp; deletedDatabase : deletedDatabases)
</span><span class="cx">         deletedDatabase-&gt;markAsDeletedAndClose();
</span><span class="cx"> 
</span><del>-    for (auto&amp; deletedDatabase : deletedDatabaseMap) {
-        SecurityOrigin* origin = deletedDatabase.key.get();
-        if (m_client)
-            m_client-&gt;dispatchDidModifyOrigin(origin);
-        
-        const Vector&lt;String&gt;&amp; databaseNames = deletedDatabase.value;
-        for (auto&amp; databaseName : databaseNames) {
-            if (m_client)
-                m_client-&gt;dispatchDidModifyDatabase(origin, databaseName);
-        }        
</del><ins>+    for (auto&amp; deletedDatabase : deletedDatabaseNames) {
+        auto&amp; origin = deletedDatabase.first;
+        m_client-&gt;dispatchDidModifyOrigin(origin);
+        for (auto&amp; databaseName : deletedDatabase.second)
+            m_client-&gt;dispatchDidModifyDatabase(origin, databaseName);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx">     
</span><span class="lines">@@ -1350,7 +1276,7 @@
</span><span class="cx">     return mutex;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-typedef Vector&lt;std::pair&lt;RefPtr&lt;SecurityOrigin&gt;, String&gt;&gt; NotificationQueue;
</del><ins>+using NotificationQueue = Vector&lt;std::pair&lt;Ref&lt;SecurityOrigin&gt;, String&gt;&gt;;
</ins><span class="cx"> 
</span><span class="cx"> static NotificationQueue&amp; notificationQueue()
</span><span class="cx"> {
</span><span class="lines">@@ -1358,11 +1284,10 @@
</span><span class="cx">     return queue;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseTracker::scheduleNotifyDatabaseChanged(SecurityOrigin* origin, const String&amp; name)
</del><ins>+void DatabaseTracker::scheduleNotifyDatabaseChanged(SecurityOrigin&amp; origin, const String&amp; name)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder locker(notificationMutex());
</span><del>-
-    notificationQueue().append(std::pair&lt;RefPtr&lt;SecurityOrigin&gt;, String&gt;(origin-&gt;isolatedCopy(), name.isolatedCopy()));
</del><ins>+    notificationQueue().append(std::make_pair(origin.isolatedCopy(), name.isolatedCopy()));
</ins><span class="cx">     scheduleForNotification();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1384,22 +1309,20 @@
</span><span class="cx"> {
</span><span class="cx">     // Note that if DatabaseTracker ever becomes non-singleton, we'll have to amend this notification
</span><span class="cx">     // mechanism to include which tracker the notification goes out on as well.
</span><del>-    DatabaseTracker&amp; theTracker(tracker());
</del><ins>+    auto&amp; tracker = DatabaseTracker::singleton();
</ins><span class="cx"> 
</span><span class="cx">     NotificationQueue notifications;
</span><span class="cx">     {
</span><span class="cx">         LockHolder locker(notificationMutex());
</span><del>-
</del><span class="cx">         notifications.swap(notificationQueue());
</span><del>-
</del><span class="cx">         notificationScheduled = false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!theTracker.m_client)
</del><ins>+    if (!tracker.m_client)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    for (unsigned i = 0; i &lt; notifications.size(); ++i)
-        theTracker.m_client-&gt;dispatchDidModifyDatabase(notifications[i].first.get(), notifications[i].second);
</del><ins>+    for (auto&amp; notification : notifications)
+        tracker.m_client-&gt;dispatchDidModifyDatabase(notification.first, notification.second);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseTrackerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -29,13 +29,13 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DatabaseDetails.h&quot;
</span><del>-#include &quot;DatabaseError.h&quot;
</del><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;SQLiteDatabase.h&quot;
</span><span class="cx"> #include &quot;SecurityOriginHash.h&quot;
</span><ins>+#include &lt;wtf/HashCountedSet.h&gt;
</ins><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/text/StringHash.h&gt;
</span><del>-#include &lt;wtf/text/WTFString.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> 
</span><span class="cx">     static void initializeTracker(const String&amp; databasePath);
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT static DatabaseTracker&amp; tracker();
</del><ins>+    WEBCORE_EXPORT static DatabaseTracker&amp; singleton();
</ins><span class="cx">     // This singleton will potentially be used from multiple worker threads and the page's context thread simultaneously.  To keep this safe, it's
</span><span class="cx">     // currently using 4 locks.  In order to avoid deadlock when taking multiple locks, you must take them in the correct order:
</span><span class="cx">     // m_databaseGuard before quotaManager if both locks are needed.
</span><span class="lines">@@ -63,43 +63,33 @@
</span><span class="cx">     // m_databaseGuard and m_openDatabaseMapGuard currently don't overlap.
</span><span class="cx">     // notificationMutex() is currently independent of the other locks.
</span><span class="cx"> 
</span><del>-    bool canEstablishDatabase(DatabaseContext*, const String&amp; name, unsigned long estimatedSize, DatabaseError&amp;);
-    bool retryCanEstablishDatabase(DatabaseContext*, const String&amp; name, unsigned long estimatedSize, DatabaseError&amp;);
</del><ins>+    ExceptionOr&lt;void&gt; canEstablishDatabase(DatabaseContext&amp;, const String&amp; name, unsigned estimatedSize);
+    ExceptionOr&lt;void&gt; retryCanEstablishDatabase(DatabaseContext&amp;, const String&amp; name, unsigned estimatedSize);
</ins><span class="cx"> 
</span><del>-    void setDatabaseDetails(SecurityOrigin*, const String&amp; name, const String&amp; displayName, unsigned long estimatedSize);
-    String fullPathForDatabase(SecurityOrigin*, const String&amp; name, bool createIfDoesNotExist = true);
</del><ins>+    void setDatabaseDetails(SecurityOrigin&amp;, const String&amp; name, const String&amp; displayName, unsigned estimatedSize);
+    String fullPathForDatabase(SecurityOrigin&amp;, const String&amp; name, bool createIfDoesNotExist);
</ins><span class="cx"> 
</span><del>-    void addOpenDatabase(Database*);
-    void removeOpenDatabase(Database*);
-    void getOpenDatabases(SecurityOrigin*, const String&amp; name, HashSet&lt;RefPtr&lt;Database&gt;&gt;* databases);
</del><ins>+    void addOpenDatabase(Database&amp;);
+    void removeOpenDatabase(Database&amp;);
</ins><span class="cx"> 
</span><del>-    unsigned long long getMaxSizeForDatabase(const Database*);
</del><ins>+    unsigned long long maximumSize(Database&amp;);
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void closeAllDatabases(CurrentQueryBehavior = CurrentQueryBehavior::RunToCompletion);
</span><span class="cx"> 
</span><del>-private:
-    explicit DatabaseTracker(const String&amp; databasePath);
</del><ins>+    WEBCORE_EXPORT Vector&lt;Ref&lt;SecurityOrigin&gt;&gt; origins();
+    WEBCORE_EXPORT Vector&lt;String&gt; databaseNames(SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><del>-    bool hasAdequateQuotaForOrigin(SecurityOrigin*, unsigned long estimatedSize, DatabaseError&amp;);
</del><ins>+    DatabaseDetails detailsForNameAndOrigin(const String&amp;, SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><del>-public:
-    void setDatabaseDirectoryPath(const String&amp;);
-    String databaseDirectoryPath() const;
</del><ins>+    WEBCORE_EXPORT unsigned long long usage(SecurityOrigin&amp;);
+    WEBCORE_EXPORT unsigned long long quota(SecurityOrigin&amp;);
+    WEBCORE_EXPORT void setQuota(SecurityOrigin&amp;, unsigned long long);
+    RefPtr&lt;OriginLock&gt; originLockFor(SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result);
-    bool databaseNamesForOrigin(SecurityOrigin*, Vector&lt;String&gt;&amp; result);
-
-    DatabaseDetails detailsForNameAndOrigin(const String&amp;, SecurityOrigin*);
-
-    unsigned long long usageForOrigin(SecurityOrigin*);
-    unsigned long long quotaForOrigin(SecurityOrigin*);
-    void setQuota(SecurityOrigin*, unsigned long long);
-    RefPtr&lt;OriginLock&gt; originLockFor(SecurityOrigin*);
-
-    void deleteAllDatabasesImmediately();
</del><ins>+    WEBCORE_EXPORT void deleteAllDatabasesImmediately();
</ins><span class="cx">     WEBCORE_EXPORT void deleteDatabasesModifiedSince(std::chrono::system_clock::time_point);
</span><del>-    WEBCORE_EXPORT bool deleteOrigin(SecurityOrigin*);
-    bool deleteDatabase(SecurityOrigin*, const String&amp; name);
</del><ins>+    WEBCORE_EXPORT bool deleteOrigin(SecurityOrigin&amp;);
+    WEBCORE_EXPORT bool deleteDatabase(SecurityOrigin&amp;, const String&amp; name);
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     WEBCORE_EXPORT void removeDeletedOpenedDatabases();
</span><span class="lines">@@ -117,18 +107,20 @@
</span><span class="cx">     void setClient(DatabaseManagerClient*);
</span><span class="cx"> 
</span><span class="cx">     // From a secondary thread, must be thread safe with its data
</span><del>-    void scheduleNotifyDatabaseChanged(SecurityOrigin*, const String&amp; name);
</del><ins>+    void scheduleNotifyDatabaseChanged(SecurityOrigin&amp;, const String&amp; name);
</ins><span class="cx"> 
</span><del>-    bool hasEntryForOrigin(SecurityOrigin*);
</del><ins>+    void doneCreatingDatabase(Database&amp;);
</ins><span class="cx"> 
</span><del>-    void doneCreatingDatabase(Database*);
-
</del><span class="cx"> private:
</span><del>-    bool hasEntryForOriginNoLock(SecurityOrigin* origin);
-    String fullPathForDatabaseNoLock(SecurityOrigin*, const String&amp; name, bool createIfDoesNotExist);
-    bool databaseNamesForOriginNoLock(SecurityOrigin* origin, Vector&lt;String&gt;&amp; resultVector);
-    unsigned long long quotaForOriginNoLock(SecurityOrigin* origin);
</del><ins>+    explicit DatabaseTracker(const String&amp; databasePath);
</ins><span class="cx"> 
</span><ins>+    ExceptionOr&lt;void&gt; hasAdequateQuotaForOrigin(SecurityOrigin&amp;, unsigned estimatedSize);
+
+    bool hasEntryForOriginNoLock(SecurityOrigin&amp;);
+    String fullPathForDatabaseNoLock(SecurityOrigin&amp;, const String&amp; name, bool createIfDoesNotExist);
+    Vector&lt;String&gt; databaseNamesNoLock(SecurityOrigin&amp;);
+    unsigned long long quotaNoLock(SecurityOrigin&amp;);
+
</ins><span class="cx">     String trackerDatabasePath() const;
</span><span class="cx"> 
</span><span class="cx">     enum TrackerCreationAction {
</span><span class="lines">@@ -137,11 +129,11 @@
</span><span class="cx">     };
</span><span class="cx">     void openTrackerDatabase(TrackerCreationAction);
</span><span class="cx"> 
</span><del>-    String originPath(SecurityOrigin*) const;
</del><ins>+    String originPath(SecurityOrigin&amp;) const;
</ins><span class="cx"> 
</span><del>-    bool hasEntryForDatabase(SecurityOrigin*, const String&amp; databaseIdentifier);
</del><ins>+    bool hasEntryForDatabase(SecurityOrigin&amp;, const String&amp; databaseIdentifier);
</ins><span class="cx"> 
</span><del>-    bool addDatabase(SecurityOrigin*, const String&amp; name, const String&amp; path);
</del><ins>+    bool addDatabase(SecurityOrigin&amp;, const String&amp; name, const String&amp; path);
</ins><span class="cx"> 
</span><span class="cx">     enum class DeletionMode {
</span><span class="cx">         Immediate,
</span><span class="lines">@@ -155,14 +147,14 @@
</span><span class="cx"> #endif
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    bool deleteOrigin(SecurityOrigin*, DeletionMode);
-    bool deleteDatabaseFile(SecurityOrigin*, const String&amp; name, DeletionMode);
</del><ins>+    bool deleteOrigin(SecurityOrigin&amp;, DeletionMode);
+    bool deleteDatabaseFile(SecurityOrigin&amp;, const String&amp; name, DeletionMode);
</ins><span class="cx"> 
</span><del>-    void deleteOriginLockFor(SecurityOrigin*);
</del><ins>+    void deleteOriginLockFor(SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><del>-    typedef HashSet&lt;Database*&gt; DatabaseSet;
-    typedef HashMap&lt;String, DatabaseSet*&gt; DatabaseNameMap;
-    typedef HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, DatabaseNameMap*&gt; DatabaseOriginMap;
</del><ins>+    using DatabaseSet = HashSet&lt;Database*&gt;;
+    using DatabaseNameMap = HashMap&lt;String, DatabaseSet*&gt;;
+    using DatabaseOriginMap = HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, DatabaseNameMap*&gt;;
</ins><span class="cx"> 
</span><span class="cx">     Lock m_openDatabaseMapGuard;
</span><span class="cx">     mutable std::unique_ptr&lt;DatabaseOriginMap&gt; m_openDatabaseMap;
</span><span class="lines">@@ -171,31 +163,28 @@
</span><span class="cx">     Lock m_databaseGuard;
</span><span class="cx">     SQLiteDatabase m_database;
</span><span class="cx"> 
</span><del>-    typedef HashMap&lt;String, RefPtr&lt;OriginLock&gt;&gt; OriginLockMap;
</del><ins>+    using OriginLockMap = HashMap&lt;String, RefPtr&lt;OriginLock&gt;&gt;;
</ins><span class="cx">     OriginLockMap m_originLockMap;
</span><span class="cx"> 
</span><span class="cx">     String m_databaseDirectoryPath;
</span><span class="cx"> 
</span><del>-    DatabaseManagerClient* m_client;
</del><ins>+    DatabaseManagerClient* m_client { nullptr };
</ins><span class="cx"> 
</span><del>-    typedef HashMap&lt;String, long&gt; NameCountMap;
-    typedef HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, NameCountMap*, SecurityOriginHash&gt; CreateSet;
-    CreateSet m_beingCreated;
-    typedef HashSet&lt;String&gt; NameSet;
-    HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, NameSet*&gt; m_beingDeleted;
</del><ins>+    HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, std::unique_ptr&lt;HashCountedSet&lt;String&gt;&gt;&gt; m_beingCreated;
+    HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, std::unique_ptr&lt;HashSet&lt;String&gt;&gt;&gt; m_beingDeleted;
</ins><span class="cx">     HashSet&lt;RefPtr&lt;SecurityOrigin&gt;&gt; m_originsBeingDeleted;
</span><del>-    bool isDeletingDatabaseOrOriginFor(SecurityOrigin*, const String&amp; name);
-    void recordCreatingDatabase(SecurityOrigin*, const String&amp; name);
-    void doneCreatingDatabase(SecurityOrigin*, const String&amp; name);
-    bool creatingDatabase(SecurityOrigin*, const String&amp; name);
-    bool canDeleteDatabase(SecurityOrigin*, const String&amp; name);
-    void recordDeletingDatabase(SecurityOrigin*, const String&amp; name);
-    void doneDeletingDatabase(SecurityOrigin*, const String&amp; name);
-    bool isDeletingDatabase(SecurityOrigin*, const String&amp; name);
-    bool canDeleteOrigin(SecurityOrigin*);
-    bool isDeletingOrigin(SecurityOrigin*);
-    void recordDeletingOrigin(SecurityOrigin*);
-    void doneDeletingOrigin(SecurityOrigin*);
</del><ins>+    bool isDeletingDatabaseOrOriginFor(SecurityOrigin&amp;, const String&amp; name);
+    void recordCreatingDatabase(SecurityOrigin&amp;, const String&amp; name);
+    void doneCreatingDatabase(SecurityOrigin&amp;, const String&amp; name);
+    bool creatingDatabase(SecurityOrigin&amp;, const String&amp; name);
+    bool canDeleteDatabase(SecurityOrigin&amp;, const String&amp; name);
+    void recordDeletingDatabase(SecurityOrigin&amp;, const String&amp; name);
+    void doneDeletingDatabase(SecurityOrigin&amp;, const String&amp; name);
+    bool isDeletingDatabase(SecurityOrigin&amp;, const String&amp; name);
+    bool canDeleteOrigin(SecurityOrigin&amp;);
+    bool isDeletingOrigin(SecurityOrigin&amp;);
+    void recordDeletingOrigin(SecurityOrigin&amp;);
+    void doneDeletingOrigin(SecurityOrigin&amp;);
</ins><span class="cx"> 
</span><span class="cx">     static void scheduleForNotification();
</span><span class="cx">     static void notifyDatabasesChanged();
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLStatementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/SQLStatement.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLStatement.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLStatement.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -77,8 +77,8 @@
</span><span class="cx"> SQLStatement::SQLStatement(Database&amp; database, const String&amp; statement, const Vector&lt;SQLValue&gt;&amp; arguments, RefPtr&lt;SQLStatementCallback&gt;&amp;&amp; callback, RefPtr&lt;SQLStatementErrorCallback&gt;&amp;&amp; errorCallback, int permissions)
</span><span class="cx">     : m_statement(statement.isolatedCopy())
</span><span class="cx">     , m_arguments(arguments)
</span><del>-    , m_statementCallbackWrapper(WTFMove(callback), database.scriptExecutionContext())
-    , m_statementErrorCallbackWrapper(WTFMove(errorCallback), database.scriptExecutionContext())
</del><ins>+    , m_statementCallbackWrapper(WTFMove(callback), &amp;database.scriptExecutionContext())
+    , m_statementErrorCallbackWrapper(WTFMove(errorCallback), &amp;database.scriptExecutionContext())
</ins><span class="cx">     , m_permissions(permissions)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -43,7 +43,6 @@
</span><span class="cx"> #include &quot;SQLStatementErrorCallback.h&quot;
</span><span class="cx"> #include &quot;SQLTransactionBackend.h&quot;
</span><span class="cx"> #include &quot;SQLTransactionCallback.h&quot;
</span><del>-#include &quot;SQLTransactionClient.h&quot;
</del><span class="cx"> #include &quot;SQLTransactionCoordinator.h&quot;
</span><span class="cx"> #include &quot;SQLTransactionErrorCallback.h&quot;
</span><span class="cx"> #include &quot;SQLiteTransaction.h&quot;
</span><span class="lines">@@ -60,17 +59,12 @@
</span><span class="cx"> 
</span><span class="cx"> SQLTransaction::SQLTransaction(Ref&lt;Database&gt;&amp;&amp; database, RefPtr&lt;SQLTransactionCallback&gt;&amp;&amp; callback, RefPtr&lt;VoidCallback&gt;&amp;&amp; successCallback, RefPtr&lt;SQLTransactionErrorCallback&gt;&amp;&amp; errorCallback, RefPtr&lt;SQLTransactionWrapper&gt;&amp;&amp; wrapper, bool readOnly)
</span><span class="cx">     : m_database(WTFMove(database))
</span><del>-    , m_callbackWrapper(WTFMove(callback), m_database-&gt;scriptExecutionContext())
-    , m_successCallbackWrapper(WTFMove(successCallback), m_database-&gt;scriptExecutionContext())
-    , m_errorCallbackWrapper(WTFMove(errorCallback), m_database-&gt;scriptExecutionContext())
</del><ins>+    , m_callbackWrapper(WTFMove(callback), &amp;m_database-&gt;scriptExecutionContext())
+    , m_successCallbackWrapper(WTFMove(successCallback), &amp;m_database-&gt;scriptExecutionContext())
+    , m_errorCallbackWrapper(WTFMove(errorCallback), &amp;m_database-&gt;scriptExecutionContext())
</ins><span class="cx">     , m_wrapper(WTFMove(wrapper))
</span><span class="cx">     , m_nextStep(&amp;SQLTransaction::acquireLock)
</span><del>-    , m_executeSqlAllowed(false)
-    , m_shouldRetryCurrentStatement(false)
-    , m_modifiedDatabase(false)
-    , m_lockAcquired(false)
</del><span class="cx">     , m_readOnly(readOnly)
</span><del>-    , m_hasVersionMismatch(false)
</del><span class="cx">     , m_backend(*this)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -79,15 +73,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SQLTransaction::executeSQL(const String&amp; sqlStatement, const Vector&lt;SQLValue&gt;&amp; arguments, RefPtr&lt;SQLStatementCallback&gt;&amp;&amp; callback, RefPtr&lt;SQLStatementErrorCallback&gt;&amp;&amp; callbackError, ExceptionCode&amp; ec)
</del><ins>+ExceptionOr&lt;void&gt; SQLTransaction::executeSQL(const String&amp; sqlStatement, const Vector&lt;SQLValue&gt;&amp; arguments, RefPtr&lt;SQLStatementCallback&gt;&amp;&amp; callback, RefPtr&lt;SQLStatementErrorCallback&gt;&amp;&amp; callbackError)
</ins><span class="cx"> {
</span><del>-    if (!m_executeSqlAllowed || !m_database-&gt;opened()) {
-        ec = INVALID_STATE_ERR;
-        return;
-    }
</del><ins>+    if (!m_executeSqlAllowed || !m_database-&gt;opened())
+        return Exception { INVALID_STATE_ERR };
</ins><span class="cx"> 
</span><span class="cx">     int permissions = DatabaseAuthorizer::ReadWriteMask;
</span><del>-    if (!m_database-&gt;databaseContext()-&gt;allowDatabaseAccess())
</del><ins>+    if (!m_database-&gt;databaseContext().allowDatabaseAccess())
</ins><span class="cx">         permissions |= DatabaseAuthorizer::NoAccessMask;
</span><span class="cx">     else if (m_readOnly)
</span><span class="cx">         permissions |= DatabaseAuthorizer::ReadOnlyMask;
</span><span class="lines">@@ -98,6 +90,8 @@
</span><span class="cx">         statement-&gt;setDatabaseDeletedError();
</span><span class="cx"> 
</span><span class="cx">     enqueueStatement(WTFMove(statement));
</span><ins>+
+    return { };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SQLTransaction::lockAcquired()
</span><span class="lines">@@ -193,7 +187,7 @@
</span><span class="cx">     m_errorCallbackWrapper.clear();
</span><span class="cx"> 
</span><span class="cx">     // The next steps should be executed only if we're on the DB thread.
</span><del>-    if (currentThread() != m_database-&gt;databaseContext()-&gt;databaseThread()-&gt;getThreadID())
</del><ins>+    if (currentThread() != m_database-&gt;databaseThread().getThreadID())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     // The current SQLite transaction should be stopped, as well
</span><span class="lines">@@ -436,7 +430,7 @@
</span><span class="cx">     ASSERT(m_currentStatement);
</span><span class="cx">     ASSERT(!m_shouldRetryCurrentStatement);
</span><span class="cx"> 
</span><del>-    m_shouldRetryCurrentStatement = m_database-&gt;transactionClient()-&gt;didExceedQuota(&amp;database());
</del><ins>+    m_shouldRetryCurrentStatement = m_database-&gt;didExceedQuota();
</ins><span class="cx"> 
</span><span class="cx">     m_backend.requestTransitToState(SQLTransactionState::RunStatements);
</span><span class="cx"> }
</span><span class="lines">@@ -606,7 +600,7 @@
</span><span class="cx"> 
</span><span class="cx">     // The commit was successful. If the transaction modified this database, notify the delegates.
</span><span class="cx">     if (m_modifiedDatabase)
</span><del>-        m_database-&gt;transactionClient()-&gt;didCommitWriteTransaction(m_database.ptr());
</del><ins>+        m_database-&gt;didCommitWriteTransaction();
</ins><span class="cx"> 
</span><span class="cx">     // Spec 4.3.2.8: Deliver success callback, if there is one.
</span><span class="cx">     scheduleCallback(&amp;SQLTransaction::deliverSuccessCallback);
</span><span class="lines">@@ -615,7 +609,7 @@
</span><span class="cx"> void SQLTransaction::acquireOriginLock()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_originLock);
</span><del>-    m_originLock = DatabaseTracker::tracker().originLockFor(m_database-&gt;securityOrigin());
</del><ins>+    m_originLock = DatabaseTracker::singleton().originLockFor(m_database-&gt;securityOrigin());
</ins><span class="cx">     m_originLock-&gt;lock();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLTransactionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -29,11 +29,10 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;EventTarget.h&quot;
</span><ins>+#include &quot;ExceptionOr.h&quot;
</ins><span class="cx"> #include &quot;SQLCallbackWrapper.h&quot;
</span><span class="cx"> #include &quot;SQLTransactionBackend.h&quot;
</span><span class="cx"> #include &quot;SQLTransactionStateMachine.h&quot;
</span><del>-#include &lt;wtf/Ref.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="lines">@@ -61,7 +60,7 @@
</span><span class="cx">     static Ref&lt;SQLTransaction&gt; create(Ref&lt;Database&gt;&amp;&amp;, RefPtr&lt;SQLTransactionCallback&gt;&amp;&amp;, RefPtr&lt;VoidCallback&gt;&amp;&amp; successCallback, RefPtr&lt;SQLTransactionErrorCallback&gt;&amp;&amp;, RefPtr&lt;SQLTransactionWrapper&gt;&amp;&amp;, bool readOnly);
</span><span class="cx">     ~SQLTransaction();
</span><span class="cx"> 
</span><del>-    void executeSQL(const String&amp; sqlStatement, const Vector&lt;SQLValue&gt;&amp; arguments, RefPtr&lt;SQLStatementCallback&gt;&amp;&amp;, RefPtr&lt;SQLStatementErrorCallback&gt;&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    ExceptionOr&lt;void&gt; executeSQL(const String&amp; sqlStatement, const Vector&lt;SQLValue&gt;&amp; arguments, RefPtr&lt;SQLStatementCallback&gt;&amp;&amp;, RefPtr&lt;SQLStatementErrorCallback&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void lockAcquired();
</span><span class="cx">     void performNextStep();
</span><span class="lines">@@ -127,14 +126,14 @@
</span><span class="cx"> 
</span><span class="cx">     void (SQLTransaction::*m_nextStep)();
</span><span class="cx"> 
</span><del>-    bool m_executeSqlAllowed;
</del><ins>+    bool m_executeSqlAllowed { false };
</ins><span class="cx">     RefPtr&lt;SQLError&gt; m_transactionError;
</span><span class="cx"> 
</span><del>-    bool m_shouldRetryCurrentStatement;
-    bool m_modifiedDatabase;
-    bool m_lockAcquired;
-    bool m_readOnly;
-    bool m_hasVersionMismatch;
</del><ins>+    bool m_shouldRetryCurrentStatement { false };
+    bool m_modifiedDatabase { false };
+    bool m_lockAcquired { false };
+    bool m_readOnly { false };
+    bool m_hasVersionMismatch { false };
</ins><span class="cx"> 
</span><span class="cx">     Lock m_statementMutex;
</span><span class="cx">     Deque&lt;std::unique_ptr&lt;SQLStatement&gt;&gt; m_statementQueue;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLTransactionidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.idl (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.idl        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.idl        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -29,8 +29,5 @@
</span><span class="cx"> [
</span><span class="cx">     SkipVTableValidation,
</span><span class="cx"> ] interface SQLTransaction {
</span><del>-    [Custom] void executeSql(DOMString sqlStatement,
-                             ObjectArray arguments,
-                             optional SQLStatementCallback? callback,
-                             optional SQLStatementErrorCallback? errorCallback);
</del><ins>+    [Custom, MayThrowException] void executeSql(DOMString sqlStatement, ObjectArray arguments, optional SQLStatementCallback? callback, optional SQLStatementErrorCallback? errorCallback);
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLTransactionBackendcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -42,7 +42,6 @@
</span><span class="cx"> #include &quot;SQLStatementCallback.h&quot;
</span><span class="cx"> #include &quot;SQLStatementErrorCallback.h&quot;
</span><span class="cx"> #include &quot;SQLTransaction.h&quot;
</span><del>-#include &quot;SQLTransactionClient.h&quot;
</del><span class="cx"> #include &quot;SQLTransactionCoordinator.h&quot;
</span><span class="cx"> #include &quot;SQLValue.h&quot;
</span><span class="cx"> #include &quot;SQLiteTransaction.h&quot;
</span><span class="lines">@@ -356,7 +355,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SQLTransactionBackend::doCleanup()
</span><span class="cx"> {
</span><del>-    ASSERT(currentThread() == m_frontend.database().databaseContext()-&gt;databaseThread()-&gt;getThreadID());
</del><ins>+    ASSERT(currentThread() == m_frontend.database().databaseThread().getThreadID());
</ins><span class="cx"> 
</span><span class="cx">     m_frontend.releaseOriginLockIfNeeded();
</span><span class="cx"> 
</span><span class="lines">@@ -468,7 +467,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SQLTransactionBackend::notifyDatabaseThreadIsShuttingDown()
</span><span class="cx"> {
</span><del>-    ASSERT(currentThread() == m_frontend.m_database-&gt;databaseContext()-&gt;databaseThread()-&gt;getThreadID());
</del><ins>+    ASSERT(currentThread() == m_frontend.database().databaseThread().getThreadID());
</ins><span class="cx"> 
</span><span class="cx">     // If the transaction is in progress, we should roll it back here, since this
</span><span class="cx">     // is our last opportunity to do something related to this transaction on the
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLTransactionClientcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,59 +0,0 @@
</span><del>-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;SQLTransactionClient.h&quot;
-
-#include &quot;Database.h&quot;
-#include &quot;DatabaseContext.h&quot;
-#include &quot;DatabaseManager.h&quot;
-#include &quot;DatabaseTracker.h&quot;
-#include &quot;ScriptExecutionContext.h&quot;
-#include &quot;SecurityOrigin.h&quot;
-
-namespace WebCore {
-
-void SQLTransactionClient::didCommitWriteTransaction(Database* database)
-{
-    DatabaseTracker::tracker().scheduleNotifyDatabaseChanged(
-        database-&gt;securityOrigin(), database-&gt;stringIdentifier());
-}
-
-bool SQLTransactionClient::didExceedQuota(Database* database)
-{
-    ASSERT(database-&gt;databaseContext()-&gt;scriptExecutionContext()-&gt;isContextThread());
-    auto&amp; databaseManager = DatabaseManager::singleton();
-    unsigned long long currentQuota = databaseManager.quotaForOrigin(database-&gt;securityOrigin());
-    database-&gt;databaseContext()-&gt;databaseExceededQuota(database-&gt;stringIdentifier(), database-&gt;details());
-    unsigned long long newQuota = databaseManager.quotaForOrigin(database-&gt;securityOrigin());
-    return (newQuota &gt; currentQuota);
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLTransactionClienth"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransactionClient.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,50 +0,0 @@
</span><del>-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include &lt;wtf/FastMalloc.h&gt;
-#include &lt;wtf/Noncopyable.h&gt;
-
-namespace WebCore {
-
-class Database;
-
-// A client to the SQLTransaction class. Allows SQLTransaction to notify interested
-// parties that certain things have happened in a transaction.
-class SQLTransactionClient {
-    WTF_MAKE_NONCOPYABLE(SQLTransactionClient); WTF_MAKE_FAST_ALLOCATED;
-public:
-    SQLTransactionClient() { }
-    void didCommitWriteTransaction(Database*);
-    bool didExceedQuota(Database*);
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseSQLTransactionCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransactionCoordinator.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/SQLTransactionCoordinator.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransactionCoordinator.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx"> 
</span><span class="cx"> static String getDatabaseIdentifier(SQLTransaction&amp; transaction)
</span><span class="cx"> {
</span><del>-    return SecurityOriginData::fromSecurityOrigin(*transaction.database().securityOrigin()).databaseIdentifier();
</del><ins>+    return SecurityOriginData::fromSecurityOrigin(transaction.database().securityOrigin()).databaseIdentifier();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SQLTransactionCoordinator::SQLTransactionCoordinator()
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -3712,8 +3712,6 @@
</span><span class="cx">                 97BC6A4F1505F081001B74AC /* SQLTransaction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC6A0D1505F081001B74AC /* SQLTransaction.cpp */; };
</span><span class="cx">                 97BC6A501505F081001B74AC /* SQLTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A0E1505F081001B74AC /* SQLTransaction.h */; };
</span><span class="cx">                 97BC6A521505F081001B74AC /* SQLTransactionCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A101505F081001B74AC /* SQLTransactionCallback.h */; };
</span><del>-                97BC6A541505F081001B74AC /* SQLTransactionClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC6A121505F081001B74AC /* SQLTransactionClient.cpp */; };
-                97BC6A551505F081001B74AC /* SQLTransactionClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A131505F081001B74AC /* SQLTransactionClient.h */; };
</del><span class="cx">                 97BC6A561505F081001B74AC /* SQLTransactionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC6A141505F081001B74AC /* SQLTransactionCoordinator.cpp */; };
</span><span class="cx">                 97BC6A571505F081001B74AC /* SQLTransactionCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A151505F081001B74AC /* SQLTransactionCoordinator.h */; };
</span><span class="cx">                 97BC6A581505F081001B74AC /* SQLTransactionErrorCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC6A161505F081001B74AC /* SQLTransactionErrorCallback.h */; };
</span><span class="lines">@@ -6812,10 +6810,8 @@
</span><span class="cx">                 FDF6BAF9134A4C9800822920 /* JSOfflineAudioCompletionEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = FDF6BAF7134A4C9800822920 /* JSOfflineAudioCompletionEvent.h */; };
</span><span class="cx">                 FDF7E9C313AC21DB00A51EAC /* JSAudioBufferCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDF7E9C113AC21DB00A51EAC /* JSAudioBufferCallback.cpp */; };
</span><span class="cx">                 FDF7E9C413AC21DB00A51EAC /* JSAudioBufferCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = FDF7E9C213AC21DB00A51EAC /* JSAudioBufferCallback.h */; };
</span><del>-                FE09DB49169E2D6E00622557 /* DatabaseError.h in Headers */ = {isa = PBXBuildFile; fileRef = FE09DB46169E2D6E00622557 /* DatabaseError.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><span class="cx">                 FE0D84E910484348001A179E /* WebEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = FE0D84E810484348001A179E /* WebEvent.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 FE0D84EB1048436E001A179E /* WebEvent.mm in Sources */ = {isa = PBXBuildFile; fileRef = FE0D84EA1048436E001A179E /* WebEvent.mm */; };
</span><del>-                FE115FAB167988CD00249134 /* AbstractDatabaseServer.h in Headers */ = {isa = PBXBuildFile; fileRef = FE115FA9167988CD00249134 /* AbstractDatabaseServer.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><span class="cx">                 FE3371A2167C11D400EDB752 /* DatabaseBasicTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = FE3371A0167C11D400EDB752 /* DatabaseBasicTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 FE36FD1516C7826500F887C1 /* ChangeVersionData.h in Headers */ = {isa = PBXBuildFile; fileRef = FE36FD1116C7826400F887C1 /* ChangeVersionData.h */; };
</span><span class="cx">                 FE36FD1616C7826500F887C1 /* SQLTransactionStateMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE36FD1216C7826400F887C1 /* SQLTransactionStateMachine.cpp */; };
</span><span class="lines">@@ -6839,8 +6835,6 @@
</span><span class="cx">                 FE8A674816CDD19E00930BF8 /* SQLStatement.h in Headers */ = {isa = PBXBuildFile; fileRef = FE8A674616CDD19E00930BF8 /* SQLStatement.h */; };
</span><span class="cx">                 FE9E89FB16E2DC0500A908F8 /* OriginLock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE9E89F916E2DC0400A908F8 /* OriginLock.cpp */; };
</span><span class="cx">                 FE9E89FC16E2DC0500A908F8 /* OriginLock.h in Headers */ = {isa = PBXBuildFile; fileRef = FE9E89FA16E2DC0400A908F8 /* OriginLock.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                FEAF6654167970320062D0C5 /* DatabaseServer.h in Headers */ = {isa = PBXBuildFile; fileRef = FEAF6653167970070062D0C5 /* DatabaseServer.h */; settings = {ATTRIBUTES = (Private, ); }; };
-                FEB26D28167A8F2A00FDD26B /* DatabaseServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEB26D27167A8F2A00FDD26B /* DatabaseServer.cpp */; };
</del><span class="cx">                 FED13D3A0CEA934600D89466 /* EditorIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = FED13D390CEA934600D89466 /* EditorIOS.mm */; };
</span><span class="cx">                 FED13D3D0CEA936A00D89466 /* FrameIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = FED13D3B0CEA936A00D89466 /* FrameIOS.mm */; };
</span><span class="cx">                 FED13D400CEA939400D89466 /* IconIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = FED13D3F0CEA939400D89466 /* IconIOS.mm */; };
</span><span class="lines">@@ -6974,7 +6968,7 @@
</span><span class="cx">                 06027CAC0B1CBFC000884B2D /* ContextMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ContextMenuItem.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 062287830B4DB322000C34DF /* FocusDirection.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FocusDirection.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 065AD4F20B0C2EDA005A2B1D /* ContextMenuClient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ContextMenuClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                065AD4F30B0C2EDA005A2B1D /* ContextMenuController.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ContextMenuController.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                065AD4F30B0C2EDA005A2B1D /* ContextMenuController.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ContextMenuController.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 065AD4F40B0C2EDA005A2B1D /* ContextMenuController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ContextMenuController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0668E1890ADD9624004128E0 /* PopupMenu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PopupMenu.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 066C772A0AB603B700238CC4 /* FileChooser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileChooser.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -7663,7 +7657,7 @@
</span><span class="cx">                 14D64B5A134A5B6B00E58FDA /* TreeScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TreeScope.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 14D64B5B134A5B6B00E58FDA /* TreeScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeScope.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 14D823500AF92A790004F057 /* Chrome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Chrome.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                14D8238A0AF92DF60004F057 /* Chrome.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Chrome.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                14D8238A0AF92DF60004F057 /* Chrome.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Chrome.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 14D824060AF93AEB0004F057 /* ChromeClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChromeClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 14DC0D0B09FECFA4007B0235 /* Node.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Node.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 14DC0D3509FED073007B0235 /* JSNode.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSNode.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -7869,7 +7863,7 @@
</span><span class="cx">                 1A8F6B010DB53006001DB794 /* SubstituteResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubstituteResource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A8F6BB10DB55CDC001DB794 /* ApplicationCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationCache.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A8F6BB20DB55CDC001DB794 /* ApplicationCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplicationCache.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                1A8F6BB30DB55CDC001DB794 /* ApplicationCacheGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationCacheGroup.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                1A8F6BB30DB55CDC001DB794 /* ApplicationCacheGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationCacheGroup.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 1A8F6BB40DB55CDC001DB794 /* ApplicationCacheGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplicationCacheGroup.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A8F6BB50DB55CDC001DB794 /* ApplicationCacheResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationCacheResource.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A8F6BB60DB55CDC001DB794 /* ApplicationCacheResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplicationCacheResource.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -8224,7 +8218,7 @@
</span><span class="cx">                 2981CAA2131822EC00D12F2A /* AccessibilityListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityListBox.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2981CAA3131822EC00D12F2A /* AccessibilityListBoxOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityListBoxOption.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2981CAA4131822EC00D12F2A /* AccessibilityMediaControls.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityMediaControls.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                2981CAA5131822EC00D12F2A /* AccessibilityObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityObject.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                2981CAA5131822EC00D12F2A /* AccessibilityObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityObject.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 2981CAA6131822EC00D12F2A /* AccessibilityRenderObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityRenderObject.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2981CAA7131822EC00D12F2A /* AccessibilityScrollbar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityScrollbar.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2981CAA8131822EC00D12F2A /* AccessibilityScrollView.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityScrollView.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -9444,7 +9438,7 @@
</span><span class="cx">                 51BA4AC91BBC5B9E00DF3D6D /* MemoryIDBBackingStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryIDBBackingStore.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51BE37DE0DAEE00E001085FC /* StorageArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageArea.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51C0AA380F2AA10A001648C2 /* CachedFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CachedFrame.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                51C0AA400F2AA15E001648C2 /* CachedFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CachedFrame.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                51C0AA400F2AA15E001648C2 /* CachedFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CachedFrame.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 51C81B870C4422F70019ECE3 /* FTPDirectoryParser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FTPDirectoryParser.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51C81B880C4422F70019ECE3 /* FTPDirectoryParser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FTPDirectoryParser.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51CBFC980D10E483002DBF51 /* CachedFramePlatformData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CachedFramePlatformData.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -9602,8 +9596,8 @@
</span><span class="cx">                 5778BD831DA4817B009E3009 /* SubtleCrypto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SubtleCrypto.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 57A9C88D1DA70BF800BC7305 /* JSSubtleCryptoCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSSubtleCryptoCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 57D0018B1DD3DBA400ED19D9 /* CryptoKeyUsage.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = CryptoKeyUsage.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                57D0018C1DD5413200ED19D9 /* JSCryptoKeyUsage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSCryptoKeyUsage.h; path = JSCryptoKeyUsage.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                57D0018E1DD5415300ED19D9 /* JSCryptoKeyUsage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSCryptoKeyUsage.cpp; path = JSCryptoKeyUsage.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                57D0018C1DD5413200ED19D9 /* JSCryptoKeyUsage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCryptoKeyUsage.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                57D0018E1DD5415300ED19D9 /* JSCryptoKeyUsage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCryptoKeyUsage.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 57E233571DC7D24800F28D01 /* JsonWebKey.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = JsonWebKey.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 57E233591DC7D37200F28D01 /* RsaOtherPrimesInfo.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RsaOtherPrimesInfo.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 57E2335A1DC7D5E500F28D01 /* JSJsonWebKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSJsonWebKey.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -9821,7 +9815,7 @@
</span><span class="cx">                 65653F2C0D9727D200CA9723 /* SVGAltGlyphElement.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SVGAltGlyphElement.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 656580EE09D12B20000E61D7 /* CSSPropertyNames.gperf */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = CSSPropertyNames.gperf; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 656580EF09D12B20000E61D7 /* CSSPropertyNames.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CSSPropertyNames.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                6565814409D13043000E61D7 /* CSSGrammar.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CSSGrammar.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                6565814409D13043000E61D7 /* CSSGrammar.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CSSGrammar.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 6565814709D13043000E61D7 /* CSSValueKeywords.gperf */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = CSSValueKeywords.gperf; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 6565814809D13043000E61D7 /* CSSValueKeywords.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CSSValueKeywords.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 656581AC09D14EE6000E61D7 /* CharsetData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CharsetData.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -11259,8 +11253,6 @@
</span><span class="cx">                 97BC6A0F1505F081001B74AC /* SQLTransaction.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SQLTransaction.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 97BC6A101505F081001B74AC /* SQLTransactionCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLTransactionCallback.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 97BC6A111505F081001B74AC /* SQLTransactionCallback.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SQLTransactionCallback.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                97BC6A121505F081001B74AC /* SQLTransactionClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLTransactionClient.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                97BC6A131505F081001B74AC /* SQLTransactionClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLTransactionClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 97BC6A141505F081001B74AC /* SQLTransactionCoordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLTransactionCoordinator.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 97BC6A151505F081001B74AC /* SQLTransactionCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLTransactionCoordinator.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 97BC6A161505F081001B74AC /* SQLTransactionErrorCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLTransactionErrorCallback.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -13037,7 +13029,7 @@
</span><span class="cx">                 BC3C39B40C0D3D8D005F4D7A /* JSMediaList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSMediaList.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BC3C39B50C0D3D8D005F4D7A /* JSMediaList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSMediaList.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BC4368E70C226E32005EFB5F /* Rect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Rect.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                BC46C1ED0C0DDBDF0020CFC3 /* JSCSSRuleCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSCSSRuleCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                BC46C1ED0C0DDBDF0020CFC3 /* JSCSSRuleCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSCSSRuleCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 BC46C1F20C0DDC8F0020CFC3 /* JSCSSFontFaceRule.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSCSSFontFaceRule.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BC46C1F30C0DDC8F0020CFC3 /* JSCSSFontFaceRule.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSCSSFontFaceRule.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BC46C1F40C0DDC8F0020CFC3 /* JSCSSImportRule.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSCSSImportRule.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -13257,7 +13249,7 @@
</span><span class="cx">                 BCB16C0B0979C3BD00467741 /* CachedScript.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CachedScript.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BCB16C0E0979C3BD00467741 /* CachedXSLStyleSheet.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CachedXSLStyleSheet.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BCB16C0F0979C3BD00467741 /* CachedXSLStyleSheet.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CachedXSLStyleSheet.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                BCB16C100979C3BD00467741 /* CachedResourceLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CachedResourceLoader.cpp; sourceTree = &quot;&lt;group&gt;&quot;;  };
</del><ins>+                BCB16C100979C3BD00467741 /* CachedResourceLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CachedResourceLoader.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 BCB16C110979C3BD00467741 /* CachedResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CachedResourceLoader.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BCB92D4E1293550B00C8387F /* FontBaseline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontBaseline.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 BCBB8AB513F1AFB000734DF0 /* PODInterval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PODInterval.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -14826,10 +14818,8 @@
</span><span class="cx">                 FDF6BAF7134A4C9800822920 /* JSOfflineAudioCompletionEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSOfflineAudioCompletionEvent.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FDF7E9C113AC21DB00A51EAC /* JSAudioBufferCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAudioBufferCallback.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FDF7E9C213AC21DB00A51EAC /* JSAudioBufferCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAudioBufferCallback.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                FE09DB46169E2D6E00622557 /* DatabaseError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseError.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 FE0D84E810484348001A179E /* WebEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebEvent.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FE0D84EA1048436E001A179E /* WebEvent.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebEvent.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                FE115FA9167988CD00249134 /* AbstractDatabaseServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractDatabaseServer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 FE3371A0167C11D400EDB752 /* DatabaseBasicTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseBasicTypes.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FE36FD1116C7826400F887C1 /* ChangeVersionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChangeVersionData.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FE36FD1216C7826400F887C1 /* SQLTransactionStateMachine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLTransactionStateMachine.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -14853,8 +14843,6 @@
</span><span class="cx">                 FE8A674616CDD19E00930BF8 /* SQLStatement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLStatement.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FE9E89F916E2DC0400A908F8 /* OriginLock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OriginLock.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FE9E89FA16E2DC0400A908F8 /* OriginLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OriginLock.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                FEAF6653167970070062D0C5 /* DatabaseServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseServer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                FEB26D27167A8F2A00FDD26B /* DatabaseServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DatabaseServer.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 FED13D390CEA934600D89466 /* EditorIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EditorIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FED13D3B0CEA936A00D89466 /* FrameIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FrameIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FED13D3F0CEA939400D89466 /* IconIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IconIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -19201,7 +19189,6 @@
</span><span class="cx">                 97BC69D51505F054001B74AC /* webdatabase */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><del>-                                FE115FA9167988CD00249134 /* AbstractDatabaseServer.h */,
</del><span class="cx">                                 FE36FD1116C7826400F887C1 /* ChangeVersionData.h */,
</span><span class="cx">                                 97BC69D81505F076001B74AC /* ChangeVersionWrapper.cpp */,
</span><span class="cx">                                 97BC69D91505F076001B74AC /* ChangeVersionWrapper.h */,
</span><span class="lines">@@ -19216,12 +19203,9 @@
</span><span class="cx">                                 97BC69E51505F081001B74AC /* DatabaseContext.cpp */,
</span><span class="cx">                                 97BC69E61505F081001B74AC /* DatabaseContext.h */,
</span><span class="cx">                                 97BC69E71505F081001B74AC /* DatabaseDetails.h */,
</span><del>-                                FE09DB46169E2D6E00622557 /* DatabaseError.h */,
</del><span class="cx">                                 FE456F161677D74E005EDDF9 /* DatabaseManager.cpp */,
</span><span class="cx">                                 FE456F171677D74E005EDDF9 /* DatabaseManager.h */,
</span><span class="cx">                                 97BC69F11505F081001B74AC /* DatabaseManagerClient.h */,
</span><del>-                                FEB26D27167A8F2A00FDD26B /* DatabaseServer.cpp */,
-                                FEAF6653167970070062D0C5 /* DatabaseServer.h */,
</del><span class="cx">                                 97BC69EB1505F081001B74AC /* DatabaseTask.cpp */,
</span><span class="cx">                                 97BC69EC1505F081001B74AC /* DatabaseTask.h */,
</span><span class="cx">                                 97BC69ED1505F081001B74AC /* DatabaseThread.cpp */,
</span><span class="lines">@@ -19258,8 +19242,6 @@
</span><span class="cx">                                 FEE1811216C319E800084849 /* SQLTransactionBackend.h */,
</span><span class="cx">                                 97BC6A101505F081001B74AC /* SQLTransactionCallback.h */,
</span><span class="cx">                                 97BC6A111505F081001B74AC /* SQLTransactionCallback.idl */,
</span><del>-                                97BC6A121505F081001B74AC /* SQLTransactionClient.cpp */,
-                                97BC6A131505F081001B74AC /* SQLTransactionClient.h */,
</del><span class="cx">                                 97BC6A141505F081001B74AC /* SQLTransactionCoordinator.cpp */,
</span><span class="cx">                                 97BC6A151505F081001B74AC /* SQLTransactionCoordinator.h */,
</span><span class="cx">                                 97BC6A161505F081001B74AC /* SQLTransactionErrorCallback.h */,
</span><span class="lines">@@ -24652,7 +24634,6 @@
</span><span class="cx">                         isa = PBXHeadersBuildPhase;
</span><span class="cx">                         buildActionMask = 2147483647;
</span><span class="cx">                         files = (
</span><del>-                                FE115FAB167988CD00249134 /* AbstractDatabaseServer.h in Headers */,
</del><span class="cx">                                 41E1B1D10FF5986900576B3B /* AbstractWorker.h in Headers */,
</span><span class="cx">                                 29A8122E0FBB9C1D00510293 /* AccessibilityARIAGridCell.h in Headers */,
</span><span class="cx">                                 29A812330FBB9C1D00510293 /* AccessibilityARIAGridRow.h in Headers */,
</span><span class="lines">@@ -25169,11 +25150,9 @@
</span><span class="cx">                                 97BC6A251505F081001B74AC /* DatabaseCallback.h in Headers */,
</span><span class="cx">                                 97BC6A281505F081001B74AC /* DatabaseContext.h in Headers */,
</span><span class="cx">                                 97BC6A291505F081001B74AC /* DatabaseDetails.h in Headers */,
</span><del>-                                FE09DB49169E2D6E00622557 /* DatabaseError.h in Headers */,
</del><span class="cx">                                 FE456F191677D74E005EDDF9 /* DatabaseManager.h in Headers */,
</span><span class="cx">                                 97BC6A331505F081001B74AC /* DatabaseManagerClient.h in Headers */,
</span><span class="cx">                                 1ACB2B241A5733F400333392 /* DatabaseProvider.h in Headers */,
</span><del>-                                FEAF6654167970320062D0C5 /* DatabaseServer.h in Headers */,
</del><span class="cx">                                 97BC6A2E1505F081001B74AC /* DatabaseTask.h in Headers */,
</span><span class="cx">                                 97BC6A301505F081001B74AC /* DatabaseThread.h in Headers */,
</span><span class="cx">                                 97BC6A321505F081001B74AC /* DatabaseTracker.h in Headers */,
</span><span class="lines">@@ -27452,7 +27431,6 @@
</span><span class="cx">                                 97BC6A501505F081001B74AC /* SQLTransaction.h in Headers */,
</span><span class="cx">                                 FEE1811416C319E800084849 /* SQLTransactionBackend.h in Headers */,
</span><span class="cx">                                 97BC6A521505F081001B74AC /* SQLTransactionCallback.h in Headers */,
</span><del>-                                97BC6A551505F081001B74AC /* SQLTransactionClient.h in Headers */,
</del><span class="cx">                                 97BC6A571505F081001B74AC /* SQLTransactionCoordinator.h in Headers */,
</span><span class="cx">                                 97BC6A581505F081001B74AC /* SQLTransactionErrorCallback.h in Headers */,
</span><span class="cx">                                 FE36FD1816C7826500F887C1 /* SQLTransactionState.h in Headers */,
</span><span class="lines">@@ -28963,7 +28941,6 @@
</span><span class="cx">                                 97BC6A271505F081001B74AC /* DatabaseContext.cpp in Sources */,
</span><span class="cx">                                 FE456F181677D74E005EDDF9 /* DatabaseManager.cpp in Sources */,
</span><span class="cx">                                 1ACB2B231A5733F400333392 /* DatabaseProvider.cpp in Sources */,
</span><del>-                                FEB26D28167A8F2A00FDD26B /* DatabaseServer.cpp in Sources */,
</del><span class="cx">                                 97BC6A2D1505F081001B74AC /* DatabaseTask.cpp in Sources */,
</span><span class="cx">                                 97BC6A2F1505F081001B74AC /* DatabaseThread.cpp in Sources */,
</span><span class="cx">                                 97BC6A311505F081001B74AC /* DatabaseTracker.cpp in Sources */,
</span><span class="lines">@@ -31083,7 +31060,6 @@
</span><span class="cx">                                 FE8A674716CDD19E00930BF8 /* SQLStatement.cpp in Sources */,
</span><span class="cx">                                 97BC6A4F1505F081001B74AC /* SQLTransaction.cpp in Sources */,
</span><span class="cx">                                 FEE1811316C319E800084849 /* SQLTransactionBackend.cpp in Sources */,
</span><del>-                                97BC6A541505F081001B74AC /* SQLTransactionClient.cpp in Sources */,
</del><span class="cx">                                 97BC6A561505F081001B74AC /* SQLTransactionCoordinator.cpp in Sources */,
</span><span class="cx">                                 FE36FD1616C7826500F887C1 /* SQLTransactionStateMachine.cpp in Sources */,
</span><span class="cx">                                 1A2E6E590CC55213004A2062 /* SQLValue.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSSQLTransactionCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSSQLTransactionCustom.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSSQLTransactionCustom.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/bindings/js/JSSQLTransactionCustom.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -107,9 +107,7 @@
</span><span class="cx">         errorCallback = JSSQLStatementErrorCallback::create(object, jsCast&lt;JSDOMGlobalObject*&gt;(globalObject()));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ExceptionCode ec = 0;
-    wrapped().executeSQL(sqlStatement, sqlValues, WTFMove(callback), WTFMove(errorCallback), ec);
-    setDOMException(&amp;state, ec);
</del><ins>+    propagateException(state, scope, wrapped().executeSQL(sqlStatement, sqlValues, WTFMove(callback), WTFMove(errorCallback)));
</ins><span class="cx"> 
</span><span class="cx">     return jsUndefined();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoredomExceptionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Exception.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Exception.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/dom/Exception.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -45,6 +45,8 @@
</span><span class="cx">     String m_message;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+Exception isolatedCopy(Exception&amp;&amp;);
+
</ins><span class="cx"> inline Exception::Exception(ExceptionCode code, String&amp;&amp; message)
</span><span class="cx">     : m_code(code)
</span><span class="cx">     , m_message(WTFMove(message))
</span><span class="lines">@@ -52,4 +54,9 @@
</span><span class="cx">     ASSERT(code);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline Exception isolatedCopy(Exception&amp;&amp; value)
+{
+    return Exception { value.code(), value.releaseMessage().isolatedCopy() };
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoredomExceptionOrh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ExceptionOr.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ExceptionOr.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/dom/ExceptionOr.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -71,6 +71,8 @@
</span><span class="cx">     Optional&lt;Exception&gt; m_exception;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+ExceptionOr&lt;void&gt; isolatedCopy(ExceptionOr&lt;void&gt;&amp;&amp;);
+
</ins><span class="cx"> template&lt;typename ReturnType&gt; inline ExceptionOr&lt;ReturnType&gt;::ExceptionOr(Exception&amp;&amp; exception)
</span><span class="cx">     : m_value(WTFMove(exception))
</span><span class="cx"> {
</span><span class="lines">@@ -141,4 +143,11 @@
</span><span class="cx">     return WTFMove(m_exception.value());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline ExceptionOr&lt;void&gt; isolatedCopy(ExceptionOr&lt;void&gt;&amp;&amp; value)
+{
+    if (value.hasException())
+        return isolatedCopy(value.releaseException());
+    return { };
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoredomScriptExecutionContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptExecutionContext.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -478,7 +478,6 @@
</span><span class="cx"> 
</span><span class="cx"> void ScriptExecutionContext::setDatabaseContext(DatabaseContext* databaseContext)
</span><span class="cx"> {
</span><del>-    ASSERT(!m_databaseContext);
</del><span class="cx">     m_databaseContext = databaseContext;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptExecutionContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptExecutionContext.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -200,6 +200,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual EventQueue&amp; eventQueue() const = 0;
</span><span class="cx"> 
</span><ins>+    DatabaseContext* databaseContext() { return m_databaseContext.get(); }
</ins><span class="cx">     void setDatabaseContext(DatabaseContext*);
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(SUBTLE_CRYPTO)
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorDatabaseAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx">         Vector&lt;SQLValue&gt; sqlValues;
</span><span class="cx">         Ref&lt;SQLStatementCallback&gt; callback(StatementCallback::create(m_requestCallback.copyRef()));
</span><span class="cx">         Ref&lt;SQLStatementErrorCallback&gt; errorCallback(StatementErrorCallback::create(m_requestCallback.copyRef()));
</span><del>-        transaction-&gt;executeSQL(m_sqlStatement, sqlValues, WTFMove(callback), WTFMove(errorCallback), IGNORE_EXCEPTION);
</del><ins>+        transaction-&gt;executeSQL(m_sqlStatement, sqlValues, WTFMove(callback), WTFMove(errorCallback));
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderFrameLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/FrameLoader.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -455,13 +455,13 @@
</span><span class="cx">         m_frame.document()-&gt;setParsing(false);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (Document* doc = m_frame.document()) {
</del><ins>+    if (auto* document = m_frame.document()) {
</ins><span class="cx">         // FIXME: HTML5 doesn't tell us to set the state to complete when aborting, but we do anyway to match legacy behavior.
</span><span class="cx">         // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10537
</span><del>-        doc-&gt;setReadyState(Document::Complete);
</del><ins>+        document-&gt;setReadyState(Document::Complete);
</ins><span class="cx"> 
</span><span class="cx">         // FIXME: Should the DatabaseManager watch for something like ActiveDOMObject::stop() rather than being special-cased here?
</span><del>-        DatabaseManager::singleton().stopDatabases(doc, 0);
</del><ins>+        DatabaseManager::singleton().stopDatabases(*document, nullptr);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // FIXME: This will cancel redirection timer, which really needs to be restarted when restoring the frame from b/f cache.
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageTrackercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageTracker.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageTracker.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/Storage/StorageTracker.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -101,31 +101,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StorageTracker::setDatabaseDirectoryPath(const String&amp; path)
-{
-    LockHolder locker(m_databaseMutex);
-
-    if (m_database.isOpen())
-        m_database.close();
-
-    m_storageDirectoryPath = path.isolatedCopy();
-
-    {
-        LockHolder locker(m_originSetMutex);
-        m_originSet.clear();
-    }
-
-    if (!m_isActive)
-        return;
-
-    importOriginIdentifiers();
-}
-
-String StorageTracker::databaseDirectoryPath() const
-{
-    return m_storageDirectoryPath.isolatedCopy();
-}
-
</del><span class="cx"> String StorageTracker::trackerDatabasePath()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_databaseMutex.tryLock());
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageTrackerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageTracker.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageTracker.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/Storage/StorageTracker.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -46,9 +46,6 @@
</span><span class="cx">     static void initializeTracker(const String&amp; storagePath, WebCore::StorageTrackerClient*);
</span><span class="cx">     static StorageTracker&amp; tracker();
</span><span class="cx"> 
</span><del>-    void setDatabaseDirectoryPath(const String&amp;);
-    String databaseDirectoryPath() const;
-
</del><span class="cx">     void setOriginDetails(const String&amp; originIdentifier, const String&amp; databaseFile);
</span><span class="cx">     
</span><span class="cx">     void deleteAllOrigins();
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,3 +1,44 @@
</span><ins>+2016-11-13  Darin Adler  &lt;darin@apple.com&gt;
+
+        Fix exception handling in SQL database code, streamline and update code
+        https://bugs.webkit.org/show_bug.cgi?id=164685
+
+        Reviewed by Sam Weinig.
+
+        * Storage/WebDatabaseManager.mm:
+        (-[WebDatabaseManager origins]): Updated to use DatabaseTracker and pass
+        a reference.
+        (-[WebDatabaseManager databasesWithOrigin:]): Ditto.
+        (-[WebDatabaseManager detailsForDatabase:withOrigin:]): Pass reference,
+        but continue to use DatabaseManager.
+        (-[WebDatabaseManager deleteOrigin:]): Use DatabaseTracker and pass a
+        reference.
+        (-[WebDatabaseManager deleteDatabase:withOrigin:]): Ditto.
+
+        * Storage/WebDatabaseManagerClient.h: Updated to take references.
+        * Storage/WebDatabaseManagerClient.mm:
+        (WebDatabaseManagerClient::WebDatabaseManagerClient): Initialize data
+        members in the class definition.
+        (DidModifyOriginData::dispatchToMainThread): Take references.
+        (DidModifyOriginData::DidModifyOriginData): Ditto.
+        (WebDatabaseManagerClient::dispatchDidModifyOrigin): Ditto.
+        (WebDatabaseManagerClient::dispatchDidModifyDatabase): Ditto.
+        (WebDatabaseManagerClient::dispatchDidAddNewOrigin): Ditto. Also use
+        DatabaseTracker::singleton instead of tracker.
+
+        * Storage/WebDatabaseQuotaManager.mm:
+        (-[WebDatabaseQuotaManager initWithOrigin:]): Reject nil pointer argument.
+        (-[WebDatabaseQuotaManager usage]): Use reference instead of pointer.
+        (-[WebDatabaseQuotaManager quota]): Ditto.
+        (-[WebDatabaseQuotaManager setQuota:]): Ditto.
+        * WebCoreSupport/WebSecurityOrigin.mm:
+        (-[WebSecurityOrigin initWithURL:]): Tweaked code a bit.
+        (-[WebSecurityOrigin usage]): Use DatabaseTracker and pass a reference.
+        (-[WebSecurityOrigin quota]): Ditto.
+        (-[WebSecurityOrigin setQuota:]): Ditto.
+        * WebView/WebFrame.mm:
+        (-[WebFrame _cacheabilityDictionary]): Pass a reference.
+
</ins><span class="cx"> 2016-11-12  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove a few assorted uses of ExceptionCode
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebDatabaseManagermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #import &quot;WebSecurityOriginInternal.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #import &lt;WebCore/DatabaseManager.h&gt;
</span><ins>+#import &lt;WebCore/DatabaseTracker.h&gt;
</ins><span class="cx"> #import &lt;WebCore/SecurityOrigin.h&gt;
</span><span class="cx"> #import &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -92,52 +93,47 @@
</span><span class="cx"> 
</span><span class="cx"> - (NSArray *)origins
</span><span class="cx"> {
</span><del>-    Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt; coreOrigins;
-    DatabaseManager::singleton().origins(coreOrigins);
</del><ins>+    auto coreOrigins = DatabaseTracker::singleton().origins();
</ins><span class="cx">     NSMutableArray *webOrigins = [[NSMutableArray alloc] initWithCapacity:coreOrigins.size()];
</span><del>-
-    for (unsigned i = 0; i &lt; coreOrigins.size(); ++i) {
-        WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:coreOrigins[i].get()];
</del><ins>+    for (auto&amp; coreOrigin : coreOrigins) {
+        WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:coreOrigin.ptr()];
</ins><span class="cx">         [webOrigins addObject:webOrigin];
</span><span class="cx">         [webOrigin release];
</span><span class="cx">     }
</span><del>-
</del><span class="cx">     return [webOrigins autorelease];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (NSArray *)databasesWithOrigin:(WebSecurityOrigin *)origin
</span><span class="cx"> {
</span><del>-    Vector&lt;String&gt; nameVector;
-    if (!DatabaseManager::singleton().databaseNamesForOrigin([origin _core], nameVector))
</del><ins>+    if (!origin)
</ins><span class="cx">         return nil;
</span><del>-    
</del><ins>+    Vector&lt;String&gt; nameVector = DatabaseTracker::singleton().databaseNames(*[origin _core]);
</ins><span class="cx">     NSMutableArray *names = [[NSMutableArray alloc] initWithCapacity:nameVector.size()];
</span><del>-
-    for (unsigned i = 0; i &lt; nameVector.size(); ++i)
-        [names addObject:(NSString *)nameVector[i]];
-
</del><ins>+    for (auto&amp; name : nameVector)
+        [names addObject:(NSString *)name];
</ins><span class="cx">     return [names autorelease];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (NSDictionary *)detailsForDatabase:(NSString *)databaseIdentifier withOrigin:(WebSecurityOrigin *)origin
</span><span class="cx"> {
</span><del>-    static id keys[3] = {WebDatabaseDisplayNameKey, WebDatabaseExpectedSizeKey, WebDatabaseUsageKey};
-    
-    DatabaseDetails details = DatabaseManager::singleton().detailsForNameAndOrigin(databaseIdentifier, [origin _core]);
</del><ins>+    if (!origin)
+        return nil;
+
+    DatabaseDetails details = DatabaseManager::singleton().detailsForNameAndOrigin(databaseIdentifier, *[origin _core]);
</ins><span class="cx">     if (details.name().isNull())
</span><span class="cx">         return nil;
</span><span class="cx">         
</span><ins>+    static const id keys[3] = { WebDatabaseDisplayNameKey, WebDatabaseExpectedSizeKey, WebDatabaseUsageKey };
</ins><span class="cx">     id objects[3];
</span><span class="cx">     objects[0] = details.displayName().isEmpty() ? databaseIdentifier : (NSString *)details.displayName();
</span><span class="cx">     objects[1] = [NSNumber numberWithUnsignedLongLong:details.expectedUsage()];
</span><span class="cx">     objects[2] = [NSNumber numberWithUnsignedLongLong:details.currentUsage()];
</span><del>-    
</del><span class="cx">     return [[[NSDictionary alloc] initWithObjects:objects forKeys:keys count:3] autorelease];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)deleteAllDatabases
</span><span class="cx"> {
</span><del>-    DatabaseManager::singleton().deleteAllDatabasesImmediately();
</del><ins>+    DatabaseTracker::singleton().deleteAllDatabasesImmediately();
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     // FIXME: This needs to be removed once DatabaseTrackers in multiple processes
</span><span class="cx">     // are in sync: &lt;rdar://problem/9567500&gt; Remove Website Data pane is not kept in sync with Safari
</span><span class="lines">@@ -147,12 +143,12 @@
</span><span class="cx"> 
</span><span class="cx"> - (BOOL)deleteOrigin:(WebSecurityOrigin *)origin
</span><span class="cx"> {
</span><del>-    return DatabaseManager::singleton().deleteOrigin([origin _core]);
</del><ins>+    return origin &amp;&amp; DatabaseTracker::singleton().deleteOrigin(*[origin _core]);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (BOOL)deleteDatabase:(NSString *)databaseIdentifier withOrigin:(WebSecurityOrigin *)origin
</span><span class="cx"> {
</span><del>-    return DatabaseManager::singleton().deleteDatabase([origin _core], databaseIdentifier);
</del><ins>+    return origin &amp;&amp; DatabaseTracker::singleton().deleteDatabase(*[origin _core], databaseIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // For DumpRenderTree support only
</span><span class="lines">@@ -164,6 +160,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><ins>+
</ins><span class="cx"> static bool isFileHidden(NSString *file)
</span><span class="cx"> {
</span><span class="cx">     ASSERT([file length]);
</span><span class="lines">@@ -232,11 +229,13 @@
</span><span class="cx">         DatabaseTracker::emptyDatabaseFilesRemovalTaskDidFinish();
</span><span class="cx">     });
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> #endif // PLATFORM(IOS)
</span><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><ins>+
</ins><span class="cx"> @implementation WebDatabaseManager (WebDatabaseManagerInternal)
</span><span class="cx"> 
</span><span class="cx"> static Lock&amp; transactionBackgroundTaskIdentifierLock()
</span><span class="lines">@@ -281,7 +280,7 @@
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     setTransactionBackgroundTaskIdentifier(startBackgroundTask(^ {
</span><del>-        DatabaseTracker::tracker().closeAllDatabases(CurrentQueryBehavior::Interrupt);
</del><ins>+        DatabaseTracker::singleton().closeAllDatabases(CurrentQueryBehavior::Interrupt);
</ins><span class="cx">         [WebDatabaseManager endBackgroundTask];
</span><span class="cx">     }));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebDatabaseManagerClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -25,17 +25,18 @@
</span><span class="cx"> 
</span><span class="cx"> #import &lt;WebCore/DatabaseManagerClient.h&gt;
</span><span class="cx"> 
</span><del>-class WebDatabaseManagerClient : public WebCore::DatabaseManagerClient {
</del><ins>+class WebDatabaseManagerClient final : public WebCore::DatabaseManagerClient {
</ins><span class="cx"> public:
</span><span class="cx">     static WebDatabaseManagerClient* sharedWebDatabaseManagerClient();
</span><span class="cx">     
</span><span class="cx">     virtual ~WebDatabaseManagerClient();
</span><del>-    void dispatchDidModifyOrigin(WebCore::SecurityOrigin*) override;
-    void dispatchDidModifyDatabase(WebCore::SecurityOrigin*, const WTF::String&amp; databaseIdentifier) override;
</del><ins>+    void dispatchDidModifyOrigin(WebCore::SecurityOrigin&amp;) final;
+    void dispatchDidModifyDatabase(WebCore::SecurityOrigin&amp;, const WTF::String&amp; databaseIdentifier) final;
+
</ins><span class="cx"> #if PLATFORM(IOS)
</span><del>-    void dispatchDidAddNewOrigin(WebCore::SecurityOrigin*) override;
-    void dispatchDidDeleteDatabase() override;
-    void dispatchDidDeleteDatabaseOrigin() override;
</del><ins>+    void dispatchDidAddNewOrigin(WebCore::SecurityOrigin&amp;) final;
+    void dispatchDidDeleteDatabase() final;
+    void dispatchDidDeleteDatabaseOrigin() final;
</ins><span class="cx">     void newDatabaseOriginWasAdded();
</span><span class="cx">     void databaseWasDeleted();
</span><span class="cx">     void databaseOriginWasDeleted();
</span><span class="lines">@@ -47,8 +48,8 @@
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     void databaseOriginsDidChange();
</span><span class="cx"> 
</span><del>-    bool m_isHandlingNewDatabaseOriginNotification;
-    bool m_isHandlingDeleteDatabaseNotification;
-    bool m_isHandlingDeleteDatabaseOriginNotification;
</del><ins>+    bool m_isHandlingNewDatabaseOriginNotification { false };
+    bool m_isHandlingDeleteDatabaseNotification { false };
+    bool m_isHandlingDeleteDatabaseOriginNotification { false };
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebDatabaseManagerClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2007,2012 Apple Inc.  All rights reserved.
</del><ins>+ * Copyright (C) 2007, 2012 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">@@ -39,9 +39,9 @@
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><del>-static CFStringRef WebDatabaseOriginWasAddedNotification = CFSTR(&quot;com.apple.MobileSafariSettings.WebDatabaseOriginWasAddedNotification&quot;);
-static CFStringRef WebDatabaseWasDeletedNotification = CFSTR(&quot;com.apple.MobileSafariSettings.WebDatabaseWasDeletedNotification&quot;);
-static CFStringRef WebDatabaseOriginWasDeletedNotification = CFSTR(&quot;com.apple.MobileSafariSettings.WebDatabaseOriginWasDeletedNotification&quot;);
</del><ins>+static const CFStringRef WebDatabaseOriginWasAddedNotification = CFSTR(&quot;com.apple.MobileSafariSettings.WebDatabaseOriginWasAddedNotification&quot;);
+static const CFStringRef WebDatabaseWasDeletedNotification = CFSTR(&quot;com.apple.MobileSafariSettings.WebDatabaseWasDeletedNotification&quot;);
+static const CFStringRef WebDatabaseOriginWasDeletedNotification = CFSTR(&quot;com.apple.MobileSafariSettings.WebDatabaseOriginWasDeletedNotification&quot;);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> WebDatabaseManagerClient* WebDatabaseManagerClient::sharedWebDatabaseManagerClient()
</span><span class="lines">@@ -77,11 +77,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> WebDatabaseManagerClient::WebDatabaseManagerClient()
</span><del>-#if PLATFORM(IOS)
-    : m_isHandlingNewDatabaseOriginNotification(false)
-    , m_isHandlingDeleteDatabaseNotification(false)
-    , m_isHandlingDeleteDatabaseOriginNotification(false)
-#endif
</del><span class="cx"> {
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     CFNotificationCenterRef center = CFNotificationCenterGetDarwinNotifyCenter(); 
</span><span class="lines">@@ -99,58 +94,53 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class DidModifyOriginData {
</span><del>-    WTF_MAKE_NONCOPYABLE(DidModifyOriginData);
</del><span class="cx"> public:
</span><del>-    static void dispatchToMainThread(WebDatabaseManagerClient* client, SecurityOrigin* origin)
</del><ins>+    static void dispatchToMainThread(WebDatabaseManagerClient&amp; client, SecurityOrigin&amp; origin)
</ins><span class="cx">     {
</span><del>-        auto context = std::make_unique&lt;DidModifyOriginData&gt;(client, origin-&gt;isolatedCopy());
</del><ins>+        auto context = std::make_unique&lt;DidModifyOriginData&gt;(client, origin);
</ins><span class="cx">         callOnMainThread([context = WTFMove(context)] {
</span><del>-            context-&gt;client-&gt;dispatchDidModifyOrigin(context-&gt;origin.get());
</del><ins>+            context-&gt;client.dispatchDidModifyOrigin(context-&gt;origin);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DidModifyOriginData(WebDatabaseManagerClient* client, PassRefPtr&lt;SecurityOrigin&gt; origin)
</del><ins>+    DidModifyOriginData(WebDatabaseManagerClient&amp; client, SecurityOrigin&amp; origin)
</ins><span class="cx">         : client(client)
</span><del>-        , origin(origin)
</del><ins>+        , origin(origin.isolatedCopy())
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    WebDatabaseManagerClient* client;
-    RefPtr&lt;SecurityOrigin&gt; origin;
</del><ins>+    WebDatabaseManagerClient&amp; client;
+    Ref&lt;SecurityOrigin&gt; origin;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-void WebDatabaseManagerClient::dispatchDidModifyOrigin(SecurityOrigin* origin)
</del><ins>+void WebDatabaseManagerClient::dispatchDidModifyOrigin(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     if (!isMainThread()) {
</span><del>-        DidModifyOriginData::dispatchToMainThread(this, origin);
</del><ins>+        DidModifyOriginData::dispatchToMainThread(*this, origin);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebSecurityOrigin&gt; webSecurityOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:origin]);
</del><ins>+    auto webSecurityOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:&amp;origin]);
</ins><span class="cx"> 
</span><del>-    [[NSNotificationCenter defaultCenter] postNotificationName:WebDatabaseDidModifyOriginNotification 
-                                                        object:webSecurityOrigin.get()];
</del><ins>+    [[NSNotificationCenter defaultCenter] postNotificationName:WebDatabaseDidModifyOriginNotification object:webSecurityOrigin.get()];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebDatabaseManagerClient::dispatchDidModifyDatabase(SecurityOrigin* origin, const String&amp; databaseIdentifier)
</del><ins>+void WebDatabaseManagerClient::dispatchDidModifyDatabase(SecurityOrigin&amp; origin, const String&amp; databaseIdentifier)
</ins><span class="cx"> {
</span><span class="cx">     if (!isMainThread()) {
</span><del>-        DidModifyOriginData::dispatchToMainThread(this, origin);
</del><ins>+        DidModifyOriginData::dispatchToMainThread(*this, origin);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;WebSecurityOrigin&gt; webSecurityOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:origin]);
-    RetainPtr&lt;NSDictionary&gt; userInfo = adoptNS([[NSDictionary alloc] 
-                                               initWithObjectsAndKeys:(NSString *)databaseIdentifier, WebDatabaseIdentifierKey, nil]);
-    
-    [[NSNotificationCenter defaultCenter] postNotificationName:WebDatabaseDidModifyDatabaseNotification
-                                                        object:webSecurityOrigin.get()
-                                                      userInfo:userInfo.get()];
</del><ins>+    auto webSecurityOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:&amp;origin]);
+    auto userInfo = adoptNS([[NSDictionary alloc] initWithObjectsAndKeys:(NSString *)databaseIdentifier, WebDatabaseIdentifierKey, nil]);
+    [[NSNotificationCenter defaultCenter] postNotificationName:WebDatabaseDidModifyDatabaseNotification object:webSecurityOrigin.get() userInfo:userInfo.get()];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><del>-void WebDatabaseManagerClient::dispatchDidAddNewOrigin(SecurityOrigin*)
</del><ins>+
+void WebDatabaseManagerClient::dispatchDidAddNewOrigin(SecurityOrigin&amp;)
</ins><span class="cx"> {    
</span><span class="cx">     m_isHandlingNewDatabaseOriginNotification = true;
</span><span class="cx">     // Send a notification to all apps that a new origin has been added, so other apps with opened database can refresh their origin maps.
</span><span class="lines">@@ -198,7 +188,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    DatabaseTracker::tracker().removeDeletedOpenedDatabases();
</del><ins>+    DatabaseTracker::singleton().removeDeletedOpenedDatabases();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebDatabaseManagerClient::databaseOriginWasDeleted()
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebDatabaseQuotaManagermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebDatabaseQuotaManager.mm (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebDatabaseQuotaManager.mm        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/mac/Storage/WebDatabaseQuotaManager.mm        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> #import &quot;WebDatabaseQuotaManager.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #import &quot;WebSecurityOriginInternal.h&quot;
</span><del>-#import &lt;WebCore/DatabaseManager.h&gt;
</del><ins>+#import &lt;WebCore/DatabaseTracker.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="lines">@@ -34,6 +34,9 @@
</span><span class="cx"> 
</span><span class="cx"> - (id)initWithOrigin:(WebSecurityOrigin *)origin
</span><span class="cx"> {
</span><ins>+    if (!origin)
+        return nil;
+
</ins><span class="cx">     self = [super init];
</span><span class="cx">     if (!self)
</span><span class="cx">         return nil;
</span><span class="lines">@@ -49,12 +52,12 @@
</span><span class="cx"> 
</span><span class="cx"> - (unsigned long long)usage
</span><span class="cx"> {
</span><del>-    return DatabaseManager::singleton().usageForOrigin([_origin _core]);
</del><ins>+    return DatabaseTracker::singleton().usage(*[_origin _core]);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (unsigned long long)quota
</span><span class="cx"> {
</span><del>-    return DatabaseManager::singleton().quotaForOrigin([_origin _core]);
</del><ins>+    return DatabaseTracker::singleton().quota(*[_origin _core]);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // If the quota is set to a value lower than the current usage, that quota will
</span><span class="lines">@@ -62,7 +65,7 @@
</span><span class="cx"> // prevent new data from being added to databases in that origin.
</span><span class="cx"> - (void)setQuota:(unsigned long long)quota
</span><span class="cx"> {
</span><del>-    DatabaseManager::singleton().setQuota([_origin _core], quota);
</del><ins>+    DatabaseTracker::singleton().setQuota(*[_origin _core], quota);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebSecurityOriginmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebSecurityOrigin.mm (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebSecurityOrigin.mm        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebSecurityOrigin.mm        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -31,10 +31,10 @@
</span><span class="cx"> #import &quot;WebApplicationCacheQuotaManager.h&quot;
</span><span class="cx"> #import &quot;WebDatabaseQuotaManager.h&quot;
</span><span class="cx"> #import &quot;WebQuotaManager.h&quot;
</span><del>-#import &lt;WebCore/URL.h&gt;
-#import &lt;WebCore/DatabaseManager.h&gt;
</del><ins>+#import &lt;WebCore/DatabaseTracker.h&gt;
</ins><span class="cx"> #import &lt;WebCore/SecurityOrigin.h&gt;
</span><span class="cx"> #import &lt;WebCore/SecurityOriginData.h&gt;
</span><ins>+#import &lt;WebCore/URL.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="lines">@@ -55,10 +55,7 @@
</span><span class="cx">     if (!self)
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><del>-    auto origin = SecurityOrigin::create(URL([url absoluteURL]));
-    SecurityOrigin* rawOrigin = &amp;origin.leakRef();
-    _private = reinterpret_cast&lt;WebSecurityOriginPrivate *&gt;(rawOrigin);
-
</del><ins>+    _private = reinterpret_cast&lt;WebSecurityOriginPrivate *&gt;(&amp;SecurityOrigin::create(URL([url absoluteURL])).leakRef());
</ins><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -167,23 +164,22 @@
</span><span class="cx"> 
</span><span class="cx"> // FIXME: The following methods are deprecated and should removed later.
</span><span class="cx"> // Clients should instead get a WebQuotaManager, and query / set the quota via the Manager.
</span><del>-// NOTE: the &lt;WebCore/DatabaseManager.h&gt; #include should be removed as well.
</del><span class="cx"> 
</span><span class="cx"> @implementation WebSecurityOrigin (Deprecated)
</span><span class="cx"> 
</span><span class="cx"> - (unsigned long long)usage
</span><span class="cx"> {
</span><del>-    return DatabaseManager::singleton().usageForOrigin(reinterpret_cast&lt;SecurityOrigin*&gt;(_private));
</del><ins>+    return DatabaseTracker::singleton().usage(*reinterpret_cast&lt;SecurityOrigin*&gt;(_private));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (unsigned long long)quota
</span><span class="cx"> {
</span><del>-    return DatabaseManager::singleton().quotaForOrigin(reinterpret_cast&lt;SecurityOrigin*&gt;(_private));
</del><ins>+    return DatabaseTracker::singleton().quota(*reinterpret_cast&lt;SecurityOrigin*&gt;(_private));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setQuota:(unsigned long long)quota
</span><span class="cx"> {
</span><del>-    DatabaseManager::singleton().setQuota(reinterpret_cast&lt;SecurityOrigin*&gt;(_private), quota);
</del><ins>+    DatabaseTracker::singleton().setQuota(*reinterpret_cast&lt;SecurityOrigin*&gt;(_private), quota);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebFramemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebFrame.mm (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebFrame.mm        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/mac/WebView/WebFrame.mm        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -2038,7 +2038,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     if (Document* document = _private-&gt;coreFrame-&gt;document()) {
</span><del>-        if (DatabaseManager::singleton().hasOpenDatabases(document))
</del><ins>+        if (DatabaseManager::singleton().hasOpenDatabases(*document))
</ins><span class="cx">             [result setObject:[NSNumber numberWithBool:YES] forKey:WebFrameUsesDatabases];
</span><span class="cx">         if (!document-&gt;canSuspendActiveDOMObjectsForDocumentSuspension())
</span><span class="cx">             [result setObject:[NSNumber numberWithBool:YES] forKey:WebFrameCanSuspendActiveDOMObjects];
</span></span></pre></div>
<a id="trunkSourceWebKitwinChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/ChangeLog (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/ChangeLog        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/win/ChangeLog        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2016-11-13  Darin Adler  &lt;darin@apple.com&gt;
+
+        Fix exception handling in SQL database code, streamline and update code
+        https://bugs.webkit.org/show_bug.cgi?id=164685
+
+        Reviewed by Sam Weinig.
+
+        * WebDatabaseManager.cpp:
+        (WebDatabaseManager::origins): Use DatabaseTracker.
+        (WebDatabaseManager::databasesWithOrigin): Ditto.
+        (WebDatabaseManager::detailsForDatabase): Use reference.
+        (WebDatabaseManager::deleteAllDatabases): Use DatabaseTracker.
+        (WebDatabaseManager::deleteOrigin): Ditto.
+        (WebDatabaseManager::deleteDatabase): Ditto.
+        (WebDatabaseManager::dispatchDidModifyOrigin): Use reference
+        and DatabaseTracker.
+        (WebDatabaseManager::setQuota): Ditto.
+        (WebDatabaseManager::dispatchDidModifyDatabase): Ditto.
+        * WebDatabaseManager.h: Updated client functions to take a reference.
+
+        * WebSecurityOrigin.cpp:
+        (WebSecurityOrigin::usage): Update to use DatabaseTracker.
+        (WebSecurityOrigin::quota): Ditto.
+        (WebSecurityOrigin::setQuota): Ditto.
+
</ins><span class="cx"> 2016-11-11  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [MediaStream] defer resolution of getUserMedia promise made in a background tab
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebDatabaseManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebDatabaseManager.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebDatabaseManager.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/win/WebDatabaseManager.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -35,10 +35,10 @@
</span><span class="cx"> #include &quot;WebNotificationCenter.h&quot;
</span><span class="cx"> #include &quot;WebPreferences.h&quot;
</span><span class="cx"> #include &quot;WebSecurityOrigin.h&quot;
</span><del>-
</del><span class="cx"> #include &lt;WebCore/BString.h&gt;
</span><span class="cx"> #include &lt;WebCore/COMPtr.h&gt;
</span><span class="cx"> #include &lt;WebCore/DatabaseManager.h&gt;
</span><ins>+#include &lt;WebCore/DatabaseTracker.h&gt;
</ins><span class="cx"> #include &lt;WebCore/FileSystem.h&gt;
</span><span class="cx"> #include &lt;WebCore/SecurityOrigin.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="lines">@@ -228,10 +228,12 @@
</span><span class="cx">     if (this != s_sharedWebDatabaseManager)
</span><span class="cx">         return E_FAIL;
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;SecurityOrigin&gt; &gt; origins;
-    DatabaseManager::singleton().origins(origins);
-        COMPtr&lt;COMEnumVariant&lt;Vector&lt;RefPtr&lt;SecurityOrigin&gt; &gt; &gt; &gt; enumVariant(AdoptCOM, COMEnumVariant&lt;Vector&lt;RefPtr&lt;SecurityOrigin&gt; &gt; &gt;::adopt(origins));
</del><ins>+    Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt; origins;
+    for (auto&amp; origin : DatabaseTracker::singleton().origins())
+        origins.append(origin.ptr());
</ins><span class="cx"> 
</span><ins>+    COMPtr&lt;COMEnumVariant&lt;Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&gt;&gt; enumVariant(AdoptCOM, COMEnumVariant&lt;Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&gt;::adopt(origins));
+
</ins><span class="cx">     *result = enumVariant.leakRef();
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="lines">@@ -253,10 +255,9 @@
</span><span class="cx">     if (!webSecurityOrigin)
</span><span class="cx">         return E_FAIL;
</span><span class="cx"> 
</span><del>-    Vector&lt;String&gt; databaseNames;
-    DatabaseManager::singleton().databaseNamesForOrigin(webSecurityOrigin-&gt;securityOrigin(), databaseNames);
</del><ins>+    auto databaseNames = DatabaseTracker::singleton().databaseNames(*webSecurityOrigin-&gt;securityOrigin());
</ins><span class="cx"> 
</span><del>-    COMPtr&lt;COMEnumVariant&lt;Vector&lt;String&gt; &gt; &gt; enumVariant(AdoptCOM, COMEnumVariant&lt;Vector&lt;String&gt; &gt;::adopt(databaseNames));
</del><ins>+    COMPtr&lt;COMEnumVariant&lt;Vector&lt;String&gt;&gt;&gt; enumVariant(AdoptCOM, COMEnumVariant&lt;Vector&lt;String&gt;&gt;::adopt(databaseNames));
</ins><span class="cx"> 
</span><span class="cx">     *result = enumVariant.leakRef();
</span><span class="cx">     return S_OK;
</span><span class="lines">@@ -277,8 +278,8 @@
</span><span class="cx">     if (!webSecurityOrigin)
</span><span class="cx">         return E_FAIL;
</span><span class="cx"> 
</span><del>-    DatabaseDetails details = DatabaseManager::singleton().detailsForNameAndOrigin(String(databaseName, SysStringLen(databaseName)),
-        webSecurityOrigin-&gt;securityOrigin());
</del><ins>+    auto details = DatabaseManager::singleton().detailsForNameAndOrigin(String(databaseName, SysStringLen(databaseName)),
+        *webSecurityOrigin-&gt;securityOrigin());
</ins><span class="cx"> 
</span><span class="cx">     if (details.name().isNull())
</span><span class="cx">         return E_INVALIDARG;
</span><span class="lines">@@ -286,13 +287,13 @@
</span><span class="cx">     *result = DatabaseDetailsPropertyBag::createInstance(details);
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><del>-    
</del><ins>+
</ins><span class="cx"> HRESULT WebDatabaseManager::deleteAllDatabases()
</span><span class="cx"> {
</span><span class="cx">     if (this != s_sharedWebDatabaseManager)
</span><span class="cx">         return E_FAIL;
</span><span class="cx"> 
</span><del>-    DatabaseManager::singleton().deleteAllDatabasesImmediately();
</del><ins>+    DatabaseTracker::singleton().deleteAllDatabasesImmediately();
</ins><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="lines">@@ -309,7 +310,7 @@
</span><span class="cx">     if (!webSecurityOrigin)
</span><span class="cx">         return E_FAIL;
</span><span class="cx"> 
</span><del>-    DatabaseManager::singleton().deleteOrigin(webSecurityOrigin-&gt;securityOrigin());
</del><ins>+    DatabaseTracker::singleton().deleteOrigin(*webSecurityOrigin-&gt;securityOrigin());
</ins><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="lines">@@ -329,7 +330,7 @@
</span><span class="cx">     if (!webSecurityOrigin)
</span><span class="cx">         return E_FAIL;
</span><span class="cx"> 
</span><del>-    DatabaseManager::singleton().deleteDatabase(webSecurityOrigin-&gt;securityOrigin(), String(databaseName, SysStringLen(databaseName)));
</del><ins>+    DatabaseTracker::singleton().deleteDatabase(*webSecurityOrigin-&gt;securityOrigin(), String(databaseName, SysStringLen(databaseName)));
</ins><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="lines">@@ -364,7 +365,7 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(isMainThread());
</span><span class="cx">         DidModifyOriginData* info = static_cast&lt;DidModifyOriginData*&gt;(context);
</span><del>-        info-&gt;databaseManager-&gt;dispatchDidModifyOrigin(info-&gt;origin.get());
</del><ins>+        info-&gt;databaseManager-&gt;dispatchDidModifyOrigin(*info-&gt;origin);
</ins><span class="cx">         delete info;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -372,10 +373,10 @@
</span><span class="cx">     RefPtr&lt;SecurityOrigin&gt; origin;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-void WebDatabaseManager::dispatchDidModifyOrigin(SecurityOrigin* origin)
</del><ins>+void WebDatabaseManager::dispatchDidModifyOrigin(SecurityOrigin&amp; origin)
</ins><span class="cx"> {
</span><span class="cx">     if (!isMainThread()) {
</span><del>-        DidModifyOriginData::dispatchToMainThread(this, origin);
</del><ins>+        DidModifyOriginData::dispatchToMainThread(this, &amp;origin);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -382,7 +383,7 @@
</span><span class="cx">     static BSTR databaseDidModifyOriginName = SysAllocString(WebDatabaseDidModifyOriginNotification);
</span><span class="cx">     IWebNotificationCenter* notifyCenter = WebNotificationCenter::defaultCenterInternal();
</span><span class="cx"> 
</span><del>-    COMPtr&lt;WebSecurityOrigin&gt; securityOrigin(AdoptCOM, WebSecurityOrigin::createInstance(origin));
</del><ins>+    COMPtr&lt;WebSecurityOrigin&gt; securityOrigin(AdoptCOM, WebSecurityOrigin::createInstance(&amp;origin));
</ins><span class="cx">     notifyCenter-&gt;postNotificationName(databaseDidModifyOriginName, securityOrigin.get(), 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -394,15 +395,15 @@
</span><span class="cx">     if (this != s_sharedWebDatabaseManager)
</span><span class="cx">         return E_FAIL;
</span><span class="cx"> 
</span><del>-    DatabaseManager::singleton().setQuota(SecurityOrigin::createFromString(origin).ptr(), quota);
</del><ins>+    DatabaseTracker::singleton().setQuota(SecurityOrigin::createFromString(origin), quota);
</ins><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebDatabaseManager::dispatchDidModifyDatabase(SecurityOrigin* origin, const String&amp; databaseName)
</del><ins>+void WebDatabaseManager::dispatchDidModifyDatabase(SecurityOrigin&amp; origin, const String&amp; databaseName)
</ins><span class="cx"> {
</span><span class="cx">     if (!isMainThread()) {
</span><del>-        DidModifyOriginData::dispatchToMainThread(this, origin);
</del><ins>+        DidModifyOriginData::dispatchToMainThread(this, &amp;origin);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -409,7 +410,7 @@
</span><span class="cx">     static BSTR databaseDidModifyOriginName = SysAllocString(WebDatabaseDidModifyDatabaseNotification);
</span><span class="cx">     IWebNotificationCenter* notifyCenter = WebNotificationCenter::defaultCenterInternal();
</span><span class="cx"> 
</span><del>-    COMPtr&lt;WebSecurityOrigin&gt; securityOrigin(AdoptCOM, WebSecurityOrigin::createInstance(origin));
</del><ins>+    COMPtr&lt;WebSecurityOrigin&gt; securityOrigin(AdoptCOM, WebSecurityOrigin::createInstance(&amp;origin));
</ins><span class="cx"> 
</span><span class="cx">     HashMap&lt;String, String&gt; userInfo;
</span><span class="cx">     userInfo.set(WebDatabaseNameKey, databaseName);
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebDatabaseManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebDatabaseManager.h (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebDatabaseManager.h        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/win/WebDatabaseManager.h        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -26,8 +26,7 @@
</span><span class="cx">  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef WebDatabaseManager_h
-#define WebDatabaseManager_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;WebKit.h&quot;
</span><span class="cx"> #include &lt;WebCore/DatabaseManagerClient.h&gt;
</span><span class="lines">@@ -55,8 +54,8 @@
</span><span class="cx">     virtual HRESULT STDMETHODCALLTYPE deleteAllIndexedDatabases();
</span><span class="cx"> 
</span><span class="cx">     // DatabaseManagerClient
</span><del>-    virtual void dispatchDidModifyOrigin(WebCore::SecurityOrigin*);
-    virtual void dispatchDidModifyDatabase(WebCore::SecurityOrigin*, const WTF::String&amp; databaseName);
</del><ins>+    virtual void dispatchDidModifyOrigin(WebCore::SecurityOrigin&amp;);
+    virtual void dispatchDidModifyDatabase(WebCore::SecurityOrigin&amp;, const WTF::String&amp; databaseName);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WebDatabaseManager();
</span><span class="lines">@@ -66,5 +65,3 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> void WebKitInitializeWebDatabasesIfNecessary();
</span><del>-
-#endif
</del></span></pre></div>
<a id="trunkSourceWebKitwinWebSecurityOrigincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebSecurityOrigin.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebSecurityOrigin.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit/win/WebSecurityOrigin.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;MarshallingHelpers.h&quot;
</span><span class="cx"> #include &lt;WebCore/BString.h&gt;
</span><del>-#include &lt;WebCore/DatabaseManager.h&gt;
</del><ins>+#include &lt;WebCore/DatabaseTracker.h&gt;
</ins><span class="cx"> #include &lt;WebCore/URL.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx">     if (!result)
</span><span class="cx">         return E_POINTER;
</span><span class="cx"> 
</span><del>-    *result = DatabaseManager::singleton().usageForOrigin(m_securityOrigin.get());
</del><ins>+    *result = DatabaseTracker::singleton().usage(*m_securityOrigin);
</ins><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="lines">@@ -139,13 +139,13 @@
</span><span class="cx">     if (!result)
</span><span class="cx">         return E_POINTER;
</span><span class="cx"> 
</span><del>-    *result = DatabaseManager::singleton().quotaForOrigin(m_securityOrigin.get());
</del><ins>+    *result = DatabaseTracker::singleton().quota(*m_securityOrigin);
</ins><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="cx">         
</span><span class="cx"> HRESULT WebSecurityOrigin::setQuota(unsigned long long quota) 
</span><span class="cx"> {
</span><del>-    DatabaseManager::singleton().setQuota(m_securityOrigin.get(), quota);
</del><ins>+    DatabaseTracker::singleton().setQuota(*m_securityOrigin, quota);
</ins><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit2/ChangeLog        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-11-13  Darin Adler  &lt;darin@apple.com&gt;
+
+        Fix exception handling in SQL database code, streamline and update code
+        https://bugs.webkit.org/show_bug.cgi?id=164685
+
+        Reviewed by Sam Weinig.
+
+        * UIProcess/API/efl/ewk_database_manager.cpp:
+        (EwkDatabaseManager::getDatabaseOrigins): Update for change to the
+        DatabaseTracker::origins function.
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::fetchData): Use DatabaseTracker.
+        (WebKit::WebsiteDataStore::removeData): Ditto.
+        * WebProcess/InjectedBundle/API/c/WKBundle.cpp:
+        (WKBundleSetDatabaseQuota): Ditto.
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::exceededDatabaseQuota): Ditto.
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::processWillSuspendImminently): Ditto.
+
</ins><span class="cx"> 2016-11-12  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a way to get the UI-side scrolling tree as text via UIScriptController
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIeflewk_database_managercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_database_manager.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_database_manager.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_database_manager.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -51,15 +51,13 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;ArrayCallback&gt; arrayCallback = ArrayCallback::create(toGenericCallbackFunction(context, callback));
</span><span class="cx"> 
</span><del>-    Vector&lt;RefPtr&lt;WebCore::SecurityOrigin&gt;&gt; origins;
</del><ins>+    auto origins = WebCore::DatabaseTracker::trackerWithDatabasePath(API::WebsiteDataStore::defaultWebSQLDatabaseDirectory())-&gt;origins();
+
</ins><span class="cx">     Vector&lt;RefPtr&lt;API::Object&gt;&gt; securityOrigins;
</span><del>-
-    WebCore::DatabaseTracker::trackerWithDatabasePath(API::WebsiteDataStore::defaultWebSQLDatabaseDirectory())-&gt;origins(origins);
</del><span class="cx">     securityOrigins.reserveInitialCapacity(origins.size());
</span><ins>+    for (auto&amp; originIdentifier : origins)
+        securityOrigins.uncheckedAppend(API::SecurityOrigin::create(originIdentifier));
</ins><span class="cx"> 
</span><del>-    for (const auto&amp; originIdentifier : origins)
-        securityOrigins.uncheckedAppend(API::SecurityOrigin::create(*originIdentifier));
-
</del><span class="cx">     arrayCallback-&gt;performCallbackWithReturnValue(API::Array::create(WTFMove(securityOrigins)).ptr());
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebsiteDataWebsiteDataStorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -376,14 +376,11 @@
</span><span class="cx">         callbackAggregator-&gt;addPendingCallback();
</span><span class="cx"> 
</span><span class="cx">         m_queue-&gt;dispatch([webSQLDatabaseDirectory = m_configuration.webSQLDatabaseDirectory.isolatedCopy(), callbackAggregator] {
</span><del>-            Vector&lt;RefPtr&lt;WebCore::SecurityOrigin&gt;&gt; origins;
-            WebCore::DatabaseTracker::trackerWithDatabasePath(webSQLDatabaseDirectory)-&gt;origins(origins);
-
</del><ins>+            auto origins = WebCore::DatabaseTracker::trackerWithDatabasePath(webSQLDatabaseDirectory)-&gt;origins();
</ins><span class="cx">             RunLoop::main().dispatch([callbackAggregator, origins = WTFMove(origins)]() mutable {
</span><span class="cx">                 WebsiteData websiteData;
</span><span class="cx">                 for (auto&amp; origin : origins)
</span><span class="cx">                     websiteData.entries.append(WebsiteData::Entry { WTFMove(origin), WebsiteDataType::WebSQLDatabases, 0 });
</span><del>-
</del><span class="cx">                 callbackAggregator-&gt;removePendingCallback(WTFMove(websiteData));
</span><span class="cx">             });
</span><span class="cx">         });
</span><span class="lines">@@ -900,10 +897,8 @@
</span><span class="cx">         callbackAggregator-&gt;addPendingCallback();
</span><span class="cx">         m_queue-&gt;dispatch([origins = WTFMove(origins), callbackAggregator, webSQLDatabaseDirectory = m_configuration.webSQLDatabaseDirectory.isolatedCopy()] {
</span><span class="cx">             auto databaseTracker = WebCore::DatabaseTracker::trackerWithDatabasePath(webSQLDatabaseDirectory);
</span><del>-
-            for (const auto&amp; origin : origins)
-                databaseTracker-&gt;deleteOrigin(origin.securityOrigin().ptr());
-
</del><ins>+            for (auto&amp; origin : origins)
+                databaseTracker-&gt;deleteOrigin(origin.securityOrigin());
</ins><span class="cx">             RunLoop::main().dispatch([callbackAggregator] {
</span><span class="cx">                 callbackAggregator-&gt;removePendingCallback();
</span><span class="cx">             });
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPIcWKBundlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> #include &quot;WebFrame.h&quot;
</span><span class="cx"> #include &quot;WebPage.h&quot;
</span><span class="cx"> #include &quot;WebPageGroupProxy.h&quot;
</span><del>-#include &lt;WebCore/DatabaseManager.h&gt;
</del><ins>+#include &lt;WebCore/DatabaseTracker.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> using namespace WebKit;
</span><span class="lines">@@ -212,14 +212,13 @@
</span><span class="cx"> 
</span><span class="cx"> void WKBundleClearAllDatabases(WKBundleRef)
</span><span class="cx"> {
</span><del>-    DatabaseManager::singleton().deleteAllDatabasesImmediately();
</del><ins>+    DatabaseTracker::singleton().deleteAllDatabasesImmediately();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WKBundleSetDatabaseQuota(WKBundleRef bundleRef, uint64_t quota)
</span><span class="cx"> {
</span><del>-    // Historically, we've used the following (somewhat non-sensical) string
-    // for the databaseIdentifier of local files.
-    DatabaseManager::singleton().setQuota(SecurityOrigin::createFromDatabaseIdentifier(&quot;file__0&quot;).ptr(), quota);
</del><ins>+    // Historically, we've used the following (somewhat nonsensical) string for the databaseIdentifier of local files.
+    DatabaseTracker::singleton().setQuota(SecurityOrigin::createFromDatabaseIdentifier(&quot;file__0&quot;), quota);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WKDataRef WKBundleCreateWKDataFromUInt8Array(WKBundleRef bundle, JSContextRef context, JSValueRef data)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx"> #include &lt;WebCore/ApplicationCacheStorage.h&gt;
</span><span class="cx"> #include &lt;WebCore/AXObjectCache.h&gt;
</span><span class="cx"> #include &lt;WebCore/ColorChooser.h&gt;
</span><del>-#include &lt;WebCore/DatabaseManager.h&gt;
</del><ins>+#include &lt;WebCore/DatabaseTracker.h&gt;
</ins><span class="cx"> #include &lt;WebCore/DocumentLoader.h&gt;
</span><span class="cx"> #include &lt;WebCore/FileChooser.h&gt;
</span><span class="cx"> #include &lt;WebCore/FileIconLoader.h&gt;
</span><span class="lines">@@ -677,10 +677,12 @@
</span><span class="cx">     ASSERT(webFrame);
</span><span class="cx">     
</span><span class="cx">     SecurityOrigin* origin = frame-&gt;document()-&gt;securityOrigin();
</span><ins>+    if (!origin)
+        return;
</ins><span class="cx"> 
</span><del>-    DatabaseManager&amp; dbManager = DatabaseManager::singleton();
-    uint64_t currentQuota = dbManager.quotaForOrigin(origin);
-    uint64_t currentOriginUsage = dbManager.usageForOrigin(origin);
</del><ins>+    auto&amp; tracker = DatabaseTracker::singleton();
+    auto currentQuota = tracker.quota(*origin);
+    auto currentOriginUsage = tracker.usage(*origin);
</ins><span class="cx">     uint64_t newQuota = 0;
</span><span class="cx">     RefPtr&lt;API::SecurityOrigin&gt; securityOrigin = API::SecurityOrigin::create(WebCore::SecurityOrigin::createFromDatabaseIdentifier(WebCore::SecurityOriginData::fromSecurityOrigin(*origin).databaseIdentifier()));
</span><span class="cx">     newQuota = m_page-&gt;injectedBundleUIClient().didExceedDatabaseQuota(m_page, securityOrigin.get(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage());
</span><span class="lines">@@ -691,7 +693,7 @@
</span><span class="cx">             Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page-&gt;pageID(), Seconds::infinity(), IPC::SendSyncOption::InformPlatformProcessWillSuspend);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    dbManager.setQuota(origin, newQuota);
</del><ins>+    tracker.setQuota(*origin, newQuota);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebChromeClient::reachedMaxAppCacheSize(int64_t)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (208671 => 208672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2016-11-13 20:36:40 UTC (rev 208671)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2016-11-14 03:22:31 UTC (rev 208672)
</span><span class="lines">@@ -1307,7 +1307,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RELEASE_LOG(ProcessSuspension, &quot;%p - WebProcess::processWillSuspendImminently()&quot;, this);
</span><del>-    DatabaseTracker::tracker().closeAllDatabases(CurrentQueryBehavior::Interrupt);
</del><ins>+    DatabaseTracker::singleton().closeAllDatabases(CurrentQueryBehavior::Interrupt);
</ins><span class="cx">     actualPrepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend::No);
</span><span class="cx">     handled = true;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>