OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/child/indexed_db/indexed_db_dispatcher.h" | 5 #include "content/child/indexed_db/indexed_db_dispatcher.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 WebIDBKeyRangeBuilder::Build(idb_observation.key_range); | 94 WebIDBKeyRangeBuilder::Build(idb_observation.key_range); |
95 // TODO(palakj): Assign value to web_observation. | 95 // TODO(palakj): Assign value to web_observation. |
96 web_observations.push_back(std::move(web_observation)); | 96 web_observations.push_back(std::move(web_observation)); |
97 } | 97 } |
98 return web_observations; | 98 return web_observations; |
99 } | 99 } |
100 | 100 |
101 void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { | 101 void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { |
102 bool handled = true; | 102 bool handled = true; |
103 IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg) | 103 IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg) |
104 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBCursor, | |
105 OnSuccessOpenCursor) | |
106 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorAdvance, | 104 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorAdvance, |
107 OnSuccessCursorContinue) | 105 OnSuccessCursorContinue) |
108 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, | 106 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, |
109 OnSuccessCursorContinue) | 107 OnSuccessCursorContinue) |
110 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, | 108 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, |
111 OnSuccessCursorPrefetch) | 109 OnSuccessCursorPrefetch) |
112 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey, | |
113 OnSuccessIndexedDBKey) | |
114 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessArray, OnSuccessArray) | |
115 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValue, OnSuccessValue) | 110 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValue, OnSuccessValue) |
116 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessInteger, OnSuccessInteger) | 111 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessInteger, OnSuccessInteger) |
117 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessUndefined, | |
118 OnSuccessUndefined) | |
119 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError) | 112 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError) |
120 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksChanges, | 113 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksChanges, |
121 OnDatabaseChanges) | 114 OnDatabaseChanges) |
122 IPC_MESSAGE_UNHANDLED(handled = false) | 115 IPC_MESSAGE_UNHANDLED(handled = false) |
123 IPC_END_MESSAGE_MAP() | 116 IPC_END_MESSAGE_MAP() |
124 // If a message gets here, IndexedDBMessageFilter already determined that it | 117 // If a message gets here, IndexedDBMessageFilter already determined that it |
125 // is an IndexedDB message. | 118 // is an IndexedDB message. |
126 DCHECK(handled) << "Didn't handle a message defined at line " | 119 DCHECK(handled) << "Didn't handle a message defined at line " |
127 << IPC_MESSAGE_ID_LINE(msg.type()); | 120 << IPC_MESSAGE_ID_LINE(msg.type()); |
128 } | 121 } |
129 | 122 |
130 bool IndexedDBDispatcher::Send(IPC::Message* msg) { | 123 bool IndexedDBDispatcher::Send(IPC::Message* msg) { |
131 return thread_safe_sender_->Send(msg); | 124 return thread_safe_sender_->Send(msg); |
132 } | 125 } |
133 | 126 |
134 int32_t IndexedDBDispatcher::AddIDBObserver( | 127 int32_t IndexedDBDispatcher::RegisterObserver( |
135 int32_t ipc_database_id, | |
136 int64_t transaction_id, | |
137 std::unique_ptr<WebIDBObserver> observer) { | 128 std::unique_ptr<WebIDBObserver> observer) { |
138 IndexedDBHostMsg_DatabaseObserve_Params params; | 129 return observers_.Add(observer.release()); |
139 static_assert(blink::WebIDBOperationTypeCount < sizeof(uint16_t) * CHAR_BIT, | |
140 "WebIDBOperationType Count exceeds size of uint16_t"); | |
141 params.operation_types = | |
142 static_cast<uint16_t>(observer->operationTypes().to_ulong()); | |
143 params.include_transaction = observer->transaction(); | |
144 params.no_records = observer->noRecords(); | |
145 params.values = observer->values(); | |
146 int32_t observer_id = observers_.Add(observer.release()); | |
147 params.ipc_database_id = ipc_database_id; | |
148 params.transaction_id = transaction_id; | |
149 params.observer_id = observer_id; | |
150 Send(new IndexedDBHostMsg_DatabaseObserve(params)); | |
151 return observer_id; | |
152 } | 130 } |
153 | 131 |
154 void IndexedDBDispatcher::RemoveIDBObserversFromDatabase( | 132 void IndexedDBDispatcher::RemoveObservers( |
155 int32_t ipc_database_id, | |
156 const std::vector<int32_t>& observer_ids_to_remove) { | 133 const std::vector<int32_t>& observer_ids_to_remove) { |
157 for (int32_t id_to_remove : observer_ids_to_remove) { | |
158 observers_.Remove(id_to_remove); | |
159 } | |
160 Send(new IndexedDBHostMsg_DatabaseUnobserve(ipc_database_id, | |
161 observer_ids_to_remove)); | |
162 } | |
163 | |
164 void IndexedDBDispatcher::RemoveIDBObservers( | |
165 const std::set<int32_t>& observer_ids_to_remove) { | |
166 for (int32_t id : observer_ids_to_remove) | 134 for (int32_t id : observer_ids_to_remove) |
167 observers_.Remove(id); | 135 observers_.Remove(id); |
168 } | 136 } |
169 | 137 |
170 void IndexedDBDispatcher::RequestIDBCursorAdvance( | 138 void IndexedDBDispatcher::RequestIDBCursorAdvance( |
171 unsigned long count, | 139 unsigned long count, |
172 WebIDBCallbacks* callbacks_ptr, | 140 WebIDBCallbacks* callbacks_ptr, |
173 int32_t ipc_cursor_id, | 141 int32_t ipc_cursor_id, |
174 int64_t transaction_id) { | 142 int64_t transaction_id) { |
175 // Reset all cursor prefetch caches except for this cursor. | 143 // Reset all cursor prefetch caches except for this cursor. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, n)); | 177 ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, n)); |
210 } | 178 } |
211 | 179 |
212 void IndexedDBDispatcher::RequestIDBCursorPrefetchReset(int used_prefetches, | 180 void IndexedDBDispatcher::RequestIDBCursorPrefetchReset(int used_prefetches, |
213 int unused_prefetches, | 181 int unused_prefetches, |
214 int32_t ipc_cursor_id) { | 182 int32_t ipc_cursor_id) { |
215 Send(new IndexedDBHostMsg_CursorPrefetchReset( | 183 Send(new IndexedDBHostMsg_CursorPrefetchReset( |
216 ipc_cursor_id, used_prefetches, unused_prefetches)); | 184 ipc_cursor_id, used_prefetches, unused_prefetches)); |
217 } | 185 } |
218 | 186 |
219 void IndexedDBDispatcher::RequestIDBDatabaseClose(int32_t ipc_database_id) { | 187 void IndexedDBDispatcher::RegisterCursor(int32_t ipc_cursor_id, |
220 Send(new IndexedDBHostMsg_DatabaseClose(ipc_database_id)); | 188 WebIDBCursorImpl* cursor) { |
221 } | 189 DCHECK(!base::ContainsKey(cursors_, ipc_cursor_id)); |
222 | 190 cursors_[ipc_cursor_id] = cursor; |
223 void IndexedDBDispatcher::NotifyIDBDatabaseVersionChangeIgnored( | |
224 int32_t ipc_database_id) { | |
225 Send(new IndexedDBHostMsg_DatabaseVersionChangeIgnored(ipc_database_id)); | |
226 } | |
227 | |
228 void IndexedDBDispatcher::RequestIDBDatabaseCreateTransaction( | |
229 int32_t ipc_database_id, | |
230 int64_t transaction_id, | |
231 WebVector<long long> object_store_ids, | |
232 blink::WebIDBTransactionMode mode) { | |
233 IndexedDBHostMsg_DatabaseCreateTransaction_Params params; | |
234 params.ipc_thread_id = CurrentWorkerId(); | |
235 params.ipc_database_id = ipc_database_id; | |
236 params.transaction_id = transaction_id; | |
237 params.object_store_ids | |
238 .assign(object_store_ids.data(), | |
239 object_store_ids.data() + object_store_ids.size()); | |
240 params.mode = mode; | |
241 | |
242 Send(new IndexedDBHostMsg_DatabaseCreateTransaction(params)); | |
243 } | |
244 | |
245 void IndexedDBDispatcher::RequestIDBDatabaseGet( | |
246 int32_t ipc_database_id, | |
247 int64_t transaction_id, | |
248 int64_t object_store_id, | |
249 int64_t index_id, | |
250 const IndexedDBKeyRange& key_range, | |
251 bool key_only, | |
252 WebIDBCallbacks* callbacks) { | |
253 ResetCursorPrefetchCaches(transaction_id, kAllCursors); | |
254 IndexedDBHostMsg_DatabaseGet_Params params; | |
255 init_params(¶ms, callbacks); | |
256 params.ipc_database_id = ipc_database_id; | |
257 params.transaction_id = transaction_id; | |
258 params.object_store_id = object_store_id; | |
259 params.index_id = index_id; | |
260 params.key_range = key_range; | |
261 params.key_only = key_only; | |
262 Send(new IndexedDBHostMsg_DatabaseGet(params)); | |
263 } | |
264 | |
265 void IndexedDBDispatcher::RequestIDBDatabaseGetAll( | |
266 int32_t ipc_database_id, | |
267 int64_t transaction_id, | |
268 int64_t object_store_id, | |
269 int64_t index_id, | |
270 const IndexedDBKeyRange& key_range, | |
271 bool key_only, | |
272 int64_t max_count, | |
273 WebIDBCallbacks* callbacks) { | |
274 ResetCursorPrefetchCaches(transaction_id, kAllCursors); | |
275 IndexedDBHostMsg_DatabaseGetAll_Params params; | |
276 init_params(¶ms, callbacks); | |
277 params.ipc_database_id = ipc_database_id; | |
278 params.transaction_id = transaction_id; | |
279 params.object_store_id = object_store_id; | |
280 params.index_id = index_id; | |
281 params.key_range = key_range; | |
282 params.key_only = key_only; | |
283 params.max_count = max_count; | |
284 Send(new IndexedDBHostMsg_DatabaseGetAll(params)); | |
285 } | |
286 | |
287 void IndexedDBDispatcher::RequestIDBDatabasePut( | |
288 int32_t ipc_database_id, | |
289 int64_t transaction_id, | |
290 int64_t object_store_id, | |
291 const WebData& value, | |
292 const blink::WebVector<WebBlobInfo>& web_blob_info, | |
293 const IndexedDBKey& key, | |
294 blink::WebIDBPutMode put_mode, | |
295 WebIDBCallbacks* callbacks, | |
296 const WebVector<long long>& index_ids, | |
297 const WebVector<WebVector<WebIDBKey>>& index_keys) { | |
298 if (value.size() + key.size_estimate() > max_put_value_size_) { | |
299 callbacks->onError(WebIDBDatabaseError( | |
300 blink::WebIDBDatabaseExceptionUnknownError, | |
301 WebString::fromUTF8(base::StringPrintf( | |
302 "The serialized value is too large" | |
303 " (size=%" PRIuS " bytes, max=%" PRIuS " bytes).", | |
304 value.size(), | |
305 max_put_value_size_).c_str()))); | |
306 return; | |
307 } | |
308 | |
309 ResetCursorPrefetchCaches(transaction_id, kAllCursors); | |
310 IndexedDBHostMsg_DatabasePut_Params params; | |
311 init_params(¶ms, callbacks); | |
312 params.ipc_database_id = ipc_database_id; | |
313 params.transaction_id = transaction_id; | |
314 params.object_store_id = object_store_id; | |
315 | |
316 params.value.bits.assign(value.data(), value.data() + value.size()); | |
317 params.key = key; | |
318 params.put_mode = put_mode; | |
319 | |
320 DCHECK_EQ(index_ids.size(), index_keys.size()); | |
321 params.index_keys.resize(index_ids.size()); | |
322 for (size_t i = 0, len = index_ids.size(); i < len; ++i) { | |
323 params.index_keys[i].first = index_ids[i]; | |
324 params.index_keys[i].second.resize(index_keys[i].size()); | |
325 for (size_t j = 0; j < index_keys[i].size(); ++j) { | |
326 params.index_keys[i].second[j] = | |
327 IndexedDBKey(IndexedDBKeyBuilder::Build(index_keys[i][j])); | |
328 } | |
329 } | |
330 | |
331 params.value.blob_or_file_info.resize(web_blob_info.size()); | |
332 for (size_t i = 0; i < web_blob_info.size(); ++i) { | |
333 const WebBlobInfo& info = web_blob_info[i]; | |
334 IndexedDBMsg_BlobOrFileInfo& blob_or_file_info = | |
335 params.value.blob_or_file_info[i]; | |
336 blob_or_file_info.is_file = info.isFile(); | |
337 if (info.isFile()) { | |
338 blob_or_file_info.file_path = info.filePath(); | |
339 blob_or_file_info.file_name = info.fileName(); | |
340 blob_or_file_info.last_modified = info.lastModified(); | |
341 } | |
342 blob_or_file_info.size = info.size(); | |
343 blob_or_file_info.uuid = info.uuid().latin1(); | |
344 DCHECK(blob_or_file_info.uuid.size()); | |
345 blob_or_file_info.mime_type = info.type(); | |
346 } | |
347 | |
348 Send(new IndexedDBHostMsg_DatabasePut(params)); | |
349 } | |
350 | |
351 void IndexedDBDispatcher::RequestIDBDatabaseOpenCursor( | |
352 int32_t ipc_database_id, | |
353 int64_t transaction_id, | |
354 int64_t object_store_id, | |
355 int64_t index_id, | |
356 const IndexedDBKeyRange& key_range, | |
357 blink::WebIDBCursorDirection direction, | |
358 bool key_only, | |
359 blink::WebIDBTaskType task_type, | |
360 WebIDBCallbacks* callbacks) { | |
361 ResetCursorPrefetchCaches(transaction_id, kAllCursors); | |
362 IndexedDBHostMsg_DatabaseOpenCursor_Params params; | |
363 init_params(¶ms, callbacks); | |
364 params.ipc_database_id = ipc_database_id; | |
365 params.transaction_id = transaction_id; | |
366 params.object_store_id = object_store_id; | |
367 params.index_id = index_id; | |
368 params.key_range = key_range; | |
369 params.direction = direction; | |
370 params.key_only = key_only; | |
371 params.task_type = task_type; | |
372 Send(new IndexedDBHostMsg_DatabaseOpenCursor(params)); | |
373 | |
374 DCHECK(cursor_transaction_ids_.find(params.ipc_callbacks_id) == | |
375 cursor_transaction_ids_.end()); | |
376 cursor_transaction_ids_[params.ipc_callbacks_id] = transaction_id; | |
377 } | |
378 | |
379 void IndexedDBDispatcher::RequestIDBDatabaseCount( | |
380 int32_t ipc_database_id, | |
381 int64_t transaction_id, | |
382 int64_t object_store_id, | |
383 int64_t index_id, | |
384 const IndexedDBKeyRange& key_range, | |
385 WebIDBCallbacks* callbacks) { | |
386 ResetCursorPrefetchCaches(transaction_id, kAllCursors); | |
387 IndexedDBHostMsg_DatabaseCount_Params params; | |
388 init_params(¶ms, callbacks); | |
389 params.ipc_database_id = ipc_database_id; | |
390 params.transaction_id = transaction_id; | |
391 params.object_store_id = object_store_id; | |
392 params.index_id = index_id; | |
393 params.key_range = key_range; | |
394 Send(new IndexedDBHostMsg_DatabaseCount(params)); | |
395 } | |
396 | |
397 void IndexedDBDispatcher::RequestIDBDatabaseDeleteRange( | |
398 int32_t ipc_database_id, | |
399 int64_t transaction_id, | |
400 int64_t object_store_id, | |
401 const IndexedDBKeyRange& key_range, | |
402 WebIDBCallbacks* callbacks) { | |
403 ResetCursorPrefetchCaches(transaction_id, kAllCursors); | |
404 IndexedDBHostMsg_DatabaseDeleteRange_Params params; | |
405 init_params(¶ms, callbacks); | |
406 params.ipc_database_id = ipc_database_id; | |
407 params.transaction_id = transaction_id; | |
408 params.object_store_id = object_store_id; | |
409 params.key_range = key_range; | |
410 Send(new IndexedDBHostMsg_DatabaseDeleteRange(params)); | |
411 } | |
412 | |
413 void IndexedDBDispatcher::RequestIDBDatabaseClear( | |
414 int32_t ipc_database_id, | |
415 int64_t transaction_id, | |
416 int64_t object_store_id, | |
417 WebIDBCallbacks* callbacks_ptr) { | |
418 ResetCursorPrefetchCaches(transaction_id, kAllCursors); | |
419 std::unique_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
420 int32_t ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); | |
421 Send(new IndexedDBHostMsg_DatabaseClear(CurrentWorkerId(), | |
422 ipc_callbacks_id, | |
423 ipc_database_id, | |
424 transaction_id, | |
425 object_store_id)); | |
426 } | 191 } |
427 | 192 |
428 void IndexedDBDispatcher::CursorDestroyed(int32_t ipc_cursor_id) { | 193 void IndexedDBDispatcher::CursorDestroyed(int32_t ipc_cursor_id) { |
429 cursors_.erase(ipc_cursor_id); | 194 cursors_.erase(ipc_cursor_id); |
430 } | 195 } |
431 | 196 |
432 void IndexedDBDispatcher::DatabaseDestroyed(int32_t ipc_database_id) { | |
433 DCHECK_EQ(databases_.count(ipc_database_id), 1u); | |
434 databases_.erase(ipc_database_id); | |
435 } | |
436 | |
437 WebIDBDatabase* IndexedDBDispatcher::RegisterDatabase(int32_t ipc_database_id) { | |
438 DCHECK(!databases_.count(ipc_database_id)); | |
439 return databases_[ipc_database_id] = | |
440 new WebIDBDatabaseImpl(ipc_database_id, thread_safe_sender_.get()); | |
441 } | |
442 | |
443 void IndexedDBDispatcher::RegisterMojoOwnedCallbacks( | 197 void IndexedDBDispatcher::RegisterMojoOwnedCallbacks( |
444 IndexedDBCallbacksImpl::InternalState* callbacks) { | 198 IndexedDBCallbacksImpl::InternalState* callbacks) { |
445 mojo_owned_callback_state_.insert(callbacks); | 199 mojo_owned_callback_state_.insert(callbacks); |
446 } | 200 } |
447 | 201 |
448 void IndexedDBDispatcher::UnregisterMojoOwnedCallbacks( | 202 void IndexedDBDispatcher::UnregisterMojoOwnedCallbacks( |
449 IndexedDBCallbacksImpl::InternalState* callbacks) { | 203 IndexedDBCallbacksImpl::InternalState* callbacks) { |
450 DCHECK(base::ContainsValue(mojo_owned_callback_state_, callbacks)); | 204 DCHECK(base::ContainsValue(mojo_owned_callback_state_, callbacks)); |
451 mojo_owned_callback_state_.erase(callbacks); | 205 mojo_owned_callback_state_.erase(callbacks); |
452 } | 206 } |
453 | 207 |
454 void IndexedDBDispatcher::RegisterMojoOwnedDatabaseCallbacks( | 208 void IndexedDBDispatcher::RegisterMojoOwnedDatabaseCallbacks( |
455 blink::WebIDBDatabaseCallbacks* callbacks) { | 209 blink::WebIDBDatabaseCallbacks* callbacks) { |
456 mojo_owned_database_callback_state_.insert(callbacks); | 210 mojo_owned_database_callback_state_.insert(callbacks); |
457 } | 211 } |
458 | 212 |
459 void IndexedDBDispatcher::UnregisterMojoOwnedDatabaseCallbacks( | 213 void IndexedDBDispatcher::UnregisterMojoOwnedDatabaseCallbacks( |
460 blink::WebIDBDatabaseCallbacks* callbacks) { | 214 blink::WebIDBDatabaseCallbacks* callbacks) { |
461 DCHECK(base::ContainsValue(mojo_owned_database_callback_state_, callbacks)); | 215 DCHECK(base::ContainsValue(mojo_owned_database_callback_state_, callbacks)); |
462 mojo_owned_database_callback_state_.erase(callbacks); | 216 mojo_owned_database_callback_state_.erase(callbacks); |
463 } | 217 } |
464 | 218 |
465 void IndexedDBDispatcher::OnSuccessIndexedDBKey(int32_t ipc_thread_id, | |
466 int32_t ipc_callbacks_id, | |
467 const IndexedDBKey& key) { | |
468 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | |
469 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | |
470 if (!callbacks) | |
471 return; | |
472 callbacks->onSuccess(WebIDBKeyBuilder::Build(key)); | |
473 pending_callbacks_.Remove(ipc_callbacks_id); | |
474 } | |
475 | |
476 // Populate some WebIDBValue members (data & blob info) from the supplied | 219 // Populate some WebIDBValue members (data & blob info) from the supplied |
477 // value message (IndexedDBMsg_Value or one that includes it). | 220 // value message (IndexedDBMsg_Value or one that includes it). |
478 template <class IndexedDBMsgValueType> | 221 template <class IndexedDBMsgValueType> |
479 static void PrepareWebValue(const IndexedDBMsgValueType& value, | 222 static void PrepareWebValue(const IndexedDBMsgValueType& value, |
480 WebIDBValue* web_value) { | 223 WebIDBValue* web_value) { |
481 if (value.bits.empty()) | 224 if (value.bits.empty()) |
482 return; | 225 return; |
483 | 226 |
484 web_value->data.assign(&*value.bits.begin(), value.bits.size()); | 227 web_value->data.assign(&*value.bits.begin(), value.bits.size()); |
485 blink::WebVector<WebBlobInfo> local_blob_info(value.blob_or_file_info.size()); | 228 blink::WebVector<WebBlobInfo> local_blob_info(value.blob_or_file_info.size()); |
(...skipping 12 matching lines...) Expand all Loading... |
498 web_value->webBlobInfo.swap(local_blob_info); | 241 web_value->webBlobInfo.swap(local_blob_info); |
499 } | 242 } |
500 | 243 |
501 static void PrepareReturnWebValue(const IndexedDBMsg_ReturnValue& value, | 244 static void PrepareReturnWebValue(const IndexedDBMsg_ReturnValue& value, |
502 WebIDBValue* web_value) { | 245 WebIDBValue* web_value) { |
503 PrepareWebValue(value, web_value); | 246 PrepareWebValue(value, web_value); |
504 web_value->primaryKey = WebIDBKeyBuilder::Build(value.primary_key); | 247 web_value->primaryKey = WebIDBKeyBuilder::Build(value.primary_key); |
505 web_value->keyPath = WebIDBKeyPathBuilder::Build(value.key_path); | 248 web_value->keyPath = WebIDBKeyPathBuilder::Build(value.key_path); |
506 } | 249 } |
507 | 250 |
508 void IndexedDBDispatcher::OnSuccessArray( | |
509 const IndexedDBMsg_CallbacksSuccessArray_Params& p) { | |
510 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | |
511 int32_t ipc_callbacks_id = p.ipc_callbacks_id; | |
512 blink::WebVector<WebIDBValue> web_values(p.values.size()); | |
513 for (size_t i = 0; i < p.values.size(); ++i) | |
514 PrepareReturnWebValue(p.values[i], &web_values[i]); | |
515 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | |
516 DCHECK(callbacks); | |
517 callbacks->onSuccess(web_values); | |
518 pending_callbacks_.Remove(ipc_callbacks_id); | |
519 } | |
520 | |
521 void IndexedDBDispatcher::OnSuccessValue( | 251 void IndexedDBDispatcher::OnSuccessValue( |
522 const IndexedDBMsg_CallbacksSuccessValue_Params& params) { | 252 const IndexedDBMsg_CallbacksSuccessValue_Params& params) { |
523 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); | 253 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); |
524 WebIDBCallbacks* callbacks = | 254 WebIDBCallbacks* callbacks = |
525 pending_callbacks_.Lookup(params.ipc_callbacks_id); | 255 pending_callbacks_.Lookup(params.ipc_callbacks_id); |
526 if (!callbacks) | 256 if (!callbacks) |
527 return; | 257 return; |
528 WebIDBValue web_value; | 258 WebIDBValue web_value; |
529 PrepareReturnWebValue(params.value, &web_value); | 259 PrepareReturnWebValue(params.value, &web_value); |
530 if (params.value.primary_key.IsValid()) { | 260 if (params.value.primary_key.IsValid()) { |
531 web_value.primaryKey = WebIDBKeyBuilder::Build(params.value.primary_key); | 261 web_value.primaryKey = WebIDBKeyBuilder::Build(params.value.primary_key); |
532 web_value.keyPath = WebIDBKeyPathBuilder::Build(params.value.key_path); | 262 web_value.keyPath = WebIDBKeyPathBuilder::Build(params.value.key_path); |
533 } | 263 } |
534 callbacks->onSuccess(web_value); | 264 callbacks->onSuccess(web_value); |
535 cursor_transaction_ids_.erase(params.ipc_callbacks_id); | |
536 pending_callbacks_.Remove(params.ipc_callbacks_id); | 265 pending_callbacks_.Remove(params.ipc_callbacks_id); |
537 } | 266 } |
538 | 267 |
539 void IndexedDBDispatcher::OnSuccessInteger(int32_t ipc_thread_id, | 268 void IndexedDBDispatcher::OnSuccessInteger(int32_t ipc_thread_id, |
540 int32_t ipc_callbacks_id, | 269 int32_t ipc_callbacks_id, |
541 int64_t value) { | 270 int64_t value) { |
542 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 271 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
543 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 272 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
544 if (!callbacks) | 273 if (!callbacks) |
545 return; | 274 return; |
546 callbacks->onSuccess(value); | 275 callbacks->onSuccess(value); |
547 pending_callbacks_.Remove(ipc_callbacks_id); | 276 pending_callbacks_.Remove(ipc_callbacks_id); |
548 } | 277 } |
549 | 278 |
550 void IndexedDBDispatcher::OnSuccessUndefined(int32_t ipc_thread_id, | |
551 int32_t ipc_callbacks_id) { | |
552 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | |
553 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | |
554 if (!callbacks) | |
555 return; | |
556 callbacks->onSuccess(); | |
557 pending_callbacks_.Remove(ipc_callbacks_id); | |
558 } | |
559 | |
560 void IndexedDBDispatcher::OnSuccessOpenCursor( | |
561 const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p) { | |
562 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | |
563 int32_t ipc_callbacks_id = p.ipc_callbacks_id; | |
564 int32_t ipc_object_id = p.ipc_cursor_id; | |
565 const IndexedDBKey& key = p.key; | |
566 const IndexedDBKey& primary_key = p.primary_key; | |
567 WebIDBValue web_value; | |
568 PrepareWebValue(p.value, &web_value); | |
569 | |
570 DCHECK(cursor_transaction_ids_.find(ipc_callbacks_id) != | |
571 cursor_transaction_ids_.end()); | |
572 int64_t transaction_id = cursor_transaction_ids_[ipc_callbacks_id]; | |
573 cursor_transaction_ids_.erase(ipc_callbacks_id); | |
574 | |
575 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | |
576 if (!callbacks) | |
577 return; | |
578 | |
579 WebIDBCursorImpl* cursor = new WebIDBCursorImpl( | |
580 ipc_object_id, transaction_id, thread_safe_sender_.get()); | |
581 cursors_[ipc_object_id] = cursor; | |
582 callbacks->onSuccess(cursor, WebIDBKeyBuilder::Build(key), | |
583 WebIDBKeyBuilder::Build(primary_key), web_value); | |
584 | |
585 pending_callbacks_.Remove(ipc_callbacks_id); | |
586 } | |
587 | |
588 void IndexedDBDispatcher::OnSuccessCursorContinue( | 279 void IndexedDBDispatcher::OnSuccessCursorContinue( |
589 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { | 280 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { |
590 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 281 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); |
591 int32_t ipc_callbacks_id = p.ipc_callbacks_id; | 282 int32_t ipc_callbacks_id = p.ipc_callbacks_id; |
592 int32_t ipc_cursor_id = p.ipc_cursor_id; | 283 int32_t ipc_cursor_id = p.ipc_cursor_id; |
593 const IndexedDBKey& key = p.key; | 284 const IndexedDBKey& key = p.key; |
594 const IndexedDBKey& primary_key = p.primary_key; | 285 const IndexedDBKey& primary_key = p.primary_key; |
595 | 286 |
596 if (cursors_.find(ipc_cursor_id) == cursors_.end()) | 287 if (cursors_.find(ipc_cursor_id) == cursors_.end()) |
597 return; | 288 return; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 const base::string16& message) { | 326 const base::string16& message) { |
636 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 327 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
637 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 328 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
638 if (!callbacks) | 329 if (!callbacks) |
639 return; | 330 return; |
640 if (message.empty()) | 331 if (message.empty()) |
641 callbacks->onError(WebIDBDatabaseError(code)); | 332 callbacks->onError(WebIDBDatabaseError(code)); |
642 else | 333 else |
643 callbacks->onError(WebIDBDatabaseError(code, message)); | 334 callbacks->onError(WebIDBDatabaseError(code, message)); |
644 pending_callbacks_.Remove(ipc_callbacks_id); | 335 pending_callbacks_.Remove(ipc_callbacks_id); |
645 cursor_transaction_ids_.erase(ipc_callbacks_id); | |
646 } | 336 } |
647 | 337 |
648 void IndexedDBDispatcher::OnDatabaseChanges( | 338 void IndexedDBDispatcher::OnDatabaseChanges( |
649 int32_t ipc_thread_id, | 339 int32_t ipc_thread_id, |
650 const IndexedDBMsg_ObserverChanges& changes) { | 340 const IndexedDBMsg_ObserverChanges& changes) { |
651 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 341 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
652 std::vector<WebIDBObservation> observations( | 342 std::vector<WebIDBObservation> observations( |
653 ConvertObservations(changes.observations)); | 343 ConvertObservations(changes.observations)); |
654 for (auto& it : changes.observation_index) { | 344 for (auto& it : changes.observation_index) { |
655 WebIDBObserver* observer = observers_.Lookup(it.first); | 345 WebIDBObserver* observer = observers_.Lookup(it.first); |
(...skipping 12 matching lines...) Expand all Loading... |
668 typedef std::map<int32_t, WebIDBCursorImpl*>::iterator Iterator; | 358 typedef std::map<int32_t, WebIDBCursorImpl*>::iterator Iterator; |
669 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { | 359 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { |
670 if (i->first == ipc_exception_cursor_id || | 360 if (i->first == ipc_exception_cursor_id || |
671 i->second->transaction_id() != transaction_id) | 361 i->second->transaction_id() != transaction_id) |
672 continue; | 362 continue; |
673 i->second->ResetPrefetchCache(); | 363 i->second->ResetPrefetchCache(); |
674 } | 364 } |
675 } | 365 } |
676 | 366 |
677 } // namespace content | 367 } // namespace content |
OLD | NEW |