Index: third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp |
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp |
index 075d84614c07acf1097f1e78d63185b8fe9225e6..2ff963bf47d2e17e0db23f075dcf2a91b01fd003 100644 |
--- a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp |
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.cpp |
@@ -36,6 +36,7 @@ |
#include "modules/indexeddb/IDBIndex.h" |
#include "modules/indexeddb/IDBObjectStore.h" |
#include "modules/indexeddb/IDBOpenDBRequest.h" |
+#include "modules/indexeddb/IDBRequestQueueItem.h" |
#include "modules/indexeddb/IDBTracing.h" |
#include "platform/bindings/ScriptState.h" |
#include "platform/bindings/V8PerIsolateData.h" |
@@ -379,10 +380,33 @@ void IDBTransaction::RegisterRequest(IDBRequest* request) { |
void IDBTransaction::UnregisterRequest(IDBRequest* request) { |
DCHECK(request); |
+ DCHECK_EQ(request->QueueItem(), nullptr); |
// If we aborted the request, it will already have been removed. |
request_list_.erase(request); |
} |
+void IDBTransaction::EnqueueResult( |
+ std::unique_ptr<IDBRequestQueueItem> result) { |
+ DCHECK(result); |
+ DCHECK(HasQueuedResults() || !result->IsReady()); |
+ |
+ result_queue_.push_back(std::move(result)); |
+ // StartLoading() may complete post-processing synchronously, so the result |
+ // needs to be in the queue before StartLoading() is called. |
+ result_queue_.back()->StartLoading(); |
+} |
+ |
+void IDBTransaction::OnResultReady() { |
+ while (!result_queue_.empty()) { |
+ IDBRequestQueueItem* result = result_queue_.front().get(); |
+ if (!result->IsReady()) |
+ break; |
+ |
+ result->FireCallback(); |
+ result_queue_.pop_front(); |
+ } |
+} |
+ |
void IDBTransaction::OnAbort(DOMException* error) { |
IDB_TRACE("IDBTransaction::onAbort"); |
if (!GetExecutionContext()) { |