| 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 e951c315075dad2133d95e487a9cf3449e7c3874..1513c2ad5b992fdd81be80fb789067744904e1aa 100644
|
| --- a/content/browser/indexed_db/indexed_db_callbacks.cc
|
| +++ b/content/browser/indexed_db/indexed_db_callbacks.cc
|
| @@ -284,6 +284,23 @@ static void BlobLookupForCursorPrefetch(
|
| new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params));
|
| }
|
|
|
| +static void BlobLookupForGetAll(
|
| + IndexedDBMsg_CallbacksSuccessArray_Params* params,
|
| + scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
|
| + const std::vector<IndexedDBValue>& 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,
|
| + 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) {
|
| @@ -530,6 +547,46 @@ void IndexedDBCallbacks::OnSuccess(IndexedDBValue* value) {
|
| dispatcher_host_ = NULL;
|
| }
|
|
|
| +void IndexedDBCallbacks::OnSuccessArray(std::vector<IndexedDBValue>* values) {
|
| + 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) {
|
| + params->values[i].bits.swap(values->at(i).bits);
|
| + if (!values->at(i).blob_info.empty()) {
|
| + found_blob_info = true;
|
| + FillInBlobData(values->at(i).blob_info,
|
| + ¶ms->values[i].blob_or_file_info);
|
| + for (const auto& blob_info : values->at(i).blob_info) {
|
| + if (!blob_info.mark_used_callback().is_null())
|
| + blob_info.mark_used_callback().Run();
|
| + }
|
| + }
|
| + }
|
| +
|
| + 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());
|
|
|
|
|