Index: content/browser/indexed_db/indexed_db_dispatcher_host.cc |
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.cc b/content/browser/indexed_db/indexed_db_dispatcher_host.cc |
index dba6ec6b234b102ee46192e5e9ecc9a4d1494b8d..33d9779ccb785698523ef54dc02d23fedcaa8e6b 100644 |
--- a/content/browser/indexed_db/indexed_db_dispatcher_host.cc |
+++ b/content/browser/indexed_db/indexed_db_dispatcher_host.cc |
@@ -21,13 +21,13 @@ |
#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_metadata.h" |
#include "content/browser/indexed_db/indexed_db_observation.h" |
#include "content/browser/indexed_db/indexed_db_observer_changes.h" |
#include "content/browser/indexed_db/indexed_db_pending_connection.h" |
#include "content/browser/indexed_db/indexed_db_value.h" |
#include "content/browser/renderer_host/render_message_filter.h" |
#include "content/common/indexed_db/indexed_db_messages.h" |
+#include "content/common/indexed_db/indexed_db_metadata.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/user_metrics.h" |
#include "content/public/common/content_switches.h" |
@@ -47,6 +47,8 @@ namespace content { |
namespace { |
+const char kInvalidOrigin[] = "Origin is invalid"; |
+ |
bool IsValidOrigin(const url::Origin& origin) { |
return !origin.unique(); |
} |
@@ -59,6 +61,7 @@ IndexedDBDispatcherHost::IndexedDBDispatcherHost( |
IndexedDBContextImpl* indexed_db_context, |
ChromeBlobStorageContext* blob_storage_context) |
: BrowserMessageFilter(IndexedDBMsgStart), |
+ BrowserAssociatedInterface(this, this), |
request_context_getter_(request_context_getter), |
indexed_db_context_(indexed_db_context), |
blob_storage_context_(blob_storage_context), |
@@ -134,11 +137,6 @@ bool IndexedDBDispatcherHost::OnMessageReceived(const IPC::Message& message) { |
if (!handled) { |
handled = true; |
IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcherHost, message) |
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_FactoryGetDatabaseNames, |
- OnIDBFactoryGetDatabaseNames) |
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_FactoryOpen, OnIDBFactoryOpen) |
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_FactoryDeleteDatabase, |
- OnIDBFactoryDeleteDatabase) |
IPC_MESSAGE_HANDLER(IndexedDBHostMsg_AckReceivedBlobs, OnAckReceivedBlobs) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
@@ -154,7 +152,6 @@ int32_t IndexedDBDispatcherHost::Add(IndexedDBCursor* cursor) { |
} |
int32_t IndexedDBDispatcherHost::Add(IndexedDBConnection* connection, |
- int32_t ipc_thread_id, |
const url::Origin& origin) { |
if (!database_dispatcher_host_) { |
connection->Close(); |
@@ -262,40 +259,6 @@ IndexedDBCursor* IndexedDBDispatcherHost::GetCursorFromId( |
return cursor_dispatcher_host_->map_.Lookup(ipc_cursor_id); |
} |
-::IndexedDBDatabaseMetadata IndexedDBDispatcherHost::ConvertMetadata( |
- const content::IndexedDBDatabaseMetadata& web_metadata) { |
- ::IndexedDBDatabaseMetadata metadata; |
- metadata.id = web_metadata.id; |
- metadata.name = web_metadata.name; |
- metadata.version = web_metadata.version; |
- metadata.max_object_store_id = web_metadata.max_object_store_id; |
- |
- for (const auto& iter : web_metadata.object_stores) { |
- const content::IndexedDBObjectStoreMetadata& web_store_metadata = |
- iter.second; |
- ::IndexedDBObjectStoreMetadata idb_store_metadata; |
- idb_store_metadata.id = web_store_metadata.id; |
- idb_store_metadata.name = web_store_metadata.name; |
- idb_store_metadata.key_path = web_store_metadata.key_path; |
- idb_store_metadata.auto_increment = web_store_metadata.auto_increment; |
- idb_store_metadata.max_index_id = web_store_metadata.max_index_id; |
- |
- for (const auto& index_iter : web_store_metadata.indexes) { |
- const content::IndexedDBIndexMetadata& web_index_metadata = |
- index_iter.second; |
- ::IndexedDBIndexMetadata idb_index_metadata; |
- idb_index_metadata.id = web_index_metadata.id; |
- idb_index_metadata.name = web_index_metadata.name; |
- idb_index_metadata.key_path = web_index_metadata.key_path; |
- idb_index_metadata.unique = web_index_metadata.unique; |
- idb_index_metadata.multi_entry = web_index_metadata.multi_entry; |
- idb_store_metadata.indexes.push_back(idb_index_metadata); |
- } |
- metadata.object_stores.push_back(idb_store_metadata); |
- } |
- return metadata; |
-} |
- |
IndexedDBMsg_ObserverChanges IndexedDBDispatcherHost::ConvertObserverChanges( |
std::unique_ptr<IndexedDBObserverChanges> changes) { |
IndexedDBMsg_ObserverChanges idb_changes; |
@@ -315,71 +278,117 @@ IndexedDBMsg_Observation IndexedDBDispatcherHost::ConvertObservation( |
return idb_observation; |
} |
-void IndexedDBDispatcherHost::OnIDBFactoryGetDatabaseNames( |
- const IndexedDBHostMsg_FactoryGetDatabaseNames_Params& params) { |
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
+void IndexedDBDispatcherHost::GetDatabaseNames( |
+ ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info, |
+ const url::Origin& origin) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (!IsValidOrigin(params.origin)) { |
- bad_message::ReceivedBadMessage(this, bad_message::IDBDH_INVALID_ORIGIN); |
+ if (!IsValidOrigin(origin)) { |
+ mojo::ReportBadMessage(kInvalidOrigin); |
return; |
} |
- base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
- context()->GetIDBFactory()->GetDatabaseNames( |
- new IndexedDBCallbacks(this, params.ipc_thread_id, |
- params.ipc_callbacks_id), |
- params.origin, indexed_db_path, request_context_getter_); |
+ scoped_refptr<IndexedDBCallbacks> callbacks( |
+ new IndexedDBCallbacks(this, origin, std::move(callbacks_info))); |
+ indexed_db_context_->TaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&IndexedDBDispatcherHost::GetDatabaseNamesOnIDBThread, this, |
+ callbacks, origin)); |
+} |
+ |
+void IndexedDBDispatcherHost::Open( |
+ int32_t worker_thread, |
+ ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info, |
+ ::indexed_db::mojom::DatabaseCallbacksAssociatedPtrInfo |
+ database_callbacks_info, |
+ const url::Origin& origin, |
+ const base::string16& name, |
+ int64_t version, |
+ int64_t transaction_id) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
+ if (!IsValidOrigin(origin)) { |
+ mojo::ReportBadMessage(kInvalidOrigin); |
+ return; |
+ } |
+ |
+ scoped_refptr<IndexedDBCallbacks> callbacks( |
+ new IndexedDBCallbacks(this, origin, std::move(callbacks_info))); |
+ scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks( |
+ new IndexedDBDatabaseCallbacks(this, worker_thread, |
+ std::move(database_callbacks_info))); |
+ indexed_db_context_->TaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&IndexedDBDispatcherHost::OpenOnIDBThread, this, callbacks, |
+ database_callbacks, origin, name, version, transaction_id)); |
} |
-void IndexedDBDispatcherHost::OnIDBFactoryOpen( |
- const IndexedDBHostMsg_FactoryOpen_Params& params) { |
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
+void IndexedDBDispatcherHost::DeleteDatabase( |
+ ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info, |
+ const url::Origin& origin, |
+ const base::string16& name) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (!IsValidOrigin(params.origin)) { |
- bad_message::ReceivedBadMessage(this, bad_message::IDBDH_INVALID_ORIGIN); |
+ if (!IsValidOrigin(origin)) { |
+ mojo::ReportBadMessage(kInvalidOrigin); |
return; |
} |
+ scoped_refptr<IndexedDBCallbacks> callbacks( |
+ new IndexedDBCallbacks(this, origin, std::move(callbacks_info))); |
+ indexed_db_context_->TaskRunner()->PostTask( |
+ FROM_HERE, base::Bind(&IndexedDBDispatcherHost::DeleteDatabaseOnIDBThread, |
+ this, callbacks, origin, name)); |
+} |
+ |
+void IndexedDBDispatcherHost::GetDatabaseNamesOnIDBThread( |
+ scoped_refptr<IndexedDBCallbacks> callbacks, |
+ const url::Origin& origin) { |
+ DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
+ |
+ base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
+ context()->GetIDBFactory()->GetDatabaseNames( |
+ callbacks, origin, indexed_db_path, request_context_getter_); |
+} |
+ |
+void IndexedDBDispatcherHost::OpenOnIDBThread( |
+ scoped_refptr<IndexedDBCallbacks> callbacks, |
+ scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks, |
+ const url::Origin& origin, |
+ const base::string16& name, |
+ int64_t version, |
+ int64_t transaction_id) { |
+ DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
+ |
base::TimeTicks begin_time = base::TimeTicks::Now(); |
base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
- int64_t host_transaction_id = HostTransactionId(params.transaction_id); |
+ int64_t host_transaction_id = HostTransactionId(transaction_id); |
// TODO(dgrogan): Don't let a non-existing database be opened (and therefore |
// created) if this origin is already over quota. |
- scoped_refptr<IndexedDBCallbacks> callbacks = new IndexedDBCallbacks( |
- this, params.ipc_thread_id, params.ipc_callbacks_id, |
- params.ipc_database_callbacks_id, host_transaction_id, params.origin); |
callbacks->SetConnectionOpenStartTime(begin_time); |
- scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks = |
- new IndexedDBDatabaseCallbacks( |
- this, params.ipc_thread_id, params.ipc_database_callbacks_id); |
+ callbacks->set_host_transaction_id(host_transaction_id); |
std::unique_ptr<IndexedDBPendingConnection> connection = |
base::MakeUnique<IndexedDBPendingConnection>( |
callbacks, database_callbacks, ipc_process_id_, host_transaction_id, |
- params.version); |
+ version); |
DCHECK(request_context_getter_); |
- context()->GetIDBFactory()->Open(params.name, std::move(connection), |
- request_context_getter_, params.origin, |
+ context()->GetIDBFactory()->Open(name, std::move(connection), |
+ request_context_getter_, origin, |
indexed_db_path); |
} |
-void IndexedDBDispatcherHost::OnIDBFactoryDeleteDatabase( |
- const IndexedDBHostMsg_FactoryDeleteDatabase_Params& params) { |
+void IndexedDBDispatcherHost::DeleteDatabaseOnIDBThread( |
+ scoped_refptr<IndexedDBCallbacks> callbacks, |
+ const url::Origin& origin, |
+ const base::string16& name) { |
DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
- if (!IsValidOrigin(params.origin)) { |
- bad_message::ReceivedBadMessage(this, bad_message::IDBDH_INVALID_ORIGIN); |
- return; |
- } |
- |
base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
DCHECK(request_context_getter_); |
context()->GetIDBFactory()->DeleteDatabase( |
- params.name, request_context_getter_, |
- new IndexedDBCallbacks(this, params.ipc_thread_id, |
- params.ipc_callbacks_id), |
- params.origin, indexed_db_path); |
+ name, request_context_getter_, callbacks, origin, indexed_db_path); |
} |
// OnPutHelper exists only to allow us to hop threads while holding a reference |