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..bfd0a8a0d06b3bc7db64fc04f4e230870067a429 100644 |
--- a/content/browser/indexed_db/indexed_db_callbacks.cc |
+++ b/content/browser/indexed_db/indexed_db_callbacks.cc |
@@ -285,6 +285,22 @@ 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[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) { |
@@ -504,6 +520,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()); |