// 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_callbacks.h" #include #include "content/common/indexed_db/indexed_db_messages.h" #include "webkit/quota/quota_manager.h" namespace content { namespace { const int32 kDatabaseNotAdded = -1; } IndexedDBCallbacksBase::IndexedDBCallbacksBase( IndexedDBDispatcherHost* dispatcher_host, int32 ipc_thread_id, int32 ipc_callbacks_id) : dispatcher_host_(dispatcher_host), ipc_callbacks_id_(ipc_callbacks_id), ipc_thread_id_(ipc_thread_id) { } IndexedDBCallbacksBase::~IndexedDBCallbacksBase() {} void IndexedDBCallbacksBase::onError(const WebKit::WebIDBDatabaseError& error) { dispatcher_host_->Send(new IndexedDBMsg_CallbacksError( ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message())); } void IndexedDBCallbacksBase::onBlocked(long long old_version) { dispatcher_host_->Send(new IndexedDBMsg_CallbacksIntBlocked( ipc_thread_id_, ipc_callbacks_id_, old_version)); } IndexedDBCallbacksDatabase::IndexedDBCallbacksDatabase( IndexedDBDispatcherHost* dispatcher_host, int32 ipc_thread_id, int32 ipc_callbacks_id, int32 ipc_database_callbacks_id, int64 host_transaction_id, const GURL& origin_url) : IndexedDBCallbacksBase(dispatcher_host, ipc_thread_id, ipc_callbacks_id), host_transaction_id_(host_transaction_id), origin_url_(origin_url), ipc_database_id_(kDatabaseNotAdded), ipc_database_callbacks_id_(ipc_database_callbacks_id) { } void IndexedDBCallbacksDatabase::onSuccess( WebKit::WebIDBDatabase* idb_object, const WebKit::WebIDBMetadata& metadata) { int32 ipc_object_id = ipc_database_id_; if (ipc_object_id == kDatabaseNotAdded) { ipc_object_id = dispatcher_host()->Add(idb_object, ipc_thread_id(), origin_url_); } else { // We already have this database and don't need a new copy of it. delete idb_object; } IndexedDBDatabaseMetadata idb_metadata = IndexedDBDispatcherHost::ConvertMetadata(metadata); dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessIDBDatabase(ipc_thread_id(), ipc_callbacks_id(), ipc_database_callbacks_id_, ipc_object_id, idb_metadata)); } void IndexedDBCallbacksDatabase::onUpgradeNeeded( long long old_version, WebKit::WebIDBDatabase* database, const WebKit::WebIDBMetadata& metadata) { dispatcher_host()->RegisterTransactionId(host_transaction_id_, origin_url_); int32 ipc_database_id = dispatcher_host()->Add(database, ipc_thread_id(), origin_url_); 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); dispatcher_host()->Send(new IndexedDBMsg_CallbacksUpgradeNeeded(params)); } void IndexedDBCallbacks::onSuccess( WebKit::WebIDBCursor* idb_cursor, const WebKit::WebIDBKey& key, const WebKit::WebIDBKey& primaryKey, const WebKit::WebData& value) { int32 ipc_object_id = dispatcher_host()->Add(idb_cursor); IndexedDBMsg_CallbacksSuccessIDBCursor_Params params; params.ipc_thread_id = ipc_thread_id(); params.ipc_callbacks_id = ipc_callbacks_id(); params.ipc_cursor_id = ipc_object_id; params.key = IndexedDBKey(key); params.primary_key = IndexedDBKey(primaryKey); params.value.assign(value.data(), value.data() + value.size()); dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(params)); } void IndexedDBCallbacks::onSuccess( const WebKit::WebData& webValue) { std::vector value(webValue.data(), webValue.data() + webValue.size()); dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessValue( ipc_thread_id(), ipc_callbacks_id(), value)); } void IndexedDBCallbacks::onSuccess( const WebKit::WebIDBKey& key, const WebKit::WebIDBKey& primaryKey, const WebKit::WebData& value) { DCHECK_NE(ipc_cursor_id_, -1); WebKit::WebIDBCursor* idb_cursor = dispatcher_host()->GetCursorFromId( ipc_cursor_id_); DCHECK(idb_cursor); if (!idb_cursor) return; IndexedDBMsg_CallbacksSuccessCursorContinue_Params params; params.ipc_thread_id = ipc_thread_id(); params.ipc_callbacks_id = ipc_callbacks_id(); params.ipc_cursor_id = ipc_cursor_id_; params.key = IndexedDBKey(key); params.primary_key = IndexedDBKey(primaryKey); params.value.assign(value.data(), value.data() + value.size()); dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessCursorContinue(params)); } void IndexedDBCallbacks::onSuccessWithPrefetch( const WebKit::WebVector& keys, const WebKit::WebVector& primaryKeys, const WebKit::WebVector& values) { DCHECK_NE(ipc_cursor_id_, -1); std::vector msgKeys; std::vector msgPrimaryKeys; std::vector > msgValues; for (size_t i = 0; i < keys.size(); ++i) { msgKeys.push_back(IndexedDBKey(keys[i])); msgPrimaryKeys.push_back(IndexedDBKey(primaryKeys[i])); msgValues.push_back( std::vector(values[i].data(), values[i].data() + values[i].size())); } IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params params; params.ipc_thread_id = ipc_thread_id(); params.ipc_callbacks_id = ipc_callbacks_id(); params.ipc_cursor_id = ipc_cursor_id_; params.keys = msgKeys; params.primary_keys = msgPrimaryKeys; params.values = msgValues; dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessCursorPrefetch(params)); } void IndexedDBCallbacks::onSuccess( const WebKit::WebIDBKey& value) { dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessIndexedDBKey( ipc_thread_id(), ipc_callbacks_id(), IndexedDBKey(value))); } void IndexedDBCallbacks::onSuccess( const WebKit::WebDOMStringList& value) { std::vector list; for (unsigned i = 0; i < value.length(); ++i) list.push_back(value.item(i)); dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessStringList( ipc_thread_id(), ipc_callbacks_id(), list)); } void IndexedDBCallbacks::onSuccess( const WebKit::WebData& value) { dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessValue( ipc_thread_id(), ipc_callbacks_id(), std::vector(value.data(), value.data() + value.size()))); } void IndexedDBCallbacks::onSuccess( const WebKit::WebData& value, const WebKit::WebIDBKey& primaryKey, const WebKit::WebIDBKeyPath& keyPath) { dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessValueWithKey( ipc_thread_id(), ipc_callbacks_id(), std::vector(value.data(), value.data() + value.size()), IndexedDBKey(primaryKey), IndexedDBKeyPath(keyPath))); } void IndexedDBCallbacks::onSuccess( long long value) { dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessInteger(ipc_thread_id(), ipc_callbacks_id(), value)); } void IndexedDBCallbacks::onSuccess() { dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessUndefined(ipc_thread_id(), ipc_callbacks_id())); } void IndexedDBCallbacks::onSuccess( const WebKit::WebIDBKey& value) { dispatcher_host()->Send( new IndexedDBMsg_CallbacksSuccessIndexedDBKey( ipc_thread_id(), ipc_callbacks_id(), IndexedDBKey(value))); } } // namespace content