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