Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(797)

Unified Diff: content/browser/in_process_webkit/indexed_db_dispatcher_host.cc

Issue 17840006: Move IndexedDB files out of in_process_webkit (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/in_process_webkit/indexed_db_dispatcher_host.cc
diff --git a/content/browser/in_process_webkit/indexed_db_dispatcher_host.cc b/content/browser/in_process_webkit/indexed_db_dispatcher_host.cc
deleted file mode 100644
index 74da3b183640d053975274a38b40a54e66556376..0000000000000000000000000000000000000000
--- a/content/browser/in_process_webkit/indexed_db_dispatcher_host.cc
+++ /dev/null
@@ -1,853 +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/in_process_webkit/indexed_db_dispatcher_host.h"
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/process.h"
-#include "base/process_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "content/browser/in_process_webkit/indexed_db_callbacks.h"
-#include "content/browser/in_process_webkit/indexed_db_database_callbacks.h"
-#include "content/browser/indexed_db/indexed_db_context_impl.h"
-#include "content/browser/indexed_db/indexed_db_metadata.h"
-#include "content/browser/indexed_db/webidbcursor_impl.h"
-#include "content/browser/indexed_db/webidbcursor_impl.h"
-#include "content/browser/indexed_db/webidbdatabase_impl.h"
-#include "content/browser/renderer_host/render_message_filter.h"
-#include "content/common/indexed_db/indexed_db_messages.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/user_metrics.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/common/result_codes.h"
-#include "googleurl/src/gurl.h"
-#include "third_party/WebKit/public/platform/WebIDBDatabase.h"
-#include "third_party/WebKit/public/platform/WebIDBDatabaseError.h"
-#include "third_party/WebKit/public/platform/WebIDBDatabaseException.h"
-#include "webkit/browser/database/database_util.h"
-#include "webkit/common/database/database_identifier.h"
-
-using webkit_database::DatabaseUtil;
-using WebKit::WebIDBDatabaseError;
-using WebKit::WebIDBKey;
-
-namespace content {
-
-IndexedDBDispatcherHost::IndexedDBDispatcherHost(
- int ipc_process_id,
- IndexedDBContextImpl* indexed_db_context)
- : indexed_db_context_(indexed_db_context),
- database_dispatcher_host_(new DatabaseDispatcherHost(this)),
- cursor_dispatcher_host_(new CursorDispatcherHost(this)),
- ipc_process_id_(ipc_process_id) {
- DCHECK(indexed_db_context_.get());
-}
-
-IndexedDBDispatcherHost::~IndexedDBDispatcherHost() {}
-
-void IndexedDBDispatcherHost::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
- bool success = indexed_db_context_->TaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&IndexedDBDispatcherHost::ResetDispatcherHosts, this));
-
- if (!success)
- ResetDispatcherHosts();
-}
-
-void IndexedDBDispatcherHost::OnDestruct() const {
- // The last reference to the dispatcher may be a posted task, which would
- // be destructed on the IndexedDB thread. Without this override, that would
- // take the dispatcher with it. Since the dispatcher may be keeping the
- // IndexedDBContext alive, it might be destructed to on its own thread,
- // which is not supported. Ensure destruction runs on the IO thread instead.
- BrowserThread::DeleteOnIOThread::Destruct(this);
-}
-
-void IndexedDBDispatcherHost::ResetDispatcherHosts() {
- // It is important that the various *_dispatcher_host_ members are reset
- // on the IndexedDB thread, since there might be incoming messages on that
- // thread, and we must not reset the dispatcher hosts until after those
- // messages are processed.
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
-
- // Note that we explicitly separate CloseAll() from destruction of the
- // DatabaseDispatcherHost, since CloseAll() can invoke callbacks which need to
- // be dispatched through database_dispatcher_host_.
- database_dispatcher_host_->CloseAll();
- database_dispatcher_host_.reset();
- cursor_dispatcher_host_.reset();
-}
-
-base::TaskRunner* IndexedDBDispatcherHost::OverrideTaskRunnerForMessage(
- const IPC::Message& message) {
- if (IPC_MESSAGE_CLASS(message) == IndexedDBMsgStart)
- return indexed_db_context_->TaskRunner();
- return NULL;
-}
-
-bool IndexedDBDispatcherHost::OnMessageReceived(const IPC::Message& message,
- bool* message_was_ok) {
- if (IPC_MESSAGE_CLASS(message) != IndexedDBMsgStart)
- return false;
-
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
-
- bool handled =
- database_dispatcher_host_->OnMessageReceived(message, message_was_ok) ||
- cursor_dispatcher_host_->OnMessageReceived(message, message_was_ok);
-
- if (!handled) {
- handled = true;
- IPC_BEGIN_MESSAGE_MAP_EX(IndexedDBDispatcherHost, message, *message_was_ok)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_FactoryGetDatabaseNames,
- OnIDBFactoryGetDatabaseNames)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_FactoryOpen, OnIDBFactoryOpen)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_FactoryDeleteDatabase,
- OnIDBFactoryDeleteDatabase)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- }
- return handled;
-}
-
-int32 IndexedDBDispatcherHost::Add(WebIDBCursorImpl* idb_cursor) {
- if (!cursor_dispatcher_host_) {
- delete idb_cursor;
- return 0;
- }
- return cursor_dispatcher_host_->map_.Add(idb_cursor);
-}
-
-int32 IndexedDBDispatcherHost::Add(WebIDBDatabaseImpl* idb_database,
- int32 ipc_thread_id,
- const GURL& origin_url) {
- if (!database_dispatcher_host_) {
- delete idb_database;
- return 0;
- }
- int32 ipc_database_id = database_dispatcher_host_->map_.Add(idb_database);
- Context()->ConnectionOpened(origin_url, idb_database);
- database_dispatcher_host_->database_url_map_[ipc_database_id] = origin_url;
- return ipc_database_id;
-}
-
-void IndexedDBDispatcherHost::RegisterTransactionId(int64 host_transaction_id,
- const GURL& url) {
- if (!database_dispatcher_host_)
- return;
- database_dispatcher_host_->transaction_url_map_[host_transaction_id] = url;
-}
-
-int64 IndexedDBDispatcherHost::HostTransactionId(int64 transaction_id) {
- // Inject the renderer process id into the transaction id, to
- // uniquely identify this transaction, and effectively bind it to
- // the renderer that initiated it. The lower 32 bits of
- // transaction_id are guaranteed to be unique within that renderer.
- base::ProcessId pid = base::GetProcId(peer_handle());
- DCHECK(!(transaction_id >> 32)) << "Transaction ids can only be 32 bits";
- COMPILE_ASSERT(sizeof(base::ProcessId) <= sizeof(int32),
- Process_ID_must_fit_in_32_bits);
-
- return transaction_id | (static_cast<uint64>(pid) << 32);
-}
-
-int64 IndexedDBDispatcherHost::RendererTransactionId(
- int64 host_transaction_id) {
- DCHECK(host_transaction_id >> 32 == base::GetProcId(peer_handle()))
- << "Invalid renderer target for transaction id";
- return host_transaction_id & 0xffffffff;
-}
-
-WebIDBCursorImpl* IndexedDBDispatcherHost::GetCursorFromId(
- int32 ipc_cursor_id) {
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- 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.int_version = web_metadata.int_version;
- metadata.max_object_store_id = web_metadata.max_object_store_id;
-
- for (content::IndexedDBDatabaseMetadata::ObjectStoreMap::const_iterator iter =
- web_metadata.object_stores.begin();
- iter != web_metadata.object_stores.end();
- ++iter) {
-
- 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.keyPath = web_store_metadata.key_path;
- idb_store_metadata.autoIncrement = web_store_metadata.auto_increment;
- idb_store_metadata.max_index_id = web_store_metadata.max_index_id;
-
- for (content::IndexedDBObjectStoreMetadata::IndexMap::const_iterator
- index_iter = web_store_metadata.indexes.begin();
- index_iter != web_store_metadata.indexes.end();
- ++index_iter) {
- 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.keyPath = web_index_metadata.key_path;
- idb_index_metadata.unique = web_index_metadata.unique;
- idb_index_metadata.multiEntry = web_index_metadata.multi_entry;
- idb_store_metadata.indexes.push_back(idb_index_metadata);
- }
- metadata.object_stores.push_back(idb_store_metadata);
- }
- return metadata;
-}
-
-void IndexedDBDispatcherHost::OnIDBFactoryGetDatabaseNames(
- const IndexedDBHostMsg_FactoryGetDatabaseNames_Params& params) {
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- base::FilePath indexed_db_path = indexed_db_context_->data_path();
-
- Context()->GetIDBFactory()->getDatabaseNames(
- new IndexedDBCallbacks<std::vector<string16> >(
- this, params.ipc_thread_id, params.ipc_callbacks_id),
- WebKit::WebString::fromUTF8(params.database_identifier),
- indexed_db_path.AsUTF16Unsafe());
-}
-
-void IndexedDBDispatcherHost::OnIDBFactoryOpen(
- const IndexedDBHostMsg_FactoryOpen_Params& params) {
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- base::FilePath indexed_db_path = indexed_db_context_->data_path();
-
- GURL origin_url =
- webkit_database::GetOriginFromIdentifier(params.database_identifier);
-
- int64 host_transaction_id = HostTransactionId(params.transaction_id);
-
- // TODO(dgrogan): Don't let a non-existing database be opened (and therefore
- // created) if this origin is already over quota.
- Context()->GetIDBFactory()
- ->open(params.name,
- params.version,
- host_transaction_id,
- new IndexedDBCallbacksDatabase(this,
- params.ipc_thread_id,
- params.ipc_callbacks_id,
- params.ipc_database_callbacks_id,
- host_transaction_id,
- origin_url),
- new IndexedDBDatabaseCallbacks(
- this, params.ipc_thread_id, params.ipc_database_callbacks_id),
- WebKit::WebString::fromUTF8(params.database_identifier),
- indexed_db_path.AsUTF16Unsafe());
-}
-
-void IndexedDBDispatcherHost::OnIDBFactoryDeleteDatabase(
- const IndexedDBHostMsg_FactoryDeleteDatabase_Params& params) {
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- base::FilePath indexed_db_path = indexed_db_context_->data_path();
-
- Context()->GetIDBFactory()
- ->deleteDatabase(params.name,
- new IndexedDBCallbacks<std::vector<char> >(
- this, params.ipc_thread_id, params.ipc_callbacks_id),
- WebKit::WebString::fromUTF8(params.database_identifier),
- indexed_db_path.AsUTF16Unsafe());
-}
-
-void IndexedDBDispatcherHost::FinishTransaction(int64 host_transaction_id,
- bool committed) {
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- TransactionIDToURLMap& transaction_url_map =
- database_dispatcher_host_->transaction_url_map_;
- TransactionIDToSizeMap& transaction_size_map =
- database_dispatcher_host_->transaction_size_map_;
- TransactionIDToDatabaseIDMap& transaction_database_map =
- database_dispatcher_host_->transaction_database_map_;
- if (committed)
- Context()->TransactionComplete(transaction_url_map[host_transaction_id]);
- // It's unclear if std::map::erase(key) has defined behavior if the
- // key is not found.
- // TODO(alecflett): Remove if it is proven that it is safe.
- if (transaction_url_map.find(host_transaction_id) !=
- transaction_url_map.end())
- transaction_url_map.erase(host_transaction_id);
- if (transaction_size_map.find(host_transaction_id) !=
- transaction_size_map.end())
- transaction_size_map.erase(host_transaction_id);
- if (transaction_database_map.find(host_transaction_id) !=
- transaction_database_map.end())
- transaction_database_map.erase(host_transaction_id);
-}
-
-//////////////////////////////////////////////////////////////////////
-// Helper templates.
-//
-
-template <typename ObjectType>
-ObjectType* IndexedDBDispatcherHost::GetOrTerminateProcess(
- IDMap<ObjectType, IDMapOwnPointer>* map,
- int32 ipc_return_object_id) {
- DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- ObjectType* return_object = map->Lookup(ipc_return_object_id);
- if (!return_object) {
- NOTREACHED() << "Uh oh, couldn't find object with id "
- << ipc_return_object_id;
- RecordAction(UserMetricsAction("BadMessageTerminate_IDBMF"));
- BadMessageReceived();
- }
- return return_object;
-}
-
-template <typename ObjectType>
-void IndexedDBDispatcherHost::DestroyObject(
- IDMap<ObjectType, IDMapOwnPointer>* map,
- int32 ipc_object_id) {
- GetOrTerminateProcess(map, ipc_object_id);
- map->Remove(ipc_object_id);
-}
-
-//////////////////////////////////////////////////////////////////////
-// IndexedDBDispatcherHost::DatabaseDispatcherHost
-//
-
-IndexedDBDispatcherHost::DatabaseDispatcherHost::DatabaseDispatcherHost(
- IndexedDBDispatcherHost* parent)
- : parent_(parent) {
- map_.set_check_on_null_data(true);
-}
-
-IndexedDBDispatcherHost::DatabaseDispatcherHost::~DatabaseDispatcherHost() {
- // TODO(alecflett): uncomment these when we find the source of these leaks.
- // DCHECK(transaction_size_map_.empty());
- // DCHECK(transaction_url_map_.empty());
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::CloseAll() {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- // Abort outstanding transactions started by connections in the associated
- // front-end to unblock later transactions. This should only occur on unclean
- // (crash) or abrupt (process-kill) shutdowns.
- for (TransactionIDToDatabaseIDMap::iterator iter =
- transaction_database_map_.begin();
- iter != transaction_database_map_.end();) {
- int64 transaction_id = iter->first;
- int32 ipc_database_id = iter->second;
- ++iter;
- WebIDBDatabaseImpl* database = map_.Lookup(ipc_database_id);
- if (database) {
- database->abort(
- transaction_id,
- WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionUnknownError));
- }
- }
- DCHECK(transaction_database_map_.empty());
-
- for (WebIDBObjectIDToURLMap::iterator iter = database_url_map_.begin();
- iter != database_url_map_.end();
- iter++) {
- WebIDBDatabaseImpl* database = map_.Lookup(iter->first);
- if (database) {
- database->close();
- parent_->Context()->ConnectionClosed(iter->second, database);
- }
- }
-}
-
-bool IndexedDBDispatcherHost::DatabaseDispatcherHost::OnMessageReceived(
- const IPC::Message& message,
- bool* msg_is_ok) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP_EX(
- IndexedDBDispatcherHost::DatabaseDispatcherHost, message, *msg_is_ok)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseCreateObjectStore,
- OnCreateObjectStore)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseDeleteObjectStore,
- OnDeleteObjectStore)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseCreateTransaction,
- OnCreateTransaction)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseClose, OnClose)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseDestroyed, OnDestroyed)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseGet, OnGet)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabasePut, OnPut)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseSetIndexKeys, OnSetIndexKeys)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseSetIndexesReady,
- OnSetIndexesReady)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseOpenCursor, OnOpenCursor)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseCount, OnCount)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseDeleteRange, OnDeleteRange)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseClear, OnClear)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseCreateIndex, OnCreateIndex)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseDeleteIndex, OnDeleteIndex)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseAbort, OnAbort)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseCommit, OnCommit)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::Send(
- IPC::Message* message) {
- parent_->Send(message);
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnCreateObjectStore(
- const IndexedDBHostMsg_DatabaseCreateObjectStore_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
- database->createObjectStore(host_transaction_id,
- params.object_store_id,
- params.name,
- params.key_path,
- params.auto_increment);
- if (parent_->Context()->IsOverQuota(
- database_url_map_[params.ipc_database_id])) {
- database->abort(
- host_transaction_id,
- WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError));
- }
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDeleteObjectStore(
- int32 ipc_database_id,
- int64 transaction_id,
- int64 object_store_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, ipc_database_id);
- if (!database)
- return;
-
- database->deleteObjectStore(parent_->HostTransactionId(transaction_id),
- object_store_id);
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnCreateTransaction(
- const IndexedDBHostMsg_DatabaseCreateTransaction_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
-
- database->createTransaction(
- host_transaction_id,
- new IndexedDBDatabaseCallbacks(
- parent_, params.ipc_thread_id, params.ipc_database_callbacks_id),
- params.object_store_ids,
- params.mode);
- transaction_database_map_[host_transaction_id] = params.ipc_database_id;
- parent_->RegisterTransactionId(host_transaction_id,
- database_url_map_[params.ipc_database_id]);
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnClose(
- int32 ipc_database_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, ipc_database_id);
- if (!database)
- return;
- database->close();
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDestroyed(
- int32 ipc_object_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database = map_.Lookup(ipc_object_id);
- parent_->Context()
- ->ConnectionClosed(database_url_map_[ipc_object_id], database);
- database_url_map_.erase(ipc_object_id);
- parent_->DestroyObject(&map_, ipc_object_id);
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnGet(
- const IndexedDBHostMsg_DatabaseGet_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- scoped_ptr<IndexedDBCallbacksBase> callbacks(
- new IndexedDBCallbacks<std::vector<char> >(
- parent_, params.ipc_thread_id, params.ipc_callbacks_id));
- database->get(parent_->HostTransactionId(params.transaction_id),
- params.object_store_id,
- params.index_id,
- params.key_range,
- params.key_only,
- callbacks.release());
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut(
- const IndexedDBHostMsg_DatabasePut_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
-
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
- scoped_ptr<IndexedDBCallbacksBase> callbacks(
- new IndexedDBCallbacks<IndexedDBKey>(
- parent_, params.ipc_thread_id, params.ipc_callbacks_id));
-
- int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
- // TODO(alecflett): Avoid a copy here.
- std::vector<char> value_copy = params.value;
- database->put(host_transaction_id,
- params.object_store_id,
- &value_copy,
- params.key,
- params.put_mode,
- callbacks.release(),
- params.index_ids,
- params.index_keys);
- TransactionIDToSizeMap* map =
- &parent_->database_dispatcher_host_->transaction_size_map_;
- // Size can't be big enough to overflow because it represents the
- // actual bytes passed through IPC.
- (*map)[host_transaction_id] += params.value.size();
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnSetIndexKeys(
- const IndexedDBHostMsg_DatabaseSetIndexKeys_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
- if (params.index_ids.size() != params.index_keys.size()) {
- database->abort(
- host_transaction_id,
- WebIDBDatabaseError(
- WebKit::WebIDBDatabaseExceptionUnknownError,
- "Malformed IPC message: index_ids.size() != index_keys.size()"));
- return;
- }
-
- database->setIndexKeys(host_transaction_id,
- params.object_store_id,
- params.primary_key,
- params.index_ids,
- params.index_keys);
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnSetIndexesReady(
- int32 ipc_database_id,
- int64 transaction_id,
- int64 object_store_id,
- const std::vector<int64>& index_ids) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, ipc_database_id);
- if (!database)
- return;
-
- database->setIndexesReady(
- parent_->HostTransactionId(transaction_id), object_store_id, index_ids);
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnOpenCursor(
- const IndexedDBHostMsg_DatabaseOpenCursor_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- scoped_ptr<IndexedDBCallbacksBase> callbacks(
- new IndexedDBCallbacks<WebIDBCursorImpl>(
- parent_, params.ipc_thread_id, params.ipc_callbacks_id, -1));
- database->openCursor(parent_->HostTransactionId(params.transaction_id),
- params.object_store_id,
- params.index_id,
- params.key_range,
- params.direction,
- params.key_only,
- params.task_type,
- callbacks.release());
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnCount(
- const IndexedDBHostMsg_DatabaseCount_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- scoped_ptr<IndexedDBCallbacksBase> callbacks(
- new IndexedDBCallbacks<std::vector<char> >(
- parent_, params.ipc_thread_id, params.ipc_callbacks_id));
- database->count(parent_->HostTransactionId(params.transaction_id),
- params.object_store_id,
- params.index_id,
- params.key_range,
- callbacks.release());
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDeleteRange(
- const IndexedDBHostMsg_DatabaseDeleteRange_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- scoped_ptr<IndexedDBCallbacksBase> callbacks(
- new IndexedDBCallbacks<std::vector<char> >(
- parent_, params.ipc_thread_id, params.ipc_callbacks_id));
- database->deleteRange(parent_->HostTransactionId(params.transaction_id),
- params.object_store_id,
- params.key_range,
- callbacks.release());
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnClear(
- int32 ipc_thread_id,
- int32 ipc_callbacks_id,
- int32 ipc_database_id,
- int64 transaction_id,
- int64 object_store_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, ipc_database_id);
- if (!database)
- return;
-
- scoped_ptr<IndexedDBCallbacksBase> callbacks(
- new IndexedDBCallbacks<std::vector<char> >(
- parent_, ipc_thread_id, ipc_callbacks_id));
-
- database->clear(parent_->HostTransactionId(transaction_id),
- object_store_id,
- callbacks.release());
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnAbort(
- int32 ipc_database_id,
- int64 transaction_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, ipc_database_id);
- if (!database)
- return;
-
- database->abort(parent_->HostTransactionId(transaction_id));
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnCommit(
- int32 ipc_database_id,
- int64 transaction_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, ipc_database_id);
- if (!database)
- return;
-
- int64 host_transaction_id = parent_->HostTransactionId(transaction_id);
- int64 transaction_size = transaction_size_map_[host_transaction_id];
- if (transaction_size &&
- parent_->Context()->WouldBeOverQuota(
- transaction_url_map_[host_transaction_id], transaction_size)) {
- database->abort(
- host_transaction_id,
- WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError));
- return;
- }
-
- database->commit(host_transaction_id);
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnCreateIndex(
- const IndexedDBHostMsg_DatabaseCreateIndex_Params& params) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
- if (!database)
- return;
-
- int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
- database->createIndex(host_transaction_id,
- params.object_store_id,
- params.index_id,
- params.name,
- params.key_path,
- params.unique,
- params.multi_entry);
- if (parent_->Context()->IsOverQuota(
- database_url_map_[params.ipc_database_id])) {
- database->abort(
- host_transaction_id,
- WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError));
- }
-}
-
-void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDeleteIndex(
- int32 ipc_database_id,
- int64 transaction_id,
- int64 object_store_id,
- int64 index_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBDatabaseImpl* database =
- parent_->GetOrTerminateProcess(&map_, ipc_database_id);
- if (!database)
- return;
-
- database->deleteIndex(
- parent_->HostTransactionId(transaction_id), object_store_id, index_id);
-}
-
-//////////////////////////////////////////////////////////////////////
-// IndexedDBDispatcherHost::CursorDispatcherHost
-//
-
-IndexedDBDispatcherHost::CursorDispatcherHost::CursorDispatcherHost(
- IndexedDBDispatcherHost* parent)
- : parent_(parent) {
- map_.set_check_on_null_data(true);
-}
-
-IndexedDBDispatcherHost::CursorDispatcherHost::~CursorDispatcherHost() {}
-
-bool IndexedDBDispatcherHost::CursorDispatcherHost::OnMessageReceived(
- const IPC::Message& message,
- bool* msg_is_ok) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
-
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP_EX(
- IndexedDBDispatcherHost::CursorDispatcherHost, message, *msg_is_ok)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_CursorAdvance, OnAdvance)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_CursorContinue, OnContinue)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_CursorPrefetch, OnPrefetch)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_CursorPrefetchReset, OnPrefetchReset)
- IPC_MESSAGE_HANDLER(IndexedDBHostMsg_CursorDestroyed, OnDestroyed)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
-void IndexedDBDispatcherHost::CursorDispatcherHost::Send(
- IPC::Message* message) {
- parent_->Send(message);
-}
-
-void IndexedDBDispatcherHost::CursorDispatcherHost::OnAdvance(
- int32 ipc_cursor_id,
- int32 ipc_thread_id,
- int32 ipc_callbacks_id,
- unsigned long count) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBCursorImpl* idb_cursor =
- parent_->GetOrTerminateProcess(&map_, ipc_cursor_id);
- if (!idb_cursor)
- return;
-
- idb_cursor->advance(
- count,
- new IndexedDBCallbacks<WebIDBCursorImpl>(
- parent_, ipc_thread_id, ipc_callbacks_id, ipc_cursor_id));
-}
-
-void IndexedDBDispatcherHost::CursorDispatcherHost::OnContinue(
- int32 ipc_cursor_id,
- int32 ipc_thread_id,
- int32 ipc_callbacks_id,
- const IndexedDBKey& key) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBCursorImpl* idb_cursor =
- parent_->GetOrTerminateProcess(&map_, ipc_cursor_id);
- if (!idb_cursor)
- return;
-
- idb_cursor->continueFunction(
- key,
- new IndexedDBCallbacks<WebIDBCursorImpl>(
- parent_, ipc_thread_id, ipc_callbacks_id, ipc_cursor_id));
-}
-
-void IndexedDBDispatcherHost::CursorDispatcherHost::OnPrefetch(
- int32 ipc_cursor_id,
- int32 ipc_thread_id,
- int32 ipc_callbacks_id,
- int n) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBCursorImpl* idb_cursor =
- parent_->GetOrTerminateProcess(&map_, ipc_cursor_id);
- if (!idb_cursor)
- return;
-
- idb_cursor->prefetchContinue(
- n,
- new IndexedDBCallbacks<WebIDBCursorImpl>(
- parent_, ipc_thread_id, ipc_callbacks_id, ipc_cursor_id));
-}
-
-void IndexedDBDispatcherHost::CursorDispatcherHost::OnPrefetchReset(
- int32 ipc_cursor_id,
- int used_prefetches,
- int unused_prefetches) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- WebIDBCursorImpl* idb_cursor =
- parent_->GetOrTerminateProcess(&map_, ipc_cursor_id);
- if (!idb_cursor)
- return;
-
- idb_cursor->prefetchReset(used_prefetches, unused_prefetches);
-}
-
-void IndexedDBDispatcherHost::CursorDispatcherHost::OnDestroyed(
- int32 ipc_object_id) {
- DCHECK(
- parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread());
- parent_->DestroyObject(&map_, ipc_object_id);
-}
-
-} // namespace content

Powered by Google App Engine
This is Rietveld 408576698