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