Index: third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
index fa26ce6c5aeeaf29190819da5069c7ecd8c15c20..c9f3326f31cb5ecdc7216e8b8732cfa39c1d4007 100644 |
--- a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
@@ -29,6 +29,8 @@ |
#include "modules/indexeddb/IDBRequest.h" |
#include <memory> |
+#include <utility> |
+ |
#include "bindings/core/v8/ExceptionState.h" |
#include "bindings/core/v8/ToV8ForCore.h" |
#include "bindings/modules/v8/ToV8ForModules.h" |
@@ -41,10 +43,13 @@ |
#include "modules/indexeddb/IDBCursorWithValue.h" |
#include "modules/indexeddb/IDBDatabase.h" |
#include "modules/indexeddb/IDBEventDispatcher.h" |
+#include "modules/indexeddb/IDBRequestQueueItem.h" |
#include "modules/indexeddb/IDBTracing.h" |
#include "modules/indexeddb/IDBValue.h" |
+#include "modules/indexeddb/IDBValueWrapping.h" |
#include "modules/indexeddb/WebIDBCallbacksImpl.h" |
#include "platform/SharedBuffer.h" |
+#include "platform/wtf/PtrUtil.h" |
#include "public/platform/WebBlobInfo.h" |
using blink::WebIDBCursor; |
@@ -200,7 +205,7 @@ IDBCursor* IDBRequest::GetResultCursor() const { |
void IDBRequest::SetResultCursor(IDBCursor* cursor, |
IDBKey* key, |
IDBKey* primary_key, |
- PassRefPtr<IDBValue> value) { |
+ RefPtr<IDBValue>&& value) { |
DCHECK_EQ(ready_state_, PENDING); |
cursor_key_ = key; |
cursor_primary_key_ = primary_key; |
@@ -234,9 +239,85 @@ bool IDBRequest::ShouldEnqueueEvent() const { |
return true; |
} |
+void IDBRequest::HandleResponse(DOMException* error) { |
+ transit_blob_handles_.clear(); |
+ if (!transaction_ || !transaction_->HasQueuedResults()) |
+ return EnqueueResponse(error); |
+ transaction_->EnqueueResult( |
+ WTF::MakeUnique<IDBRequestQueueItem>(this, error)); |
+} |
+ |
+void IDBRequest::HandleResponse(IDBKey* key) { |
+ transit_blob_handles_.clear(); |
+ DCHECK(transaction_); |
+ if (!transaction_->HasQueuedResults()) |
+ return EnqueueResponse(key); |
+ transaction_->EnqueueResult(WTF::MakeUnique<IDBRequestQueueItem>(this, key)); |
+} |
+ |
+void IDBRequest::HandleResponse(int64_t value_or_old_version) { |
+ transit_blob_handles_.clear(); |
+ if (!transaction_ || !transaction_->HasQueuedResults()) |
+ return EnqueueResponse(value_or_old_version); |
+ transaction_->EnqueueResult( |
+ WTF::MakeUnique<IDBRequestQueueItem>(this, value_or_old_version)); |
+} |
+ |
+void IDBRequest::HandleResponse() { |
+ transit_blob_handles_.clear(); |
+ if (!transaction_ || !transaction_->HasQueuedResults()) |
+ return EnqueueResponse(); |
+ transaction_->EnqueueResult(WTF::MakeUnique<IDBRequestQueueItem>(this)); |
+} |
+ |
+void IDBRequest::HandleResponse(std::unique_ptr<WebIDBCursor> backend, |
+ IDBKey* key, |
+ IDBKey* primary_key, |
+ RefPtr<IDBValue>&& value) { |
+ bool is_wrapped = IDBValueUnwrapper::IsWrapped(value.Get()); |
+ DCHECK(transaction_); |
+ if (!transaction_->HasQueuedResults() && !is_wrapped) { |
+ return EnqueueResponse(std::move(backend), key, primary_key, |
+ std::move(value)); |
+ } |
+ transaction_->EnqueueResult(WTF::MakeUnique<IDBRequestQueueItem>( |
+ this, std::move(backend), key, primary_key, std::move(value), |
+ is_wrapped)); |
+} |
+ |
+void IDBRequest::HandleResponse(RefPtr<IDBValue>&& value) { |
+ bool is_wrapped = IDBValueUnwrapper::IsWrapped(value.Get()); |
+ DCHECK(transaction_); |
+ if (!transaction_->HasQueuedResults() && !is_wrapped) |
+ return EnqueueResponse(std::move(value)); |
+ transaction_->EnqueueResult( |
+ WTF::MakeUnique<IDBRequestQueueItem>(this, std::move(value), is_wrapped)); |
+} |
+ |
+void IDBRequest::HandleResponse(const Vector<RefPtr<IDBValue>>& values) { |
+ bool is_wrapped = IDBValueUnwrapper::IsWrapped(values); |
+ DCHECK(transaction_); |
+ if (!transaction_->HasQueuedResults() && !is_wrapped) |
+ return EnqueueResponse(values); |
+ transaction_->EnqueueResult( |
+ WTF::MakeUnique<IDBRequestQueueItem>(this, values, is_wrapped)); |
+} |
+ |
+void IDBRequest::HandleResponse(IDBKey* key, |
+ IDBKey* primary_key, |
+ RefPtr<IDBValue>&& value) { |
+ bool is_wrapped = IDBValueUnwrapper::IsWrapped(value.Get()); |
+ |
+ DCHECK(transaction_); |
+ if (!transaction_->HasQueuedResults() && !is_wrapped) |
+ return EnqueueResponse(key, primary_key, std::move(value)); |
+ |
+ transaction_->EnqueueResult(WTF::MakeUnique<IDBRequestQueueItem>( |
+ this, key, primary_key, std::move(value), is_wrapped)); |
+} |
+ |
void IDBRequest::EnqueueResponse(DOMException* error) { |
- IDB_TRACE("IDBRequest::onError()"); |
- ClearPutOperationBlobs(); |
+ IDB_TRACE("IDBRequest::EnqueueResponse(DOMException)"); |
if (!ShouldEnqueueEvent()) |
return; |
@@ -260,8 +341,8 @@ void IDBRequest::EnqueueResponse(const Vector<String>& string_list) { |
void IDBRequest::EnqueueResponse(std::unique_ptr<WebIDBCursor> backend, |
IDBKey* key, |
IDBKey* primary_key, |
- PassRefPtr<IDBValue> value) { |
- IDB_TRACE("IDBRequest::onSuccess(IDBCursor)"); |
+ RefPtr<IDBValue>&& value) { |
+ IDB_TRACE("IDBRequest::EnqueueResponse(IDBCursor)"); |
if (!ShouldEnqueueEvent()) |
return; |
@@ -284,8 +365,7 @@ void IDBRequest::EnqueueResponse(std::unique_ptr<WebIDBCursor> backend, |
} |
void IDBRequest::EnqueueResponse(IDBKey* idb_key) { |
- IDB_TRACE("IDBRequest::onSuccess(IDBKey)"); |
- ClearPutOperationBlobs(); |
+ IDB_TRACE("IDBRequest::EnqueueResponse(IDBKey)"); |
if (!ShouldEnqueueEvent()) |
return; |
@@ -296,7 +376,7 @@ void IDBRequest::EnqueueResponse(IDBKey* idb_key) { |
} |
void IDBRequest::EnqueueResponse(const Vector<RefPtr<IDBValue>>& values) { |
- IDB_TRACE("IDBRequest::onSuccess([IDBValue])"); |
+ IDB_TRACE("IDBRequest::EnqueueResponse([IDBValue])"); |
if (!ShouldEnqueueEvent()) |
return; |
@@ -316,12 +396,11 @@ static IDBObjectStore* EffectiveObjectStore(IDBAny* source) { |
} |
#endif // DCHECK_IS_ON() |
-void IDBRequest::EnqueueResponse(PassRefPtr<IDBValue> prp_value) { |
- IDB_TRACE("IDBRequest::onSuccess(IDBValue)"); |
+void IDBRequest::EnqueueResponse(RefPtr<IDBValue>&& value) { |
+ IDB_TRACE("IDBRequest::EnqueueResponse(IDBValue)"); |
if (!ShouldEnqueueEvent()) |
return; |
- RefPtr<IDBValue> value(std::move(prp_value)); |
AckReceivedBlobs(value.Get()); |
if (pending_cursor_) { |
@@ -337,18 +416,18 @@ void IDBRequest::EnqueueResponse(PassRefPtr<IDBValue> prp_value) { |
value->KeyPath() == EffectiveObjectStore(source_)->IdbKeyPath()); |
#endif |
- EnqueueResultInternal(IDBAny::Create(value.Release())); |
+ EnqueueResultInternal(IDBAny::Create(std::move(value))); |
} |
void IDBRequest::EnqueueResponse(int64_t value) { |
- IDB_TRACE("IDBRequest::onSuccess(int64_t)"); |
+ IDB_TRACE("IDBRequest::EnqueueResponse(int64_t)"); |
if (!ShouldEnqueueEvent()) |
return; |
EnqueueResultInternal(IDBAny::Create(value)); |
} |
void IDBRequest::EnqueueResponse() { |
- IDB_TRACE("IDBRequest::onSuccess()"); |
+ IDB_TRACE("IDBRequest::EnqueueResponse()"); |
if (!ShouldEnqueueEvent()) |
return; |
EnqueueResultInternal(IDBAny::CreateUndefined()); |
@@ -369,8 +448,8 @@ void IDBRequest::SetResult(IDBAny* result) { |
void IDBRequest::EnqueueResponse(IDBKey* key, |
IDBKey* primary_key, |
- PassRefPtr<IDBValue> value) { |
- IDB_TRACE("IDBRequest::onSuccess(key, primaryKey, value)"); |
+ RefPtr<IDBValue>&& value) { |
+ IDB_TRACE("IDBRequest::EnqueueResponse(IDBKey, IDBKey primaryKey, IDBValue)"); |
if (!ShouldEnqueueEvent()) |
return; |