Proxy WebData-based WebIDBDatabase::put

BUG=


Review URL: https://chromiumcodereview.appspot.com/12217049

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182392 0039d316-1c4b-4281-b951-d872f2087c98
parent 09f7812b
......@@ -21,6 +21,7 @@
#include "content/public/common/content_switches.h"
#include "content/public/common/result_codes.h"
#include "googleurl/src/gurl.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebData.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebVector.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMStringList.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBCursor.h"
......@@ -36,6 +37,7 @@
using webkit_database::DatabaseUtil;
using WebKit::WebDOMStringList;
using WebKit::WebData;
using WebKit::WebExceptionCode;
using WebKit::WebIDBCallbacks;
using WebKit::WebIDBCursor;
......@@ -346,6 +348,7 @@ bool IndexedDBDispatcherHost::DatabaseDispatcherHost::OnMessageReceived(
IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseClose, OnClose)
IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseDestroyed, OnDestroyed)
IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseGet, OnGet)
IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabasePutOld, OnPutOld)
IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabasePut, OnPut)
IPC_MESSAGE_HANDLER(IndexedDBHostMsg_DatabaseSetIndexKeys,
OnSetIndexKeys)
......@@ -464,8 +467,8 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnGet(
params.key_range, params.key_only, callbacks.release());
}
void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut(
const IndexedDBHostMsg_DatabasePut_Params& params) {
void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPutOld(
const IndexedDBHostMsg_DatabasePutOld_Params& params) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
WebIDBDatabase* database = parent_->GetOrTerminateProcess(
......@@ -497,6 +500,35 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut(
(*map)[host_transaction_id] += params.value.size();
}
void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut(
const IndexedDBHostMsg_DatabasePut_Params& params) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
WebIDBDatabase* database = parent_->GetOrTerminateProcess(
&map_, params.ipc_database_id);
if (!database)
return;
scoped_ptr<WebIDBCallbacks> callbacks(
new IndexedDBCallbacks<WebIDBKey>(parent_, params.ipc_thread_id,
params.ipc_response_id));
// Be careful with empty vectors.
WebData value;
if (params.value.size())
value.assign(&params.value.front(), params.value.size());
int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
database->put(host_transaction_id,
params.object_store_id,
value, 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(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
......
......@@ -23,17 +23,12 @@ struct IndexedDBHostMsg_DatabaseCreateTransaction_Params;
struct IndexedDBHostMsg_DatabaseDeleteRange_Params;
struct IndexedDBHostMsg_DatabaseGet_Params;
struct IndexedDBHostMsg_DatabaseOpenCursor_Params;
struct IndexedDBHostMsg_DatabasePutOld_Params;
struct IndexedDBHostMsg_DatabasePut_Params;
struct IndexedDBHostMsg_DatabaseSetIndexKeys_Params;
struct IndexedDBHostMsg_FactoryDeleteDatabase_Params;
struct IndexedDBHostMsg_FactoryGetDatabaseNames_Params;
struct IndexedDBHostMsg_FactoryOpen_Params;
struct IndexedDBHostMsg_IndexCount_Params;
struct IndexedDBHostMsg_IndexOpenCursor_Params;
struct IndexedDBHostMsg_ObjectStoreCount_Params;
struct IndexedDBHostMsg_ObjectStoreCreateIndex_Params;
struct IndexedDBHostMsg_ObjectStoreOpenCursor_Params;
struct IndexedDBHostMsg_ObjectStorePut_Params;
namespace WebKit {
class WebIDBCursor;
......@@ -136,6 +131,7 @@ class IndexedDBDispatcherHost : public BrowserMessageFilter {
void OnDestroyed(int32 ipc_database_id);
void OnGet(const IndexedDBHostMsg_DatabaseGet_Params& params);
void OnPutOld(const IndexedDBHostMsg_DatabasePutOld_Params& params);
void OnPut(const IndexedDBHostMsg_DatabasePut_Params& params);
void OnSetIndexKeys(
const IndexedDBHostMsg_DatabaseSetIndexKeys_Params& params);
......
......@@ -18,6 +18,7 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBKeyRange.h"
using WebKit::WebDOMStringList;
using WebKit::WebData;
using WebKit::WebExceptionCode;
using WebKit::WebFrame;
using WebKit::WebIDBCallbacks;
......@@ -387,7 +388,7 @@ void IndexedDBDispatcher::RequestIDBDatabaseGet(
}
void IndexedDBDispatcher::RequestIDBDatabasePut(
void IndexedDBDispatcher::RequestIDBDatabasePutOld(
int32 ipc_database_id,
int64 transaction_id,
int64 object_store_id,
......@@ -399,7 +400,7 @@ void IndexedDBDispatcher::RequestIDBDatabasePut(
const WebKit::WebVector<WebKit::WebVector<
WebKit::WebIDBKey> >& index_keys) {
ResetCursorPrefetchCaches();
IndexedDBHostMsg_DatabasePut_Params params;
IndexedDBHostMsg_DatabasePutOld_Params params;
init_params(params, callbacks);
params.ipc_database_id = ipc_database_id;
params.transaction_id = transaction_id;
......@@ -410,6 +411,43 @@ void IndexedDBDispatcher::RequestIDBDatabasePut(
params.key = key;
params.put_mode = put_mode;
COMPILE_ASSERT(sizeof(params.index_ids[0]) ==
sizeof(index_ids[0]), Cant_copy);
params.index_ids.assign(index_ids.data(),
index_ids.data() + index_ids.size());
params.index_keys.resize(index_keys.size());
for (size_t i = 0; i < index_keys.size(); ++i) {
params.index_keys[i].resize(index_keys[i].size());
for (size_t j = 0; j < index_keys[i].size(); ++j) {
params.index_keys[i][j] = IndexedDBKey(index_keys[i][j]);
}
}
Send(new IndexedDBHostMsg_DatabasePutOld(params));
}
void IndexedDBDispatcher::RequestIDBDatabasePut(
int32 ipc_database_id,
int64 transaction_id,
int64 object_store_id,
const WebData& value,
const IndexedDBKey& key,
WebIDBDatabase::PutMode put_mode,
WebIDBCallbacks* callbacks,
const WebVector<long long>& index_ids,
const WebVector<WebKit::WebVector<
WebIDBKey> >& index_keys) {
ResetCursorPrefetchCaches();
IndexedDBHostMsg_DatabasePut_Params params;
init_params(params, callbacks);
params.ipc_database_id = ipc_database_id;
params.transaction_id = transaction_id;
params.object_store_id = object_store_id;
params.value.assign(value.data(), value.data() + value.size());
params.key = key;
params.put_mode = put_mode;
COMPILE_ASSERT(sizeof(params.index_ids[0]) ==
sizeof(index_ids[0]), Cant_copy);
params.index_ids.assign(index_ids.data(),
......
......@@ -134,7 +134,7 @@ class CONTENT_EXPORT IndexedDBDispatcher
bool key_only,
WebKit::WebIDBCallbacks* callbacks);
void RequestIDBDatabasePut(
void RequestIDBDatabasePutOld(
int32 ipc_database_id,
int64 transaction_id,
int64 object_store_id,
......@@ -146,6 +146,18 @@ class CONTENT_EXPORT IndexedDBDispatcher
const WebKit::WebVector<WebKit::WebVector<
WebKit::WebIDBKey> >& index_keys);
void RequestIDBDatabasePut(
int32 ipc_database_id,
int64 transaction_id,
int64 object_store_id,
const WebKit::WebData& value,
const IndexedDBKey& key,
WebKit::WebIDBDatabase::PutMode put_mode,
WebKit::WebIDBCallbacks* callbacks,
const WebKit::WebVector<long long>& index_ids,
const WebKit::WebVector<WebKit::WebVector<
WebKit::WebIDBKey> >& index_keys);
void RequestIDBDatabaseOpenCursor(
int32 ipc_database_id,
int64 transaction_id,
......
......@@ -8,6 +8,7 @@
#include "content/common/indexed_db/indexed_db_key.h"
#include "content/public/common/serialized_script_value.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebData.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebExceptionCode.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBCallbacks.h"
......@@ -21,7 +22,7 @@ namespace content {
TEST(IndexedDBDispatcherTest, DISABLED_ValueSizeTest) {
string16 data;
data.resize(kMaxIDBValueSizeInBytes / sizeof(char16) + 1, 'x');
WebKit::WebVector<unsigned char> value;
const WebKit::WebData value;
const int32 ipc_dummy_id = -1;
const int64 transaction_id = 1;
const int64 object_store_id = 2;
......@@ -34,7 +35,7 @@ TEST(IndexedDBDispatcherTest, DISABLED_ValueSizeTest) {
ipc_dummy_id,
transaction_id,
object_store_id,
&value,
value,
key,
WebKit::WebIDBDatabase::AddOrUpdate,
static_cast<WebKit::WebIDBCallbacks*>(NULL),
......
......@@ -112,6 +112,33 @@ IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabaseGet_Params)
IPC_STRUCT_MEMBER(bool, key_only)
IPC_STRUCT_END()
// Used to set a value in an object store.
IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabasePutOld_Params)
// The id any response should contain.
IPC_STRUCT_MEMBER(int32, ipc_thread_id)
IPC_STRUCT_MEMBER(int32, ipc_response_id)
// The database the object store belongs to.
IPC_STRUCT_MEMBER(int32, ipc_database_id)
// The transaction it's associated with.
IPC_STRUCT_MEMBER(int64, transaction_id)
// The object store's id.
IPC_STRUCT_MEMBER(int64, object_store_id)
// The index's id.
IPC_STRUCT_MEMBER(int64, index_id)
// The value to set.
IPC_STRUCT_MEMBER(std::vector<char>, value)
// The key to set it on (may not be "valid"/set in some cases).
IPC_STRUCT_MEMBER(content::IndexedDBKey, key)
// Whether this is an add or a put.
IPC_STRUCT_MEMBER(WebKit::WebIDBDatabase::PutMode, put_mode)
// The names of the indexes used below.
IPC_STRUCT_MEMBER(std::vector<int64>, index_ids)
// The keys for each index, such that each inner vector corresponds
// to each index named in index_names, respectively.
IPC_STRUCT_MEMBER(std::vector<std::vector<content::IndexedDBKey> >,
index_keys)
IPC_STRUCT_END()
// Used to set a value in an object store.
IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabasePut_Params)
// The id any response should contain.
......@@ -126,7 +153,7 @@ IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabasePut_Params)
// The index's id.
IPC_STRUCT_MEMBER(int64, index_id)
// The value to set.
IPC_STRUCT_MEMBER(std::vector<uint8>, value)
IPC_STRUCT_MEMBER(std::vector<char>, value)
// The key to set it on (may not be "valid"/set in some cases).
IPC_STRUCT_MEMBER(content::IndexedDBKey, key)
// Whether this is an add or a put.
......@@ -449,6 +476,10 @@ IPC_MESSAGE_CONTROL1(IndexedDBHostMsg_DatabaseDestroyed,
IPC_MESSAGE_CONTROL1(IndexedDBHostMsg_DatabaseGet,
IndexedDBHostMsg_DatabaseGet_Params)
// WebIDBDatabase::put() message.
IPC_MESSAGE_CONTROL1(IndexedDBHostMsg_DatabasePutOld,
IndexedDBHostMsg_DatabasePutOld_Params)
// WebIDBDatabase::put() message.
IPC_MESSAGE_CONTROL1(IndexedDBHostMsg_DatabasePut,
IndexedDBHostMsg_DatabasePut_Params)
......
......@@ -118,6 +118,23 @@ void RendererWebIDBDatabaseImpl::put(
const WebVector<WebIndexKeys>& web_index_keys) {
IndexedDBDispatcher* dispatcher =
IndexedDBDispatcher::ThreadSpecificInstance();
dispatcher->RequestIDBDatabasePutOld(
ipc_database_id_, transaction_id, object_store_id,
value, IndexedDBKey(key), put_mode, callbacks,
web_index_ids, web_index_keys);
}
void RendererWebIDBDatabaseImpl::put(
long long transaction_id,
long long object_store_id,
const WebKit::WebData& value,
const WebKit::WebIDBKey& key,
PutMode put_mode,
WebIDBCallbacks* callbacks,
const WebVector<long long>& web_index_ids,
const WebVector<WebIndexKeys>& web_index_keys) {
IndexedDBDispatcher* dispatcher =
IndexedDBDispatcher::ThreadSpecificInstance();
dispatcher->RequestIDBDatabasePut(
ipc_database_id_, transaction_id, object_store_id,
value, IndexedDBKey(key), put_mode, callbacks,
......
......@@ -51,6 +51,14 @@ class RendererWebIDBDatabaseImpl : public WebKit::WebIDBDatabase {
WebKit::WebIDBCallbacks*,
const WebKit::WebVector<long long>& indexIds,
const WebKit::WebVector<WebIndexKeys>&);
virtual void put(long long transactionId,
long long objectStoreId,
const WebKit::WebData& value,
const WebKit::WebIDBKey&,
PutMode,
WebKit::WebIDBCallbacks*,
const WebKit::WebVector<long long>& indexIds,
const WebKit::WebVector<WebIndexKeys>&);
virtual void setIndexKeys(long long transactionId,
long long objectStoreId,
const WebKit::WebIDBKey&,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment