- add sources.
[platform/framework/web/crosswalk.git] / src / content / child / indexed_db / proxy_webidbdatabase_impl.cc
1 // Copyright 2013 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.
4
5 #include "content/child/indexed_db/proxy_webidbdatabase_impl.h"
6
7 #include <vector>
8
9 #include "content/child/thread_safe_sender.h"
10 #include "content/child/indexed_db/indexed_db_dispatcher.h"
11 #include "content/child/indexed_db/indexed_db_key_builders.h"
12 #include "content/common/indexed_db/indexed_db_messages.h"
13 #include "third_party/WebKit/public/platform/WebIDBKeyPath.h"
14 #include "third_party/WebKit/public/platform/WebIDBMetadata.h"
15 #include "third_party/WebKit/public/platform/WebString.h"
16 #include "third_party/WebKit/public/platform/WebVector.h"
17 #include "webkit/child/worker_task_runner.h"
18
19 using WebKit::WebIDBCallbacks;
20 using WebKit::WebIDBDatabaseCallbacks;
21 using WebKit::WebIDBMetadata;
22 using WebKit::WebIDBKey;
23 using WebKit::WebIDBKeyPath;
24 using WebKit::WebIDBKeyRange;
25 using WebKit::WebString;
26 using WebKit::WebVector;
27 using webkit_glue::WorkerTaskRunner;
28
29 namespace content {
30
31 RendererWebIDBDatabaseImpl::RendererWebIDBDatabaseImpl(
32     int32 ipc_database_id,
33     int32 ipc_database_callbacks_id,
34     ThreadSafeSender* thread_safe_sender)
35     : ipc_database_id_(ipc_database_id),
36       ipc_database_callbacks_id_(ipc_database_callbacks_id),
37       thread_safe_sender_(thread_safe_sender) {}
38
39 RendererWebIDBDatabaseImpl::~RendererWebIDBDatabaseImpl() {
40   // It's not possible for there to be pending callbacks that address this
41   // object since inside WebKit, they hold a reference to the object which owns
42   // this object. But, if that ever changed, then we'd need to invalidate
43   // any such pointers.
44   thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseDestroyed(
45       ipc_database_id_));
46   IndexedDBDispatcher* dispatcher =
47       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
48   dispatcher->DatabaseDestroyed(ipc_database_id_);
49 }
50
51 void RendererWebIDBDatabaseImpl::createObjectStore(
52     long long transaction_id,
53     long long object_store_id,
54     const WebString& name,
55     const WebIDBKeyPath& key_path,
56     bool auto_increment) {
57   IndexedDBHostMsg_DatabaseCreateObjectStore_Params params;
58   params.ipc_database_id = ipc_database_id_;
59   params.transaction_id = transaction_id;
60   params.object_store_id = object_store_id;
61   params.name = name;
62   params.key_path = IndexedDBKeyPathBuilder::Build(key_path);
63   params.auto_increment = auto_increment;
64
65   thread_safe_sender_->Send(
66       new IndexedDBHostMsg_DatabaseCreateObjectStore(params));
67 }
68
69 void RendererWebIDBDatabaseImpl::deleteObjectStore(
70     long long transaction_id,
71     long long object_store_id) {
72   thread_safe_sender_->Send(
73       new IndexedDBHostMsg_DatabaseDeleteObjectStore(
74           ipc_database_id_,
75           transaction_id,
76           object_store_id));
77 }
78
79 void RendererWebIDBDatabaseImpl::createTransaction(
80     long long transaction_id,
81     WebIDBDatabaseCallbacks* callbacks,
82     const WebVector<long long>& object_store_ids,
83     unsigned short mode) {
84   IndexedDBDispatcher* dispatcher =
85       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
86   dispatcher->RequestIDBDatabaseCreateTransaction(
87       ipc_database_id_, transaction_id, callbacks, object_store_ids, mode);
88 }
89
90 void RendererWebIDBDatabaseImpl::close() {
91   IndexedDBDispatcher* dispatcher =
92       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
93   dispatcher->RequestIDBDatabaseClose(ipc_database_id_,
94                                       ipc_database_callbacks_id_);
95 }
96
97 void RendererWebIDBDatabaseImpl::get(
98     long long transaction_id,
99     long long object_store_id,
100     long long index_id,
101     const WebIDBKeyRange& key_range,
102     bool key_only,
103     WebIDBCallbacks* callbacks) {
104   IndexedDBDispatcher* dispatcher =
105       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
106   dispatcher->RequestIDBDatabaseGet(
107       ipc_database_id_,
108       transaction_id,
109       object_store_id,
110       index_id,
111       IndexedDBKeyRangeBuilder::Build(key_range),
112       key_only,
113       callbacks);
114 }
115
116 void RendererWebIDBDatabaseImpl::put(
117     long long transaction_id,
118     long long object_store_id,
119     const WebKit::WebData& value,
120     const WebIDBKey& key,
121     PutMode put_mode,
122     WebIDBCallbacks* callbacks,
123     const WebVector<long long>& web_index_ids,
124     const WebVector<WebIndexKeys>& web_index_keys) {
125   IndexedDBDispatcher* dispatcher =
126       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
127   dispatcher->RequestIDBDatabasePut(ipc_database_id_,
128                                     transaction_id,
129                                     object_store_id,
130                                     value,
131                                     IndexedDBKeyBuilder::Build(key),
132                                     put_mode,
133                                     callbacks,
134                                     web_index_ids,
135                                     web_index_keys);
136 }
137
138 void RendererWebIDBDatabaseImpl::setIndexKeys(
139     long long transaction_id,
140     long long object_store_id,
141     const WebIDBKey& primary_key,
142     const WebVector<long long>& index_ids,
143     const WebVector<WebIndexKeys>& index_keys) {
144   IndexedDBHostMsg_DatabaseSetIndexKeys_Params params;
145   params.ipc_database_id = ipc_database_id_;
146   params.transaction_id = transaction_id;
147   params.object_store_id = object_store_id;
148   params.primary_key = IndexedDBKeyBuilder::Build(primary_key);
149   COMPILE_ASSERT(sizeof(params.index_ids[0]) ==
150                  sizeof(index_ids[0]), Cant_copy);
151   params.index_ids.assign(index_ids.data(),
152                           index_ids.data() + index_ids.size());
153
154   params.index_keys.resize(index_keys.size());
155   for (size_t i = 0; i < index_keys.size(); ++i) {
156     params.index_keys[i].resize(index_keys[i].size());
157     for (size_t j = 0; j < index_keys[i].size(); ++j) {
158       params.index_keys[i][j] = IndexedDBKeyBuilder::Build(index_keys[i][j]);
159     }
160   }
161   thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseSetIndexKeys(params));
162 }
163
164 void RendererWebIDBDatabaseImpl::setIndexesReady(
165     long long transaction_id,
166     long long object_store_id,
167     const WebVector<long long>& web_index_ids) {
168   std::vector<int64> index_ids(web_index_ids.data(),
169                                web_index_ids.data() + web_index_ids.size());
170   thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseSetIndexesReady(
171       ipc_database_id_, transaction_id, object_store_id, index_ids));
172 }
173
174 void RendererWebIDBDatabaseImpl::openCursor(
175     long long transaction_id,
176     long long object_store_id,
177     long long index_id,
178     const WebIDBKeyRange& key_range,
179     unsigned short direction,
180     bool key_only,
181     TaskType task_type,
182     WebIDBCallbacks* callbacks) {
183   IndexedDBDispatcher* dispatcher =
184       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
185   dispatcher->RequestIDBDatabaseOpenCursor(
186       ipc_database_id_,
187       transaction_id,
188       object_store_id,
189       index_id,
190       IndexedDBKeyRangeBuilder::Build(key_range),
191       direction,
192       key_only,
193       task_type,
194       callbacks);
195 }
196
197 void RendererWebIDBDatabaseImpl::count(
198     long long transaction_id,
199     long long object_store_id,
200     long long index_id,
201     const WebIDBKeyRange& key_range,
202     WebIDBCallbacks* callbacks) {
203   IndexedDBDispatcher* dispatcher =
204       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
205   dispatcher->RequestIDBDatabaseCount(
206       ipc_database_id_,
207       transaction_id,
208       object_store_id,
209       index_id,
210       IndexedDBKeyRangeBuilder::Build(key_range),
211       callbacks);
212 }
213
214 void RendererWebIDBDatabaseImpl::deleteRange(
215     long long transaction_id,
216     long long object_store_id,
217     const WebIDBKeyRange& key_range,
218     WebIDBCallbacks* callbacks) {
219   IndexedDBDispatcher* dispatcher =
220       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
221   dispatcher->RequestIDBDatabaseDeleteRange(
222       ipc_database_id_,
223       transaction_id,
224       object_store_id,
225       IndexedDBKeyRangeBuilder::Build(key_range),
226       callbacks);
227 }
228
229 void RendererWebIDBDatabaseImpl::clear(
230     long long transaction_id,
231     long long object_store_id,
232     WebIDBCallbacks* callbacks) {
233   IndexedDBDispatcher* dispatcher =
234       IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
235   dispatcher->RequestIDBDatabaseClear(
236       ipc_database_id_, transaction_id, object_store_id, callbacks);
237 }
238
239 void RendererWebIDBDatabaseImpl::createIndex(
240     long long transaction_id,
241     long long object_store_id,
242     long long index_id,
243     const WebString& name,
244     const WebIDBKeyPath& key_path,
245     bool unique,
246     bool multi_entry)
247 {
248   IndexedDBHostMsg_DatabaseCreateIndex_Params params;
249   params.ipc_database_id = ipc_database_id_;
250   params.transaction_id = transaction_id;
251   params.object_store_id = object_store_id;
252   params.index_id = index_id;
253   params.name = name;
254   params.key_path = IndexedDBKeyPathBuilder::Build(key_path);
255   params.unique = unique;
256   params.multi_entry = multi_entry;
257
258   thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseCreateIndex(params));
259 }
260
261 void RendererWebIDBDatabaseImpl::deleteIndex(
262     long long transaction_id,
263     long long object_store_id,
264     long long index_id)
265 {
266   thread_safe_sender_->Send(
267       new IndexedDBHostMsg_DatabaseDeleteIndex(
268           ipc_database_id_,
269           transaction_id,
270           object_store_id, index_id));
271 }
272
273 void RendererWebIDBDatabaseImpl::abort(long long transaction_id) {
274   thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseAbort(
275       ipc_database_id_, transaction_id));
276 }
277
278 void RendererWebIDBDatabaseImpl::commit(long long transaction_id) {
279   thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseCommit(
280       ipc_database_id_, transaction_id));
281 }
282
283 }  // namespace content