Clean up ExceptionCode enumeration
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Jul 2017 02:34:56 +0000 (02:34 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Jul 2017 02:34:56 +0000 (02:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174812

Reviewed by Darin Adler.

Clean up ExceptionCode enumeration:
- Updated comments to reflect the latest WebIDL specification
- Drop special values given to some exception codes. Those legacy codes are already in the
  table inside DOMException.cpp. This also allows us to drop empty rows in the DOMException
  table
- Drop NoException value in the enumeration and use std::optional<ExceptionCode> when needed
  instead.

* Modules/indexeddb/shared/IDBError.cpp:
(WebCore::IDBError::IDBError):
(WebCore::IDBError::name):
(WebCore::IDBError::message):
* Modules/indexeddb/shared/IDBError.h:
(WebCore::IDBError::code):
(WebCore::IDBError::encode):
(WebCore::IDBError::decode):
* dom/DOMException.cpp:
* dom/ExceptionCode.h:
* fileapi/FileReaderSync.cpp:
(WebCore::errorCodeToException):
(WebCore::FileReaderSync::startLoading):
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::createRequest):
* xml/XMLHttpRequest.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219901 268f45cc-cd09-0410-ab3c-d52691b4dbfc

20 files changed:
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBRequest.cpp
Source/WebCore/Modules/indexeddb/IDBTransaction.cpp
Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp
Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.cpp
Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp
Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.cpp
Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp
Source/WebCore/Modules/indexeddb/server/SQLiteIDBTransaction.cpp
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
Source/WebCore/Modules/indexeddb/shared/IDBError.cpp
Source/WebCore/Modules/indexeddb/shared/IDBError.h
Source/WebCore/bindings/js/JSDOMExceptionHandling.cpp
Source/WebCore/dom/DOMException.cpp
Source/WebCore/dom/Exception.h
Source/WebCore/dom/ExceptionCode.h
Source/WebCore/fileapi/FileReaderSync.cpp
Source/WebCore/xml/XMLHttpRequest.cpp
Source/WebCore/xml/XMLHttpRequest.h
Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp

index 5d72be8..c1373cd 100644 (file)
@@ -1,3 +1,35 @@
+2017-07-25  Chris Dumez  <cdumez@apple.com>
+
+        Clean up ExceptionCode enumeration
+        https://bugs.webkit.org/show_bug.cgi?id=174812
+
+        Reviewed by Darin Adler.
+
+        Clean up ExceptionCode enumeration:
+        - Updated comments to reflect the latest WebIDL specification
+        - Drop special values given to some exception codes. Those legacy codes are already in the
+          table inside DOMException.cpp. This also allows us to drop empty rows in the DOMException
+          table
+        - Drop NoException value in the enumeration and use std::optional<ExceptionCode> when needed
+          instead.
+
+        * Modules/indexeddb/shared/IDBError.cpp:
+        (WebCore::IDBError::IDBError):
+        (WebCore::IDBError::name):
+        (WebCore::IDBError::message):
+        * Modules/indexeddb/shared/IDBError.h:
+        (WebCore::IDBError::code):
+        (WebCore::IDBError::encode):
+        (WebCore::IDBError::decode):
+        * dom/DOMException.cpp:
+        * dom/ExceptionCode.h:
+        * fileapi/FileReaderSync.cpp:
+        (WebCore::errorCodeToException):
+        (WebCore::FileReaderSync::startLoading):
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::createRequest):
+        * xml/XMLHttpRequest.h:
+
 2017-07-25  Andy Estes  <aestes@apple.com>
 
         [Apple Pay] Add "carteBancaire" as a supported payment network
index 1e1b87d..605692e 100644 (file)
@@ -485,7 +485,7 @@ void IDBRequest::willIterateCursor(IDBCursor& cursor)
     m_result = std::nullopt;
     m_readyState = ReadyState::Pending;
     m_domError = nullptr;
-    m_idbError = { };
+    m_idbError = IDBError { };
 
     m_cursorRequestNotifier = std::make_unique<ScopeGuard>([this]() {
         m_pendingCursor->decrementOutstandingRequestCount();
index 1a98d7f..e91abc9 100644 (file)
@@ -1216,7 +1216,7 @@ void IDBTransaction::putOrAddOnServer(IDBClient::TransactionOperation& operation
             // If the IDBValue doesn't have any data, then something went wrong writing the blobs to disk.
             // In that case, we cannot successfully store this record, so we callback with an error.
             RefPtr<IDBClient::TransactionOperation> protectedOperation(&operation);
-            auto result = IDBResultData::error(operation.identifier(), { UnknownError, ASCIILiteral("Error preparing Blob/File data to be stored in object store") });
+            auto result = IDBResultData::error(operation.identifier(), IDBError { UnknownError, ASCIILiteral("Error preparing Blob/File data to be stored in object store") });
             scriptExecutionContext()->postTask([protectedOperation = WTFMove(protectedOperation), result = WTFMove(result)](ScriptExecutionContext&) {
                 protectedOperation->doComplete(result);
             });
@@ -1238,7 +1238,7 @@ void IDBTransaction::putOrAddOnServer(IDBClient::TransactionOperation& operation
 
         // If the IDBValue doesn't have any data, then something went wrong writing the blobs to disk.
         // In that case, we cannot successfully store this record, so we callback with an error.
-        auto result = IDBResultData::error(protectedOperation->identifier(), { UnknownError, ASCIILiteral("Error preparing Blob/File data to be stored in object store") });
+        auto result = IDBResultData::error(protectedOperation->identifier(), IDBError { UnknownError, ASCIILiteral("Error preparing Blob/File data to be stored in object store") });
         callOnMainThread([protectedThis = WTFMove(protectedThis), protectedOperation = WTFMove(protectedOperation), result = WTFMove(result)]() mutable {
             protectedOperation->doComplete(result);
         });
index d7cdb77..6983c9d 100644 (file)
@@ -97,7 +97,7 @@ IDBError IndexValueStore::addRecord(const IDBKeyData& indexKey, const IDBKeyData
     result.iterator->value->addKey(valueKey);
     m_orderedKeys.insert(indexKey);
 
-    return { };
+    return IDBError { };
 }
 
 void IndexValueStore::removeRecord(const IDBKeyData& indexKey, const IDBKeyData& valueKey)
index 2fc6799..c6abc8e 100644 (file)
@@ -66,7 +66,7 @@ IDBError MemoryIDBBackingStore::getOrEstablishDatabaseInfo(IDBDatabaseInfo& info
         m_databaseInfo = std::make_unique<IDBDatabaseInfo>(m_identifier.databaseName(), 0);
 
     info = *m_databaseInfo;
-    return { };
+    return IDBError { };
 }
 
 void MemoryIDBBackingStore::setDatabaseInfo(const IDBDatabaseInfo& info)
@@ -82,7 +82,7 @@ IDBError MemoryIDBBackingStore::beginTransaction(const IDBTransactionInfo& info)
     LOG(IndexedDB, "MemoryIDBBackingStore::beginTransaction");
 
     if (m_transactions.contains(info.identifier()))
-        return { InvalidStateError, "Backing store asked to create transaction it already has a record of" };
+        return IDBError { InvalidStateError, "Backing store asked to create transaction it already has a record of" };
 
     auto transaction = MemoryBackingStoreTransaction::create(*this, info);
 
@@ -99,7 +99,7 @@ IDBError MemoryIDBBackingStore::beginTransaction(const IDBTransactionInfo& info)
 
     m_transactions.set(info.identifier(), WTFMove(transaction));
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::abortTransaction(const IDBResourceIdentifier& transactionIdentifier)
@@ -108,11 +108,11 @@ IDBError MemoryIDBBackingStore::abortTransaction(const IDBResourceIdentifier& tr
 
     auto transaction = m_transactions.take(transactionIdentifier);
     if (!transaction)
-        return { InvalidStateError, "Backing store asked to abort transaction it didn't have record of" };
+        return IDBError { InvalidStateError, "Backing store asked to abort transaction it didn't have record of" };
 
     transaction->abort();
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::commitTransaction(const IDBResourceIdentifier& transactionIdentifier)
@@ -121,11 +121,11 @@ IDBError MemoryIDBBackingStore::commitTransaction(const IDBResourceIdentifier& t
 
     auto transaction = m_transactions.take(transactionIdentifier);
     if (!transaction)
-        return { InvalidStateError, "Backing store asked to commit transaction it didn't have record of" };
+        return IDBError { InvalidStateError, "Backing store asked to commit transaction it didn't have record of" };
 
     transaction->commit();
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::createObjectStore(const IDBResourceIdentifier& transactionIdentifier, const IDBObjectStoreInfo& info)
@@ -134,7 +134,7 @@ IDBError MemoryIDBBackingStore::createObjectStore(const IDBResourceIdentifier& t
 
     ASSERT(m_databaseInfo);
     if (m_databaseInfo->hasObjectStore(info.name()))
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     ASSERT(!m_objectStoresByIdentifier.contains(info.identifier()));
     auto objectStore = MemoryObjectStore::create(info);
@@ -148,7 +148,7 @@ IDBError MemoryIDBBackingStore::createObjectStore(const IDBResourceIdentifier& t
     rawTransaction->addNewObjectStore(objectStore.get());
     registerObjectStore(WTFMove(objectStore));
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier)
@@ -157,7 +157,7 @@ IDBError MemoryIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
 
     ASSERT(m_databaseInfo);
     if (!m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier))
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     auto transaction = m_transactions.get(transactionIdentifier);
     ASSERT(transaction);
@@ -166,12 +166,12 @@ IDBError MemoryIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
     auto objectStore = takeObjectStoreByIdentifier(objectStoreIdentifier);
     ASSERT(objectStore);
     if (!objectStore)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     m_databaseInfo->deleteObjectStore(objectStore->info().name());
     transaction->objectStoreDeleted(*objectStore);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::renameObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const String& newName)
@@ -180,7 +180,7 @@ IDBError MemoryIDBBackingStore::renameObjectStore(const IDBResourceIdentifier& t
 
     ASSERT(m_databaseInfo);
     if (!m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier))
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     auto transaction = m_transactions.get(transactionIdentifier);
     ASSERT(transaction);
@@ -189,7 +189,7 @@ IDBError MemoryIDBBackingStore::renameObjectStore(const IDBResourceIdentifier& t
     auto objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     ASSERT(objectStore);
     if (!objectStore)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     String oldName = objectStore->info().name();
     objectStore->rename(newName);
@@ -197,7 +197,7 @@ IDBError MemoryIDBBackingStore::renameObjectStore(const IDBResourceIdentifier& t
 
     m_databaseInfo->renameObjectStore(objectStoreIdentifier, newName);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::clearObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier)
@@ -214,11 +214,11 @@ IDBError MemoryIDBBackingStore::clearObjectStore(const IDBResourceIdentifier& tr
 
     auto objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     if (!objectStore)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     objectStore->clear();
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::createIndex(const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo& info)
@@ -231,7 +231,7 @@ IDBError MemoryIDBBackingStore::createIndex(const IDBResourceIdentifier& transac
 
     auto* objectStore = m_objectStoresByIdentifier.get(info.objectStoreIdentifier());
     if (!objectStore)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     return objectStore->createIndex(*rawTransaction, info);
 }
@@ -246,7 +246,7 @@ IDBError MemoryIDBBackingStore::deleteIndex(const IDBResourceIdentifier& transac
 
     auto* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     if (!objectStore)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     return objectStore->deleteIndex(*rawTransaction, indexIdentifier);
 }
@@ -258,11 +258,11 @@ IDBError MemoryIDBBackingStore::renameIndex(const IDBResourceIdentifier& transac
     ASSERT(m_databaseInfo);
     auto* objectStoreInfo = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier);
     if (!objectStoreInfo)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     auto* indexInfo = objectStoreInfo->infoForExistingIndex(indexIdentifier);
     if (!indexInfo)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     auto transaction = m_transactions.get(transactionIdentifier);
     ASSERT(transaction);
@@ -271,12 +271,12 @@ IDBError MemoryIDBBackingStore::renameIndex(const IDBResourceIdentifier& transac
     auto objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     ASSERT(objectStore);
     if (!objectStore)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     auto* index = objectStore->indexForIdentifier(indexIdentifier);
     ASSERT(index);
     if (!index)
-        return { ConstraintError };
+        return IDBError { ConstraintError };
 
     String oldName = index->info().name();
     objectStore->renameIndex(*index, newName);
@@ -284,7 +284,7 @@ IDBError MemoryIDBBackingStore::renameIndex(const IDBResourceIdentifier& transac
 
     indexInfo->rename(newName);
 
-    return { };
+    return IDBError { };
 }
 
 void MemoryIDBBackingStore::removeObjectStoreForVersionChangeAbort(MemoryObjectStore& objectStore)
@@ -314,7 +314,7 @@ IDBError MemoryIDBBackingStore::keyExistsInObjectStore(const IDBResourceIdentifi
     RELEASE_ASSERT(objectStore);
 
     keyExists = objectStore->containsRecord(keyData);
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::deleteRange(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyRangeData& range)
@@ -324,14 +324,14 @@ IDBError MemoryIDBBackingStore::deleteRange(const IDBResourceIdentifier& transac
     ASSERT(objectStoreIdentifier);
 
     if (!m_transactions.contains(transactionIdentifier))
-        return { UnknownError, ASCIILiteral("No backing store transaction found to delete from") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found to delete from") };
 
     MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     if (!objectStore)
-        return { UnknownError, ASCIILiteral("No backing store object store found") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store object store found") };
 
     objectStore->deleteRange(range);
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::addRecord(const IDBResourceIdentifier& transactionIdentifier, const IDBObjectStoreInfo& objectStoreInfo, const IDBKeyData& keyData, const IDBValue& value)
@@ -342,11 +342,11 @@ IDBError MemoryIDBBackingStore::addRecord(const IDBResourceIdentifier& transacti
 
     auto transaction = m_transactions.get(transactionIdentifier);
     if (!transaction)
-        return { UnknownError, ASCIILiteral("No backing store transaction found to put record") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found to put record") };
 
     MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreInfo.identifier());
     if (!objectStore)
-        return { UnknownError, ASCIILiteral("No backing store object store found to put record") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store object store found to put record") };
 
     return objectStore->addRecord(*transaction, keyData, value);
 }
@@ -358,11 +358,11 @@ IDBError MemoryIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
     ASSERT(objectStoreIdentifier);
 
     if (!m_transactions.contains(transactionIdentifier))
-        return { UnknownError, ASCIILiteral("No backing store transaction found to get record") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found to get record") };
 
     MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     if (!objectStore)
-        return { UnknownError, ASCIILiteral("No backing store object store found") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store object store found") };
 
     switch (type) {
     case IDBGetRecordDataType::KeyAndValue:
@@ -373,7 +373,7 @@ IDBError MemoryIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
         break;
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::getAllRecords(const IDBResourceIdentifier& transactionIdentifier, const IDBGetAllRecordsData& getAllRecordsData, IDBGetAllResult& result)
@@ -383,22 +383,22 @@ IDBError MemoryIDBBackingStore::getAllRecords(const IDBResourceIdentifier& trans
     ASSERT(getAllRecordsData.objectStoreIdentifier);
 
     if (!m_transactions.contains(transactionIdentifier))
-        return { UnknownError, ASCIILiteral("No backing store transaction found to get all records") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found to get all records") };
 
     auto* objectStore = m_objectStoresByIdentifier.get(getAllRecordsData.objectStoreIdentifier);
     if (!objectStore)
-        return { UnknownError, ASCIILiteral("No backing store object store found") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store object store found") };
 
     if (getAllRecordsData.indexIdentifier) {
         auto* index = objectStore->indexForIdentifier(getAllRecordsData.indexIdentifier);
         if (!index)
-            return { UnknownError, ASCIILiteral("No backing store index found") };
+            return IDBError { UnknownError, ASCIILiteral("No backing store index found") };
 
         index->getAllRecords(getAllRecordsData.keyRangeData, getAllRecordsData.count, getAllRecordsData.getAllType, result);
     } else
         objectStore->getAllRecords(getAllRecordsData.keyRangeData, getAllRecordsData.count, getAllRecordsData.getAllType, result);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::getIndexRecord(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, IndexedDB::IndexRecordType recordType, const IDBKeyRangeData& range, IDBGetResult& outValue)
@@ -408,14 +408,14 @@ IDBError MemoryIDBBackingStore::getIndexRecord(const IDBResourceIdentifier& tran
     ASSERT(objectStoreIdentifier);
 
     if (!m_transactions.contains(transactionIdentifier))
-        return { UnknownError, ASCIILiteral("No backing store transaction found to get record") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found to get record") };
 
     MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     if (!objectStore)
-        return { UnknownError, ASCIILiteral("No backing store object store found") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store object store found") };
 
     outValue = objectStore->indexValueForKeyRange(indexIdentifier, recordType, range);
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::getCount(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const IDBKeyRangeData& range, uint64_t& outCount)
@@ -425,15 +425,15 @@ IDBError MemoryIDBBackingStore::getCount(const IDBResourceIdentifier& transactio
     ASSERT(objectStoreIdentifier);
 
     if (!m_transactions.contains(transactionIdentifier))
-        return { UnknownError, ASCIILiteral("No backing store transaction found to get count") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found to get count") };
 
     MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier);
     if (!objectStore)
-        return { UnknownError, ASCIILiteral("No backing store object store found") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store object store found") };
 
     outCount = objectStore->countForKeyRange(indexIdentifier, range);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::generateKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t& keyNumber)
@@ -448,11 +448,11 @@ IDBError MemoryIDBBackingStore::generateKeyNumber(const IDBResourceIdentifier& t
 
     keyNumber = objectStore->currentKeyGeneratorValue();
     if (keyNumber > maxGeneratedKeyValue)
-        return { ConstraintError, "Cannot generate new key value over 2^53 for object store operation" };
+        return IDBError { ConstraintError, "Cannot generate new key value over 2^53 for object store operation" };
 
     objectStore->setKeyGeneratorValue(keyNumber + 1);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::revertGeneratedKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t keyNumber)
@@ -467,7 +467,7 @@ IDBError MemoryIDBBackingStore::revertGeneratedKeyNumber(const IDBResourceIdenti
 
     objectStore->setKeyGeneratorValue(keyNumber);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::maybeUpdateKeyGeneratorNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, double newKeyNumber)
@@ -481,7 +481,7 @@ IDBError MemoryIDBBackingStore::maybeUpdateKeyGeneratorNumber(const IDBResourceI
     RELEASE_ASSERT(objectStore);
 
     if (newKeyNumber < objectStore->currentKeyGeneratorValue())
-        return { };
+        return IDBError { };
 
     uint64_t newKeyInteger(newKeyNumber);
     if (newKeyInteger <= uint64_t(newKeyNumber))
@@ -491,7 +491,7 @@ IDBError MemoryIDBBackingStore::maybeUpdateKeyGeneratorNumber(const IDBResourceI
 
     objectStore->setKeyGeneratorValue(newKeyInteger);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::openCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBCursorInfo& info, IDBGetResult& outData)
@@ -501,17 +501,17 @@ IDBError MemoryIDBBackingStore::openCursor(const IDBResourceIdentifier& transact
     ASSERT(!MemoryCursor::cursorForIdentifier(info.identifier()));
 
     if (!m_transactions.contains(transactionIdentifier))
-        return { UnknownError, ASCIILiteral("No backing store transaction found in which to open a cursor") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found in which to open a cursor") };
 
     switch (info.cursorSource()) {
     case IndexedDB::CursorSource::ObjectStore: {
         auto* objectStore = m_objectStoresByIdentifier.get(info.sourceIdentifier());
         if (!objectStore)
-            return { UnknownError, ASCIILiteral("No backing store object store found") };
+            return IDBError { UnknownError, ASCIILiteral("No backing store object store found") };
 
         MemoryCursor* cursor = objectStore->maybeOpenCursor(info);
         if (!cursor)
-            return { UnknownError, ASCIILiteral("Could not create object store cursor in backing store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not create object store cursor in backing store") };
 
         cursor->currentData(outData);
         break;
@@ -519,21 +519,21 @@ IDBError MemoryIDBBackingStore::openCursor(const IDBResourceIdentifier& transact
     case IndexedDB::CursorSource::Index:
         auto* objectStore = m_objectStoresByIdentifier.get(info.objectStoreIdentifier());
         if (!objectStore)
-            return { UnknownError, ASCIILiteral("No backing store object store found") };
+            return IDBError { UnknownError, ASCIILiteral("No backing store object store found") };
 
         auto* index = objectStore->indexForIdentifier(info.sourceIdentifier());
         if (!index)
-            return { UnknownError, ASCIILiteral("No backing store index found") };
+            return IDBError { UnknownError, ASCIILiteral("No backing store index found") };
 
         MemoryCursor* cursor = index->maybeOpenCursor(info);
         if (!cursor)
-            return { UnknownError, ASCIILiteral("Could not create index cursor in backing store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not create index cursor in backing store") };
 
         cursor->currentData(outData);
         break;
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError MemoryIDBBackingStore::iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData& data, IDBGetResult& outData)
@@ -541,15 +541,15 @@ IDBError MemoryIDBBackingStore::iterateCursor(const IDBResourceIdentifier& trans
     LOG(IndexedDB, "MemoryIDBBackingStore::iterateCursor");
 
     if (!m_transactions.contains(transactionIdentifier))
-        return { UnknownError, ASCIILiteral("No backing store transaction found in which to iterate cursor") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store transaction found in which to iterate cursor") };
 
     auto* cursor = MemoryCursor::cursorForIdentifier(cursorIdentifier);
     if (!cursor)
-        return { UnknownError, ASCIILiteral("No backing store cursor found in which to iterate cursor") };
+        return IDBError { UnknownError, ASCIILiteral("No backing store cursor found in which to iterate cursor") };
 
     cursor->iterate(data.keyData, data.primaryKeyData, data.count, outData);
 
-    return { };
+    return IDBError { };
 }
 
 void MemoryIDBBackingStore::registerObjectStore(Ref<MemoryObjectStore>&& objectStore)
index fda251b..4894a8f 100644 (file)
@@ -228,7 +228,7 @@ IDBError MemoryIndex::putIndexKey(const IDBKeyData& valueKey, const IndexKey& in
         notifyCursorsOfValueChange(key, valueKey);
     }
 
-    return { };
+    return IDBError { };
 }
 
 void MemoryIndex::removeRecord(const IDBKeyData& valueKey, const IndexKey& indexKey)
index 8130e46..ddd193b 100644 (file)
@@ -102,7 +102,7 @@ IDBError MemoryObjectStore::createIndex(MemoryBackingStoreTransaction& transacti
     transaction.addNewIndex(index.get());
     registerIndex(WTFMove(index));
 
-    return { };
+    return IDBError { };
 }
 
 void MemoryObjectStore::maybeRestoreDeletedIndex(Ref<MemoryIndex>&& index)
@@ -153,7 +153,7 @@ IDBError MemoryObjectStore::deleteIndex(MemoryBackingStoreTransaction& transacti
     m_info.deleteIndex(indexIdentifier);
     transaction.indexDeleted(*index);
 
-    return { };
+    return IDBError { };
 }
 
 void MemoryObjectStore::deleteAllIndexes(MemoryBackingStoreTransaction& transaction)
@@ -304,7 +304,7 @@ IDBError MemoryObjectStore::updateIndexesForPutRecord(const IDBKeyData& key, con
 
     auto jsValue = deserializeIDBValueToJSValue(UniqueIDBDatabase::databaseThreadExecState(), value);
     if (jsValue.isUndefinedOrNull())
-        return { };
+        return IDBError { };
 
     IDBError error;
     Vector<std::pair<MemoryIndex*, IndexKey>> changedIndexRecords;
@@ -335,14 +335,14 @@ IDBError MemoryObjectStore::updateIndexesForPutRecord(const IDBKeyData& key, con
 IDBError MemoryObjectStore::populateIndexWithExistingRecords(MemoryIndex& index)
 {
     if (!m_keyValueStore)
-        return { };
+        return IDBError { };
 
     JSLockHolder locker(UniqueIDBDatabase::databaseThreadVM());
 
     for (auto iterator : *m_keyValueStore) {
         auto jsValue = deserializeIDBValueToJSValue(UniqueIDBDatabase::databaseThreadExecState(), iterator.value);
         if (jsValue.isUndefinedOrNull())
-            return { };
+            return IDBError { };
 
         IndexKey indexKey;
         generateIndexKeyForValue(UniqueIDBDatabase::databaseThreadExecState(), index.info(), jsValue, indexKey);
@@ -355,7 +355,7 @@ IDBError MemoryObjectStore::populateIndexWithExistingRecords(MemoryIndex& index)
             return error;
     }
 
-    return { };
+    return IDBError { };
 }
 
 uint64_t MemoryObjectStore::countForKeyRange(uint64_t indexIdentifier, const IDBKeyRangeData& inRange) const
index 6094cfc..eedc438 100644 (file)
@@ -780,7 +780,7 @@ IDBError SQLiteIDBBackingStore::getOrEstablishDatabaseInfo(IDBDatabaseInfo& info
 
     if (m_databaseInfo) {
         info = *m_databaseInfo;
-        return { };
+        return IDBError { };
     }
 
     makeAllDirectories(fullDatabaseDirectory());
@@ -793,7 +793,7 @@ IDBError SQLiteIDBBackingStore::getOrEstablishDatabaseInfo(IDBDatabaseInfo& info
     }
 
     if (!m_sqliteDB)
-        return { UnknownError, ASCIILiteral("Unable to open database file on disk") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to open database file on disk") };
 
     m_sqliteDB->setCollationFunction("IDBKEY", [](int aLength, const void* a, int bLength, const void* b) {
         return idbKeyCollate(aLength, a, bLength, b);
@@ -802,25 +802,25 @@ IDBError SQLiteIDBBackingStore::getOrEstablishDatabaseInfo(IDBDatabaseInfo& info
     if (!ensureValidRecordsTable()) {
         LOG_ERROR("Error creating or migrating Records table in database");
         closeSQLiteDB();
-        return { UnknownError, ASCIILiteral("Error creating or migrating Records table in database") };
+        return IDBError { UnknownError, ASCIILiteral("Error creating or migrating Records table in database") };
     }
 
     if (!ensureValidIndexRecordsTable()) {
         LOG_ERROR("Error creating or migrating Index Records table in database");
         closeSQLiteDB();
-        return { UnknownError, ASCIILiteral("Error creating or migrating Index Records table in database") };
+        return IDBError { UnknownError, ASCIILiteral("Error creating or migrating Index Records table in database") };
     }
 
     if (!ensureValidIndexRecordsIndex()) {
         LOG_ERROR("Error creating or migrating Index Records index in database");
         closeSQLiteDB();
-        return { UnknownError, ASCIILiteral("Error creating or migrating Index Records index in database") };
+        return IDBError { UnknownError, ASCIILiteral("Error creating or migrating Index Records index in database") };
     }
 
     if (!ensureValidBlobTables()) {
         LOG_ERROR("Error creating or confirming Blob Records tables in database");
         closeSQLiteDB();
-        return { UnknownError, ASCIILiteral("Error creating or confirming Blob Records tables in database") };
+        return IDBError { UnknownError, ASCIILiteral("Error creating or confirming Blob Records tables in database") };
     }
 
     auto databaseInfo = extractExistingDatabaseInfo();
@@ -830,12 +830,12 @@ IDBError SQLiteIDBBackingStore::getOrEstablishDatabaseInfo(IDBDatabaseInfo& info
     if (!databaseInfo) {
         LOG_ERROR("Unable to establish IDB database at path '%s'", dbFilename.utf8().data());
         closeSQLiteDB();
-        return { UnknownError, ASCIILiteral("Unable to establish IDB database file") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to establish IDB database file") };
     }
 
     m_databaseInfo = WTFMove(databaseInfo);
     info = *m_databaseInfo;
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::beginTransaction(const IDBTransactionInfo& info)
@@ -849,7 +849,7 @@ IDBError SQLiteIDBBackingStore::beginTransaction(const IDBTransactionInfo& info)
     auto addResult = m_transactions.add(info.identifier(), nullptr);
     if (!addResult.isNewEntry) {
         LOG_ERROR("Attempt to establish transaction identifier that already exists");
-        return { UnknownError, ASCIILiteral("Attempt to establish transaction identifier that already exists") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to establish transaction identifier that already exists") };
     }
 
     addResult.iterator->value = std::make_unique<SQLiteIDBTransaction>(*this, info);
@@ -862,7 +862,7 @@ IDBError SQLiteIDBBackingStore::beginTransaction(const IDBTransactionInfo& info)
         if (sql.prepare() != SQLITE_OK
             || sql.bindText(1, String::number(info.newVersion())) != SQLITE_OK
             || sql.step() != SQLITE_DONE)
-            error = { UnknownError, ASCIILiteral("Failed to store new database version in database") };
+            error = IDBError { UnknownError, ASCIILiteral("Failed to store new database version in database") };
     }
 
     return error;
@@ -878,7 +878,7 @@ IDBError SQLiteIDBBackingStore::abortTransaction(const IDBResourceIdentifier& id
     auto transaction = m_transactions.take(identifier);
     if (!transaction) {
         LOG_ERROR("Attempt to commit a transaction that hasn't been established");
-        return { UnknownError, ASCIILiteral("Attempt to abort a transaction that hasn't been established") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to abort a transaction that hasn't been established") };
     }
 
     if (transaction->mode() == IDBTransactionMode::Versionchange && m_originalDatabaseInfoBeforeVersionChange)
@@ -897,7 +897,7 @@ IDBError SQLiteIDBBackingStore::commitTransaction(const IDBResourceIdentifier& i
     auto transaction = m_transactions.take(identifier);
     if (!transaction) {
         LOG_ERROR("Attempt to commit a transaction that hasn't been established");
-        return { UnknownError, ASCIILiteral("Attempt to commit a transaction that hasn't been established") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to commit a transaction that hasn't been established") };
     }
 
     auto error = transaction->commit();
@@ -922,17 +922,17 @@ IDBError SQLiteIDBBackingStore::createObjectStore(const IDBResourceIdentifier& t
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to create an object store without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to create an object store without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to create an object store without an in-progress transaction") };
     }
     if (transaction->mode() != IDBTransactionMode::Versionchange) {
         LOG_ERROR("Attempt to create an object store in a non-version-change transaction");
-        return { UnknownError, ASCIILiteral("Attempt to create an object store in a non-version-change transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to create an object store in a non-version-change transaction") };
     }
 
     RefPtr<SharedBuffer> keyPathBlob = serializeIDBKeyPath(info.keyPath());
     if (!keyPathBlob) {
         LOG_ERROR("Unable to serialize IDBKeyPath to save in database for new object store");
-        return { UnknownError, ASCIILiteral("Unable to serialize IDBKeyPath to save in database for new object store") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize IDBKeyPath to save in database for new object store") };
     }
 
     {
@@ -945,7 +945,7 @@ IDBError SQLiteIDBBackingStore::createObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(5, info.maxIndexID()) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not add object store '%s' to ObjectStoreInfo table (%i) - %s", info.name().utf8().data(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not create object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not create object store") };
         }
     }
 
@@ -955,13 +955,13 @@ IDBError SQLiteIDBBackingStore::createObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(1, info.identifier()) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not seed initial key generator value for ObjectStoreInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not seed initial key generator value for object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not seed initial key generator value for object store") };
         }
     }
 
     m_databaseInfo->addExistingObjectStore(info);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier)
@@ -974,11 +974,11 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to delete an object store without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to delete an object store without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to delete an object store without an in-progress transaction") };
     }
     if (transaction->mode() != IDBTransactionMode::Versionchange) {
         LOG_ERROR("Attempt to delete an object store in a non-version-change transaction");
-        return { UnknownError, ASCIILiteral("Attempt to delete an object store in a non-version-change transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to delete an object store in a non-version-change transaction") };
     }
 
     // Delete the ObjectStore record
@@ -988,7 +988,7 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(1, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete object store id %" PRIi64 " from ObjectStoreInfo table (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not delete object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not delete object store") };
         }
     }
 
@@ -999,7 +999,7 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(1, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete object store from KeyGenerators table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not delete key generator for deleted object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not delete key generator for deleted object store") };
         }
     }
 
@@ -1010,7 +1010,7 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(1, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete records for object store %" PRIi64 " (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not delete records for deleted object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not delete records for deleted object store") };
         }
     }
 
@@ -1021,7 +1021,7 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(1, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete index from IndexInfo table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not delete IDBIndex for deleted object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not delete IDBIndex for deleted object store") };
         }
     }
 
@@ -1032,7 +1032,7 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(1, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete index records(%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not delete IDBIndex records for deleted object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not delete IDBIndex records for deleted object store") };
         }
     }
 
@@ -1042,7 +1042,7 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
         if (!sql
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete Blob URL records(%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not delete stored blob records for deleted object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not delete stored blob records for deleted object store") };
         }
     }
 
@@ -1053,7 +1053,7 @@ IDBError SQLiteIDBBackingStore::deleteObjectStore(const IDBResourceIdentifier& t
 
     m_databaseInfo->deleteObjectStore(objectStoreIdentifier);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::renameObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const String& newName)
@@ -1066,11 +1066,11 @@ IDBError SQLiteIDBBackingStore::renameObjectStore(const IDBResourceIdentifier& t
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to rename an object store without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to rename an object store without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to rename an object store without an in-progress transaction") };
     }
     if (transaction->mode() != IDBTransactionMode::Versionchange) {
         LOG_ERROR("Attempt to rename an object store in a non-version-change transaction");
-        return { UnknownError, ASCIILiteral("Attempt to rename an object store in a non-version-change transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to rename an object store in a non-version-change transaction") };
     }
 
     {
@@ -1080,13 +1080,13 @@ IDBError SQLiteIDBBackingStore::renameObjectStore(const IDBResourceIdentifier& t
             || sql->bindInt64(2, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not update name for object store id %" PRIi64 " in ObjectStoreInfo table (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not rename object store") };
+            return IDBError { UnknownError, ASCIILiteral("Could not rename object store") };
         }
     }
 
     m_databaseInfo->renameObjectStore(objectStoreIdentifier, newName);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::clearObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreID)
@@ -1099,11 +1099,11 @@ IDBError SQLiteIDBBackingStore::clearObjectStore(const IDBResourceIdentifier& tr
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to clear an object store without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to clear an object store without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to clear an object store without an in-progress transaction") };
     }
     if (transaction->mode() == IDBTransactionMode::Readonly) {
         LOG_ERROR("Attempt to clear an object store in a read-only transaction");
-        return { UnknownError, ASCIILiteral("Attempt to clear an object store in a read-only transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to clear an object store in a read-only transaction") };
     }
 
     {
@@ -1112,7 +1112,7 @@ IDBError SQLiteIDBBackingStore::clearObjectStore(const IDBResourceIdentifier& tr
             || sql->bindInt64(1, objectStoreID) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not clear records from object store id %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Unable to clear object store") };
+            return IDBError { UnknownError, ASCIILiteral("Unable to clear object store") };
         }
     }
 
@@ -1122,13 +1122,13 @@ IDBError SQLiteIDBBackingStore::clearObjectStore(const IDBResourceIdentifier& tr
             || sql->bindInt64(1, objectStoreID) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete records from index record store id %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Unable to delete index records while clearing object store") };
+            return IDBError { UnknownError, ASCIILiteral("Unable to delete index records while clearing object store") };
         }
     }
 
     transaction->notifyCursorsOfChanges(objectStoreID);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::createIndex(const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo& info)
@@ -1140,17 +1140,17 @@ IDBError SQLiteIDBBackingStore::createIndex(const IDBResourceIdentifier& transac
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to create an index without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to create an index without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to create an index without an in-progress transaction") };
     }
     if (transaction->mode() != IDBTransactionMode::Versionchange) {
         LOG_ERROR("Attempt to create an index in a non-version-change transaction");
-        return { UnknownError, ASCIILiteral("Attempt to create an index in a non-version-change transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to create an index in a non-version-change transaction") };
     }
 
     RefPtr<SharedBuffer> keyPathBlob = serializeIDBKeyPath(info.keyPath());
     if (!keyPathBlob) {
         LOG_ERROR("Unable to serialize IDBKeyPath to save in database");
-        return { UnknownError, ASCIILiteral("Unable to serialize IDBKeyPath to create index in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize IDBKeyPath to create index in database") };
     }
 
     auto* sql = cachedStatement(SQL::CreateIndexInfo, ASCIILiteral("INSERT INTO IndexInfo VALUES (?, ?, ?, ?, ?, ?);"));
@@ -1163,7 +1163,7 @@ IDBError SQLiteIDBBackingStore::createIndex(const IDBResourceIdentifier& transac
         || sql->bindInt(6, info.multiEntry()) != SQLITE_OK
         || sql->step() != SQLITE_DONE) {
         LOG_ERROR("Could not add index '%s' to IndexInfo table (%i) - %s", info.name().utf8().data(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { UnknownError, ASCIILiteral("Unable to create index in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to create index in database") };
     }
 
     // Write index records for any records that already exist in this object store.
@@ -1172,7 +1172,7 @@ IDBError SQLiteIDBBackingStore::createIndex(const IDBResourceIdentifier& transac
 
     if (!cursor) {
         LOG_ERROR("Cannot open cursor to populate indexes in database");
-        return { UnknownError, ASCIILiteral("Unable to populate indexes in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to populate indexes in database") };
     }
 
     while (!cursor->currentKey().isNull()) {
@@ -1190,7 +1190,7 @@ IDBError SQLiteIDBBackingStore::createIndex(const IDBResourceIdentifier& transac
                 || sql->bindInt64(2, info.objectStoreIdentifier()) != SQLITE_OK
                 || sql->step() != SQLITE_DONE) {
                 LOG_ERROR("Index creation failed due to uniqueness constraint failure, but there was an error deleting the Index record from the database");
-                return { UnknownError, ASCIILiteral("Index creation failed due to uniqueness constraint failure, but there was an error deleting the Index record from the database") };
+                return IDBError { UnknownError, ASCIILiteral("Index creation failed due to uniqueness constraint failure, but there was an error deleting the Index record from the database") };
             }
 
             return error;
@@ -1198,7 +1198,7 @@ IDBError SQLiteIDBBackingStore::createIndex(const IDBResourceIdentifier& transac
 
         if (!cursor->advance(1)) {
             LOG_ERROR("Error advancing cursor while indexing existing records for new index.");
-            return { UnknownError, ASCIILiteral("Error advancing cursor while indexing existing records for new index") };
+            return IDBError { UnknownError, ASCIILiteral("Error advancing cursor while indexing existing records for new index") };
         }
     }
 
@@ -1206,7 +1206,7 @@ IDBError SQLiteIDBBackingStore::createIndex(const IDBResourceIdentifier& transac
     ASSERT(objectStore);
     objectStore->addExistingIndex(info);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::uncheckedHasIndexRecord(const IDBIndexInfo& info, const IDBKeyData& indexKey, bool& hasRecord)
@@ -1216,7 +1216,7 @@ IDBError SQLiteIDBBackingStore::uncheckedHasIndexRecord(const IDBIndexInfo& info
     RefPtr<SharedBuffer> indexKeyBuffer = serializeIDBKeyData(indexKey);
     if (!indexKeyBuffer) {
         LOG_ERROR("Unable to serialize index key to be stored in the database");
-        return { UnknownError, ASCIILiteral("Unable to serialize IDBKey to check for index record in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize IDBKey to check for index record in database") };
     }
 
     auto* sql = cachedStatement(SQL::HasIndexRecord, ASCIILiteral("SELECT rowid FROM IndexRecords WHERE indexID = ? AND objectStoreID = ? AND key = CAST(? AS TEXT);"));
@@ -1225,21 +1225,21 @@ IDBError SQLiteIDBBackingStore::uncheckedHasIndexRecord(const IDBIndexInfo& info
         || sql->bindInt64(2, info.objectStoreIdentifier()) != SQLITE_OK
         || sql->bindBlob(3, indexKeyBuffer->data(), indexKeyBuffer->size()) != SQLITE_OK) {
         LOG_ERROR("Error checking for index record in database");
-        return { UnknownError, ASCIILiteral("Error checking for index record in database") };
+        return IDBError { UnknownError, ASCIILiteral("Error checking for index record in database") };
     }
 
     int sqlResult = sql->step();
     if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE)
-        return { };
+        return IDBError { };
 
     if (sqlResult != SQLITE_ROW) {
         // There was an error fetching the record from the database.
         LOG_ERROR("Could not check if key exists in index (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { UnknownError, ASCIILiteral("Error checking for existence of IDBKey in index") };
+        return IDBError { UnknownError, ASCIILiteral("Error checking for existence of IDBKey in index") };
     }
 
     hasRecord = true;
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::uncheckedPutIndexKey(const IDBIndexInfo& info, const IDBKeyData& key, const IndexKey& indexKey, int64_t recordID)
@@ -1276,7 +1276,7 @@ IDBError SQLiteIDBBackingStore::uncheckedPutIndexKey(const IDBIndexInfo& info, c
         }
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::uncheckedPutIndexRecord(int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyData& keyValue, const WebCore::IDBKeyData& indexKey, int64_t recordID)
@@ -1286,13 +1286,13 @@ IDBError SQLiteIDBBackingStore::uncheckedPutIndexRecord(int64_t objectStoreID, i
     RefPtr<SharedBuffer> indexKeyBuffer = serializeIDBKeyData(indexKey);
     if (!indexKeyBuffer) {
         LOG_ERROR("Unable to serialize index key to be stored in the database");
-        return { UnknownError, ASCIILiteral("Unable to serialize index key to be stored in the database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize index key to be stored in the database") };
     }
 
     RefPtr<SharedBuffer> valueBuffer = serializeIDBKeyData(keyValue);
     if (!valueBuffer) {
         LOG_ERROR("Unable to serialize the value to be stored in the database");
-        return { UnknownError, ASCIILiteral("Unable to serialize value to be stored in the database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize value to be stored in the database") };
     }
 
     {
@@ -1305,11 +1305,11 @@ IDBError SQLiteIDBBackingStore::uncheckedPutIndexRecord(int64_t objectStoreID, i
             || sql->bindInt64(5, recordID) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not put index record for index %" PRIi64 " in object store %" PRIi64 " in Records table (%i) - %s", indexID, objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Error putting index record into database") };
+            return IDBError { UnknownError, ASCIILiteral("Error putting index record into database") };
         }
     }
 
-    return { };
+    return IDBError { };
 }
 
 
@@ -1323,12 +1323,12 @@ IDBError SQLiteIDBBackingStore::deleteIndex(const IDBResourceIdentifier& transac
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to delete index without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to delete index without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to delete index without an in-progress transaction") };
     }
 
     if (transaction->mode() != IDBTransactionMode::Versionchange) {
         LOG_ERROR("Attempt to delete index during a non-version-change transaction");
-        return { UnknownError, ASCIILiteral("Attempt to delete index during a non-version-change transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to delete index during a non-version-change transaction") };
     }
 
     {
@@ -1338,7 +1338,7 @@ IDBError SQLiteIDBBackingStore::deleteIndex(const IDBResourceIdentifier& transac
             || sql->bindInt64(2, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete index id %" PRIi64 " from IndexInfo table (%i) - %s", objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Error deleting index from database") };
+            return IDBError { UnknownError, ASCIILiteral("Error deleting index from database") };
         }
     }
 
@@ -1349,7 +1349,7 @@ IDBError SQLiteIDBBackingStore::deleteIndex(const IDBResourceIdentifier& transac
             || sql->bindInt64(2, objectStoreIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete index records for index id %" PRIi64 " from IndexRecords table (%i) - %s", indexIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Error deleting index records from database") };
+            return IDBError { UnknownError, ASCIILiteral("Error deleting index records from database") };
         }
     }
 
@@ -1357,7 +1357,7 @@ IDBError SQLiteIDBBackingStore::deleteIndex(const IDBResourceIdentifier& transac
     ASSERT(objectStore);
     objectStore->deleteIndex(indexIdentifier);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::renameIndex(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName)
@@ -1369,21 +1369,21 @@ IDBError SQLiteIDBBackingStore::renameIndex(const IDBResourceIdentifier& transac
 
     auto* objectStoreInfo = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier);
     if (!objectStoreInfo)
-        return { UnknownError, ASCIILiteral("Could not rename index") };
+        return IDBError { UnknownError, ASCIILiteral("Could not rename index") };
 
     auto* indexInfo = objectStoreInfo->infoForExistingIndex(indexIdentifier);
     if (!indexInfo)
-        return { UnknownError, ASCIILiteral("Could not rename index") };
+        return IDBError { UnknownError, ASCIILiteral("Could not rename index") };
 
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to rename an index without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to rename an index without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to rename an index without an in-progress transaction") };
     }
 
     if (transaction->mode() != IDBTransactionMode::Versionchange) {
         LOG_ERROR("Attempt to rename an index in a non-version-change transaction");
-        return { UnknownError, ASCIILiteral("Attempt to rename an index in a non-version-change transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to rename an index in a non-version-change transaction") };
     }
 
     {
@@ -1394,13 +1394,13 @@ IDBError SQLiteIDBBackingStore::renameIndex(const IDBResourceIdentifier& transac
             || sql->bindInt64(3, indexIdentifier) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not update name for index id (%" PRIi64 ", %" PRIi64 ") in IndexInfo table (%i) - %s", objectStoreIdentifier, indexIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Could not rename index") };
+            return IDBError { UnknownError, ASCIILiteral("Could not rename index") };
         }
     }
 
     indexInfo->rename(newName);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::keyExistsInObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreID, const IDBKeyData& keyData, bool& keyExists)
@@ -1415,34 +1415,34 @@ IDBError SQLiteIDBBackingStore::keyExistsInObjectStore(const IDBResourceIdentifi
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to see if key exists in objectstore without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to see if key exists in objectstore without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to see if key exists in objectstore without an in-progress transaction") };
     }
 
     RefPtr<SharedBuffer> keyBuffer = serializeIDBKeyData(keyData);
     if (!keyBuffer) {
         LOG_ERROR("Unable to serialize IDBKey to check for existence in object store");
-        return { UnknownError, ASCIILiteral("Unable to serialize IDBKey to check for existence in object store") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize IDBKey to check for existence in object store") };
     }
     auto* sql = cachedStatement(SQL::KeyExistsInObjectStore, ASCIILiteral("SELECT key FROM Records WHERE objectStoreID = ? AND key = CAST(? AS TEXT) LIMIT 1;"));
     if (!sql
         || sql->bindInt64(1, objectStoreID) != SQLITE_OK
         || sql->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK) {
         LOG_ERROR("Could not get record from object store %" PRIi64 " from Records table (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { UnknownError, ASCIILiteral("Unable to check for existence of IDBKey in object store") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to check for existence of IDBKey in object store") };
     }
 
     int sqlResult = sql->step();
     if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE)
-        return { };
+        return IDBError { };
 
     if (sqlResult != SQLITE_ROW) {
         // There was an error fetching the record from the database.
         LOG_ERROR("Could not check if key exists in object store (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { UnknownError, ASCIILiteral("Error checking for existence of IDBKey in object store") };
+        return IDBError { UnknownError, ASCIILiteral("Error checking for existence of IDBKey in object store") };
     }
 
     keyExists = true;
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::deleteUnusedBlobFileRecords(SQLiteIDBTransaction& transaction)
@@ -1456,7 +1456,7 @@ IDBError SQLiteIDBBackingStore::deleteUnusedBlobFileRecords(SQLiteIDBTransaction
 
         if (!sql) {
             LOG_ERROR("Error deleting stored blobs (%i) (Could not gather unused blobURLs) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Error deleting stored blobs") };
+            return IDBError { UnknownError, ASCIILiteral("Error deleting stored blobs") };
         }
 
         int result = sql->step();
@@ -1467,7 +1467,7 @@ IDBError SQLiteIDBBackingStore::deleteUnusedBlobFileRecords(SQLiteIDBTransaction
 
         if (result != SQLITE_DONE) {
             LOG_ERROR("Error deleting stored blobs (%i) (Could not gather unused blobURLs) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Error deleting stored blobs") };
+            return IDBError { UnknownError, ASCIILiteral("Error deleting stored blobs") };
         }
     }
 
@@ -1478,14 +1478,14 @@ IDBError SQLiteIDBBackingStore::deleteUnusedBlobFileRecords(SQLiteIDBTransaction
         if (!sql
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Error deleting stored blobs (%i) (Could not delete blobFile records) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Error deleting stored blobs") };
+            return IDBError { UnknownError, ASCIILiteral("Error deleting stored blobs") };
         }
     }
 
     for (auto& file : removedBlobFilenames)
         transaction.addRemovedBlobFile(file);
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::deleteRecord(SQLiteIDBTransaction& transaction, int64_t objectStoreID, const IDBKeyData& keyData)
@@ -1501,7 +1501,7 @@ IDBError SQLiteIDBBackingStore::deleteRecord(SQLiteIDBTransaction& transaction,
     RefPtr<SharedBuffer> keyBuffer = serializeIDBKeyData(keyData);
     if (!keyBuffer) {
         LOG_ERROR("Unable to serialize IDBKeyData to be removed from the database");
-        return { UnknownError, ASCIILiteral("Unable to serialize IDBKeyData to be removed from the database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize IDBKeyData to be removed from the database") };
     }
 
     // Get the record ID
@@ -1513,18 +1513,18 @@ IDBError SQLiteIDBBackingStore::deleteRecord(SQLiteIDBTransaction& transaction,
             || sql->bindInt64(1, objectStoreID) != SQLITE_OK
             || sql->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK) {
             LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to delete record from object store") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to delete record from object store") };
         }
 
         int result = sql->step();
 
         // If there's no record ID, there's no record to delete.
         if (result == SQLITE_DONE)
-            return { };
+            return IDBError { };
 
         if (result != SQLITE_ROW) {
             LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) (unable to fetch record ID) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to delete record from object store") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to delete record from object store") };
         }
 
         recordID = sql->getColumnInt64(0);
@@ -1532,7 +1532,7 @@ IDBError SQLiteIDBBackingStore::deleteRecord(SQLiteIDBTransaction& transaction,
 
     if (recordID < 1) {
         LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) (record ID is invalid) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { UnknownError, ASCIILiteral("Failed to delete record from object store") };
+        return IDBError { UnknownError, ASCIILiteral("Failed to delete record from object store") };
     }
 
     // Delete the blob records for this object store record.
@@ -1543,7 +1543,7 @@ IDBError SQLiteIDBBackingStore::deleteRecord(SQLiteIDBTransaction& transaction,
             || sql->bindInt64(1, recordID) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) (Could not delete BlobRecords records) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to delete record from object store") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to delete record from object store") };
         }
     }
 
@@ -1560,7 +1560,7 @@ IDBError SQLiteIDBBackingStore::deleteRecord(SQLiteIDBTransaction& transaction,
             || sql->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete record from object store %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to delete record from object store") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to delete record from object store") };
         }
     }
 
@@ -1573,11 +1573,11 @@ IDBError SQLiteIDBBackingStore::deleteRecord(SQLiteIDBTransaction& transaction,
             || sql->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not delete record from indexes for object store %" PRIi64 " (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to delete index entries for object store record") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to delete index entries for object store record") };
         }
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::deleteRange(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreID, const IDBKeyRangeData& keyRange)
@@ -1590,11 +1590,11 @@ IDBError SQLiteIDBBackingStore::deleteRange(const IDBResourceIdentifier& transac
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to delete range from database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to delete range from database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to delete range from database without an in-progress transaction") };
     }
     if (transaction->mode() == IDBTransactionMode::Readonly) {
         LOG_ERROR("Attempt to delete records from an object store in a read-only transaction");
-        return { UnknownError, ASCIILiteral("Attempt to delete records from an object store in a read-only transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to delete records from an object store in a read-only transaction") };
     }
 
     // If the range to delete is exactly one key we can delete it right now.
@@ -1607,13 +1607,13 @@ IDBError SQLiteIDBBackingStore::deleteRange(const IDBResourceIdentifier& transac
 
         transaction->notifyCursorsOfChanges(objectStoreID);
 
-        return { };
+        return IDBError { };
     }
 
     auto cursor = transaction->maybeOpenBackingStoreCursor(objectStoreID, 0, keyRange);
     if (!cursor) {
         LOG_ERROR("Cannot open cursor to delete range of records from the database");
-        return { UnknownError, ASCIILiteral("Cannot open cursor to delete range of records from the database") };
+        return IDBError { UnknownError, ASCIILiteral("Cannot open cursor to delete range of records from the database") };
     }
 
     Vector<IDBKeyData> keys;
@@ -1624,7 +1624,7 @@ IDBError SQLiteIDBBackingStore::deleteRange(const IDBResourceIdentifier& transac
 
     if (cursor->didError()) {
         LOG_ERROR("Cursor failed while accumulating range of records from the database");
-        return { UnknownError, ASCIILiteral("Cursor failed while accumulating range of records from the database") };
+        return IDBError { UnknownError, ASCIILiteral("Cursor failed while accumulating range of records from the database") };
     }
 
     IDBError error;
@@ -1647,13 +1647,13 @@ IDBError SQLiteIDBBackingStore::updateOneIndexForAddRecord(const IDBIndexInfo& i
 
     auto jsValue = deserializeIDBValueToJSValue(*globalObject().globalExec(), value);
     if (jsValue.isUndefinedOrNull())
-        return { };
+        return IDBError { };
 
     IndexKey indexKey;
     generateIndexKeyForValue(*m_globalObject->globalExec(), info, jsValue, indexKey);
 
     if (indexKey.isNull())
-        return { };
+        return IDBError { };
 
     return uncheckedPutIndexKey(info, key, indexKey, recordID);
 }
@@ -1664,7 +1664,7 @@ IDBError SQLiteIDBBackingStore::updateAllIndexesForAddRecord(const IDBObjectStor
 
     auto jsValue = deserializeIDBValueToJSValue(*globalObject().globalExec(), value);
     if (jsValue.isUndefinedOrNull())
-        return { };
+        return IDBError { };
 
     IDBError error;
     bool anyRecordsSucceeded = false;
@@ -1692,7 +1692,7 @@ IDBError SQLiteIDBBackingStore::updateAllIndexesForAddRecord(const IDBObjectStor
             || sql->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Adding one Index record failed, but failed to remove all others that previously succeeded");
-            return { UnknownError, ASCIILiteral("Adding one Index record failed, but failed to remove all others that previously succeeded") };
+            return IDBError { UnknownError, ASCIILiteral("Adding one Index record failed, but failed to remove all others that previously succeeded") };
         }
     }
 
@@ -1711,17 +1711,17 @@ IDBError SQLiteIDBBackingStore::addRecord(const IDBResourceIdentifier& transacti
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to store a record in an object store without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to store a record in an object store without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to store a record in an object store without an in-progress transaction") };
     }
     if (transaction->mode() == IDBTransactionMode::Readonly) {
         LOG_ERROR("Attempt to store a record in an object store in a read-only transaction");
-        return { UnknownError, ASCIILiteral("Attempt to store a record in an object store in a read-only transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to store a record in an object store in a read-only transaction") };
     }
 
     RefPtr<SharedBuffer> keyBuffer = serializeIDBKeyData(keyData);
     if (!keyBuffer) {
         LOG_ERROR("Unable to serialize IDBKey to be stored in an object store");
-        return { UnknownError, ASCIILiteral("Unable to serialize IDBKey to be stored in an object store") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize IDBKey to be stored in an object store") };
     }
 
     int64_t recordID = 0;
@@ -1733,7 +1733,7 @@ IDBError SQLiteIDBBackingStore::addRecord(const IDBResourceIdentifier& transacti
             || sql->bindBlob(3, value.data().data()->data(), value.data().data()->size()) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Could not put record for object store %" PRIi64 " in Records table (%i) - %s", objectStoreInfo.identifier(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Unable to store record in object store") };
+            return IDBError { UnknownError, ASCIILiteral("Unable to store record in object store") };
         }
 
         recordID = m_sqliteDB->lastInsertRowID();
@@ -1748,7 +1748,7 @@ IDBError SQLiteIDBBackingStore::addRecord(const IDBResourceIdentifier& transacti
             || sql->bindBlob(2, keyBuffer->data(), keyBuffer->size()) != SQLITE_OK
             || sql->step() != SQLITE_DONE) {
             LOG_ERROR("Indexing new object store record failed, but unable to remove the object store record itself");
-            return { UnknownError, ASCIILiteral("Indexing new object store record failed, but unable to remove the object store record itself") };
+            return IDBError { UnknownError, ASCIILiteral("Indexing new object store record failed, but unable to remove the object store record itself") };
         }
 
         return error;
@@ -1765,7 +1765,7 @@ IDBError SQLiteIDBBackingStore::addRecord(const IDBResourceIdentifier& transacti
                 || sql->bindText(2, url) != SQLITE_OK
                 || sql->step() != SQLITE_DONE) {
                 LOG_ERROR("Unable to record Blob record in database");
-                return { UnknownError, ASCIILiteral("Unable to record Blob record in database") };
+                return IDBError { UnknownError, ASCIILiteral("Unable to record Blob record in database") };
             }
         }
         int64_t potentialFileNameInteger = m_sqliteDB->lastInsertRowID();
@@ -1776,13 +1776,13 @@ IDBError SQLiteIDBBackingStore::addRecord(const IDBResourceIdentifier& transacti
             if (!sql
                 || sql->bindText(1, url) != SQLITE_OK) {
                 LOG_ERROR("Unable to examine Blob filenames in database");
-                return { UnknownError, ASCIILiteral("Unable to examine Blob filenames in database") };
+                return IDBError { UnknownError, ASCIILiteral("Unable to examine Blob filenames in database") };
             }
 
             int result = sql->step();
             if (result != SQLITE_ROW && result != SQLITE_DONE) {
                 LOG_ERROR("Unable to examine Blob filenames in database");
-                return { UnknownError, ASCIILiteral("Unable to examine Blob filenames in database") };
+                return IDBError { UnknownError, ASCIILiteral("Unable to examine Blob filenames in database") };
             }
 
             if (result == SQLITE_ROW)
@@ -1798,7 +1798,7 @@ IDBError SQLiteIDBBackingStore::addRecord(const IDBResourceIdentifier& transacti
                 || sql->bindText(2, storedFilename) != SQLITE_OK
                 || sql->step() != SQLITE_DONE) {
                 LOG_ERROR("Unable to record Blob file record in database");
-                return { UnknownError, ASCIILiteral("Unable to record Blob file record in database") };
+                return IDBError { UnknownError, ASCIILiteral("Unable to record Blob file record in database") };
             }
         }
 
@@ -1820,13 +1820,13 @@ IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objec
         if (!sql
             || sql->bindInt64(1, objectStoreRecord) != SQLITE_OK) {
             LOG_ERROR("Could not prepare statement to fetch blob URLs for object store record (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
         }
 
         int sqlResult = sql->step();
         if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE) {
             // There are no blobURLs in the database for this object store record.
-            return { };
+            return IDBError { };
         }
 
         while (sqlResult == SQLITE_ROW) {
@@ -1836,7 +1836,7 @@ IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objec
 
         if (sqlResult != SQLITE_DONE) {
             LOG_ERROR("Could not fetch blob URLs for object store record (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
         }
     }
 
@@ -1847,12 +1847,12 @@ IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objec
         if (!sql
             || sql->bindText(1, blobURL) != SQLITE_OK) {
             LOG_ERROR("Could not prepare statement to fetch blob filename for object store record (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
         }
 
         if (sql->step() != SQLITE_ROW) {
             LOG_ERROR("Entry for blob filename for blob url %s does not exist (%i) - %s", blobURL.utf8().data(), m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to look up blobURL records in object store by key range") };
         }
 
         blobURLs.append(blobURL);
@@ -1861,7 +1861,7 @@ IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objec
         blobFilePaths.append(pathByAppendingComponent(databaseDirectory, fileName));
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::getRecord(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreID, const IDBKeyRangeData& keyRange, IDBGetRecordDataType type, IDBGetResult& resultValue)
@@ -1874,7 +1874,7 @@ IDBError SQLiteIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to get a record from database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to get a record from database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to get a record from database without an in-progress transaction") };
     }
 
     auto key = keyRange.lowerKey;
@@ -1883,7 +1883,7 @@ IDBError SQLiteIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
     RefPtr<SharedBuffer> lowerBuffer = serializeIDBKeyData(key);
     if (!lowerBuffer) {
         LOG_ERROR("Unable to serialize lower IDBKey in lookup range");
-        return { UnknownError, ASCIILiteral("Unable to serialize lower IDBKey in lookup range") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize lower IDBKey in lookup range") };
     }
 
     key = keyRange.upperKey;
@@ -1892,7 +1892,7 @@ IDBError SQLiteIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
     RefPtr<SharedBuffer> upperBuffer = serializeIDBKeyData(key);
     if (!upperBuffer) {
         LOG_ERROR("Unable to serialize upper IDBKey in lookup range");
-        return { UnknownError, ASCIILiteral("Unable to serialize upper IDBKey in lookup range") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize upper IDBKey in lookup range") };
     }
 
     int64_t recordID = 0;
@@ -1943,19 +1943,19 @@ IDBError SQLiteIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
             || sql->bindBlob(2, lowerBuffer->data(), lowerBuffer->size()) != SQLITE_OK
             || sql->bindBlob(3, upperBuffer->data(), upperBuffer->size()) != SQLITE_OK) {
             LOG_ERROR("Could not get key range record from object store %" PRIi64 " from Records table (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Failed to look up record in object store by key range") };
+            return IDBError { UnknownError, ASCIILiteral("Failed to look up record in object store by key range") };
         }
 
         int sqlResult = sql->step();
 
         if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE) {
             // There was no record for the key in the database.
-            return { };
+            return IDBError { };
         }
         if (sqlResult != SQLITE_ROW) {
             // There was an error fetching the record from the database.
             LOG_ERROR("Could not get record from object store %" PRIi64 " from Records table (%i) - %s", objectStoreID, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-            return { UnknownError, ASCIILiteral("Error looking up record in object store by key range") };
+            return IDBError { UnknownError, ASCIILiteral("Error looking up record in object store by key range") };
         }
 
         Vector<uint8_t> buffer;
@@ -1970,17 +1970,17 @@ IDBError SQLiteIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
         auto* vector = resultBuffer.data();
         if (!vector) {
             LOG_ERROR("Unable to deserialize key data from database for IDBObjectStore.getKey()");
-            return { UnknownError, ASCIILiteral("Error extracting key data from database executing IDBObjectStore.getKey()") };
+            return IDBError { UnknownError, ASCIILiteral("Error extracting key data from database executing IDBObjectStore.getKey()") };
         }
 
         IDBKeyData keyData;
         if (!deserializeIDBKeyData(vector->data(), vector->size(), keyData)) {
             LOG_ERROR("Unable to deserialize key data from database for IDBObjectStore.getKey()");
-            return { UnknownError, ASCIILiteral("Error extracting key data from database executing IDBObjectStore.getKey()") };
+            return IDBError { UnknownError, ASCIILiteral("Error extracting key data from database executing IDBObjectStore.getKey()") };
         }
 
         resultValue = { keyData };
-        return { };
+        return IDBError { };
     }
 
     ASSERT(recordID);
@@ -1992,7 +1992,7 @@ IDBError SQLiteIDBBackingStore::getRecord(const IDBResourceIdentifier& transacti
         return error;
 
     resultValue = { { resultBuffer, WTFMove(blobURLs), WTFMove(blobFilePaths) } };
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::getAllRecords(const IDBResourceIdentifier& transactionIdentifier, const IDBGetAllRecordsData& getAllRecordsData, IDBGetAllResult& result)
@@ -2044,7 +2044,7 @@ IDBError SQLiteIDBBackingStore::getAllObjectStoreRecords(const IDBResourceIdenti
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to get records from database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to get records from database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to get records from database without an in-progress transaction") };
     }
 
     auto key = getAllRecordsData.keyRangeData.lowerKey;
@@ -2053,7 +2053,7 @@ IDBError SQLiteIDBBackingStore::getAllObjectStoreRecords(const IDBResourceIdenti
     auto lowerBuffer = serializeIDBKeyData(key);
     if (!lowerBuffer) {
         LOG_ERROR("Unable to serialize lower IDBKey in lookup range");
-        return { UnknownError, ASCIILiteral("Unable to serialize lower IDBKey in lookup range") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize lower IDBKey in lookup range") };
     }
 
     key = getAllRecordsData.keyRangeData.upperKey;
@@ -2062,7 +2062,7 @@ IDBError SQLiteIDBBackingStore::getAllObjectStoreRecords(const IDBResourceIdenti
     auto upperBuffer = serializeIDBKeyData(key);
     if (!upperBuffer) {
         LOG_ERROR("Unable to serialize upper IDBKey in lookup range");
-        return { UnknownError, ASCIILiteral("Unable to serialize upper IDBKey in lookup range") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize upper IDBKey in lookup range") };
     }
 
     auto* sql = cachedStatementForGetAllObjectStoreRecords(getAllRecordsData);
@@ -2071,7 +2071,7 @@ IDBError SQLiteIDBBackingStore::getAllObjectStoreRecords(const IDBResourceIdenti
         || sql->bindBlob(2, lowerBuffer->data(), lowerBuffer->size()) != SQLITE_OK
         || sql->bindBlob(3, upperBuffer->data(), upperBuffer->size()) != SQLITE_OK) {
         LOG_ERROR("Could not get key range record from object store %" PRIi64 " from Records table (%i) - %s", getAllRecordsData.objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { UnknownError, ASCIILiteral("Failed to look up record in object store by key range") };
+        return IDBError { UnknownError, ASCIILiteral("Failed to look up record in object store by key range") };
     }
 
     result = { getAllRecordsData.getAllType };
@@ -2109,7 +2109,7 @@ IDBError SQLiteIDBBackingStore::getAllObjectStoreRecords(const IDBResourceIdenti
 
             if (!deserializeIDBKeyData(keyData.data(), keyData.size(), key)) {
                 LOG_ERROR("Unable to deserialize key data from database while getting all key records");
-                return { UnknownError, ASCIILiteral("Unable to deserialize key data while getting all key records") };
+                return IDBError { UnknownError, ASCIILiteral("Unable to deserialize key data while getting all key records") };
             }
 
             result.addKey(WTFMove(key));
@@ -2121,12 +2121,12 @@ IDBError SQLiteIDBBackingStore::getAllObjectStoreRecords(const IDBResourceIdenti
 
     if (sqlResult == SQLITE_OK || sqlResult == SQLITE_DONE || sqlResult == SQLITE_ROW) {
         // Finished getting results
-        return { };
+        return IDBError { };
     }
 
     // There was an error fetching records from the database.
     LOG_ERROR("Could not get record from object store %" PRIi64 " from Records table (%i) - %s", getAllRecordsData.objectStoreIdentifier, m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-    return { UnknownError, ASCIILiteral("Error looking up record in object store by key range") };
+    return IDBError { UnknownError, ASCIILiteral("Error looking up record in object store by key range") };
 }
 
 IDBError SQLiteIDBBackingStore::getAllIndexRecords(const IDBResourceIdentifier& transactionIdentifier, const IDBGetAllRecordsData& getAllRecordsData, IDBGetAllResult& result)
@@ -2139,18 +2139,18 @@ IDBError SQLiteIDBBackingStore::getAllIndexRecords(const IDBResourceIdentifier&
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to get all index records from database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to get all index records from database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to get all index records from database without an in-progress transaction") };
     }
 
     auto cursor = transaction->maybeOpenBackingStoreCursor(getAllRecordsData.objectStoreIdentifier, getAllRecordsData.indexIdentifier, getAllRecordsData.keyRangeData);
     if (!cursor) {
         LOG_ERROR("Cannot open cursor to perform index gets in database");
-        return { UnknownError, ASCIILiteral("Cannot open cursor to perform index gets in database") };
+        return IDBError { UnknownError, ASCIILiteral("Cannot open cursor to perform index gets in database") };
     }
 
     if (cursor->didError()) {
         LOG_ERROR("Cursor failed while looking up index records in database");
-        return { UnknownError, ASCIILiteral("Cursor failed while looking up index records in database") };
+        return IDBError { UnknownError, ASCIILiteral("Cursor failed while looking up index records in database") };
     }
 
     result = { getAllRecordsData.getAllType };
@@ -2171,10 +2171,10 @@ IDBError SQLiteIDBBackingStore::getAllIndexRecords(const IDBResourceIdentifier&
 
     if (cursor->didError()) {
         LOG_ERROR("Cursor failed while looking up index records in database");
-        return { UnknownError, ASCIILiteral("Cursor failed while looking up index records in database") };
+        return IDBError { UnknownError, ASCIILiteral("Cursor failed while looking up index records in database") };
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::getIndexRecord(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreID, uint64_t indexID, IndexedDB::IndexRecordType type, const IDBKeyRangeData& range, IDBGetResult& getResult)
@@ -2187,7 +2187,7 @@ IDBError SQLiteIDBBackingStore::getIndexRecord(const IDBResourceIdentifier& tran
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to get an index record from database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to get an index record from database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to get an index record from database without an in-progress transaction") };
     }
 
     if (range.isExactlyOneKey())
@@ -2196,12 +2196,12 @@ IDBError SQLiteIDBBackingStore::getIndexRecord(const IDBResourceIdentifier& tran
     auto cursor = transaction->maybeOpenBackingStoreCursor(objectStoreID, indexID, range);
     if (!cursor) {
         LOG_ERROR("Cannot open cursor to perform index get in database");
-        return { UnknownError, ASCIILiteral("Cannot open cursor to perform index get in database") };
+        return IDBError { UnknownError, ASCIILiteral("Cannot open cursor to perform index get in database") };
     }
 
     if (cursor->didError()) {
         LOG_ERROR("Cursor failed while looking up index record in database");
-        return { UnknownError, ASCIILiteral("Cursor failed while looking up index record in database") };
+        return IDBError { UnknownError, ASCIILiteral("Cursor failed while looking up index record in database") };
     }
 
     if (cursor->didComplete())
@@ -2213,7 +2213,7 @@ IDBError SQLiteIDBBackingStore::getIndexRecord(const IDBResourceIdentifier& tran
             getResult = { cursor->currentValue() ? *cursor->currentValue() : IDBValue(), cursor->currentPrimaryKey() };
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::uncheckedGetIndexRecordForOneKey(int64_t indexID, int64_t objectStoreID, IndexedDB::IndexRecordType type, const IDBKeyData& key, IDBGetResult& getResult)
@@ -2225,7 +2225,7 @@ IDBError SQLiteIDBBackingStore::uncheckedGetIndexRecordForOneKey(int64_t indexID
     RefPtr<SharedBuffer> buffer = serializeIDBKeyData(key);
     if (!buffer) {
         LOG_ERROR("Unable to serialize IDBKey to look up one index record");
-        return { UnknownError, ASCIILiteral("Unable to serialize IDBKey to look up one index record") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to serialize IDBKey to look up one index record") };
     }
 
     auto* sql = cachedStatement(SQL::GetIndexRecordForOneKey, ASCIILiteral("SELECT IndexRecords.value, Records.value, Records.recordID FROM Records INNER JOIN IndexRecords ON Records.recordID = IndexRecords.objectStoreRecordID WHERE IndexRecords.indexID = ? AND IndexRecords.objectStoreID = ? AND IndexRecords.key = CAST(? AS TEXT) ORDER BY IndexRecords.key, IndexRecords.value"));
@@ -2235,17 +2235,17 @@ IDBError SQLiteIDBBackingStore::uncheckedGetIndexRecordForOneKey(int64_t indexID
         || sql->bindInt64(2, objectStoreID) != SQLITE_OK
         || sql->bindBlob(3, buffer->data(), buffer->size()) != SQLITE_OK) {
         LOG_ERROR("Unable to lookup index record in database");
-        return { UnknownError, ASCIILiteral("Unable to lookup index record in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to lookup index record in database") };
     }
 
     int result = sql->step();
     if (result != SQLITE_ROW && result != SQLITE_DONE) {
         LOG_ERROR("Unable to lookup index record in database");
-        return { UnknownError, ASCIILiteral("Unable to lookup index record in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to lookup index record in database") };
     }
 
     if (result == SQLITE_DONE)
-        return { };
+        return IDBError { };
 
     IDBKeyData objectStoreKey;
     Vector<uint8_t> keyVector;
@@ -2253,12 +2253,12 @@ IDBError SQLiteIDBBackingStore::uncheckedGetIndexRecordForOneKey(int64_t indexID
 
     if (!deserializeIDBKeyData(keyVector.data(), keyVector.size(), objectStoreKey)) {
         LOG_ERROR("Unable to deserialize key looking up index record in database");
-        return { UnknownError, ASCIILiteral("Unable to deserialize key looking up index record in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to deserialize key looking up index record in database") };
     }
 
     if (type == IndexedDB::IndexRecordType::Key) {
         getResult = { objectStoreKey };
-        return { };
+        return IDBError { };
     }
 
     sql->getColumnBlobAsVector(1, keyVector);
@@ -2272,7 +2272,7 @@ IDBError SQLiteIDBBackingStore::uncheckedGetIndexRecordForOneKey(int64_t indexID
         return error;
 
     getResult = { { ThreadSafeDataBuffer::create(WTFMove(keyVector)), WTFMove(blobURLs), WTFMove(blobFilePaths) }, objectStoreKey };
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::getCount(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const IDBKeyRangeData& range, uint64_t& outCount)
@@ -2286,19 +2286,19 @@ IDBError SQLiteIDBBackingStore::getCount(const IDBResourceIdentifier& transactio
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to get count from database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to get count from database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to get count from database without an in-progress transaction") };
     }
 
     auto cursor = transaction->maybeOpenBackingStoreCursor(objectStoreIdentifier, indexIdentifier, range);
     if (!cursor) {
         LOG_ERROR("Cannot open cursor to populate indexes in database");
-        return { UnknownError, ASCIILiteral("Unable to populate indexes in database") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to populate indexes in database") };
     }
 
     while (cursor->advance(1))
         ++outCount;
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::uncheckedGetKeyGeneratorValue(int64_t objectStoreID, uint64_t& outValue)
@@ -2307,20 +2307,20 @@ IDBError SQLiteIDBBackingStore::uncheckedGetKeyGeneratorValue(int64_t objectStor
     if (!sql
         || sql->bindInt64(1, objectStoreID) != SQLITE_OK) {
         LOG_ERROR("Could not retrieve currentKey from KeyGenerators table (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { UnknownError, ASCIILiteral("Error getting current key generator value from database") };
+        return IDBError { UnknownError, ASCIILiteral("Error getting current key generator value from database") };
     }
     int result = sql->step();
     if (result != SQLITE_ROW) {
         LOG_ERROR("Could not retreive key generator value for object store, but it should be there.");
-        return { UnknownError, ASCIILiteral("Error finding current key generator value in database") };
+        return IDBError { UnknownError, ASCIILiteral("Error finding current key generator value in database") };
     }
 
     int64_t value = sql->getColumnInt64(0);
     if (value < 0)
-        return { ConstraintError, "Current key generator value from database is invalid" };
+        return IDBError { ConstraintError, "Current key generator value from database is invalid" };
 
     outValue = value;
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::uncheckedSetKeyGeneratorValue(int64_t objectStoreID, uint64_t value)
@@ -2331,10 +2331,10 @@ IDBError SQLiteIDBBackingStore::uncheckedSetKeyGeneratorValue(int64_t objectStor
         || sql->bindInt64(2, value) != SQLITE_OK
         || sql->step() != SQLITE_DONE) {
         LOG_ERROR("Could not update key generator value (%i) - %s", m_sqliteDB->lastError(), m_sqliteDB->lastErrorMsg());
-        return { ConstraintError, "Error storing new key generator value in database" };
+        return IDBError { ConstraintError, "Error storing new key generator value in database" };
     }
 
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::generateKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreID, uint64_t& generatedKey)
@@ -2350,11 +2350,11 @@ IDBError SQLiteIDBBackingStore::generateKeyNumber(const IDBResourceIdentifier& t
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to generate key in database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to generate key in database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to generate key in database without an in-progress transaction") };
     }
     if (transaction->mode() == IDBTransactionMode::Readonly) {
         LOG_ERROR("Attempt to generate key in a read-only transaction");
-        return { UnknownError, ASCIILiteral("Attempt to generate key in a read-only transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to generate key in a read-only transaction") };
     }
 
     uint64_t currentValue;
@@ -2363,7 +2363,7 @@ IDBError SQLiteIDBBackingStore::generateKeyNumber(const IDBResourceIdentifier& t
         return error;
 
     if (currentValue + 1 > maxGeneratorValue)
-        return { ConstraintError, "Cannot generate new key value over 2^53 for object store operation" };
+        return IDBError { ConstraintError, "Cannot generate new key value over 2^53 for object store operation" };
 
     generatedKey = currentValue + 1;
     return uncheckedSetKeyGeneratorValue(objectStoreID, generatedKey);
@@ -2379,11 +2379,11 @@ IDBError SQLiteIDBBackingStore::revertGeneratedKeyNumber(const IDBResourceIdenti
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to revert key generator value in database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to revert key generator value in database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to revert key generator value in database without an in-progress transaction") };
     }
     if (transaction->mode() == IDBTransactionMode::Readonly) {
         LOG_ERROR("Attempt to revert key generator value in a read-only transaction");
-        return { UnknownError, ASCIILiteral("Attempt to revert key generator value in a read-only transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to revert key generator value in a read-only transaction") };
     }
 
     ASSERT(newKeyNumber);
@@ -2400,11 +2400,11 @@ IDBError SQLiteIDBBackingStore::maybeUpdateKeyGeneratorNumber(const IDBResourceI
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to update key generator value in database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to update key generator value in database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to update key generator value in database without an in-progress transaction") };
     }
     if (transaction->mode() == IDBTransactionMode::Readonly) {
         LOG_ERROR("Attempt to update key generator value in a read-only transaction");
-        return { UnknownError, ASCIILiteral("Attempt to update key generator value in a read-only transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to update key generator value in a read-only transaction") };
     }
 
     uint64_t currentValue;
@@ -2413,7 +2413,7 @@ IDBError SQLiteIDBBackingStore::maybeUpdateKeyGeneratorNumber(const IDBResourceI
         return error;
 
     if (newKeyNumber <= currentValue)
-        return { };
+        return IDBError { };
 
     uint64_t newKeyInteger(newKeyNumber);
     if (newKeyInteger <= uint64_t(newKeyNumber))
@@ -2432,19 +2432,19 @@ IDBError SQLiteIDBBackingStore::openCursor(const IDBResourceIdentifier& transact
     auto* transaction = m_transactions.get(transactionIdentifier);
     if (!transaction || !transaction->inProgress()) {
         LOG_ERROR("Attempt to open a cursor in database without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to open a cursor in database without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to open a cursor in database without an in-progress transaction") };
     }
 
     auto* cursor = transaction->maybeOpenCursor(info);
     if (!cursor) {
         LOG_ERROR("Unable to open cursor");
-        return { UnknownError, ASCIILiteral("Unable to open cursor") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to open cursor") };
     }
 
     m_cursors.set(cursor->identifier(), cursor);
 
     cursor->currentData(result);
-    return { };
+    return IDBError { };
 }
 
 IDBError SQLiteIDBBackingStore::iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData& data, IDBGetResult& result)
@@ -2457,14 +2457,14 @@ IDBError SQLiteIDBBackingStore::iterateCursor(const IDBResourceIdentifier& trans
     auto* cursor = m_cursors.get(cursorIdentifier);
     if (!cursor) {
         LOG_ERROR("Attempt to iterate a cursor that doesn't exist");
-        return { UnknownError, ASCIILiteral("Attempt to iterate a cursor that doesn't exist") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to iterate a cursor that doesn't exist") };
     }
 
     ASSERT_UNUSED(transactionIdentifier, cursor->transaction()->transactionIdentifier() == transactionIdentifier);
 
     if (!cursor->transaction() || !cursor->transaction()->inProgress()) {
         LOG_ERROR("Attempt to iterate a cursor without an in-progress transaction");
-        return { UnknownError, ASCIILiteral("Attempt to iterate a cursor without an in-progress transaction") };
+        return IDBError { UnknownError, ASCIILiteral("Attempt to iterate a cursor without an in-progress transaction") };
     }
 
     auto key = data.keyData;
@@ -2474,7 +2474,7 @@ IDBError SQLiteIDBBackingStore::iterateCursor(const IDBResourceIdentifier& trans
     if (key.isValid()) {
         if (!cursor->iterate(key, primaryKey)) {
             LOG_ERROR("Attempt to iterate cursor failed");
-            return { UnknownError, ASCIILiteral("Attempt to iterate cursor failed") };
+            return IDBError { UnknownError, ASCIILiteral("Attempt to iterate cursor failed") };
         }
     } else {
         ASSERT(!primaryKey.isValid());
@@ -2482,12 +2482,12 @@ IDBError SQLiteIDBBackingStore::iterateCursor(const IDBResourceIdentifier& trans
             count = 1;
         if (!cursor->advance(count)) {
             LOG_ERROR("Attempt to advance cursor failed");
-            return { UnknownError, ASCIILiteral("Attempt to advance cursor failed") };
+            return IDBError { UnknownError, ASCIILiteral("Attempt to advance cursor failed") };
         }
     }
 
     cursor->currentData(result);
-    return { };
+    return IDBError { };
 }
 
 bool SQLiteIDBBackingStore::prefetchCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier)
index b7efafa..60863a8 100644 (file)
@@ -62,27 +62,27 @@ IDBError SQLiteIDBTransaction::begin(SQLiteDatabase& database)
     m_sqliteTransaction->begin();
 
     if (m_sqliteTransaction->inProgress())
-        return { };
+        return IDBError { };
 
-    return { UnknownError, ASCIILiteral("Could not start SQLite transaction in database backend") };
+    return IDBError { UnknownError, ASCIILiteral("Could not start SQLite transaction in database backend") };
 }
 
 IDBError SQLiteIDBTransaction::commit()
 {
     LOG(IndexedDB, "SQLiteIDBTransaction::commit");
     if (!m_sqliteTransaction || !m_sqliteTransaction->inProgress())
-        return { UnknownError, ASCIILiteral("No SQLite transaction in progress to commit") };
+        return IDBError { UnknownError, ASCIILiteral("No SQLite transaction in progress to commit") };
 
     m_sqliteTransaction->commit();
 
     if (m_sqliteTransaction->inProgress())
-        return { UnknownError, ASCIILiteral("Unable to commit SQLite transaction in database backend") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to commit SQLite transaction in database backend") };
 
     deleteBlobFilesIfNecessary();
     moveBlobFilesIfNecessary();
 
     reset();
-    return { };
+    return IDBError { };
 }
 
 void SQLiteIDBTransaction::moveBlobFilesIfNecessary()
@@ -125,15 +125,15 @@ IDBError SQLiteIDBTransaction::abort()
     m_blobTemporaryAndStoredFilenames.clear();
 
     if (!m_sqliteTransaction || !m_sqliteTransaction->inProgress())
-        return { UnknownError, ASCIILiteral("No SQLite transaction in progress to abort") };
+        return IDBError { UnknownError, ASCIILiteral("No SQLite transaction in progress to abort") };
 
     m_sqliteTransaction->rollback();
 
     if (m_sqliteTransaction->inProgress())
-        return { UnknownError, ASCIILiteral("Unable to abort SQLite transaction in database backend") };
+        return IDBError { UnknownError, ASCIILiteral("Unable to abort SQLite transaction in database backend") };
 
     reset();
-    return { };
+    return IDBError { };
 }
 
 void SQLiteIDBTransaction::reset()
index 5f6f629..e86a232 100644 (file)
@@ -694,7 +694,7 @@ void UniqueIDBDatabase::deleteObjectStore(UniqueIDBDatabaseTransaction& transact
 
     auto* info = m_databaseInfo->infoForExistingObjectStore(objectStoreName);
     if (!info) {
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to delete non-existant object store") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to delete non-existant object store") });
         return;
     }
 
@@ -735,7 +735,7 @@ void UniqueIDBDatabase::renameObjectStore(UniqueIDBDatabaseTransaction& transact
 
     auto* info = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier);
     if (!info) {
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to rename non-existant object store") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to rename non-existant object store") });
         return;
     }
 
@@ -844,13 +844,13 @@ void UniqueIDBDatabase::deleteIndex(UniqueIDBDatabaseTransaction& transaction, u
 
     auto* objectStoreInfo = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier);
     if (!objectStoreInfo) {
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to delete index from non-existant object store") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to delete index from non-existant object store") });
         return;
     }
 
     auto* indexInfo = objectStoreInfo->infoForExistingIndex(indexName);
     if (!indexInfo) {
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to delete non-existant index") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to delete non-existant index") });
         return;
     }
 
@@ -894,13 +894,13 @@ void UniqueIDBDatabase::renameIndex(UniqueIDBDatabaseTransaction& transaction, u
 
     auto* objectStoreInfo = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier);
     if (!objectStoreInfo) {
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to rename index in non-existant object store") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to rename index in non-existant object store") });
         return;
     }
 
     auto* indexInfo = objectStoreInfo->infoForExistingIndex(indexIdentifier);
     if (!indexInfo) {
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to rename non-existant index") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to rename non-existant index") });
         return;
     }
 
@@ -1329,7 +1329,7 @@ void UniqueIDBDatabase::commitTransaction(UniqueIDBDatabaseTransaction& transact
             return;
         }
 
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to commit transaction that is already finishing") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to commit transaction that is already finishing") });
         return;
     }
 
@@ -1373,7 +1373,7 @@ void UniqueIDBDatabase::abortTransaction(UniqueIDBDatabaseTransaction& transacti
             return;
         }
 
-        performErrorCallback(callbackID, { UnknownError, ASCIILiteral("Attempt to abort transaction that is already finishing") });
+        performErrorCallback(callbackID, IDBError { UnknownError, ASCIILiteral("Attempt to abort transaction that is already finishing") });
         return;
     }
 
index 338d6ce..c747c55 100644 (file)
 
 namespace WebCore {
 
-IDBError::IDBError(ExceptionCode code)
-    : IDBError(code, emptyString())
-{
-}
-
-IDBError::IDBError(ExceptionCode code, const String& message)
+IDBError::IDBError(std::optional<ExceptionCode> code, const String& message)
     : m_code(code)
     , m_message(message)
 {
@@ -45,7 +40,7 @@ IDBError::IDBError(ExceptionCode code, const String& message)
 
 IDBError IDBError::isolatedCopy() const
 {
-    return { m_code, m_message.isolatedCopy() };
+    return IDBError { m_code, m_message.isolatedCopy() };
 }
 
 IDBError& IDBError::operator=(const IDBError& other)
@@ -57,12 +52,16 @@ IDBError& IDBError::operator=(const IDBError& other)
 
 String IDBError::name() const
 {
-    return DOMException::name(m_code);
+    if (!m_code)
+        return { };
+    return DOMException::name(m_code.value());
 }
 
 String IDBError::message() const
 {
-    return DOMException::message(m_code);
+    if (!m_code)
+        return { };
+    return DOMException::message(m_code.value());
 }
 
 RefPtr<DOMError> IDBError::toDOMError() const
index 41009fd..ad1cd0b 100644 (file)
@@ -35,20 +35,18 @@ namespace WebCore {
 
 class IDBError {
 public:
-    IDBError() { }
-    IDBError(ExceptionCode);
-    WEBCORE_EXPORT IDBError(ExceptionCode, const String& message);
+    WEBCORE_EXPORT explicit IDBError(std::optional<ExceptionCode> = std::nullopt, const String& message = { });
 
     static IDBError userDeleteError()
     {
-        return { UnknownError, ASCIILiteral("Database deleted by request of the user") };
+        return IDBError { UnknownError, ASCIILiteral("Database deleted by request of the user") };
     }
 
     IDBError& operator=(const IDBError&);
 
     RefPtr<DOMError> toDOMError() const;
 
-    ExceptionCode code() const { return m_code; }
+    std::optional<ExceptionCode> code() const { return m_code; }
     String name() const;
     String message() const;
 
@@ -60,23 +58,36 @@ public:
     template<class Decoder> static bool decode(Decoder&, IDBError&);
 
 private:
-    ExceptionCode m_code { NoException };
+    std::optional<ExceptionCode> m_code;
     String m_message;
 };
 
 template<class Encoder>
 void IDBError::encode(Encoder& encoder) const
 {
-    encoder.encodeEnum(m_code);
+    if (m_code) {
+        encoder << true;
+        encoder.encodeEnum(m_code.value());
+    } else
+        encoder << false;
     encoder << m_message;
 }
     
 template<class Decoder>
 bool IDBError::decode(Decoder& decoder, IDBError& error)
 {
-    if (!decoder.decodeEnum(error.m_code))
+    bool hasCode = false;
+    if (!decoder.decode(hasCode))
         return false;
 
+    if (hasCode) {
+        ExceptionCode ec;
+        if (!decoder.decodeEnum(ec))
+            return false;
+        error.m_code = ec;
+    } else
+        error.m_code = std::nullopt;
+
     if (!decoder.decode(error.m_message))
         return false;
 
index 6e6452a..730d13b 100644 (file)
@@ -124,7 +124,7 @@ void reportCurrentException(ExecState* exec)
 
 static JSValue createDOMException(ExecState* exec, ExceptionCode ec, const String* message = nullptr)
 {
-    if (!ec || ec == ExistingExceptionError)
+    if (ec == ExistingExceptionError)
         return jsUndefined();
 
     // FIXME: Handle other WebIDL exception types.
index ed74aac..e28b0d1 100644 (file)
 
 namespace WebCore {
 
+// This array needs to be kept in sync with the ExceptionCode enumeration.
 // http://heycam.github.io/webidl/#idl-DOMException-error-names
 static const DOMException::Description descriptions[] = {
     { "IndexSizeError", "The index is not in the allowed range.", 1 },
-    { nullptr, nullptr, 0 }, // DOMStringSizeError
     { "HierarchyRequestError", "The operation would yield an incorrect node tree.", 3 },
     { "WrongDocumentError", "The object is in the wrong document.", 4 },
     { "InvalidCharacterError", "The string contains invalid characters.", 5 },
-    { nullptr, nullptr, 0 }, // NoDataAllowedError
     { "NoModificationAllowedError", "The object can not be modified.", 7 },
     { "NotFoundError", "The object can not be found here.", 8 },
     { "NotSupportedError", "The operation is not supported.", 9 },
@@ -48,7 +47,6 @@ static const DOMException::Description descriptions[] = {
     { "InvalidModificationError", " The object can not be modified in this way.", 13 },
     { "NamespaceError", "The operation is not allowed by Namespaces in XML.", 14 },
     { "InvalidAccessError", "The object does not support the operation or argument.", 15 },
-    { nullptr, nullptr, 0 }, // ValidationError
     { "TypeMismatchError", "The type of an object was incompatible with the expected type of the parameter associated to the object.", 17 },
     { "SecurityError", "The operation is insecure.", 18 },
     { "NetworkError", " A network error occurred.", 19 },
@@ -69,14 +67,13 @@ static const DOMException::Description descriptions[] = {
     { "OperationError", "The operation failed for an operation-specific reason.", 0 },
     { "NotAllowedError", "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.", 0 }
 };
+static_assert(!IndexSizeError, "This table needs to be kept in sync with DOMException names in ExceptionCode enumeration");
+static_assert(NotAllowedError == WTF_ARRAY_LENGTH(descriptions) - 1, "This table needs to be kept in sync with DOMException names in ExceptionCode enumeration");
 
 auto DOMException::description(ExceptionCode ec) -> const Description&
 {
-    size_t index = ec - 1;
-    if (index < WTF_ARRAY_LENGTH(descriptions)) {
-        ASSERT(!descriptions[index].legacyCode || descriptions[index].legacyCode == ec);
-        return descriptions[index];
-    }
+    if (ec < WTF_ARRAY_LENGTH(descriptions))
+        return descriptions[ec];
 
     static const Description emptyDescription { nullptr, nullptr, 0 };
     return emptyDescription;
index db50861..5f8a8d2 100644 (file)
@@ -50,7 +50,6 @@ inline Exception::Exception(ExceptionCode code, String&& message)
     : m_code(code)
     , m_message(WTFMove(message))
 {
-    ASSERT(code);
 }
 
 inline Exception isolatedCopy(Exception&& value)
index 9bcc6c9..6f56565 100644 (file)
 
 namespace WebCore {
 
-// Some of these are considered historical since they have been
-// changed or removed from the specifications.
 enum ExceptionCode {
-    NoException = 0,
-    IndexSizeError = 1,
-    HierarchyRequestError = 3,
-    WrongDocumentError = 4,
-    InvalidCharacterError = 5,
-    NoModificationAllowedError = 7,
-    NotFoundError = 8,
-    NotSupportedError = 9,
-    InUseAttributeError = 10, // Historical. Only used in setAttributeNode etc which have been removed from the DOM specs.
-
-    // Introduced in DOM Level 2:
-    InvalidStateError = 11,
-    SyntaxError = 12,
-    InvalidModificationError = 13,
-    NamespaceError = 14,
-    InvalidAccessError = 15,
-
-    // Introduced in DOM Level 3:
-    TypeMismatchError = 17, // Historical; use TypeError instead
-
-    // XMLHttpRequest extension:
-    SecurityError = 18,
-
-    // Others introduced in HTML5:
-    NetworkError = 19,
-    AbortError = 20,
-    URLMismatchError = 21,
-    QuotaExceededError = 22,
-    TimeoutError = 23,
-    InvalidNodeTypeError = 24,
-    DataCloneError = 25,
-
-    // Others introduced in https://heycam.github.io/webidl/#idl-exceptions
+    // DOMException error names (https://heycam.github.io/webidl/#idl-DOMException-error-names).
+    // Those need to be kept in sync with the array in DOMException.cpp.
+    IndexSizeError, // Deprecated. Use RangeError instead.
+    HierarchyRequestError,
+    WrongDocumentError,
+    InvalidCharacterError,
+    NoModificationAllowedError,
+    NotFoundError,
+    NotSupportedError,
+    InUseAttributeError,
+    InvalidStateError,
+    SyntaxError,
+    InvalidModificationError,
+    NamespaceError,
+    InvalidAccessError, // Deprecated. use NotAllowedError instead.
+    TypeMismatchError, // Deprecated. Use TypeError instead.
+    SecurityError,
+    NetworkError,
+    AbortError,
+    URLMismatchError,
+    QuotaExceededError,
+    TimeoutError,
+    InvalidNodeTypeError,
+    DataCloneError,
     EncodingError,
     NotReadableError,
     UnknownError,
@@ -67,16 +56,15 @@ enum ExceptionCode {
     OperationError,
     NotAllowedError,
 
-    // Non-standard errors
+    // Simple exceptions (https://heycam.github.io/webidl/#idl-exceptions).
+    RangeError,
+    TypeError,
+
+    // Non-standard error.
     StackOverflowError,
 
-    // Used to indicate to the bindings that a JS exception was thrown below and it should be propogated.
+    // Used to indicate to the bindings that a JS exception was thrown below and it should be propagated.
     ExistingExceptionError,
-
-    // WebIDL exception types, handled by the binding layer.
-    // FIXME: Add GeneralError, EvalError, etc. when implemented in the bindings.
-    TypeError = 105,
-    RangeError = 106,
 };
 
 } // namespace WebCore
index 828b103..05f3328 100644 (file)
@@ -72,45 +72,43 @@ ExceptionOr<String> FileReaderSync::readAsDataURL(ScriptExecutionContext& script
     return startLoadingString(scriptExecutionContext, loader, blob);
 }
 
-static ExceptionCode errorCodeToExceptionCode(FileError::ErrorCode errorCode)
+static ExceptionOr<void> errorCodeToException(FileError::ErrorCode errorCode)
 {
     switch (errorCode) {
     case FileError::OK:
-        return NoException;
+        return { };
     case FileError::NOT_FOUND_ERR:
-        return NotFoundError;
+        return Exception { NotFoundError };
     case FileError::SECURITY_ERR:
-        return SecurityError;
+        return Exception { SecurityError };
     case FileError::ABORT_ERR:
-        return AbortError;
+        return Exception { AbortError };
     case FileError::NOT_READABLE_ERR:
-        return NotReadableError;
+        return Exception { NotReadableError };
     case FileError::ENCODING_ERR:
-        return EncodingError;
+        return Exception { EncodingError };
     case FileError::NO_MODIFICATION_ALLOWED_ERR:
-        return NoModificationAllowedError;
+        return Exception { NoModificationAllowedError };
     case FileError::INVALID_STATE_ERR:
-        return InvalidStateError;
+        return Exception { InvalidStateError };
     case FileError::SYNTAX_ERR:
-        return SyntaxError;
+        return Exception { SyntaxError };
     case FileError::INVALID_MODIFICATION_ERR:
-        return InvalidModificationError;
+        return Exception { InvalidModificationError };
     case FileError::QUOTA_EXCEEDED_ERR:
-        return QuotaExceededError;
+        return Exception { QuotaExceededError };
     case FileError::TYPE_MISMATCH_ERR:
-        return TypeMismatchError;
+        return Exception { TypeMismatchError };
     case FileError::PATH_EXISTS_ERR:
-        return NoModificationAllowedError;
+        return Exception { NoModificationAllowedError };
     }
-    return UnknownError;
+    return Exception { UnknownError };
 }
 
 ExceptionOr<void> FileReaderSync::startLoading(ScriptExecutionContext& scriptExecutionContext, FileReaderLoader& loader, Blob& blob)
 {
     loader.start(&scriptExecutionContext, blob);
-    if (ExceptionCode code = errorCodeToExceptionCode(loader.errorCode()))
-        return Exception { code };
-    return { };
+    return errorCodeToException(loader.errorCode());
 }
 
 ExceptionOr<String> FileReaderSync::startLoadingString(ScriptExecutionContext& scriptExecutionContext, FileReaderLoader& loader, Blob& blob)
index 497a160..d932dc1 100644 (file)
@@ -742,7 +742,7 @@ ExceptionOr<void> XMLHttpRequest::createRequest()
         }
     }
 
-    m_exceptionCode = NoException;
+    m_exceptionCode = std::nullopt;
     m_error = false;
 
     if (m_async) {
@@ -767,7 +767,7 @@ ExceptionOr<void> XMLHttpRequest::createRequest()
     }
 
     if (m_exceptionCode)
-        return Exception { m_exceptionCode };
+        return Exception { m_exceptionCode.value() };
     if (m_error)
         return Exception { NetworkError };
     return { };
index 48e1894..ef354fd 100644 (file)
@@ -224,7 +224,7 @@ private:
     unsigned m_lastSendLineNumber { 0 };
     unsigned m_lastSendColumnNumber { 0 };
     String m_lastSendURL;
-    ExceptionCode m_exceptionCode { NoException };
+    std::optional<ExceptionCode> m_exceptionCode;
 
     XMLHttpRequestProgressEventThrottle m_progressEventThrottle;
 
index b272275..d113cb2 100644 (file)
@@ -360,7 +360,7 @@ void WebIDBConnectionToServer::didGetAllDatabaseNames(uint64_t callbackID, const
 
 void WebIDBConnectionToServer::connectionToServerLost()
 {
-    m_connectionToServer->connectionToServerLost({ WebCore::UnknownError, ASCIILiteral("An internal error was encountered in the Indexed Database server") });
+    m_connectionToServer->connectionToServerLost(IDBError { WebCore::UnknownError, ASCIILiteral("An internal error was encountered in the Indexed Database server") });
 }
 
 } // namespace WebKit