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"
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
;
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
43 IndexedDBDispatcher::Send(new IndexedDBHostMsg_DatabaseDestroyed(
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
;
95 WebKit::WebIDBObjectStore
* RendererWebIDBDatabaseImpl::createObjectStore(
97 const WebKit::WebString
& name
,
98 const WebKit::WebIDBKeyPath
& key_path
,
100 const WebKit::WebIDBTransaction
& transaction
,
101 WebExceptionCode
& ec
) {
102 IndexedDBHostMsg_DatabaseCreateObjectStore_Params params
;
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_
;
111 IndexedDBDispatcher::Send(
112 new IndexedDBHostMsg_DatabaseCreateObjectStore(
113 params
, &object_store
, &ec
));
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
));
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