[content shell] hook up testRunner.dumpEditingCallbacks
[chromium-blink-merge.git] / content / common / indexed_db / proxy_webidbdatabase_impl.cc
blobf1fd2fabaf0c7601a18373a5a7105f76d0427278
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/common/indexed_db/proxy_webidbdatabase_impl.h"
7 #include <vector>
9 #include "content/common/child_thread.h"
10 #include "content/common/indexed_db/indexed_db_messages.h"
11 #include "content/common/indexed_db/indexed_db_dispatcher.h"
12 #include "content/common/indexed_db/proxy_webidbobjectstore_impl.h"
13 #include "content/common/indexed_db/proxy_webidbtransaction_impl.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBKeyPath.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBMetadata.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h"
17 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h"
18 #include "webkit/glue/worker_task_runner.h"
20 using WebKit::WebDOMStringList;
21 using WebKit::WebExceptionCode;
22 using WebKit::WebFrame;
23 using WebKit::WebIDBCallbacks;
24 using WebKit::WebIDBDatabaseCallbacks;
25 using WebKit::WebIDBMetadata;
26 using WebKit::WebIDBKeyPath;
27 using WebKit::WebIDBTransaction;
28 using WebKit::WebString;
29 using WebKit::WebVector;
30 using webkit_glue::WorkerTaskRunner;
32 namespace content {
34 RendererWebIDBDatabaseImpl::RendererWebIDBDatabaseImpl(int32 ipc_database_id)
35 : ipc_database_id_(ipc_database_id) {
38 RendererWebIDBDatabaseImpl::~RendererWebIDBDatabaseImpl() {
39 // It's not possible for there to be pending callbacks that address this
40 // object since inside WebKit, they hold a reference to the object which owns
41 // this object. But, if that ever changed, then we'd need to invalidate
42 // any such pointers.
43 IndexedDBDispatcher::Send(new IndexedDBHostMsg_DatabaseDestroyed(
44 ipc_database_id_));
45 IndexedDBDispatcher* dispatcher =
46 IndexedDBDispatcher::ThreadSpecificInstance();
47 dispatcher->DatabaseDestroyed(ipc_database_id_);
50 WebIDBMetadata RendererWebIDBDatabaseImpl::metadata() const {
51 IndexedDBDatabaseMetadata idb_metadata;
52 IndexedDBDispatcher::Send(
53 new IndexedDBHostMsg_DatabaseMetadata(ipc_database_id_, &idb_metadata));
55 WebIDBMetadata web_metadata;
56 web_metadata.id = idb_metadata.id;
57 web_metadata.name = idb_metadata.name;
58 web_metadata.version = idb_metadata.version;
59 web_metadata.intVersion = idb_metadata.int_version;
60 web_metadata.maxObjectStoreId = idb_metadata.max_object_store_id;
61 web_metadata.objectStores = WebVector<WebIDBMetadata::ObjectStore>(
62 idb_metadata.object_stores.size());
64 for (size_t i = 0; i < idb_metadata.object_stores.size(); ++i) {
65 const IndexedDBObjectStoreMetadata& idb_store_metadata =
66 idb_metadata.object_stores[i];
67 WebIDBMetadata::ObjectStore& web_store_metadata =
68 web_metadata.objectStores[i];
70 web_store_metadata.id = idb_store_metadata.id;
71 web_store_metadata.name = idb_store_metadata.name;
72 web_store_metadata.keyPath = idb_store_metadata.keyPath;
73 web_store_metadata.autoIncrement = idb_store_metadata.autoIncrement;
74 web_store_metadata.maxIndexId = idb_store_metadata.max_index_id;
75 web_store_metadata.indexes = WebVector<WebIDBMetadata::Index>(
76 idb_store_metadata.indexes.size());
78 for (size_t j = 0; j < idb_store_metadata.indexes.size(); ++j) {
79 const IndexedDBIndexMetadata& idb_index_metadata =
80 idb_store_metadata.indexes[j];
81 WebIDBMetadata::Index& web_index_metadata =
82 web_store_metadata.indexes[j];
84 web_index_metadata.id = idb_index_metadata.id;
85 web_index_metadata.name = idb_index_metadata.name;
86 web_index_metadata.keyPath = idb_index_metadata.keyPath;
87 web_index_metadata.unique = idb_index_metadata.unique;
88 web_index_metadata.multiEntry = idb_index_metadata.multiEntry;
92 return web_metadata;
95 WebKit::WebIDBObjectStore* RendererWebIDBDatabaseImpl::createObjectStore(
96 long long id,
97 const WebKit::WebString& name,
98 const WebKit::WebIDBKeyPath& key_path,
99 bool auto_increment,
100 const WebKit::WebIDBTransaction& transaction,
101 WebExceptionCode& ec) {
102 IndexedDBHostMsg_DatabaseCreateObjectStore_Params params;
103 params.id = id;
104 params.name = name;
105 params.key_path = IndexedDBKeyPath(key_path);
106 params.auto_increment = auto_increment;
107 params.ipc_transaction_id = IndexedDBDispatcher::TransactionId(transaction);
108 params.ipc_database_id = ipc_database_id_;
110 int object_store;
111 IndexedDBDispatcher::Send(
112 new IndexedDBHostMsg_DatabaseCreateObjectStore(
113 params, &object_store, &ec));
114 if (!object_store)
115 return NULL;
116 return new RendererWebIDBObjectStoreImpl(object_store);
119 void RendererWebIDBDatabaseImpl::deleteObjectStore(
120 long long object_store_id,
121 const WebIDBTransaction& transaction,
122 WebExceptionCode& ec) {
123 IndexedDBDispatcher::Send(
124 new IndexedDBHostMsg_DatabaseDeleteObjectStore(
125 ipc_database_id_, object_store_id,
126 IndexedDBDispatcher::TransactionId(transaction), &ec));
129 WebKit::WebIDBTransaction* RendererWebIDBDatabaseImpl::createTransaction(
130 long long transaction_id,
131 const WebVector<long long>& object_store_ids,
132 unsigned short mode) {
133 std::vector<int64> object_stores;
134 object_stores.reserve(object_store_ids.size());
135 for (unsigned int i = 0; i < object_store_ids.size(); ++i)
136 object_stores.push_back(object_store_ids[i]);
138 int ipc_transaction_id;
139 IndexedDBDispatcher::Send(new IndexedDBHostMsg_DatabaseCreateTransaction(
140 WorkerTaskRunner::Instance()->CurrentWorkerId(),
141 ipc_database_id_, transaction_id, object_stores, mode,
142 &ipc_transaction_id));
143 if (!transaction_id)
144 return NULL;
145 return new RendererWebIDBTransactionImpl(ipc_transaction_id);
148 void RendererWebIDBDatabaseImpl::close() {
149 IndexedDBDispatcher* dispatcher =
150 IndexedDBDispatcher::ThreadSpecificInstance();
151 dispatcher->RequestIDBDatabaseClose(ipc_database_id_);
154 } // namespace content