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 |
deleted file mode 100644 |
index a5bda9f950349ef2a7e3f4014227ea3dfa5d9c54..0000000000000000000000000000000000000000 |
--- a/content/browser/indexed_db/indexed_db_callbacks.cc |
+++ /dev/null |
@@ -1,612 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/indexed_db/indexed_db_callbacks.h" |
- |
-#include <stddef.h> |
- |
-#include <algorithm> |
-#include <utility> |
- |
-#include "base/metrics/histogram.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/time/time.h" |
-#include "content/browser/child_process_security_policy_impl.h" |
-#include "content/browser/fileapi/fileapi_message_filter.h" |
-#include "content/browser/indexed_db/indexed_db_blob_info.h" |
-#include "content/browser/indexed_db/indexed_db_connection.h" |
-#include "content/browser/indexed_db/indexed_db_context_impl.h" |
-#include "content/browser/indexed_db/indexed_db_cursor.h" |
-#include "content/browser/indexed_db/indexed_db_database_callbacks.h" |
-#include "content/browser/indexed_db/indexed_db_database_error.h" |
-#include "content/browser/indexed_db/indexed_db_metadata.h" |
-#include "content/browser/indexed_db/indexed_db_return_value.h" |
-#include "content/browser/indexed_db/indexed_db_tracing.h" |
-#include "content/browser/indexed_db/indexed_db_value.h" |
-#include "content/common/indexed_db/indexed_db_constants.h" |
-#include "content/common/indexed_db/indexed_db_messages.h" |
-#include "storage/browser/blob/blob_storage_context.h" |
-#include "storage/browser/blob/shareable_file_reference.h" |
-#include "storage/browser/quota/quota_manager.h" |
- |
-using storage::ShareableFileReference; |
- |
-namespace content { |
- |
-namespace { |
-const int32_t kNoCursor = -1; |
-const int32_t kNoDatabaseCallbacks = -1; |
-const int64_t kNoTransaction = -1; |
-} |
- |
-IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, |
- int32_t ipc_thread_id, |
- int32_t ipc_callbacks_id) |
- : dispatcher_host_(dispatcher_host), |
- ipc_callbacks_id_(ipc_callbacks_id), |
- ipc_thread_id_(ipc_thread_id), |
- ipc_cursor_id_(kNoCursor), |
- host_transaction_id_(kNoTransaction), |
- ipc_database_id_(kNoDatabase), |
- ipc_database_callbacks_id_(kNoDatabaseCallbacks), |
- data_loss_(blink::WebIDBDataLossNone), |
- sent_blocked_(false) {} |
- |
-IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, |
- int32_t ipc_thread_id, |
- int32_t ipc_callbacks_id, |
- int32_t ipc_cursor_id) |
- : dispatcher_host_(dispatcher_host), |
- ipc_callbacks_id_(ipc_callbacks_id), |
- ipc_thread_id_(ipc_thread_id), |
- ipc_cursor_id_(ipc_cursor_id), |
- host_transaction_id_(kNoTransaction), |
- ipc_database_id_(kNoDatabase), |
- ipc_database_callbacks_id_(kNoDatabaseCallbacks), |
- data_loss_(blink::WebIDBDataLossNone), |
- sent_blocked_(false) {} |
- |
-IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, |
- int32_t ipc_thread_id, |
- int32_t ipc_callbacks_id, |
- int32_t ipc_database_callbacks_id, |
- int64_t host_transaction_id, |
- const url::Origin& origin) |
- : dispatcher_host_(dispatcher_host), |
- ipc_callbacks_id_(ipc_callbacks_id), |
- ipc_thread_id_(ipc_thread_id), |
- ipc_cursor_id_(kNoCursor), |
- host_transaction_id_(host_transaction_id), |
- origin_(origin), |
- ipc_database_id_(kNoDatabase), |
- ipc_database_callbacks_id_(ipc_database_callbacks_id), |
- data_loss_(blink::WebIDBDataLossNone), |
- sent_blocked_(false) {} |
- |
-IndexedDBCallbacks::~IndexedDBCallbacks() {} |
- |
-void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { |
- DCHECK(dispatcher_host_.get()); |
- |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksError( |
- ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message())); |
- dispatcher_host_ = NULL; |
- |
- if (!connection_open_start_time_.is_null()) { |
- UMA_HISTOGRAM_MEDIUM_TIMES( |
- "WebCore.IndexedDB.OpenTime.Error", |
- base::TimeTicks::Now() - connection_open_start_time_); |
- connection_open_start_time_ = base::TimeTicks(); |
- } |
-} |
- |
-void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- 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_); |
- |
- std::vector<base::string16> list; |
- for (unsigned i = 0; i < value.size(); ++i) |
- list.push_back(value[i]); |
- |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessStringList( |
- ipc_thread_id_, ipc_callbacks_id_, list)); |
- dispatcher_host_ = NULL; |
-} |
- |
-void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- // No transaction/db callbacks for DeleteDatabase. |
- DCHECK_EQ(kNoTransaction == host_transaction_id_, |
- kNoDatabaseCallbacks == ipc_database_callbacks_id_); |
- DCHECK_EQ(kNoDatabase, ipc_database_id_); |
- |
- if (sent_blocked_) |
- return; |
- |
- sent_blocked_ = true; |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksIntBlocked( |
- ipc_thread_id_, ipc_callbacks_id_, existing_version)); |
- |
- if (!connection_open_start_time_.is_null()) { |
- UMA_HISTOGRAM_MEDIUM_TIMES( |
- "WebCore.IndexedDB.OpenTime.Blocked", |
- base::TimeTicks::Now() - connection_open_start_time_); |
- connection_open_start_time_ = base::TimeTicks(); |
- } |
-} |
- |
-void IndexedDBCallbacks::OnUpgradeNeeded( |
- int64_t old_version, |
- std::unique_ptr<IndexedDBConnection> connection, |
- const IndexedDBDatabaseMetadata& metadata, |
- const IndexedDBDataLossInfo& data_loss_info) { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- DCHECK_NE(kNoTransaction, host_transaction_id_); |
- DCHECK_EQ(kNoDatabase, ipc_database_id_); |
- DCHECK_NE(kNoDatabaseCallbacks, ipc_database_callbacks_id_); |
- |
- data_loss_ = data_loss_info.status; |
- dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); |
- int32_t ipc_database_id = |
- dispatcher_host_->Add(connection.release(), ipc_thread_id_, origin_); |
- if (ipc_database_id < 0) |
- return; |
- ipc_database_id_ = ipc_database_id; |
- IndexedDBMsg_CallbacksUpgradeNeeded_Params params; |
- params.ipc_thread_id = ipc_thread_id_; |
- params.ipc_callbacks_id = ipc_callbacks_id_; |
- params.ipc_database_id = ipc_database_id; |
- params.ipc_database_callbacks_id = ipc_database_callbacks_id_; |
- params.old_version = old_version; |
- params.idb_metadata = IndexedDBDispatcherHost::ConvertMetadata(metadata); |
- params.data_loss = data_loss_info.status; |
- params.data_loss_message = data_loss_info.message; |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksUpgradeNeeded(params)); |
- |
- if (!connection_open_start_time_.is_null()) { |
- UMA_HISTOGRAM_MEDIUM_TIMES( |
- "WebCore.IndexedDB.OpenTime.UpgradeNeeded", |
- base::TimeTicks::Now() - connection_open_start_time_); |
- connection_open_start_time_ = base::TimeTicks(); |
- } |
-} |
- |
-void IndexedDBCallbacks::OnSuccess( |
- std::unique_ptr<IndexedDBConnection> connection, |
- const IndexedDBDatabaseMetadata& metadata) { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- DCHECK_NE(kNoTransaction, host_transaction_id_); |
- DCHECK_NE(ipc_database_id_ == kNoDatabase, !connection); |
- DCHECK_NE(kNoDatabaseCallbacks, ipc_database_callbacks_id_); |
- |
- scoped_refptr<IndexedDBCallbacks> self(this); |
- |
- int32_t ipc_object_id = kNoDatabase; |
- // Only register if the connection was not previously sent in OnUpgradeNeeded. |
- if (ipc_database_id_ == kNoDatabase) { |
- ipc_object_id = |
- dispatcher_host_->Add(connection.release(), ipc_thread_id_, origin_); |
- } |
- |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBDatabase( |
- ipc_thread_id_, |
- ipc_callbacks_id_, |
- ipc_database_callbacks_id_, |
- ipc_object_id, |
- IndexedDBDispatcherHost::ConvertMetadata(metadata))); |
- dispatcher_host_ = NULL; |
- |
- if (!connection_open_start_time_.is_null()) { |
- UMA_HISTOGRAM_MEDIUM_TIMES( |
- "WebCore.IndexedDB.OpenTime.Success", |
- base::TimeTicks::Now() - connection_open_start_time_); |
- connection_open_start_time_ = base::TimeTicks(); |
- } |
-} |
- |
-static std::string CreateBlobData( |
- const IndexedDBBlobInfo& blob_info, |
- scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, |
- base::TaskRunner* task_runner) { |
- if (!blob_info.uuid().empty()) { |
- // We're sending back a live blob, not a reference into our backing store. |
- return dispatcher_host->HoldBlobData(blob_info); |
- } |
- scoped_refptr<ShareableFileReference> shareable_file = |
- ShareableFileReference::Get(blob_info.file_path()); |
- if (!shareable_file.get()) { |
- shareable_file = ShareableFileReference::GetOrCreate( |
- blob_info.file_path(), |
- ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, |
- task_runner); |
- if (!blob_info.release_callback().is_null()) |
- shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); |
- } |
- return dispatcher_host->HoldBlobData(blob_info); |
-} |
- |
-static bool CreateAllBlobs( |
- const std::vector<IndexedDBBlobInfo>& blob_info, |
- std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info, |
- scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) { |
- IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); |
- DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); |
- size_t i; |
- if (!dispatcher_host->blob_storage_context()) |
- return false; |
- for (i = 0; i < blob_info.size(); ++i) { |
- (*blob_or_file_info)[i].uuid = |
- CreateBlobData(blob_info[i], dispatcher_host, |
- dispatcher_host->context()->TaskRunner()); |
- } |
- return true; |
-} |
- |
-template <class ParamType, class MsgType> |
-static void CreateBlobsAndSend( |
- ParamType* params, |
- scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, |
- const std::vector<IndexedDBBlobInfo>& blob_info, |
- std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host)) |
- dispatcher_host->Send(new MsgType(*params)); |
-} |
- |
-static void BlobLookupForCursorPrefetch( |
- IndexedDBMsg_CallbacksSuccessCursorPrefetch_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[i].blob_or_file_info, dispatcher_host)) |
- return; |
- } |
- |
- dispatcher_host->Send( |
- 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) { |
- for (const auto& iter : blob_info) { |
- if (iter.is_file()) { |
- IndexedDBMsg_BlobOrFileInfo info; |
- info.is_file = true; |
- info.mime_type = iter.type(); |
- info.file_name = iter.file_name(); |
- info.file_path = iter.file_path().AsUTF16Unsafe(); |
- info.size = iter.size(); |
- info.last_modified = iter.last_modified().ToDoubleT(); |
- blob_or_file_info->push_back(info); |
- } else { |
- IndexedDBMsg_BlobOrFileInfo info; |
- info.mime_type = iter.type(); |
- info.size = iter.size(); |
- blob_or_file_info->push_back(info); |
- } |
- } |
-} |
- |
-void IndexedDBCallbacks::RegisterBlobsAndSend( |
- const std::vector<IndexedDBBlobInfo>& blob_info, |
- const base::Closure& callback) { |
- for (const auto& iter : blob_info) { |
- if (!iter.mark_used_callback().is_null()) |
- iter.mark_used_callback().Run(); |
- } |
- DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); |
-} |
- |
-void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, |
- const IndexedDBKey& key, |
- const IndexedDBKey& primary_key, |
- IndexedDBValue* value) { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- 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_); |
- |
- int32_t ipc_object_id = dispatcher_host_->Add(cursor.get()); |
- std::unique_ptr<IndexedDBMsg_CallbacksSuccessIDBCursor_Params> params( |
- new IndexedDBMsg_CallbacksSuccessIDBCursor_Params()); |
- params->ipc_thread_id = ipc_thread_id_; |
- params->ipc_callbacks_id = ipc_callbacks_id_; |
- params->ipc_cursor_id = ipc_object_id; |
- params->key = key; |
- params->primary_key = primary_key; |
- if (value && !value->empty()) |
- std::swap(params->value.bits, value->bits); |
- // TODO(alecflett): Avoid a copy here: the whole params object is |
- // being copied into the message. |
- if (!value || value->blob_info.empty()) { |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(*params)); |
- } else { |
- IndexedDBMsg_CallbacksSuccessIDBCursor_Params* p = params.get(); |
- FillInBlobData(value->blob_info, &p->value.blob_or_file_info); |
- RegisterBlobsAndSend( |
- value->blob_info, |
- base::Bind( |
- CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessIDBCursor_Params, |
- IndexedDBMsg_CallbacksSuccessIDBCursor>, |
- base::Owned(params.release()), dispatcher_host_, value->blob_info, |
- base::Unretained(&p->value.blob_or_file_info))); |
- } |
- dispatcher_host_ = NULL; |
-} |
- |
-void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, |
- const IndexedDBKey& primary_key, |
- IndexedDBValue* value) { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_NE(kNoCursor, ipc_cursor_id_); |
- 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_); |
- |
- IndexedDBCursor* idb_cursor = |
- dispatcher_host_->GetCursorFromId(ipc_cursor_id_); |
- |
- DCHECK(idb_cursor); |
- if (!idb_cursor) |
- return; |
- |
- std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params( |
- new IndexedDBMsg_CallbacksSuccessCursorContinue_Params()); |
- params->ipc_thread_id = ipc_thread_id_; |
- params->ipc_callbacks_id = ipc_callbacks_id_; |
- params->ipc_cursor_id = ipc_cursor_id_; |
- params->key = key; |
- params->primary_key = primary_key; |
- if (value && !value->empty()) |
- std::swap(params->value.bits, value->bits); |
- // TODO(alecflett): Avoid a copy here: the whole params object is |
- // being copied into the message. |
- if (!value || value->blob_info.empty()) { |
- dispatcher_host_->Send( |
- new IndexedDBMsg_CallbacksSuccessCursorContinue(*params)); |
- } else { |
- IndexedDBMsg_CallbacksSuccessCursorContinue_Params* p = params.get(); |
- FillInBlobData(value->blob_info, &p->value.blob_or_file_info); |
- RegisterBlobsAndSend( |
- value->blob_info, |
- base::Bind(CreateBlobsAndSend< |
- IndexedDBMsg_CallbacksSuccessCursorContinue_Params, |
- IndexedDBMsg_CallbacksSuccessCursorContinue>, |
- base::Owned(params.release()), dispatcher_host_, |
- value->blob_info, |
- base::Unretained(&p->value.blob_or_file_info))); |
- } |
- dispatcher_host_ = NULL; |
-} |
- |
-void IndexedDBCallbacks::OnSuccessWithPrefetch( |
- const std::vector<IndexedDBKey>& keys, |
- const std::vector<IndexedDBKey>& primary_keys, |
- std::vector<IndexedDBValue>* values) { |
- DCHECK_EQ(keys.size(), primary_keys.size()); |
- DCHECK_EQ(keys.size(), values->size()); |
- |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_NE(kNoCursor, ipc_cursor_id_); |
- 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_); |
- |
- std::vector<IndexedDBKey> msg_keys; |
- std::vector<IndexedDBKey> msg_primary_keys; |
- |
- for (size_t i = 0; i < keys.size(); ++i) { |
- msg_keys.push_back(keys[i]); |
- msg_primary_keys.push_back(primary_keys[i]); |
- } |
- |
- std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params( |
- new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params()); |
- params->ipc_thread_id = ipc_thread_id_; |
- params->ipc_callbacks_id = ipc_callbacks_id_; |
- params->ipc_cursor_id = ipc_cursor_id_; |
- params->keys = msg_keys; |
- params->primary_keys = msg_primary_keys; |
- 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_iter : values->at(i).blob_info) { |
- if (!blob_iter.mark_used_callback().is_null()) |
- blob_iter.mark_used_callback().Run(); |
- } |
- } |
- } |
- |
- if (found_blob_info) { |
- BrowserThread::PostTask(BrowserThread::IO, |
- FROM_HERE, |
- base::Bind(BlobLookupForCursorPrefetch, |
- base::Owned(params.release()), |
- dispatcher_host_, |
- *values)); |
- } else { |
- dispatcher_host_->Send( |
- new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); |
- } |
- dispatcher_host_ = NULL; |
-} |
- |
-void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
- DCHECK(dispatcher_host_.get()); |
- |
- if (value && value->primary_key.IsValid()) { |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- } else { |
- DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL); |
- } |
- 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_); |
- |
- std::unique_ptr<IndexedDBMsg_CallbacksSuccessValue_Params> params( |
- new IndexedDBMsg_CallbacksSuccessValue_Params()); |
- params->ipc_thread_id = ipc_thread_id_; |
- params->ipc_callbacks_id = ipc_callbacks_id_; |
- if (value && value->primary_key.IsValid()) { |
- params->value.primary_key = value->primary_key; |
- params->value.key_path = value->key_path; |
- } |
- if (value && !value->empty()) |
- std::swap(params->value.bits, value->bits); |
- if (!value || value->blob_info.empty()) { |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params)); |
- } else { |
- IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get(); |
- FillInBlobData(value->blob_info, &p->value.blob_or_file_info); |
- RegisterBlobsAndSend( |
- value->blob_info, |
- base::Bind(CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params, |
- IndexedDBMsg_CallbacksSuccessValue>, |
- base::Owned(params.release()), dispatcher_host_, |
- value->blob_info, |
- base::Unretained(&p->value.blob_or_file_info))); |
- } |
- 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_); |
- |
- std::unique_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()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- 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_); |
- |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIndexedDBKey( |
- ipc_thread_id_, ipc_callbacks_id_, value)); |
- dispatcher_host_ = NULL; |
-} |
- |
-void IndexedDBCallbacks::OnSuccess(int64_t value) { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- 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_); |
- |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger( |
- ipc_thread_id_, ipc_callbacks_id_, value)); |
- dispatcher_host_ = NULL; |
-} |
- |
-void IndexedDBCallbacks::OnSuccess() { |
- DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
- 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_); |
- |
- dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined( |
- ipc_thread_id_, ipc_callbacks_id_)); |
- dispatcher_host_ = NULL; |
-} |
- |
-void IndexedDBCallbacks::SetConnectionOpenStartTime( |
- const base::TimeTicks& start_time) { |
- connection_open_start_time_ = start_time; |
-} |
- |
-} // namespace content |