OLD | NEW |
| (Empty) |
1 // Copyright (c) 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/browser/indexed_db/indexed_db_callbacks_wrapper.h" | |
6 | |
7 #include "content/browser/indexed_db/indexed_db_cursor.h" | |
8 #include "content/browser/indexed_db/indexed_db_metadata.h" | |
9 #include "content/browser/indexed_db/webidbcursor_impl.h" | |
10 #include "content/browser/indexed_db/webidbdatabase_impl.h" | |
11 #include "third_party/WebKit/Source/Platform/chromium/public/WebData.h" | |
12 #include "third_party/WebKit/Source/Platform/chromium/public/WebIDBDatabaseError
.h" | |
13 #include "third_party/WebKit/Source/Platform/chromium/public/WebIDBKey.h" | |
14 #include "third_party/WebKit/Source/Platform/chromium/public/WebIDBMetadata.h" | |
15 #include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" | |
16 #include "third_party/WebKit/Source/Platform/chromium/public/WebVector.h" | |
17 | |
18 namespace content { | |
19 | |
20 using WebKit::WebData; | |
21 using WebKit::WebIDBKey; | |
22 using WebKit::WebIDBMetadata; | |
23 using WebKit::WebString; | |
24 using WebKit::WebVector; | |
25 | |
26 IndexedDBCallbacksWrapper::IndexedDBCallbacksWrapper( | |
27 WebKit::WebIDBCallbacks* callbacks) | |
28 : callbacks_(callbacks), did_complete_(false), did_create_proxy_(false) {} | |
29 | |
30 IndexedDBCallbacksWrapper::~IndexedDBCallbacksWrapper() {} | |
31 | |
32 void IndexedDBCallbacksWrapper::OnError( | |
33 scoped_refptr<IndexedDBDatabaseError> error) { | |
34 DCHECK(callbacks_); | |
35 callbacks_->onError( | |
36 WebKit::WebIDBDatabaseError(error->code(), error->message())); | |
37 callbacks_.reset(); | |
38 } | |
39 | |
40 void IndexedDBCallbacksWrapper::OnSuccess(const std::vector<string16>& value) { | |
41 DCHECK(callbacks_); | |
42 callbacks_->onSuccess(WebVector<WebString>(value)); | |
43 callbacks_.reset(); | |
44 } | |
45 | |
46 void IndexedDBCallbacksWrapper::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, | |
47 const IndexedDBKey& key, | |
48 const IndexedDBKey& primary_key, | |
49 std::vector<char>* value) { | |
50 DCHECK(callbacks_); | |
51 WebData web_value; | |
52 if (value && value->size()) | |
53 web_value.assign(&value->front(), value->size()); | |
54 callbacks_->onSuccess( | |
55 new WebIDBCursorImpl(cursor), WebIDBKey(key), primary_key, web_value); | |
56 callbacks_.reset(); | |
57 } | |
58 | |
59 void IndexedDBCallbacksWrapper::OnSuccess(const IndexedDBKey& key) { | |
60 DCHECK(callbacks_); | |
61 callbacks_->onSuccess(WebIDBKey(key)); | |
62 callbacks_.reset(); | |
63 } | |
64 | |
65 void IndexedDBCallbacksWrapper::OnSuccess(std::vector<char>* value) { | |
66 WebData web_value; | |
67 if (value && value->size()) | |
68 web_value.assign(&value->front(), value->size()); | |
69 | |
70 DCHECK(callbacks_); | |
71 callbacks_->onSuccess(web_value); | |
72 callbacks_.reset(); | |
73 } | |
74 | |
75 void IndexedDBCallbacksWrapper::OnSuccess(std::vector<char>* value, | |
76 const IndexedDBKey& key, | |
77 const IndexedDBKeyPath& key_path) { | |
78 WebData web_value; | |
79 if (value && value->size()) | |
80 web_value.assign(&value->front(), value->size()); | |
81 DCHECK(callbacks_); | |
82 callbacks_->onSuccess(web_value, WebIDBKey(key), key_path); | |
83 callbacks_.reset(); | |
84 } | |
85 | |
86 void IndexedDBCallbacksWrapper::OnSuccess(int64 value) { | |
87 DCHECK(callbacks_); | |
88 callbacks_->onSuccess(value); | |
89 callbacks_.reset(); | |
90 } | |
91 | |
92 void IndexedDBCallbacksWrapper::OnSuccess() { | |
93 DCHECK(callbacks_); | |
94 callbacks_->onSuccess(); | |
95 callbacks_.reset(); | |
96 } | |
97 | |
98 void IndexedDBCallbacksWrapper::OnSuccess(const IndexedDBKey& key, | |
99 const IndexedDBKey& primary_key, | |
100 std::vector<char>* value) { | |
101 WebData web_value; | |
102 if (value && value->size()) | |
103 web_value.assign(&value->front(), value->size()); | |
104 DCHECK(callbacks_); | |
105 callbacks_->onSuccess(key, primary_key, web_value); | |
106 callbacks_.reset(); | |
107 } | |
108 | |
109 void IndexedDBCallbacksWrapper::OnSuccessWithPrefetch( | |
110 const std::vector<IndexedDBKey>& keys, | |
111 const std::vector<IndexedDBKey>& primary_keys, | |
112 const std::vector<std::vector<char> >& values) { | |
113 DCHECK_EQ(keys.size(), primary_keys.size()); | |
114 DCHECK_EQ(keys.size(), values.size()); | |
115 | |
116 std::vector<WebIDBKey> web_keys(keys.size()); | |
117 std::vector<WebIDBKey> web_primary_keys(primary_keys.size()); | |
118 std::vector<WebData> web_values(values.size()); | |
119 for (size_t i = 0; i < keys.size(); ++i) { | |
120 web_keys[i] = keys[i]; | |
121 web_primary_keys[i] = primary_keys[i]; | |
122 if (values[i].size()) | |
123 web_values[i].assign(&values[i].front(), values[i].size()); | |
124 } | |
125 | |
126 DCHECK(callbacks_); | |
127 callbacks_->onSuccessWithPrefetch(web_keys, web_primary_keys, web_values); | |
128 callbacks_.reset(); | |
129 } | |
130 | |
131 void IndexedDBCallbacksWrapper::OnBlocked(int64 existing_version) { | |
132 DCHECK(callbacks_); | |
133 callbacks_->onBlocked(existing_version); | |
134 } | |
135 | |
136 WebIDBMetadata ConvertMetadata(const IndexedDBDatabaseMetadata& idb_metadata) { | |
137 WebIDBMetadata web_metadata; | |
138 web_metadata.id = idb_metadata.id; | |
139 web_metadata.name = idb_metadata.name; | |
140 web_metadata.version = idb_metadata.version; | |
141 web_metadata.intVersion = idb_metadata.int_version; | |
142 web_metadata.maxObjectStoreId = idb_metadata.max_object_store_id; | |
143 web_metadata.objectStores = | |
144 WebVector<WebIDBMetadata::ObjectStore>(idb_metadata.object_stores.size()); | |
145 | |
146 size_t i = 0; | |
147 for (IndexedDBDatabaseMetadata::ObjectStoreMap::const_iterator | |
148 it = idb_metadata.object_stores.begin(); | |
149 it != idb_metadata.object_stores.end(); | |
150 ++it, ++i) { | |
151 const IndexedDBObjectStoreMetadata& idb_store_metadata = it->second; | |
152 WebIDBMetadata::ObjectStore& web_store_metadata = | |
153 web_metadata.objectStores[i]; | |
154 | |
155 web_store_metadata.id = idb_store_metadata.id; | |
156 web_store_metadata.name = idb_store_metadata.name; | |
157 web_store_metadata.keyPath = idb_store_metadata.key_path; | |
158 web_store_metadata.autoIncrement = idb_store_metadata.auto_increment; | |
159 web_store_metadata.maxIndexId = idb_store_metadata.max_index_id; | |
160 web_store_metadata.indexes = | |
161 WebVector<WebIDBMetadata::Index>(idb_store_metadata.indexes.size()); | |
162 | |
163 size_t j = 0; | |
164 for (IndexedDBObjectStoreMetadata::IndexMap::const_iterator | |
165 it2 = idb_store_metadata.indexes.begin(); | |
166 it2 != idb_store_metadata.indexes.end(); | |
167 ++it2, ++j) { | |
168 const IndexedDBIndexMetadata& idb_index_metadata = it2->second; | |
169 WebIDBMetadata::Index& web_index_metadata = web_store_metadata.indexes[j]; | |
170 | |
171 web_index_metadata.id = idb_index_metadata.id; | |
172 web_index_metadata.name = idb_index_metadata.name; | |
173 web_index_metadata.keyPath = idb_index_metadata.key_path; | |
174 web_index_metadata.unique = idb_index_metadata.unique; | |
175 web_index_metadata.multiEntry = idb_index_metadata.multi_entry; | |
176 } | |
177 } | |
178 | |
179 return web_metadata; | |
180 } | |
181 | |
182 void IndexedDBCallbacksWrapper::OnUpgradeNeeded( | |
183 int64 old_version, | |
184 scoped_refptr<IndexedDBDatabase> database, | |
185 const IndexedDBDatabaseMetadata& metadata) { | |
186 DCHECK(callbacks_); | |
187 WebIDBMetadata web_metadata = ConvertMetadata(metadata); | |
188 did_create_proxy_ = true; | |
189 callbacks_->onUpgradeNeeded( | |
190 old_version, | |
191 new WebIDBDatabaseImpl(database, database_callbacks_), | |
192 web_metadata); | |
193 database_callbacks_ = NULL; | |
194 } | |
195 | |
196 void IndexedDBCallbacksWrapper::OnSuccess( | |
197 scoped_refptr<IndexedDBDatabase> database, | |
198 const IndexedDBDatabaseMetadata& metadata) { | |
199 DCHECK(callbacks_); | |
200 WebIDBMetadata web_metadata = ConvertMetadata(metadata); | |
201 scoped_refptr<IndexedDBCallbacksWrapper> self(this); | |
202 | |
203 WebIDBDatabaseImpl* impl = | |
204 did_create_proxy_ ? 0 | |
205 : new WebIDBDatabaseImpl(database, database_callbacks_); | |
206 database_callbacks_ = NULL; | |
207 | |
208 callbacks_->onSuccess(impl, web_metadata); | |
209 callbacks_.reset(); | |
210 } | |
211 | |
212 void IndexedDBCallbacksWrapper::SetDatabaseCallbacks( | |
213 scoped_refptr<IndexedDBDatabaseCallbacksWrapper> database_callbacks) { | |
214 database_callbacks_ = database_callbacks; | |
215 } | |
216 } // namespace content | |
OLD | NEW |