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 b62eeb025a1c1e098ff8e2b589764d940fcc548b..f8183fc6424db6a6c418d647c0c77c59f7573e37 100644 |
--- a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
@@ -85,6 +85,7 @@ DEFINE_TRACE(IDBRequest) { |
visitor->Trace(pending_cursor_); |
visitor->Trace(cursor_key_); |
visitor->Trace(cursor_primary_key_); |
+ visitor->Trace(loader_); |
EventTargetWithInlineData::Trace(visitor); |
SuspendableObject::Trace(visitor); |
} |
@@ -265,6 +266,13 @@ void IDBRequest::OnSuccess(std::unique_ptr<WebIDBCursor> backend, |
IDBKey* key, |
IDBKey* primary_key, |
PassRefPtr<IDBValue> value) { |
+ if (!loader_ && IDBRequestLoader::NeedsUnwrapping(value.Get())) { |
+ // TODO(pwnall): Tracing. |
+ loader_ = new IDBRequestLoader(this); |
+ loader_->Start(std::move(backend), key, primary_key, std::move(value)); |
+ return; |
+ } |
+ |
IDB_TRACE("IDBRequest::onSuccess(IDBCursor)"); |
if (!ShouldEnqueueEvent()) |
return; |
@@ -299,6 +307,13 @@ void IDBRequest::OnSuccess(IDBKey* idb_key) { |
} |
void IDBRequest::OnSuccess(const Vector<RefPtr<IDBValue>>& values) { |
+ if (!loader_ && IDBRequestLoader::NeedUnwrapping(values)) { |
+ // TODO(pwnall): Tracing. |
+ loader_ = new IDBRequestLoader(this); |
+ loader_->Start(values); |
+ return; |
+ } |
+ |
IDB_TRACE("IDBRequest::onSuccess([IDBValue])"); |
if (!ShouldEnqueueEvent()) |
return; |
@@ -320,11 +335,18 @@ static IDBObjectStore* EffectiveObjectStore(IDBAny* source) { |
#endif // DCHECK_IS_ON() |
void IDBRequest::OnSuccess(PassRefPtr<IDBValue> prp_value) { |
+ RefPtr<IDBValue> value(std::move(prp_value)); |
+ if (!loader_ && IDBRequestLoader::NeedsUnwrapping(value.Get())) { |
+ // TODO(pwnall): Tracing. |
+ loader_ = new IDBRequestLoader(this); |
+ loader_->Start(value.Release()); |
+ return; |
+ } |
+ |
IDB_TRACE("IDBRequest::onSuccess(IDBValue)"); |
if (!ShouldEnqueueEvent()) |
return; |
- RefPtr<IDBValue> value(std::move(prp_value)); |
AckReceivedBlobs(value.Get()); |
if (pending_cursor_) { |
@@ -372,6 +394,13 @@ void IDBRequest::SetResult(IDBAny* result) { |
void IDBRequest::OnSuccess(IDBKey* key, |
IDBKey* primary_key, |
PassRefPtr<IDBValue> value) { |
+ if (!loader_ && IDBRequestLoader::NeedsUnwrapping(value.Get())) { |
+ // TODO(pwnall): Tracing. |
+ loader_ = new IDBRequestLoader(this); |
+ loader_->Start(key, primary_key, std::move(value)); |
+ return; |
+ } |
+ |
IDB_TRACE("IDBRequest::onSuccess(key, primaryKey, value)"); |
if (!ShouldEnqueueEvent()) |
return; |