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/public/platform/WebData.h" |
| 12 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" |
| 13 #include "third_party/WebKit/public/platform/WebIDBKey.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 |
| 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 |