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 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
513 int32 ipc_callbacks_id, | 513 int32 ipc_callbacks_id, |
514 const std::vector<base::string16>& value) { | 514 const std::vector<base::string16>& value) { |
515 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 515 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
516 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 516 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
517 if (!callbacks) | 517 if (!callbacks) |
518 return; | 518 return; |
519 callbacks->onSuccess(WebVector<WebString>(value)); | 519 callbacks->onSuccess(WebVector<WebString>(value)); |
520 pending_callbacks_.Remove(ipc_callbacks_id); | 520 pending_callbacks_.Remove(ipc_callbacks_id); |
521 } | 521 } |
522 | 522 |
523 static void PrepareWebValueAndBlobInfo( | |
524 const std::string& value, | |
525 const std::vector<IndexedDBMsg_BlobOrFileInfo>& blob_info, | |
526 WebData* web_value, | |
527 blink::WebVector<WebBlobInfo>* web_blob_info) { | |
528 | |
529 if (value.empty()) | |
530 return; | |
531 | |
532 web_value->assign(&*value.begin(), value.size()); | |
533 blink::WebVector<WebBlobInfo> local_blob_info(blob_info.size()); | |
cmumford
2014/04/17 22:26:53
Why create a local array and then swap at the end?
ericu
2014/04/17 22:33:11
Outside of the constructor, you can't set the size
| |
534 for (size_t i = 0; i < blob_info.size(); ++i) { | |
535 const IndexedDBMsg_BlobOrFileInfo& info = blob_info[i]; | |
536 if (info.is_file) { | |
537 local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info.uuid.c_str()), | |
538 info.file_path, | |
539 info.file_name, | |
540 info.mime_type, | |
541 info.last_modified, | |
542 info.size); | |
543 } else { | |
544 local_blob_info[i] = WebBlobInfo( | |
545 WebString::fromUTF8(info.uuid.c_str()), info.mime_type, info.size); | |
546 } | |
547 } | |
548 web_blob_info->swap(local_blob_info); | |
549 } | |
550 | |
523 void IndexedDBDispatcher::OnSuccessValue( | 551 void IndexedDBDispatcher::OnSuccessValue( |
524 const IndexedDBMsg_CallbacksSuccessValue_Params& p) { | 552 const IndexedDBMsg_CallbacksSuccessValue_Params& params) { |
525 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 553 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); |
526 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(p.ipc_callbacks_id); | 554 WebIDBCallbacks* callbacks = |
555 pending_callbacks_.Lookup(params.ipc_callbacks_id); | |
527 if (!callbacks) | 556 if (!callbacks) |
528 return; | 557 return; |
529 WebData web_value; | 558 WebData web_value; |
530 if (!p.value.empty()) | 559 WebVector<WebBlobInfo> web_blob_info; |
531 web_value.assign(&*p.value.begin(), p.value.size()); | 560 PrepareWebValueAndBlobInfo( |
532 callbacks->onSuccess(web_value); | 561 params.value, params.blob_or_file_info, &web_value, &web_blob_info); |
533 pending_callbacks_.Remove(p.ipc_callbacks_id); | 562 callbacks->onSuccess(web_value, web_blob_info); |
534 cursor_transaction_ids_.erase(p.ipc_callbacks_id); | 563 pending_callbacks_.Remove(params.ipc_callbacks_id); |
564 cursor_transaction_ids_.erase(params.ipc_callbacks_id); | |
535 } | 565 } |
536 | 566 |
537 void IndexedDBDispatcher::OnSuccessValueWithKey( | 567 void IndexedDBDispatcher::OnSuccessValueWithKey( |
538 const IndexedDBMsg_CallbacksSuccessValueWithKey_Params& p) { | 568 const IndexedDBMsg_CallbacksSuccessValueWithKey_Params& params) { |
539 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 569 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); |
540 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(p.ipc_callbacks_id); | 570 WebIDBCallbacks* callbacks = |
571 pending_callbacks_.Lookup(params.ipc_callbacks_id); | |
541 if (!callbacks) | 572 if (!callbacks) |
542 return; | 573 return; |
543 WebData web_value; | 574 WebData web_value; |
544 if (p.value.size()) | 575 WebVector<WebBlobInfo> web_blob_info; |
545 web_value.assign(&*p.value.begin(), p.value.size()); | 576 PrepareWebValueAndBlobInfo( |
577 params.value, params.blob_or_file_info, &web_value, &web_blob_info); | |
546 callbacks->onSuccess(web_value, | 578 callbacks->onSuccess(web_value, |
547 WebIDBKeyBuilder::Build(p.primary_key), | 579 web_blob_info, |
548 WebIDBKeyPathBuilder::Build(p.key_path)); | 580 WebIDBKeyBuilder::Build(params.primary_key), |
549 pending_callbacks_.Remove(p.ipc_callbacks_id); | 581 WebIDBKeyPathBuilder::Build(params.key_path)); |
582 pending_callbacks_.Remove(params.ipc_callbacks_id); | |
550 } | 583 } |
551 | 584 |
552 void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id, | 585 void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id, |
553 int32 ipc_callbacks_id, | 586 int32 ipc_callbacks_id, |
554 int64 value) { | 587 int64 value) { |
555 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 588 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
556 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 589 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
557 if (!callbacks) | 590 if (!callbacks) |
558 return; | 591 return; |
559 callbacks->onSuccess(value); | 592 callbacks->onSuccess(value); |
(...skipping 11 matching lines...) Expand all Loading... | |
571 } | 604 } |
572 | 605 |
573 void IndexedDBDispatcher::OnSuccessOpenCursor( | 606 void IndexedDBDispatcher::OnSuccessOpenCursor( |
574 const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p) { | 607 const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p) { |
575 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 608 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); |
576 int32 ipc_callbacks_id = p.ipc_callbacks_id; | 609 int32 ipc_callbacks_id = p.ipc_callbacks_id; |
577 int32 ipc_object_id = p.ipc_cursor_id; | 610 int32 ipc_object_id = p.ipc_cursor_id; |
578 const IndexedDBKey& key = p.key; | 611 const IndexedDBKey& key = p.key; |
579 const IndexedDBKey& primary_key = p.primary_key; | 612 const IndexedDBKey& primary_key = p.primary_key; |
580 WebData web_value; | 613 WebData web_value; |
581 if (p.value.size()) | 614 WebVector<WebBlobInfo> web_blob_info; |
582 web_value.assign(&*p.value.begin(), p.value.size()); | 615 PrepareWebValueAndBlobInfo( |
616 p.value, p.blob_or_file_info, &web_value, &web_blob_info); | |
583 | 617 |
584 DCHECK(cursor_transaction_ids_.find(ipc_callbacks_id) != | 618 DCHECK(cursor_transaction_ids_.find(ipc_callbacks_id) != |
585 cursor_transaction_ids_.end()); | 619 cursor_transaction_ids_.end()); |
586 int64 transaction_id = cursor_transaction_ids_[ipc_callbacks_id]; | 620 int64 transaction_id = cursor_transaction_ids_[ipc_callbacks_id]; |
587 cursor_transaction_ids_.erase(ipc_callbacks_id); | 621 cursor_transaction_ids_.erase(ipc_callbacks_id); |
588 | 622 |
589 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 623 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
590 if (!callbacks) | 624 if (!callbacks) |
591 return; | 625 return; |
592 | 626 |
593 WebIDBCursorImpl* cursor = new WebIDBCursorImpl( | 627 WebIDBCursorImpl* cursor = new WebIDBCursorImpl( |
594 ipc_object_id, transaction_id, thread_safe_sender_.get()); | 628 ipc_object_id, transaction_id, thread_safe_sender_.get()); |
595 cursors_[ipc_object_id] = cursor; | 629 cursors_[ipc_object_id] = cursor; |
596 callbacks->onSuccess(cursor, WebIDBKeyBuilder::Build(key), | 630 callbacks->onSuccess(cursor, |
597 WebIDBKeyBuilder::Build(primary_key), web_value); | 631 WebIDBKeyBuilder::Build(key), |
632 WebIDBKeyBuilder::Build(primary_key), | |
633 web_value, | |
634 web_blob_info); | |
598 | 635 |
599 pending_callbacks_.Remove(ipc_callbacks_id); | 636 pending_callbacks_.Remove(ipc_callbacks_id); |
600 } | 637 } |
601 | 638 |
602 void IndexedDBDispatcher::OnSuccessCursorContinue( | 639 void IndexedDBDispatcher::OnSuccessCursorContinue( |
603 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { | 640 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { |
604 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 641 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); |
605 int32 ipc_callbacks_id = p.ipc_callbacks_id; | 642 int32 ipc_callbacks_id = p.ipc_callbacks_id; |
606 int32 ipc_cursor_id = p.ipc_cursor_id; | 643 int32 ipc_cursor_id = p.ipc_cursor_id; |
607 const IndexedDBKey& key = p.key; | 644 const IndexedDBKey& key = p.key; |
608 const IndexedDBKey& primary_key = p.primary_key; | 645 const IndexedDBKey& primary_key = p.primary_key; |
609 const std::string& value = p.value; | 646 const std::string& value = p.value; |
610 | 647 |
611 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; | 648 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; |
612 DCHECK(cursor); | 649 DCHECK(cursor); |
613 | 650 |
614 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 651 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
615 if (!callbacks) | 652 if (!callbacks) |
616 return; | 653 return; |
617 | 654 |
618 WebData web_value; | 655 WebData web_value; |
619 if (value.size()) | 656 WebVector<WebBlobInfo> web_blob_info; |
620 web_value.assign(&*value.begin(), value.size()); | 657 PrepareWebValueAndBlobInfo( |
658 value, p.blob_or_file_info, &web_value, &web_blob_info); | |
621 callbacks->onSuccess(WebIDBKeyBuilder::Build(key), | 659 callbacks->onSuccess(WebIDBKeyBuilder::Build(key), |
622 WebIDBKeyBuilder::Build(primary_key), web_value); | 660 WebIDBKeyBuilder::Build(primary_key), |
661 web_value, | |
662 web_blob_info); | |
623 | 663 |
624 pending_callbacks_.Remove(ipc_callbacks_id); | 664 pending_callbacks_.Remove(ipc_callbacks_id); |
625 } | 665 } |
626 | 666 |
627 void IndexedDBDispatcher::OnSuccessCursorPrefetch( | 667 void IndexedDBDispatcher::OnSuccessCursorPrefetch( |
628 const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) { | 668 const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) { |
629 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 669 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); |
630 int32 ipc_callbacks_id = p.ipc_callbacks_id; | 670 int32 ipc_callbacks_id = p.ipc_callbacks_id; |
631 int32 ipc_cursor_id = p.ipc_cursor_id; | 671 int32 ipc_cursor_id = p.ipc_cursor_id; |
632 const std::vector<IndexedDBKey>& keys = p.keys; | 672 const std::vector<IndexedDBKey>& keys = p.keys; |
633 const std::vector<IndexedDBKey>& primary_keys = p.primary_keys; | 673 const std::vector<IndexedDBKey>& primary_keys = p.primary_keys; |
634 std::vector<WebData> values(p.values.size()); | 674 std::vector<WebData> values(p.values.size()); |
675 DCHECK_EQ(p.values.size(), p.blob_or_file_infos.size()); | |
676 std::vector<WebVector<WebBlobInfo> > blob_infos(p.blob_or_file_infos.size()); | |
635 for (size_t i = 0; i < p.values.size(); ++i) { | 677 for (size_t i = 0; i < p.values.size(); ++i) { |
636 if (p.values[i].size()) | 678 PrepareWebValueAndBlobInfo( |
637 values[i].assign(&*p.values[i].begin(), p.values[i].size()); | 679 p.values[i], p.blob_or_file_infos[i], &values[i], &blob_infos[i]); |
638 } | 680 } |
639 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; | 681 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; |
640 DCHECK(cursor); | 682 DCHECK(cursor); |
641 cursor->SetPrefetchData(keys, primary_keys, values); | 683 cursor->SetPrefetchData(keys, primary_keys, values, blob_infos); |
642 | 684 |
643 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 685 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
644 DCHECK(callbacks); | 686 DCHECK(callbacks); |
645 cursor->CachedContinue(callbacks); | 687 cursor->CachedContinue(callbacks); |
646 pending_callbacks_.Remove(ipc_callbacks_id); | 688 pending_callbacks_.Remove(ipc_callbacks_id); |
647 } | 689 } |
648 | 690 |
649 void IndexedDBDispatcher::OnIntBlocked(int32 ipc_thread_id, | 691 void IndexedDBDispatcher::OnIntBlocked(int32 ipc_thread_id, |
650 int32 ipc_callbacks_id, | 692 int32 ipc_callbacks_id, |
651 int64 existing_version) { | 693 int64 existing_version) { |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
747 typedef std::map<int32, WebIDBCursorImpl*>::iterator Iterator; | 789 typedef std::map<int32, WebIDBCursorImpl*>::iterator Iterator; |
748 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { | 790 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { |
749 if (i->first == ipc_exception_cursor_id || | 791 if (i->first == ipc_exception_cursor_id || |
750 i->second->transaction_id() != transaction_id) | 792 i->second->transaction_id() != transaction_id) |
751 continue; | 793 continue; |
752 i->second->ResetPrefetchCache(); | 794 i->second->ResetPrefetchCache(); |
753 } | 795 } |
754 } | 796 } |
755 | 797 |
756 } // namespace content | 798 } // namespace content |
OLD | NEW |