| 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()) {
|
|
|