| 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 2cd04cee1f4d08913dcd6c95af7bf885dcdffb1f..42dff94b67a67a38be96b1db205b9a2624e9a9b8 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"
|
| @@ -380,10 +381,37 @@ void IDBTransaction::RegisterRequest(IDBRequest* request) {
|
|
|
| void IDBTransaction::UnregisterRequest(IDBRequest* request) {
|
| DCHECK(request);
|
| +#if DCHECK_IS_ON()
|
| + // Make sure that no pending IDBRequest gets left behind in the result queue.
|
| + DCHECK(!request->QueueItem() || request->QueueItem()->IsReady());
|
| +#endif // DCHECK_IS_ON()
|
| +
|
| // 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->EnqueueResponse();
|
| + result_queue_.pop_front();
|
| + }
|
| +}
|
| +
|
| void IDBTransaction::OnAbort(DOMException* error) {
|
| IDB_TRACE("IDBTransaction::onAbort");
|
| if (!GetExecutionContext()) {
|
|
|