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" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/threading/thread_local.h" | 12 #include "base/threading/thread_local.h" |
13 #include "content/child/indexed_db/indexed_db_key_builders.h" | 13 #include "content/child/indexed_db/indexed_db_key_builders.h" |
14 #include "content/child/indexed_db/webidbcursor_impl.h" | 14 #include "content/child/indexed_db/webidbcursor_impl.h" |
15 #include "content/child/indexed_db/webidbdatabase_impl.h" | 15 #include "content/child/indexed_db/webidbdatabase_impl.h" |
16 #include "content/child/thread_safe_sender.h" | 16 #include "content/child/thread_safe_sender.h" |
17 #include "content/common/indexed_db/indexed_db_constants.h" | 17 #include "content/common/indexed_db/indexed_db_constants.h" |
18 #include "content/common/indexed_db/indexed_db_messages.h" | 18 #include "content/common/indexed_db/indexed_db_messages.h" |
19 #include "ipc/ipc_channel.h" | 19 #include "ipc/ipc_channel.h" |
20 #include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h" | 20 #include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h" |
21 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" | 21 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" |
22 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" | 22 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" |
| 23 #include "third_party/WebKit/public/platform/WebIDBValue.h" |
23 | 24 |
24 using blink::WebBlobInfo; | 25 using blink::WebBlobInfo; |
25 using blink::WebData; | 26 using blink::WebData; |
26 using blink::WebIDBCallbacks; | 27 using blink::WebIDBCallbacks; |
27 using blink::WebIDBCursor; | 28 using blink::WebIDBCursor; |
28 using blink::WebIDBDatabase; | 29 using blink::WebIDBDatabase; |
29 using blink::WebIDBDatabaseCallbacks; | 30 using blink::WebIDBDatabaseCallbacks; |
30 using blink::WebIDBDatabaseError; | 31 using blink::WebIDBDatabaseError; |
31 using blink::WebIDBKey; | 32 using blink::WebIDBKey; |
32 using blink::WebIDBMetadata; | 33 using blink::WebIDBMetadata; |
| 34 using blink::WebIDBValue; |
33 using blink::WebString; | 35 using blink::WebString; |
34 using blink::WebVector; | 36 using blink::WebVector; |
35 using base::ThreadLocalPointer; | 37 using base::ThreadLocalPointer; |
36 | 38 |
37 namespace content { | 39 namespace content { |
38 static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky | 40 static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky |
39 g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER; | 41 g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER; |
40 | 42 |
41 namespace { | 43 namespace { |
42 | 44 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, | 138 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, |
137 OnSuccessCursorContinue) | 139 OnSuccessCursorContinue) |
138 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, | 140 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, |
139 OnSuccessCursorPrefetch) | 141 OnSuccessCursorPrefetch) |
140 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, | 142 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, |
141 OnSuccessIDBDatabase) | 143 OnSuccessIDBDatabase) |
142 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey, | 144 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey, |
143 OnSuccessIndexedDBKey) | 145 OnSuccessIndexedDBKey) |
144 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessStringList, | 146 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessStringList, |
145 OnSuccessStringList) | 147 OnSuccessStringList) |
| 148 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessArray, OnSuccessArray) |
146 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValue, OnSuccessValue) | 149 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValue, OnSuccessValue) |
147 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValueWithKey, | 150 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValueWithKey, |
148 OnSuccessValueWithKey) | 151 OnSuccessValueWithKey) |
149 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessInteger, OnSuccessInteger) | 152 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessInteger, OnSuccessInteger) |
150 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessUndefined, | 153 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessUndefined, |
151 OnSuccessUndefined) | 154 OnSuccessUndefined) |
152 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError) | 155 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError) |
153 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksIntBlocked, OnIntBlocked) | 156 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksIntBlocked, OnIntBlocked) |
154 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksUpgradeNeeded, OnUpgradeNeeded) | 157 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksUpgradeNeeded, OnUpgradeNeeded) |
155 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksForcedClose, | 158 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksForcedClose, |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 init_params(¶ms, callbacks); | 321 init_params(¶ms, callbacks); |
319 params.ipc_database_id = ipc_database_id; | 322 params.ipc_database_id = ipc_database_id; |
320 params.transaction_id = transaction_id; | 323 params.transaction_id = transaction_id; |
321 params.object_store_id = object_store_id; | 324 params.object_store_id = object_store_id; |
322 params.index_id = index_id; | 325 params.index_id = index_id; |
323 params.key_range = key_range; | 326 params.key_range = key_range; |
324 params.key_only = key_only; | 327 params.key_only = key_only; |
325 Send(new IndexedDBHostMsg_DatabaseGet(params)); | 328 Send(new IndexedDBHostMsg_DatabaseGet(params)); |
326 } | 329 } |
327 | 330 |
| 331 void IndexedDBDispatcher::RequestIDBDatabaseGetAll( |
| 332 int32 ipc_database_id, |
| 333 int64 transaction_id, |
| 334 int64 object_store_id, |
| 335 const IndexedDBKeyRange& key_range, |
| 336 int64 max_count, |
| 337 WebIDBCallbacks* callbacks) { |
| 338 ResetCursorPrefetchCaches(transaction_id, kAllCursors); |
| 339 IndexedDBHostMsg_DatabaseGetAll_Params params; |
| 340 init_params(¶ms, callbacks); |
| 341 params.ipc_database_id = ipc_database_id; |
| 342 params.transaction_id = transaction_id; |
| 343 params.object_store_id = object_store_id; |
| 344 params.key_range = key_range; |
| 345 params.max_count = max_count; |
| 346 Send(new IndexedDBHostMsg_DatabaseGetAll(params)); |
| 347 } |
| 348 |
328 void IndexedDBDispatcher::RequestIDBDatabasePut( | 349 void IndexedDBDispatcher::RequestIDBDatabasePut( |
329 int32 ipc_database_id, | 350 int32 ipc_database_id, |
330 int64 transaction_id, | 351 int64 transaction_id, |
331 int64 object_store_id, | 352 int64 object_store_id, |
332 const WebData& value, | 353 const WebData& value, |
333 const blink::WebVector<WebBlobInfo>& web_blob_info, | 354 const blink::WebVector<WebBlobInfo>& web_blob_info, |
334 const IndexedDBKey& key, | 355 const IndexedDBKey& key, |
335 blink::WebIDBPutMode put_mode, | 356 blink::WebIDBPutMode put_mode, |
336 WebIDBCallbacks* callbacks, | 357 WebIDBCallbacks* callbacks, |
337 const WebVector<long long>& index_ids, | 358 const WebVector<long long>& index_ids, |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 int32 ipc_callbacks_id, | 538 int32 ipc_callbacks_id, |
518 const std::vector<base::string16>& value) { | 539 const std::vector<base::string16>& value) { |
519 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 540 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
520 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 541 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
521 if (!callbacks) | 542 if (!callbacks) |
522 return; | 543 return; |
523 callbacks->onSuccess(WebVector<WebString>(value)); | 544 callbacks->onSuccess(WebVector<WebString>(value)); |
524 pending_callbacks_.Remove(ipc_callbacks_id); | 545 pending_callbacks_.Remove(ipc_callbacks_id); |
525 } | 546 } |
526 | 547 |
| 548 static void PrepareWebValue(const IndexedDBMsg_Value& value, |
| 549 WebIDBValue* web_value) { |
| 550 if (value.bits.empty()) |
| 551 return; |
| 552 |
| 553 web_value->data.assign(&*value.bits.begin(), value.bits.size()); |
| 554 blink::WebVector<WebBlobInfo> local_blob_info(value.blob_or_file_info.size()); |
| 555 for (size_t i = 0; i < value.blob_or_file_info.size(); ++i) { |
| 556 const IndexedDBMsg_BlobOrFileInfo& info = value.blob_or_file_info[i]; |
| 557 if (info.is_file) { |
| 558 local_blob_info[i] = WebBlobInfo( |
| 559 WebString::fromUTF8(info.uuid.c_str()), info.file_path, |
| 560 info.file_name, info.mime_type, info.last_modified, info.size); |
| 561 } else { |
| 562 local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info.uuid.c_str()), |
| 563 info.mime_type, info.size); |
| 564 } |
| 565 } |
| 566 web_value->webBlobInfo.swap(local_blob_info); |
| 567 } |
| 568 |
527 static void PrepareWebValueAndBlobInfo( | 569 static void PrepareWebValueAndBlobInfo( |
528 const IndexedDBMsg_Value& value, | 570 const IndexedDBMsg_Value& value, |
529 WebData* web_value, | 571 WebData* web_value, |
530 blink::WebVector<WebBlobInfo>* web_blob_info) { | 572 blink::WebVector<WebBlobInfo>* web_blob_info) { |
531 if (value.bits.empty()) | 573 if (value.bits.empty()) |
532 return; | 574 return; |
533 | 575 |
534 web_value->assign(&*value.bits.begin(), value.bits.size()); | 576 web_value->assign(&*value.bits.begin(), value.bits.size()); |
535 blink::WebVector<WebBlobInfo> local_blob_info(value.blob_or_file_info.size()); | 577 blink::WebVector<WebBlobInfo> local_blob_info(value.blob_or_file_info.size()); |
536 for (size_t i = 0; i < value.blob_or_file_info.size(); ++i) { | 578 for (size_t i = 0; i < value.blob_or_file_info.size(); ++i) { |
537 const IndexedDBMsg_BlobOrFileInfo& info = value.blob_or_file_info[i]; | 579 const IndexedDBMsg_BlobOrFileInfo& info = value.blob_or_file_info[i]; |
538 if (info.is_file) { | 580 if (info.is_file) { |
539 local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info.uuid.c_str()), | 581 local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info.uuid.c_str()), |
540 info.file_path, | 582 info.file_path, |
541 info.file_name, | 583 info.file_name, |
542 info.mime_type, | 584 info.mime_type, |
543 info.last_modified, | 585 info.last_modified, |
544 info.size); | 586 info.size); |
545 } else { | 587 } else { |
546 local_blob_info[i] = WebBlobInfo( | 588 local_blob_info[i] = WebBlobInfo( |
547 WebString::fromUTF8(info.uuid.c_str()), info.mime_type, info.size); | 589 WebString::fromUTF8(info.uuid.c_str()), info.mime_type, info.size); |
548 } | 590 } |
549 } | 591 } |
550 web_blob_info->swap(local_blob_info); | 592 web_blob_info->swap(local_blob_info); |
551 } | 593 } |
552 | 594 |
| 595 void IndexedDBDispatcher::OnSuccessArray( |
| 596 const IndexedDBMsg_CallbacksSuccessArray_Params& p) { |
| 597 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); |
| 598 int32 ipc_callbacks_id = p.ipc_callbacks_id; |
| 599 blink::WebVector<WebIDBValue> web_values(p.values.size()); |
| 600 for (size_t i = 0; i < p.values.size(); ++i) |
| 601 PrepareWebValue(p.values[i], &web_values[i]); |
| 602 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
| 603 DCHECK(callbacks); |
| 604 callbacks->onSuccess(web_values); |
| 605 pending_callbacks_.Remove(ipc_callbacks_id); |
| 606 } |
| 607 |
553 void IndexedDBDispatcher::OnSuccessValue( | 608 void IndexedDBDispatcher::OnSuccessValue( |
554 const IndexedDBMsg_CallbacksSuccessValue_Params& params) { | 609 const IndexedDBMsg_CallbacksSuccessValue_Params& params) { |
555 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); | 610 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); |
556 WebIDBCallbacks* callbacks = | 611 WebIDBCallbacks* callbacks = |
557 pending_callbacks_.Lookup(params.ipc_callbacks_id); | 612 pending_callbacks_.Lookup(params.ipc_callbacks_id); |
558 if (!callbacks) | 613 if (!callbacks) |
559 return; | 614 return; |
560 WebData web_value; | 615 WebData web_value; |
561 WebVector<WebBlobInfo> web_blob_info; | 616 WebVector<WebBlobInfo> web_blob_info; |
562 PrepareWebValueAndBlobInfo(params.value, &web_value, &web_blob_info); | 617 PrepareWebValueAndBlobInfo(params.value, &web_value, &web_blob_info); |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 typedef std::map<int32, WebIDBCursorImpl*>::iterator Iterator; | 841 typedef std::map<int32, WebIDBCursorImpl*>::iterator Iterator; |
787 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { | 842 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { |
788 if (i->first == ipc_exception_cursor_id || | 843 if (i->first == ipc_exception_cursor_id || |
789 i->second->transaction_id() != transaction_id) | 844 i->second->transaction_id() != transaction_id) |
790 continue; | 845 continue; |
791 i->second->ResetPrefetchCache(); | 846 i->second->ResetPrefetchCache(); |
792 } | 847 } |
793 } | 848 } |
794 | 849 |
795 } // namespace content | 850 } // namespace content |
OLD | NEW |