Changeset 250800 in webkit
- Timestamp:
- Oct 7, 2019 3:36:47 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r250788 r250800 1 2019-10-07 Sihui Liu <sihui_liu@apple.com> 2 3 ASSERTION FAILED: m_transactionOperationsInProgressQueue.first() == &operation in IDBTransaction::operationCompletedOnClient 4 https://bugs.webkit.org/show_bug.cgi?id=202552 5 6 Reviewed by Alex Christensen. 7 8 * storage/indexeddb/resources/storage-limit.js: 9 (onOpenSuccess.request.onerror): 10 * storage/indexeddb/storage-limit-expected.txt: 11 1 12 2019-10-07 Ryosuke Niwa <rniwa@webkit.org> 2 13 -
trunk/LayoutTests/storage/indexeddb/resources/storage-limit.js
r242911 r250800 24 24 evalAndLog("db = event.target.result"); 25 25 evalAndLog("store = db.transaction('store', 'readwrite').objectStore('store')"); 26 27 // Small add should succeed. 28 evalAndLog("addCount = 0"); 29 for (var i = 1; i <= 10; i ++) 30 evalAndLog("store.add(new Uint8Array(1), " + i + ").onsuccess = ()=> { ++addCount; }"); 31 32 // Big add should fail. 26 33 evalAndLog("request = store.add(new Uint8Array(" + (quota + 1) + "), 0)"); 27 34 request.onerror = function(event) { 35 shouldBe("addCount", "10"); 28 36 shouldBeTrue("'error' in request"); 29 37 shouldBe("request.error.code", "DOMException.QUOTA_EXCEEDED_ERR"); -
trunk/LayoutTests/storage/indexeddb/storage-limit-expected.txt
r242911 r250800 16 16 db = event.target.result 17 17 store = db.transaction('store', 'readwrite').objectStore('store') 18 addCount = 0 19 store.add(new Uint8Array(1), 1).onsuccess = ()=> { ++addCount; } 20 store.add(new Uint8Array(1), 2).onsuccess = ()=> { ++addCount; } 21 store.add(new Uint8Array(1), 3).onsuccess = ()=> { ++addCount; } 22 store.add(new Uint8Array(1), 4).onsuccess = ()=> { ++addCount; } 23 store.add(new Uint8Array(1), 5).onsuccess = ()=> { ++addCount; } 24 store.add(new Uint8Array(1), 6).onsuccess = ()=> { ++addCount; } 25 store.add(new Uint8Array(1), 7).onsuccess = ()=> { ++addCount; } 26 store.add(new Uint8Array(1), 8).onsuccess = ()=> { ++addCount; } 27 store.add(new Uint8Array(1), 9).onsuccess = ()=> { ++addCount; } 28 store.add(new Uint8Array(1), 10).onsuccess = ()=> { ++addCount; } 18 29 request = store.add(new Uint8Array(409601), 0) 30 PASS addCount is 10 19 31 PASS 'error' in request is true 20 32 PASS request.error.code is DOMException.QUOTA_EXCEEDED_ERR -
trunk/Source/WebCore/ChangeLog
r250798 r250800 1 2019-10-07 Sihui Liu <sihui_liu@apple.com> 2 3 ASSERTION FAILED: m_transactionOperationsInProgressQueue.first() == &operation in IDBTransaction::operationCompletedOnClient 4 https://bugs.webkit.org/show_bug.cgi?id=202552 5 6 Reviewed by Alex Christensen. 7 8 Dispatch task to database thread even if there is QuotaExceededError, to make sure request results are sent in 9 order. 10 11 Modified existing test to cover this: storage/indexeddb/storage-limit.html. Test would hit this assertion 12 without fix. 13 14 * Modules/indexeddb/server/UniqueIDBDatabase.cpp: 15 (WebCore::IDBServer::UniqueIDBDatabase::requestSpace): 16 (WebCore::IDBServer::UniqueIDBDatabase::waitForRequestSpaceCompletion): 17 (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): 18 (WebCore::IDBServer::UniqueIDBDatabase::createObjectStoreAfterQuotaCheck): 19 (WebCore::IDBServer::UniqueIDBDatabase::performCreateObjectStore): 20 (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): 21 (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): 22 (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck): 23 (WebCore::IDBServer::UniqueIDBDatabase::performRenameObjectStore): 24 (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): 25 (WebCore::IDBServer::UniqueIDBDatabase::createIndex): 26 (WebCore::IDBServer::UniqueIDBDatabase::createIndexAfterQuotaCheck): 27 (WebCore::IDBServer::UniqueIDBDatabase::performCreateIndex): 28 (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): 29 (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): 30 (WebCore::IDBServer::UniqueIDBDatabase::renameIndexAfterQuotaCheck): 31 (WebCore::IDBServer::UniqueIDBDatabase::performRenameIndex): 32 (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): 33 (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterQuotaCheck): 34 (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd): 35 (WebCore::IDBServer::UniqueIDBDatabase::getRecord): 36 (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): 37 (WebCore::IDBServer::UniqueIDBDatabase::getCount): 38 (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): 39 (WebCore::IDBServer::UniqueIDBDatabase::openCursor): 40 (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): 41 (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): 42 (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): 43 * Modules/indexeddb/server/UniqueIDBDatabase.h: 44 1 45 2019-10-07 Keith Rollin <krollin@apple.com> 2 46 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r250798 r250800 187 187 } 188 188 189 void UniqueIDBDatabase::requestSpace(UniqueIDBDatabaseTransaction& transaction, uint64_t taskSize, const char* taskName, CompletionHandler<void( Optional<IDBError>&&)>&& callback)189 void UniqueIDBDatabase::requestSpace(UniqueIDBDatabaseTransaction& transaction, uint64_t taskSize, const char* taskName, CompletionHandler<void(IDBError&&)>&& callback) 190 190 { 191 191 m_server->requestSpace(m_identifier.origin(), taskSize, [weakThis = makeWeakPtr(this), this, weakTransaction = makeWeakPtr(transaction), taskName, callback = WTFMove(callback)](auto decision) mutable { … … 210 210 return; 211 211 case StorageQuotaManager::Decision::Grant: 212 callback( { });212 callback(IDBError { }); 213 213 }; 214 214 }); 215 215 } 216 216 217 void UniqueIDBDatabase::waitForRequestSpaceCompletion(UniqueIDBDatabaseTransaction& transaction, CompletionHandler<void( Optional<IDBError>&&)>&& callback)217 void UniqueIDBDatabase::waitForRequestSpaceCompletion(UniqueIDBDatabaseTransaction& transaction, CompletionHandler<void(IDBError&&)>&& callback) 218 218 { 219 219 requestSpace(transaction, 0, "", WTFMove(callback)); … … 839 839 auto taskSize = defaultWriteOperationCost + estimateSize(info); 840 840 requestSpace(transaction, taskSize, "createObjectStore", [this, taskSize, &transaction, info, callback = WTFMove(callback)](auto error) mutable { 841 if ( error) {842 callback(WTFMove( *error));843 return; 844 } 845 this->createObjectStoreAfterQuotaCheck(taskSize, transaction, info, WTFMove(callback) );841 if (!error.isNull() && *error.code() != QuotaExceededError) { 842 callback(WTFMove(error)); 843 return; 844 } 845 this->createObjectStoreAfterQuotaCheck(taskSize, transaction, info, WTFMove(callback), error); 846 846 }); 847 847 } 848 848 849 void UniqueIDBDatabase::createObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, const IDBObjectStoreInfo& info, ErrorCallback callback )849 void UniqueIDBDatabase::createObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, const IDBObjectStoreInfo& info, ErrorCallback callback, const IDBError& quotaError) 850 850 { 851 851 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback), taskSize); … … 853 853 return; 854 854 855 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performCreateObjectStore, callbackID, transaction.info().identifier(), info ));856 } 857 858 void UniqueIDBDatabase::performCreateObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBObjectStoreInfo& info )855 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performCreateObjectStore, callbackID, transaction.info().identifier(), info, quotaError)); 856 } 857 858 void UniqueIDBDatabase::performCreateObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBObjectStoreInfo& info, const IDBError& quotaError) 859 859 { 860 860 ASSERT(!isMainThread()); 861 861 LOG(IndexedDB, "(db) UniqueIDBDatabase::performCreateObjectStore"); 862 862 863 if (!quotaError.isNull()) { 864 postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformCreateObjectStore, callbackIdentifier, quotaError, info)); 865 return; 866 } 867 863 868 ASSERT(m_backingStore); 864 869 m_backingStore->createObjectStore(transactionIdentifier, info); … … 884 889 LOG(IndexedDB, "(main) UniqueIDBDatabase::deleteObjectStore"); 885 890 886 waitForRequestSpaceCompletion(transaction, [this, &transaction, objectStoreName, callback = WTFMove(callback)](auto error) mutable {887 if ( error) {888 callback(WTFMove( *error));891 waitForRequestSpaceCompletion(transaction, [this, &transaction, objectStoreName, callback = WTFMove(callback)](auto&& error) mutable { 892 if (!error.isNull()) { 893 callback(WTFMove(error)); 889 894 return; 890 895 } … … 938 943 auto taskSize = defaultWriteOperationCost + newName.sizeInBytes(); 939 944 requestSpace(transaction, taskSize, "renameObjectStore", [this, taskSize, &transaction, objectStoreIdentifier, newName, callback = WTFMove(callback)](auto error) mutable { 940 if ( error) {941 callback(WTFMove( *error));942 return; 943 } 944 this->renameObjectStoreAfterQuotaCheck(taskSize, transaction, objectStoreIdentifier, newName, WTFMove(callback) );945 if (!error.isNull() && *error.code() != QuotaExceededError) { 946 callback(WTFMove(error)); 947 return; 948 } 949 this->renameObjectStoreAfterQuotaCheck(taskSize, transaction, objectStoreIdentifier, newName, WTFMove(callback), error); 945 950 }); 946 951 } 947 952 948 void UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback callback )953 void UniqueIDBDatabase::renameObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback callback, const IDBError& quotaError) 949 954 { 950 955 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback), taskSize); … … 952 957 return; 953 958 959 IDBError error = quotaError; 954 960 auto* info = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier); 955 if (!info) { 956 performErrorCallback(callbackID, IDBError { UnknownError, "Attempt to rename non-existant object store"_s }); 957 return; 958 } 959 960 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performRenameObjectStore, callbackID, transaction.info().identifier(), objectStoreIdentifier, newName)); 961 } 962 963 void UniqueIDBDatabase::performRenameObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const String& newName) 961 if (!info) 962 error = IDBError { UnknownError, "Attempt to rename non-existant object store"_s }; 963 964 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performRenameObjectStore, callbackID, transaction.info().identifier(), objectStoreIdentifier, newName, error)); 965 } 966 967 void UniqueIDBDatabase::performRenameObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const String& newName, const IDBError& error) 964 968 { 965 969 ASSERT(!isMainThread()); 966 970 LOG(IndexedDB, "(db) UniqueIDBDatabase::performRenameObjectStore"); 967 971 972 if (!error.isNull()) { 973 postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformRenameObjectStore, callbackIdentifier, error, objectStoreIdentifier, newName)); 974 return; 975 } 976 968 977 ASSERT(m_backingStore); 969 978 m_backingStore->renameObjectStore(transactionIdentifier, objectStoreIdentifier, newName); 970 979 971 IDBError error;972 980 postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformRenameObjectStore, callbackIdentifier, error, objectStoreIdentifier, newName)); 973 981 } … … 989 997 LOG(IndexedDB, "(main) UniqueIDBDatabase::clearObjectStore"); 990 998 991 waitForRequestSpaceCompletion(transaction, [this, &transaction, objectStoreIdentifier, callback = WTFMove(callback)](auto error) mutable {992 if ( error) {993 callback(WTFMove( *error));999 waitForRequestSpaceCompletion(transaction, [this, &transaction, objectStoreIdentifier, callback = WTFMove(callback)](auto&& error) mutable { 1000 if (!error.isNull()) { 1001 callback(WTFMove(error)); 994 1002 return; 995 1003 } … … 1033 1041 auto taskSize = defaultWriteOperationCost + estimateSize(info); 1034 1042 requestSpace(transaction, taskSize, "createIndex", [this, taskSize, &transaction, info, callback = WTFMove(callback)](auto error) mutable { 1035 if ( error) {1036 callback(WTFMove( *error));1037 return; 1038 } 1039 this->createIndexAfterQuotaCheck(taskSize, transaction, info, WTFMove(callback) );1043 if (!error.isNull() && *error.code() != QuotaExceededError) { 1044 callback(WTFMove(error)); 1045 return; 1046 } 1047 this->createIndexAfterQuotaCheck(taskSize, transaction, info, WTFMove(callback), error); 1040 1048 }); 1041 1049 } 1042 1050 1043 void UniqueIDBDatabase::createIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, const IDBIndexInfo& info, ErrorCallback callback )1051 void UniqueIDBDatabase::createIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, const IDBIndexInfo& info, ErrorCallback callback, const IDBError& quotaError) 1044 1052 { 1045 1053 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback), taskSize); 1046 1054 if (!callbackID) 1047 1055 return; 1048 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performCreateIndex, callbackID, transaction.info().identifier(), info ));1049 } 1050 1051 void UniqueIDBDatabase::performCreateIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo& info )1056 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performCreateIndex, callbackID, transaction.info().identifier(), info, quotaError)); 1057 } 1058 1059 void UniqueIDBDatabase::performCreateIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo& info, const IDBError& quotaError) 1052 1060 { 1053 1061 ASSERT(!isMainThread()); 1054 1062 LOG(IndexedDB, "(db) UniqueIDBDatabase::performCreateIndex"); 1063 1064 if (!quotaError.isNull()) { 1065 postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformCreateIndex, callbackIdentifier, quotaError, info)); 1066 return; 1067 } 1055 1068 1056 1069 IDBError error; … … 1087 1100 LOG(IndexedDB, "(main) UniqueIDBDatabase::deleteIndex"); 1088 1101 1089 waitForRequestSpaceCompletion(transaction, [this, &transaction, objectStoreIdentifier, indexName, callback = WTFMove(callback)](auto error) mutable {1090 if ( error) {1091 callback(WTFMove( *error));1102 waitForRequestSpaceCompletion(transaction, [this, &transaction, objectStoreIdentifier, indexName, callback = WTFMove(callback)](auto&& error) mutable { 1103 if (!error.isNull()) { 1104 callback(WTFMove(error)); 1092 1105 return; 1093 1106 } … … 1150 1163 auto taskSize = defaultWriteOperationCost + newName.sizeInBytes(); 1151 1164 requestSpace(transaction, taskSize, "renameIndex", [this, taskSize, &transaction, objectStoreIdentifier, indexIdentifier, newName, callback = WTFMove(callback)](auto error) mutable { 1152 if ( error) {1153 callback(WTFMove( *error));1154 return; 1155 } 1156 this->renameIndexAfterQuotaCheck(taskSize, transaction, objectStoreIdentifier, indexIdentifier, newName, WTFMove(callback) );1165 if (!error.isNull() && *error.code() != QuotaExceededError) { 1166 callback(WTFMove(error)); 1167 return; 1168 } 1169 this->renameIndexAfterQuotaCheck(taskSize, transaction, objectStoreIdentifier, indexIdentifier, newName, WTFMove(callback), error); 1157 1170 }); 1158 1171 } 1159 1172 1160 void UniqueIDBDatabase::renameIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback callback )1173 void UniqueIDBDatabase::renameIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback callback, const IDBError& quotaError) 1161 1174 { 1162 1175 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback), taskSize); … … 1164 1177 return; 1165 1178 1179 IDBError error = quotaError; 1166 1180 auto* objectStoreInfo = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier); 1167 if (!objectStoreInfo) { 1168 performErrorCallback(callbackID, IDBError { UnknownError, "Attempt to rename index in non-existant object store"_s }); 1169 return; 1170 } 1181 if (!objectStoreInfo) 1182 error = IDBError { UnknownError, "Attempt to rename index in non-existant object store"_s }; 1171 1183 1172 1184 auto* indexInfo = objectStoreInfo->infoForExistingIndex(indexIdentifier); 1173 if (!indexInfo) { 1174 performErrorCallback(callbackID, IDBError { UnknownError, "Attempt to rename non-existant index"_s }); 1175 return; 1176 } 1177 1178 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performRenameIndex, callbackID, transaction.info().identifier(), objectStoreIdentifier, indexIdentifier, newName)); 1179 } 1180 1181 void UniqueIDBDatabase::performRenameIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName) 1185 if (!indexInfo) 1186 error = IDBError { UnknownError, "Attempt to rename non-existant index"_s }; 1187 1188 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performRenameIndex, callbackID, transaction.info().identifier(), objectStoreIdentifier, indexIdentifier, newName, error)); 1189 } 1190 1191 void UniqueIDBDatabase::performRenameIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, const IDBError& error) 1182 1192 { 1183 1193 ASSERT(!isMainThread()); 1184 1194 LOG(IndexedDB, "(db) UniqueIDBDatabase::performRenameIndex"); 1185 1195 1196 if (!error.isNull()) { 1197 postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformRenameIndex, callbackIdentifier, error, objectStoreIdentifier, indexIdentifier, newName)); 1198 return; 1199 } 1200 1186 1201 ASSERT(m_backingStore); 1187 1202 m_backingStore->renameIndex(transactionIdentifier, objectStoreIdentifier, indexIdentifier, newName); 1188 1203 1189 IDBError error;1190 1204 postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformRenameIndex, callbackIdentifier, error, objectStoreIdentifier, indexIdentifier, newName)); 1191 1205 } … … 1216 1230 auto taskSize = defaultWriteOperationCost + estimateSize(keyData) + estimateSize(value); 1217 1231 requestSpace(transaction, taskSize, "putOrAdd", [this, taskSize, requestData, keyData, value, callback = WTFMove(callback), overwriteMode](auto error) mutable { 1218 if ( error) {1219 callback(WTFMove( *error), { });1220 return; 1221 } 1222 this->putOrAddAfterQuotaCheck(taskSize, requestData, keyData, value, overwriteMode, WTFMove(callback) );1232 if (!error.isNull() && *error.code() != QuotaExceededError) { 1233 callback(WTFMove(error), { }); 1234 return; 1235 } 1236 this->putOrAddAfterQuotaCheck(taskSize, requestData, keyData, value, overwriteMode, WTFMove(callback), error); 1223 1237 }); 1224 1238 } 1225 1239 1226 void UniqueIDBDatabase::putOrAddAfterQuotaCheck(uint64_t taskSize, const IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, IndexedDB::ObjectStoreOverwriteMode overwriteMode, KeyDataCallback callback )1240 void UniqueIDBDatabase::putOrAddAfterQuotaCheck(uint64_t taskSize, const IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, IndexedDB::ObjectStoreOverwriteMode overwriteMode, KeyDataCallback callback, const IDBError& quotaError) 1227 1241 { 1228 1242 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback), taskSize); 1229 1243 if (!callbackID) 1230 1244 return; 1231 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performPutOrAdd, callbackID, requestData.transactionIdentifier(), requestData.objectStoreIdentifier(), keyData, value, overwriteMode ));1232 } 1233 1234 void UniqueIDBDatabase::performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData& keyData, const IDBValue& originalRecordValue, IndexedDB::ObjectStoreOverwriteMode overwriteMode )1245 postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performPutOrAdd, callbackID, requestData.transactionIdentifier(), requestData.objectStoreIdentifier(), keyData, value, overwriteMode, quotaError)); 1246 } 1247 1248 void UniqueIDBDatabase::performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData& keyData, const IDBValue& originalRecordValue, IndexedDB::ObjectStoreOverwriteMode overwriteMode, const IDBError& quotaError) 1235 1249 { 1236 1250 ASSERT(!isMainThread()); … … 1242 1256 IDBKeyData usedKey; 1243 1257 IDBError error; 1258 1259 if (!quotaError.isNull()) { 1260 postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformPutOrAdd, callbackIdentifier, quotaError, usedKey)); 1261 return; 1262 } 1244 1263 1245 1264 if (!m_backingStore) { … … 1324 1343 LOG(IndexedDB, "(main) UniqueIDBDatabase::getRecord"); 1325 1344 1326 waitForRequestSpaceCompletion(transaction, [this, requestData, getRecordData, callback = WTFMove(callback)](auto error) mutable {1327 if ( error) {1328 callback(WTFMove( *error), { });1345 waitForRequestSpaceCompletion(transaction, [this, requestData, getRecordData, callback = WTFMove(callback)](auto&& error) mutable { 1346 if (!error.isNull()) { 1347 callback(WTFMove(error), { }); 1329 1348 return; 1330 1349 } … … 1350 1369 LOG(IndexedDB, "(main) UniqueIDBDatabase::getAllRecords"); 1351 1370 1352 waitForRequestSpaceCompletion(transaction, [this, requestData, getAllRecordsData, callback = WTFMove(callback)](auto error) mutable {1353 if ( error) {1354 callback(WTFMove( *error), { });1371 waitForRequestSpaceCompletion(transaction, [this, requestData, getAllRecordsData, callback = WTFMove(callback)](auto&& error) mutable { 1372 if (!error.isNull()) { 1373 callback(WTFMove(error), { }); 1355 1374 return; 1356 1375 } … … 1428 1447 LOG(IndexedDB, "(main) UniqueIDBDatabase::getCount"); 1429 1448 1430 waitForRequestSpaceCompletion(transaction, [this, requestData, range, callback = WTFMove(callback)](auto error) mutable {1431 if ( error) {1432 callback(WTFMove( *error), { });1449 waitForRequestSpaceCompletion(transaction, [this, requestData, range, callback = WTFMove(callback)](auto&& error) mutable { 1450 if (!error.isNull()) { 1451 callback(WTFMove(error), { }); 1433 1452 return; 1434 1453 } … … 1472 1491 LOG(IndexedDB, "(main) UniqueIDBDatabase::deleteRecord"); 1473 1492 1474 waitForRequestSpaceCompletion(transaction, [this, requestData, keyRangeData, callback = WTFMove(callback)](auto error) mutable {1475 if ( error) {1476 callback(WTFMove( *error));1493 waitForRequestSpaceCompletion(transaction, [this, requestData, keyRangeData, callback = WTFMove(callback)](auto&& error) mutable { 1494 if (!error.isNull()) { 1495 callback(WTFMove(error)); 1477 1496 return; 1478 1497 } … … 1512 1531 LOG(IndexedDB, "(main) UniqueIDBDatabase::openCursor"); 1513 1532 1514 waitForRequestSpaceCompletion(transaction, [this, requestData, info, callback = WTFMove(callback)](auto error) mutable {1515 if ( error) {1516 callback(WTFMove( *error), { });1533 waitForRequestSpaceCompletion(transaction, [this, requestData, info, callback = WTFMove(callback)](auto&& error) mutable { 1534 if (!error.isNull()) { 1535 callback(WTFMove(error), { }); 1517 1536 return; 1518 1537 } … … 1553 1572 LOG(IndexedDB, "(main) UniqueIDBDatabase::iterateCursor"); 1554 1573 1555 waitForRequestSpaceCompletion(transaction, [this, requestData, data, callback = WTFMove(callback)](auto error) mutable {1556 if ( error) {1557 callback(WTFMove( *error), { });1574 waitForRequestSpaceCompletion(transaction, [this, requestData, data, callback = WTFMove(callback)](auto&& error) mutable { 1575 if (!error.isNull()) { 1576 callback(WTFMove(error), { }); 1558 1577 return; 1559 1578 } … … 1627 1646 ASSERT(transaction.databaseConnection().database() == this); 1628 1647 1629 waitForRequestSpaceCompletion(transaction, [this, &transaction, callback = WTFMove(callback)](auto error) mutable {1630 if ( error) {1631 callback(WTFMove( *error));1648 waitForRequestSpaceCompletion(transaction, [this, &transaction, callback = WTFMove(callback)](auto&& error) mutable { 1649 if (!error.isNull()) { 1650 callback(WTFMove(error)); 1632 1651 return; 1633 1652 } … … 1700 1719 if (waitForPendingTasks == WaitForPendingTasks::Yes) { 1701 1720 waitForRequestSpaceCompletion(transaction, [this, &transaction, callback = WTFMove(callback)](auto&& error) mutable { 1702 if ( error) {1703 callback(WTFMove( *error));1721 if (!error.isNull()) { 1722 callback(WTFMove(error)); 1704 1723 return; 1705 1724 } -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r250317 r250800 142 142 void scheduleShutdownForClose(); 143 143 144 void createObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, const IDBObjectStoreInfo&, ErrorCallback );145 void renameObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback );146 void createIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, const IDBIndexInfo&, ErrorCallback );147 void renameIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback );148 void putOrAddAfterQuotaCheck(uint64_t taskSize, const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode, KeyDataCallback );144 void createObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, const IDBObjectStoreInfo&, ErrorCallback, const IDBError&); 145 void renameObjectStoreAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback, const IDBError&); 146 void createIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, const IDBIndexInfo&, ErrorCallback, const IDBError&); 147 void renameIndexAfterQuotaCheck(uint64_t taskSize, UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback, const IDBError&); 148 void putOrAddAfterQuotaCheck(uint64_t taskSize, const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode, KeyDataCallback, const IDBError&); 149 149 void deleteRecordAfterQuotaCheck(const IDBRequestData&, const IDBKeyRangeData&, ErrorCallback); 150 150 … … 165 165 void performAbortTransaction(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier); 166 166 void beginTransactionInBackingStore(const IDBTransactionInfo&); 167 void performCreateObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBObjectStoreInfo& );167 void performCreateObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBObjectStoreInfo&, const IDBError&); 168 168 void performDeleteObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier); 169 void performRenameObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const String& newName );169 void performRenameObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const String& newName, const IDBError&); 170 170 void performClearObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier); 171 void performCreateIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo& );171 void performCreateIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo&, const IDBError&); 172 172 void performDeleteIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier); 173 void performRenameIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName );174 void performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode );173 void performRenameIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, const IDBError&); 174 void performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode, const IDBError&); 175 175 void performGetRecord(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyRangeData&, IDBGetRecordDataType); 176 176 void performGetAllRecords(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBGetAllRecordsData&); … … 248 248 bool isDoneWithHardClose(); 249 249 250 void requestSpace(UniqueIDBDatabaseTransaction&, uint64_t taskSize, const char* errorMessage, CompletionHandler<void( Optional<IDBError>&&)>&&);251 void waitForRequestSpaceCompletion(UniqueIDBDatabaseTransaction&, CompletionHandler<void( Optional<IDBError>&&)>&&);250 void requestSpace(UniqueIDBDatabaseTransaction&, uint64_t taskSize, const char* errorMessage, CompletionHandler<void(IDBError&&)>&&); 251 void waitForRequestSpaceCompletion(UniqueIDBDatabaseTransaction&, CompletionHandler<void(IDBError&&)>&&); 252 252 void updateSpaceUsedIfNeeded(Optional<uint64_t> optionalCallbackIdentifier = WTF::nullopt); 253 253
Note: See TracChangeset
for help on using the changeset viewer.