| OLD | NEW |
| (Empty) |
| 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. | |
| 4 | |
| 5 #include "content/browser/in_process_webkit/indexed_db_callbacks.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 #include <vector> | |
| 9 | |
| 10 #include "content/browser/indexed_db/indexed_db_metadata.h" | |
| 11 #include "content/browser/indexed_db/webidbdatabase_impl.h" | |
| 12 #include "content/common/indexed_db/indexed_db_messages.h" | |
| 13 #include "webkit/browser/quota/quota_manager.h" | |
| 14 | |
| 15 using WebKit::WebData; | |
| 16 using WebKit::WebIDBCallbacks; | |
| 17 using WebKit::WebString; | |
| 18 | |
| 19 namespace content { | |
| 20 | |
| 21 namespace { | |
| 22 const int32 kDatabaseNotAdded = -1; | |
| 23 } | |
| 24 | |
| 25 IndexedDBCallbacksBase::IndexedDBCallbacksBase( | |
| 26 IndexedDBDispatcherHost* dispatcher_host, | |
| 27 int32 ipc_thread_id, | |
| 28 int32 ipc_callbacks_id) | |
| 29 : dispatcher_host_(dispatcher_host), | |
| 30 ipc_callbacks_id_(ipc_callbacks_id), | |
| 31 ipc_thread_id_(ipc_thread_id) {} | |
| 32 | |
| 33 IndexedDBCallbacksBase::~IndexedDBCallbacksBase() {} | |
| 34 | |
| 35 void IndexedDBCallbacksBase::onError(const WebKit::WebIDBDatabaseError& error) { | |
| 36 dispatcher_host_->Send(new IndexedDBMsg_CallbacksError( | |
| 37 ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message())); | |
| 38 } | |
| 39 | |
| 40 void IndexedDBCallbacksBase::onBlocked(long long old_version) { | |
| 41 dispatcher_host_->Send(new IndexedDBMsg_CallbacksIntBlocked( | |
| 42 ipc_thread_id_, ipc_callbacks_id_, old_version)); | |
| 43 } | |
| 44 | |
| 45 void IndexedDBCallbacksBase::onSuccess(const std::vector<string16>& value) { | |
| 46 NOTREACHED(); | |
| 47 } | |
| 48 | |
| 49 void IndexedDBCallbacksBase::onSuccess( | |
| 50 WebIDBDatabaseImpl* idb_object, | |
| 51 const IndexedDBDatabaseMetadata& metadata) { | |
| 52 NOTREACHED(); | |
| 53 } | |
| 54 | |
| 55 void IndexedDBCallbacksBase::onUpgradeNeeded( | |
| 56 long long old_version, | |
| 57 WebIDBDatabaseImpl* database, | |
| 58 const IndexedDBDatabaseMetadata& /*metadata*/, | |
| 59 WebKit::WebIDBCallbacks::DataLoss data_loss) { | |
| 60 NOTREACHED(); | |
| 61 } | |
| 62 | |
| 63 void IndexedDBCallbacksBase::onSuccess(WebIDBCursorImpl* idb_object, | |
| 64 const IndexedDBKey& key, | |
| 65 const IndexedDBKey& primaryKey, | |
| 66 std::vector<char>* value) { | |
| 67 NOTREACHED(); | |
| 68 } | |
| 69 | |
| 70 void IndexedDBCallbacksBase::onSuccess(const IndexedDBKey& key, | |
| 71 const IndexedDBKey& primaryKey, | |
| 72 std::vector<char>* value) { | |
| 73 NOTREACHED(); | |
| 74 } | |
| 75 | |
| 76 void IndexedDBCallbacksBase::onSuccess(std::vector<char>* value) { | |
| 77 NOTREACHED(); | |
| 78 } | |
| 79 | |
| 80 void IndexedDBCallbacksBase::onSuccessWithPrefetch( | |
| 81 const std::vector<IndexedDBKey>& keys, | |
| 82 const std::vector<IndexedDBKey>& primaryKeys, | |
| 83 const std::vector<std::vector<char> >& values) { | |
| 84 NOTREACHED(); | |
| 85 } | |
| 86 | |
| 87 void IndexedDBCallbacksBase::onSuccess(const IndexedDBKey& value) { | |
| 88 NOTREACHED(); | |
| 89 } | |
| 90 | |
| 91 void IndexedDBCallbacksBase::onSuccess(std::vector<char>* value, | |
| 92 const IndexedDBKey& key, | |
| 93 const IndexedDBKeyPath& keyPath) { | |
| 94 NOTREACHED(); | |
| 95 } | |
| 96 | |
| 97 void IndexedDBCallbacksBase::onSuccess(long long value) { NOTREACHED(); } | |
| 98 | |
| 99 void IndexedDBCallbacksBase::onSuccess() { NOTREACHED(); } | |
| 100 | |
| 101 IndexedDBCallbacksDatabase::IndexedDBCallbacksDatabase( | |
| 102 IndexedDBDispatcherHost* dispatcher_host, | |
| 103 int32 ipc_thread_id, | |
| 104 int32 ipc_callbacks_id, | |
| 105 int32 ipc_database_callbacks_id, | |
| 106 int64 host_transaction_id, | |
| 107 const GURL& origin_url) | |
| 108 : IndexedDBCallbacksBase(dispatcher_host, ipc_thread_id, ipc_callbacks_id), | |
| 109 host_transaction_id_(host_transaction_id), | |
| 110 origin_url_(origin_url), | |
| 111 ipc_database_id_(kDatabaseNotAdded), | |
| 112 ipc_database_callbacks_id_(ipc_database_callbacks_id) {} | |
| 113 | |
| 114 void IndexedDBCallbacksDatabase::onSuccess( | |
| 115 WebIDBDatabaseImpl* idb_object, | |
| 116 const IndexedDBDatabaseMetadata& metadata) { | |
| 117 int32 ipc_object_id = ipc_database_id_; | |
| 118 if (ipc_object_id == kDatabaseNotAdded) { | |
| 119 ipc_object_id = | |
| 120 dispatcher_host()->Add(idb_object, ipc_thread_id(), origin_url_); | |
| 121 } else { | |
| 122 // We already have this database and don't need a new copy of it. | |
| 123 delete idb_object; | |
| 124 } | |
| 125 const ::IndexedDBDatabaseMetadata idb_metadata = | |
| 126 IndexedDBDispatcherHost::ConvertMetadata(metadata); | |
| 127 | |
| 128 dispatcher_host()->Send( | |
| 129 new IndexedDBMsg_CallbacksSuccessIDBDatabase(ipc_thread_id(), | |
| 130 ipc_callbacks_id(), | |
| 131 ipc_database_callbacks_id_, | |
| 132 ipc_object_id, | |
| 133 idb_metadata)); | |
| 134 } | |
| 135 | |
| 136 void IndexedDBCallbacksDatabase::onUpgradeNeeded( | |
| 137 long long old_version, | |
| 138 WebIDBDatabaseImpl* database, | |
| 139 const IndexedDBDatabaseMetadata& metadata, | |
| 140 WebIDBCallbacks::DataLoss data_loss) { | |
| 141 dispatcher_host()->RegisterTransactionId(host_transaction_id_, origin_url_); | |
| 142 int32 ipc_database_id = | |
| 143 dispatcher_host()->Add(database, ipc_thread_id(), origin_url_); | |
| 144 ipc_database_id_ = ipc_database_id; | |
| 145 IndexedDBMsg_CallbacksUpgradeNeeded_Params params; | |
| 146 params.ipc_thread_id = ipc_thread_id(); | |
| 147 params.ipc_callbacks_id = ipc_callbacks_id(); | |
| 148 params.ipc_database_id = ipc_database_id; | |
| 149 params.ipc_database_callbacks_id = ipc_database_callbacks_id_; | |
| 150 params.old_version = old_version; | |
| 151 params.idb_metadata = IndexedDBDispatcherHost::ConvertMetadata(metadata); | |
| 152 params.data_loss = data_loss; | |
| 153 dispatcher_host()->Send(new IndexedDBMsg_CallbacksUpgradeNeeded(params)); | |
| 154 } | |
| 155 | |
| 156 void IndexedDBCallbacks<WebIDBCursorImpl>::onSuccess( | |
| 157 WebIDBCursorImpl* idb_cursor, | |
| 158 const IndexedDBKey& key, | |
| 159 const IndexedDBKey& primaryKey, | |
| 160 std::vector<char>* value) { | |
| 161 int32 ipc_object_id = dispatcher_host()->Add(idb_cursor); | |
| 162 IndexedDBMsg_CallbacksSuccessIDBCursor_Params params; | |
| 163 params.ipc_thread_id = ipc_thread_id(); | |
| 164 params.ipc_callbacks_id = ipc_callbacks_id(); | |
| 165 params.ipc_cursor_id = ipc_object_id; | |
| 166 params.key = key; | |
| 167 params.primary_key = primaryKey; | |
| 168 if (value && !value->empty()) | |
| 169 std::swap(params.value, *value); | |
| 170 // TODO(alecflett): Avoid a copy here: the whole params object is | |
| 171 // being copied into the message. | |
| 172 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(params)); | |
| 173 } | |
| 174 | |
| 175 void IndexedDBCallbacks<WebIDBCursorImpl>::onSuccess(std::vector<char>* value) { | |
| 176 std::vector<char> value_copy; | |
| 177 if (value && !value->empty()) | |
| 178 std::swap(value_copy, *value); | |
| 179 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessValue( | |
| 180 ipc_thread_id(), | |
| 181 ipc_callbacks_id(), | |
| 182 // TODO(alecflett): avoid a copy here. | |
| 183 value_copy)); | |
| 184 } | |
| 185 | |
| 186 void IndexedDBCallbacks<WebIDBCursorImpl>::onSuccess( | |
| 187 const IndexedDBKey& key, | |
| 188 const IndexedDBKey& primaryKey, | |
| 189 std::vector<char>* value) { | |
| 190 DCHECK_NE(ipc_cursor_id_, -1); | |
| 191 WebIDBCursorImpl* idb_cursor = | |
| 192 dispatcher_host()->GetCursorFromId(ipc_cursor_id_); | |
| 193 | |
| 194 DCHECK(idb_cursor); | |
| 195 if (!idb_cursor) | |
| 196 return; | |
| 197 IndexedDBMsg_CallbacksSuccessCursorContinue_Params params; | |
| 198 params.ipc_thread_id = ipc_thread_id(); | |
| 199 params.ipc_callbacks_id = ipc_callbacks_id(); | |
| 200 params.ipc_cursor_id = ipc_cursor_id_; | |
| 201 params.key = key; | |
| 202 params.primary_key = primaryKey; | |
| 203 if (value && !value->empty()) | |
| 204 std::swap(params.value, *value); | |
| 205 // TODO(alecflett): Avoid a copy here: the whole params object is | |
| 206 // being copied into the message. | |
| 207 dispatcher_host()->Send( | |
| 208 new IndexedDBMsg_CallbacksSuccessCursorContinue(params)); | |
| 209 } | |
| 210 | |
| 211 void IndexedDBCallbacks<WebIDBCursorImpl>::onSuccessWithPrefetch( | |
| 212 const std::vector<IndexedDBKey>& keys, | |
| 213 const std::vector<IndexedDBKey>& primaryKeys, | |
| 214 const std::vector<std::vector<char> >& values) { | |
| 215 DCHECK_NE(ipc_cursor_id_, -1); | |
| 216 | |
| 217 std::vector<IndexedDBKey> msgKeys; | |
| 218 std::vector<IndexedDBKey> msgPrimaryKeys; | |
| 219 | |
| 220 for (size_t i = 0; i < keys.size(); ++i) { | |
| 221 msgKeys.push_back(keys[i]); | |
| 222 msgPrimaryKeys.push_back(primaryKeys[i]); | |
| 223 } | |
| 224 | |
| 225 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params params; | |
| 226 params.ipc_thread_id = ipc_thread_id(); | |
| 227 params.ipc_callbacks_id = ipc_callbacks_id(); | |
| 228 params.ipc_cursor_id = ipc_cursor_id_; | |
| 229 params.keys = msgKeys; | |
| 230 params.primary_keys = msgPrimaryKeys; | |
| 231 params.values = values; | |
| 232 dispatcher_host()->Send( | |
| 233 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(params)); | |
| 234 } | |
| 235 | |
| 236 void IndexedDBCallbacks<IndexedDBKey>::onSuccess(const IndexedDBKey& value) { | |
| 237 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessIndexedDBKey( | |
| 238 ipc_thread_id(), ipc_callbacks_id(), IndexedDBKey(value))); | |
| 239 } | |
| 240 | |
| 241 void IndexedDBCallbacks<std::vector<string16> >::onSuccess( | |
| 242 const std::vector<string16>& value) { | |
| 243 | |
| 244 std::vector<string16> list; | |
| 245 for (unsigned i = 0; i < value.size(); ++i) | |
| 246 list.push_back(value[i]); | |
| 247 | |
| 248 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessStringList( | |
| 249 ipc_thread_id(), ipc_callbacks_id(), list)); | |
| 250 } | |
| 251 | |
| 252 void IndexedDBCallbacks<std::vector<char> >::onSuccess( | |
| 253 std::vector<char>* value) { | |
| 254 std::vector<char> value_copy; | |
| 255 if (value && !value->empty()) | |
| 256 std::swap(value_copy, *value); | |
| 257 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessValue( | |
| 258 ipc_thread_id(), | |
| 259 ipc_callbacks_id(), | |
| 260 // TODO(alecflett): avoid a copy here | |
| 261 value_copy)); | |
| 262 } | |
| 263 | |
| 264 void IndexedDBCallbacks<std::vector<char> >::onSuccess( | |
| 265 std::vector<char>* value, | |
| 266 const IndexedDBKey& primaryKey, | |
| 267 const IndexedDBKeyPath& keyPath) { | |
| 268 std::vector<char> value_copy; | |
| 269 if (value && !value->empty()) | |
| 270 std::swap(value_copy, *value); | |
| 271 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessValueWithKey( | |
| 272 ipc_thread_id(), | |
| 273 ipc_callbacks_id(), | |
| 274 // TODO(alecflett): Avoid a copy here. | |
| 275 value_copy, | |
| 276 IndexedDBKey(primaryKey), | |
| 277 IndexedDBKeyPath(keyPath))); | |
| 278 } | |
| 279 | |
| 280 void IndexedDBCallbacks<std::vector<char> >::onSuccess(long long value) { | |
| 281 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessInteger( | |
| 282 ipc_thread_id(), ipc_callbacks_id(), value)); | |
| 283 } | |
| 284 | |
| 285 void IndexedDBCallbacks<std::vector<char> >::onSuccess() { | |
| 286 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessUndefined( | |
| 287 ipc_thread_id(), ipc_callbacks_id())); | |
| 288 } | |
| 289 | |
| 290 void IndexedDBCallbacks<std::vector<char> >::onSuccess( | |
| 291 const IndexedDBKey& value) { | |
| 292 dispatcher_host()->Send(new IndexedDBMsg_CallbacksSuccessIndexedDBKey( | |
| 293 ipc_thread_id(), ipc_callbacks_id(), value)); | |
| 294 } | |
| 295 | |
| 296 } // namespace content | |
| OLD | NEW |