| 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; | 
|  |