Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog (241525 => 241526)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog 2019-02-14 11:27:15 UTC (rev 241525)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/ChangeLog 2019-02-14 11:27:20 UTC (rev 241526)
@@ -1,3 +1,27 @@
+2019-02-13 Sihui Liu <sihui_...@apple.com>
+
+ REGRESSION: [ Mac Debug WK2 ] Layout Test storage/indexeddb/key-type-infinity-private.html is a flaky crash
+ https://bugs.webkit.org/show_bug.cgi?id=194413
+ <rdar://problem/47897254>
+
+ Reviewed by Brady Eidson.
+
+ IDB clients expected transaction operations to be executed in order, but in
+ UniqueIDBDatabase::immediateCloseForUserDelete, callbacks in callback map were errored out randomly.
+ This patch added a callback queue to UniqueIDBDatabase to make sure callbacks will be called in the same order
+ as IDB Server receives the request.
+
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::storeCallbackOrFireError):
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete):
+ (WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback):
+ (WebCore::IDBServer::UniqueIDBDatabase::performKeyDataCallback):
+ (WebCore::IDBServer::UniqueIDBDatabase::performGetResultCallback):
+ (WebCore::IDBServer::UniqueIDBDatabase::performGetAllResultsCallback):
+ (WebCore::IDBServer::UniqueIDBDatabase::performCountCallback):
+ (WebCore::IDBServer::UniqueIDBDatabase::forgetErrorCallback):
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
2019-02-13 Eric Carlson <eric.carl...@apple.com>
Revert r240434
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (241525 => 241526)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2019-02-14 11:27:15 UTC (rev 241525)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2019-02-14 11:27:20 UTC (rev 241526)
@@ -423,6 +423,7 @@
uint64_t identifier = generateUniqueCallbackIdentifier();
ASSERT(!m_errorCallbacks.contains(identifier));
m_errorCallbacks.add(identifier, WTFMove(callback));
+ m_callbackQueue.append(identifier);
return identifier;
}
@@ -436,6 +437,7 @@
uint64_t identifier = generateUniqueCallbackIdentifier();
ASSERT(!m_keyDataCallbacks.contains(identifier));
m_keyDataCallbacks.add(identifier, WTFMove(callback));
+ m_callbackQueue.append(identifier);
return identifier;
}
@@ -449,6 +451,7 @@
uint64_t identifier = generateUniqueCallbackIdentifier();
ASSERT(!m_getResultCallbacks.contains(identifier));
m_getResultCallbacks.add(identifier, WTFMove(callback));
+ m_callbackQueue.append(identifier);
return identifier;
}
@@ -462,6 +465,7 @@
uint64_t identifier = generateUniqueCallbackIdentifier();
ASSERT(!m_getAllResultsCallbacks.contains(identifier));
m_getAllResultsCallbacks.add(identifier, WTFMove(callback));
+ m_callbackQueue.append(identifier);
return identifier;
}
@@ -475,6 +479,7 @@
uint64_t identifier = generateUniqueCallbackIdentifier();
ASSERT(!m_countCallbacks.contains(identifier));
m_countCallbacks.add(identifier, WTFMove(callback));
+ m_callbackQueue.append(identifier);
return identifier;
}
@@ -1828,19 +1833,24 @@
IDBError error = IDBError::userDeleteError();
IDBKeyData keyData;
IDBGetResult getResult;
+ IDBGetAllResult getAllResult;
- for (auto identifier : copyToVector(m_errorCallbacks.keys()))
- performErrorCallback(identifier, error);
+ while (!m_callbackQueue.isEmpty()) {
+ auto identifier = m_callbackQueue.first();
+ if (m_errorCallbacks.contains(identifier))
+ performErrorCallback(identifier, error);
+ else if (m_keyDataCallbacks.contains(identifier))
+ performKeyDataCallback(identifier, error, keyData);
+ else if (m_getResultCallbacks.contains(identifier))
+ performGetResultCallback(identifier, error, getResult);
+ else if (m_countCallbacks.contains(identifier))
+ performCountCallback(identifier, error, 0);
+ else if (m_getAllResultsCallbacks.contains(identifier))
+ performGetAllResultsCallback(identifier, error, getAllResult);
+ else
+ ASSERT_NOT_REACHED();
+ }
- for (auto identifier : copyToVector(m_keyDataCallbacks.keys()))
- performKeyDataCallback(identifier, error, keyData);
-
- for (auto identifier : copyToVector(m_getResultCallbacks.keys()))
- performGetResultCallback(identifier, error, getResult);
-
- for (auto identifier : copyToVector(m_countCallbacks.keys()))
- performCountCallback(identifier, error, 0);
-
// Error out all IDBOpenDBRequests
if (m_currentOpenDBRequest) {
errorOpenDBRequestForUserDelete(*m_currentOpenDBRequest);
@@ -1880,8 +1890,11 @@
{
auto callback = m_errorCallbacks.take(callbackIdentifier);
ASSERT(callback || m_hardClosedForUserDelete);
- if (callback)
+ if (callback) {
callback(error);
+ ASSERT(m_callbackQueue.first() == callbackIdentifier);
+ m_callbackQueue.removeFirst();
+ }
}
void UniqueIDBDatabase::performKeyDataCallback(uint64_t callbackIdentifier, const IDBError& error, const IDBKeyData& resultKey)
@@ -1888,8 +1901,11 @@
{
auto callback = m_keyDataCallbacks.take(callbackIdentifier);
ASSERT(callback || m_hardClosedForUserDelete);
- if (callback)
+ if (callback) {
callback(error, resultKey);
+ ASSERT(m_callbackQueue.first() == callbackIdentifier);
+ m_callbackQueue.removeFirst();
+ }
}
void UniqueIDBDatabase::performGetResultCallback(uint64_t callbackIdentifier, const IDBError& error, const IDBGetResult& resultData)
@@ -1896,8 +1912,11 @@
{
auto callback = m_getResultCallbacks.take(callbackIdentifier);
ASSERT(callback || m_hardClosedForUserDelete);
- if (callback)
+ if (callback) {
callback(error, resultData);
+ ASSERT(m_callbackQueue.first() == callbackIdentifier);
+ m_callbackQueue.removeFirst();
+ }
}
void UniqueIDBDatabase::performGetAllResultsCallback(uint64_t callbackIdentifier, const IDBError& error, const IDBGetAllResult& resultData)
@@ -1904,8 +1923,11 @@
{
auto callback = m_getAllResultsCallbacks.take(callbackIdentifier);
ASSERT(callback || m_hardClosedForUserDelete);
- if (callback)
+ if (callback) {
callback(error, resultData);
+ ASSERT(m_callbackQueue.first() == callbackIdentifier);
+ m_callbackQueue.removeFirst();
+ }
}
void UniqueIDBDatabase::performCountCallback(uint64_t callbackIdentifier, const IDBError& error, uint64_t count)
@@ -1912,13 +1934,18 @@
{
auto callback = m_countCallbacks.take(callbackIdentifier);
ASSERT(callback || m_hardClosedForUserDelete);
- if (callback)
+ if (callback) {
callback(error, count);
+ ASSERT(m_callbackQueue.first() == callbackIdentifier);
+ m_callbackQueue.removeFirst();
+ }
}
void UniqueIDBDatabase::forgetErrorCallback(uint64_t callbackIdentifier)
{
ASSERT(m_errorCallbacks.contains(callbackIdentifier));
+ ASSERT(m_callbackQueue.last() == callbackIdentifier);
+ m_callbackQueue.removeLast();
m_errorCallbacks.remove(callbackIdentifier);
}
Modified: releases/WebKitGTK/webkit-2.24/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (241525 => 241526)
--- releases/WebKitGTK/webkit-2.24/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2019-02-14 11:27:15 UTC (rev 241525)
+++ releases/WebKitGTK/webkit-2.24/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2019-02-14 11:27:20 UTC (rev 241526)
@@ -250,6 +250,7 @@
HashMap<uint64_t, GetResultCallback> m_getResultCallbacks;
HashMap<uint64_t, GetAllResultsCallback> m_getAllResultsCallbacks;
HashMap<uint64_t, CountCallback> m_countCallbacks;
+ Deque<uint64_t> m_callbackQueue;
Timer m_operationAndTransactionTimer;