Chromium Code Reviews| Index: content/browser/indexed_db/indexed_db_callbacks.cc |
| diff --git a/content/browser/indexed_db/indexed_db_callbacks.cc b/content/browser/indexed_db/indexed_db_callbacks.cc |
| index aa5497376f415566b8f1c6b4326c8fd92ff86371..6bd913de806cd600de88c5b97177e30ce5d2633a 100644 |
| --- a/content/browser/indexed_db/indexed_db_callbacks.cc |
| +++ b/content/browser/indexed_db/indexed_db_callbacks.cc |
| @@ -285,6 +285,23 @@ static void BlobLookupForCursorPrefetch( |
| new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params)); |
| } |
| +static void BlobLookupForGetAll( |
| + IndexedDBMsg_CallbacksSuccessArray_Params* params, |
| + scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, |
| + const std::vector<IndexedDBReturnValue>& values) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DCHECK_EQ(values.size(), params->values.size()); |
| + |
| + for (size_t i = 0; i < values.size(); ++i) { |
| + if (!CreateAllBlobs(values[i].blob_info, |
| + ¶ms->values.at(i).blob_or_file_info, |
|
jsbell
2015/04/28 00:06:53
Why at() rather than [] ?
cmumford
2015/04/29 23:17:46
I usually only use at() when it's a pointer. I pre
|
| + dispatcher_host)) |
| + return; |
| + } |
| + |
| + dispatcher_host->Send(new IndexedDBMsg_CallbacksSuccessArray(*params)); |
| +} |
| + |
| static void FillInBlobData( |
| const std::vector<IndexedDBBlobInfo>& blob_info, |
| std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) { |
| @@ -504,6 +521,51 @@ void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
| dispatcher_host_ = NULL; |
| } |
| +void IndexedDBCallbacks::OnSuccessArray( |
| + std::vector<IndexedDBReturnValue>* values, |
| + const IndexedDBKeyPath& key_path) { |
| + DCHECK(dispatcher_host_.get()); |
| + |
| + DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| + DCHECK_EQ(kNoDatabase, ipc_database_id_); |
| + DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); |
| + DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| + |
| + scoped_ptr<IndexedDBMsg_CallbacksSuccessArray_Params> params( |
| + new IndexedDBMsg_CallbacksSuccessArray_Params()); |
| + params->ipc_thread_id = ipc_thread_id_; |
| + params->ipc_callbacks_id = ipc_callbacks_id_; |
| + params->values.resize(values->size()); |
| + |
| + bool found_blob_info = false; |
| + for (size_t i = 0; i < values->size(); ++i) { |
| + IndexedDBMsg_ReturnValue& pvalue = params->values[i]; |
| + IndexedDBReturnValue& value = (*values)[i]; |
| + pvalue.bits.swap(value.bits); |
| + if (!value.blob_info.empty()) { |
| + found_blob_info = true; |
| + FillInBlobData(value.blob_info, &pvalue.blob_or_file_info); |
| + for (const auto& blob_info : value.blob_info) { |
| + if (!blob_info.mark_used_callback().is_null()) |
| + blob_info.mark_used_callback().Run(); |
| + } |
| + } |
| + pvalue.primary_key = value.primary_key; |
| + pvalue.key_path = key_path; |
| + } |
| + |
| + if (found_blob_info) { |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(BlobLookupForGetAll, base::Owned(params.release()), |
| + dispatcher_host_, *values)); |
| + } else { |
| + dispatcher_host_->Send( |
| + new IndexedDBMsg_CallbacksSuccessArray(*params.get())); |
| + } |
| + dispatcher_host_ = NULL; |
| +} |
| + |
| void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { |
| DCHECK(dispatcher_host_.get()); |