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 8783d3b1049623997bd3145a5593259b8334a222..0106fbcdd41f0f9b3fec7a396cee5eebaf8f6a85 100644 |
--- a/content/browser/indexed_db/indexed_db_callbacks.cc |
+++ b/content/browser/indexed_db/indexed_db_callbacks.cc |
@@ -18,28 +18,50 @@ |
#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 "content/common/indexed_db/indexed_db_metadata.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 indexed_db::mojom::CallbacksAssociatedPtrInfo; |
using storage::ShareableFileReference; |
namespace content { |
namespace { |
const int32_t kNoCursor = -1; |
-const int32_t kNoDatabaseCallbacks = -1; |
const int64_t kNoTransaction = -1; |
} |
+class IndexedDBCallbacks::IOThreadHelper { |
+ public: |
+ explicit IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info); |
+ ~IOThreadHelper(); |
+ |
+ void SendError(const IndexedDBDatabaseError& error); |
+ void SendSuccessStringList(const std::vector<base::string16>& value); |
+ void SendBlocked(int64_t existing_version); |
+ void SendUpgradeNeeded(int32_t database_id, |
+ int64_t old_version, |
+ blink::WebIDBDataLoss data_loss, |
+ const std::string& data_loss_message, |
+ const content::IndexedDBDatabaseMetadata& metadata); |
+ void SendSuccessDatabase(int32_t database_id, |
+ const content::IndexedDBDatabaseMetadata& metadata); |
+ void SendSuccessInteger(int64_t value); |
+ |
+ private: |
+ ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); |
+}; |
+ |
IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, |
int32_t ipc_thread_id, |
int32_t ipc_callbacks_id) |
@@ -49,9 +71,9 @@ IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, |
ipc_cursor_id_(kNoCursor), |
host_transaction_id_(kNoTransaction), |
ipc_database_id_(kNoDatabase), |
- ipc_database_callbacks_id_(kNoDatabaseCallbacks), |
data_loss_(blink::WebIDBDataLossNone), |
- sent_blocked_(false) {} |
+ sent_blocked_(false), |
+ io_helper_(nullptr) {} |
IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, |
int32_t ipc_thread_id, |
@@ -63,35 +85,38 @@ IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, |
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) {} |
+ sent_blocked_(false), |
+ io_helper_(nullptr) {} |
-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) |
+IndexedDBCallbacks::IndexedDBCallbacks( |
+ IndexedDBDispatcherHost* dispatcher_host, |
+ const url::Origin& origin, |
+ ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) |
: 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), |
+ host_transaction_id_(kNoTransaction), |
origin_(origin), |
ipc_database_id_(kNoDatabase), |
- ipc_database_callbacks_id_(ipc_database_callbacks_id), |
data_loss_(blink::WebIDBDataLossNone), |
- sent_blocked_(false) {} |
+ sent_blocked_(false), |
+ io_helper_(new IOThreadHelper(std::move(callbacks_info))) {} |
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 (io_helper_) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&IOThreadHelper::SendError, |
+ base::Unretained(io_helper_.get()), error)); |
+ } else { |
+ dispatcher_host_->Send(new IndexedDBMsg_CallbacksError( |
+ ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message())); |
+ } |
+ dispatcher_host_ = nullptr; |
if (!connection_open_start_time_.is_null()) { |
UMA_HISTOGRAM_MEDIUM_TIMES( |
@@ -103,37 +128,32 @@ void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { |
void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { |
DCHECK(dispatcher_host_.get()); |
- |
+ DCHECK(io_helper_); |
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; |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&IOThreadHelper::SendSuccessStringList, |
+ base::Unretained(io_helper_.get()), value)); |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { |
DCHECK(dispatcher_host_.get()); |
- |
+ DCHECK(io_helper_); |
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)); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&IOThreadHelper::SendBlocked, |
+ base::Unretained(io_helper_.get()), existing_version)); |
if (!connection_open_start_time_.is_null()) { |
UMA_HISTOGRAM_MEDIUM_TIMES( |
@@ -149,29 +169,26 @@ void IndexedDBCallbacks::OnUpgradeNeeded( |
const IndexedDBDatabaseMetadata& metadata, |
const IndexedDBDataLossInfo& data_loss_info) { |
DCHECK(dispatcher_host_.get()); |
- |
- DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
+ DCHECK(io_helper_); |
DCHECK_NE(kNoTransaction, host_transaction_id_); |
+ DCHECK_EQ(kNoCursor, ipc_cursor_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_); |
+ dispatcher_host_->Add(connection.release(), 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)); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&IOThreadHelper::SendUpgradeNeeded, |
+ base::Unretained(io_helper_.get()), ipc_database_id, |
+ old_version, data_loss_info.status, data_loss_info.message, |
+ metadata)); |
if (!connection_open_start_time_.is_null()) { |
UMA_HISTOGRAM_MEDIUM_TIMES( |
@@ -185,28 +202,24 @@ void IndexedDBCallbacks::OnSuccess( |
std::unique_ptr<IndexedDBConnection> connection, |
const IndexedDBDatabaseMetadata& metadata) { |
DCHECK(dispatcher_host_.get()); |
- |
+ DCHECK(io_helper_); |
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_); |
+ ipc_object_id = dispatcher_host_->Add(connection.release(), 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; |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&IOThreadHelper::SendSuccessDatabase, |
+ base::Unretained(io_helper_.get()), ipc_object_id, metadata)); |
+ dispatcher_host_ = nullptr; |
if (!connection_open_start_time_.is_null()) { |
UMA_HISTOGRAM_MEDIUM_TIMES( |
@@ -335,12 +348,12 @@ void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, |
const IndexedDBKey& key, |
const IndexedDBKey& primary_key, |
IndexedDBValue* value) { |
+ DCHECK(!io_helper_); |
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()); |
@@ -368,18 +381,18 @@ void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, |
base::Owned(params.release()), dispatcher_host_, value->blob_info, |
base::Unretained(&p->value.blob_or_file_info))); |
} |
- dispatcher_host_ = NULL; |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, |
const IndexedDBKey& primary_key, |
IndexedDBValue* value) { |
+ DCHECK(!io_helper_); |
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 = |
@@ -415,13 +428,14 @@ void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, |
value->blob_info, |
base::Unretained(&p->value.blob_or_file_info))); |
} |
- dispatcher_host_ = NULL; |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnSuccessWithPrefetch( |
const std::vector<IndexedDBKey>& keys, |
const std::vector<IndexedDBKey>& primary_keys, |
std::vector<IndexedDBValue>* values) { |
+ DCHECK(!io_helper_); |
DCHECK_EQ(keys.size(), primary_keys.size()); |
DCHECK_EQ(keys.size(), values->size()); |
@@ -430,7 +444,6 @@ void IndexedDBCallbacks::OnSuccessWithPrefetch( |
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; |
@@ -475,10 +488,11 @@ void IndexedDBCallbacks::OnSuccessWithPrefetch( |
dispatcher_host_->Send( |
new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); |
} |
- dispatcher_host_ = NULL; |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
+ DCHECK(!io_helper_); |
DCHECK(dispatcher_host_.get()); |
if (value && value->primary_key.IsValid()) { |
@@ -488,7 +502,6 @@ void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
} |
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( |
@@ -514,17 +527,17 @@ void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { |
value->blob_info, |
base::Unretained(&p->value.blob_or_file_info))); |
} |
- dispatcher_host_ = NULL; |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnSuccessArray( |
std::vector<IndexedDBReturnValue>* values, |
const IndexedDBKeyPath& key_path) { |
+ DCHECK(!io_helper_); |
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( |
@@ -559,49 +572,54 @@ void IndexedDBCallbacks::OnSuccessArray( |
dispatcher_host_->Send( |
new IndexedDBMsg_CallbacksSuccessArray(*params.get())); |
} |
- dispatcher_host_ = NULL; |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { |
+ DCHECK(!io_helper_); |
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; |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnSuccess(int64_t value) { |
DCHECK(dispatcher_host_.get()); |
+ if (io_helper_) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&IOThreadHelper::SendSuccessInteger, |
+ base::Unretained(io_helper_.get()), value)); |
+ } else { |
+ DCHECK_EQ(kNoCursor, ipc_cursor_id_); |
+ DCHECK_EQ(kNoTransaction, host_transaction_id_); |
+ DCHECK_EQ(kNoDatabase, ipc_database_id_); |
+ DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
- 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; |
+ dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger( |
+ ipc_thread_id_, ipc_callbacks_id_, value)); |
+ } |
+ dispatcher_host_ = nullptr; |
} |
void IndexedDBCallbacks::OnSuccess() { |
+ DCHECK(!io_helper_); |
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; |
+ dispatcher_host_ = nullptr; |
} |
bool IndexedDBCallbacks::IsValid() const { |
@@ -615,4 +633,46 @@ void IndexedDBCallbacks::SetConnectionOpenStartTime( |
connection_open_start_time_ = start_time; |
} |
+IndexedDBCallbacks::IOThreadHelper::IOThreadHelper( |
+ CallbacksAssociatedPtrInfo callbacks_info) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ callbacks_.Bind(std::move(callbacks_info)); |
+} |
+ |
+IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {} |
+ |
+void IndexedDBCallbacks::IOThreadHelper::SendError( |
+ const IndexedDBDatabaseError& error) { |
+ callbacks_->Error(error.code(), error.message()); |
+} |
+ |
+void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList( |
+ const std::vector<base::string16>& value) { |
+ callbacks_->SuccessStringList(value); |
+} |
+ |
+void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) { |
+ callbacks_->Blocked(existing_version); |
+} |
+ |
+void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded( |
+ int32_t database_id, |
+ int64_t old_version, |
+ blink::WebIDBDataLoss data_loss, |
+ const std::string& data_loss_message, |
+ const content::IndexedDBDatabaseMetadata& metadata) { |
+ callbacks_->UpgradeNeeded(database_id, old_version, data_loss, |
+ data_loss_message, metadata); |
+} |
+ |
+void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase( |
+ int32_t database_id, |
+ const content::IndexedDBDatabaseMetadata& metadata) { |
+ callbacks_->SuccessDatabase(database_id, metadata); |
+} |
+ |
+void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { |
+ callbacks_->SuccessInteger(value); |
+} |
+ |
} // namespace content |