Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(466)

Side by Side Diff: content/child/indexed_db/indexed_db_dispatcher.cc

Issue 240003010: The chromium-side backchannel plumbing for blobs in IDB. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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(
jsbell 2014/04/17 18:37:59 It seems like it would be nice to propagate the In
ericu 2014/04/17 21:56:02 Agreed; will add a TODO to my notes.
524 WebData* web_value,
525 const std::string& value,
526 const std::vector<IndexedDBMsg_BlobOrFileInfo>& blob_info,
527 blink::WebVector<WebBlobInfo>* web_blob_info) {
jsbell 2014/04/17 18:37:59 Parameter order here looks odd - web_value, value,
ericu 2014/04/17 21:56:02 Huh. Yeah, that's terrible. Fixed to value, blob
528
529 if (!value.empty()) {
jsbell 2014/04/17 18:37:59 Make this an early exit, to reduce indentation?
ericu 2014/04/17 21:56:02 Done.
530 web_value->assign(&*value.begin(), value.size());
531 blink::WebVector<WebBlobInfo> local_blob_info(blob_info.size());
532 for (size_t i = 0; i < blob_info.size(); ++i) {
533 const IndexedDBMsg_BlobOrFileInfo& info = blob_info[i];
534 if (info.is_file) {
535 local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info.uuid.c_str()),
536 info.file_path,
537 info.file_name,
538 info.mime_type,
539 info.last_modified,
540 info.size);
541 } else {
542 local_blob_info[i] = WebBlobInfo(
543 WebString::fromUTF8(info.uuid.c_str()), info.mime_type, info.size);
544 }
545 }
546 web_blob_info->swap(local_blob_info);
547 }
548 }
549
523 void IndexedDBDispatcher::OnSuccessValue( 550 void IndexedDBDispatcher::OnSuccessValue(
524 const IndexedDBMsg_CallbacksSuccessValue_Params& p) { 551 const IndexedDBMsg_CallbacksSuccessValue_Params& params) {
525 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 552 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId());
526 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(p.ipc_callbacks_id); 553 WebIDBCallbacks* callbacks =
554 pending_callbacks_.Lookup(params.ipc_callbacks_id);
527 if (!callbacks) 555 if (!callbacks)
528 return; 556 return;
529 WebData web_value; 557 WebData web_value;
530 if (!p.value.empty()) 558 WebVector<WebBlobInfo> web_blob_info;
531 web_value.assign(&*p.value.begin(), p.value.size()); 559 PrepareWebValueAndBlobInfo(
532 callbacks->onSuccess(web_value); 560 &web_value, params.value, params.blob_or_file_info, &web_blob_info);
533 pending_callbacks_.Remove(p.ipc_callbacks_id); 561 callbacks->onSuccess(web_value, web_blob_info);
534 cursor_transaction_ids_.erase(p.ipc_callbacks_id); 562 pending_callbacks_.Remove(params.ipc_callbacks_id);
563 cursor_transaction_ids_.erase(params.ipc_callbacks_id);
535 } 564 }
536 565
537 void IndexedDBDispatcher::OnSuccessValueWithKey( 566 void IndexedDBDispatcher::OnSuccessValueWithKey(
538 const IndexedDBMsg_CallbacksSuccessValueWithKey_Params& p) { 567 const IndexedDBMsg_CallbacksSuccessValueWithKey_Params& params) {
539 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 568 DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId());
540 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(p.ipc_callbacks_id); 569 WebIDBCallbacks* callbacks =
570 pending_callbacks_.Lookup(params.ipc_callbacks_id);
541 if (!callbacks) 571 if (!callbacks)
542 return; 572 return;
543 WebData web_value; 573 WebData web_value;
544 if (p.value.size()) 574 WebVector<WebBlobInfo> web_blob_info;
545 web_value.assign(&*p.value.begin(), p.value.size()); 575 PrepareWebValueAndBlobInfo(
576 &web_value, params.value, params.blob_or_file_info, &web_blob_info);
546 callbacks->onSuccess(web_value, 577 callbacks->onSuccess(web_value,
547 WebIDBKeyBuilder::Build(p.primary_key), 578 web_blob_info,
548 WebIDBKeyPathBuilder::Build(p.key_path)); 579 WebIDBKeyBuilder::Build(params.primary_key),
549 pending_callbacks_.Remove(p.ipc_callbacks_id); 580 WebIDBKeyPathBuilder::Build(params.key_path));
581 pending_callbacks_.Remove(params.ipc_callbacks_id);
550 } 582 }
551 583
552 void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id, 584 void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id,
553 int32 ipc_callbacks_id, 585 int32 ipc_callbacks_id,
554 int64 value) { 586 int64 value) {
555 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 587 DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
556 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 588 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
557 if (!callbacks) 589 if (!callbacks)
558 return; 590 return;
559 callbacks->onSuccess(value); 591 callbacks->onSuccess(value);
(...skipping 11 matching lines...) Expand all
571 } 603 }
572 604
573 void IndexedDBDispatcher::OnSuccessOpenCursor( 605 void IndexedDBDispatcher::OnSuccessOpenCursor(
574 const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p) { 606 const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p) {
575 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 607 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId());
576 int32 ipc_callbacks_id = p.ipc_callbacks_id; 608 int32 ipc_callbacks_id = p.ipc_callbacks_id;
577 int32 ipc_object_id = p.ipc_cursor_id; 609 int32 ipc_object_id = p.ipc_cursor_id;
578 const IndexedDBKey& key = p.key; 610 const IndexedDBKey& key = p.key;
579 const IndexedDBKey& primary_key = p.primary_key; 611 const IndexedDBKey& primary_key = p.primary_key;
580 WebData web_value; 612 WebData web_value;
581 if (p.value.size()) 613 WebVector<WebBlobInfo> web_blob_info;
582 web_value.assign(&*p.value.begin(), p.value.size()); 614 PrepareWebValueAndBlobInfo(
615 &web_value, p.value, p.blob_or_file_info, &web_blob_info);
583 616
584 DCHECK(cursor_transaction_ids_.find(ipc_callbacks_id) != 617 DCHECK(cursor_transaction_ids_.find(ipc_callbacks_id) !=
585 cursor_transaction_ids_.end()); 618 cursor_transaction_ids_.end());
586 int64 transaction_id = cursor_transaction_ids_[ipc_callbacks_id]; 619 int64 transaction_id = cursor_transaction_ids_[ipc_callbacks_id];
587 cursor_transaction_ids_.erase(ipc_callbacks_id); 620 cursor_transaction_ids_.erase(ipc_callbacks_id);
588 621
589 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 622 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
590 if (!callbacks) 623 if (!callbacks)
591 return; 624 return;
592 625
593 WebIDBCursorImpl* cursor = new WebIDBCursorImpl( 626 WebIDBCursorImpl* cursor = new WebIDBCursorImpl(
594 ipc_object_id, transaction_id, thread_safe_sender_.get()); 627 ipc_object_id, transaction_id, thread_safe_sender_.get());
595 cursors_[ipc_object_id] = cursor; 628 cursors_[ipc_object_id] = cursor;
596 callbacks->onSuccess(cursor, WebIDBKeyBuilder::Build(key), 629 callbacks->onSuccess(cursor,
597 WebIDBKeyBuilder::Build(primary_key), web_value); 630 WebIDBKeyBuilder::Build(key),
631 WebIDBKeyBuilder::Build(primary_key),
632 web_value,
633 web_blob_info);
598 634
599 pending_callbacks_.Remove(ipc_callbacks_id); 635 pending_callbacks_.Remove(ipc_callbacks_id);
600 } 636 }
601 637
602 void IndexedDBDispatcher::OnSuccessCursorContinue( 638 void IndexedDBDispatcher::OnSuccessCursorContinue(
603 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { 639 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) {
604 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 640 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId());
605 int32 ipc_callbacks_id = p.ipc_callbacks_id; 641 int32 ipc_callbacks_id = p.ipc_callbacks_id;
606 int32 ipc_cursor_id = p.ipc_cursor_id; 642 int32 ipc_cursor_id = p.ipc_cursor_id;
607 const IndexedDBKey& key = p.key; 643 const IndexedDBKey& key = p.key;
608 const IndexedDBKey& primary_key = p.primary_key; 644 const IndexedDBKey& primary_key = p.primary_key;
609 const std::string& value = p.value; 645 const std::string& value = p.value;
610 646
611 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; 647 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id];
612 DCHECK(cursor); 648 DCHECK(cursor);
613 649
614 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 650 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
615 if (!callbacks) 651 if (!callbacks)
616 return; 652 return;
617 653
618 WebData web_value; 654 WebData web_value;
619 if (value.size()) 655 WebVector<WebBlobInfo> web_blob_info;
620 web_value.assign(&*value.begin(), value.size()); 656 PrepareWebValueAndBlobInfo(
657 &web_value, value, p.blob_or_file_info, &web_blob_info);
621 callbacks->onSuccess(WebIDBKeyBuilder::Build(key), 658 callbacks->onSuccess(WebIDBKeyBuilder::Build(key),
622 WebIDBKeyBuilder::Build(primary_key), web_value); 659 WebIDBKeyBuilder::Build(primary_key),
660 web_value,
661 web_blob_info);
623 662
624 pending_callbacks_.Remove(ipc_callbacks_id); 663 pending_callbacks_.Remove(ipc_callbacks_id);
625 } 664 }
626 665
627 void IndexedDBDispatcher::OnSuccessCursorPrefetch( 666 void IndexedDBDispatcher::OnSuccessCursorPrefetch(
628 const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) { 667 const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) {
629 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 668 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId());
630 int32 ipc_callbacks_id = p.ipc_callbacks_id; 669 int32 ipc_callbacks_id = p.ipc_callbacks_id;
631 int32 ipc_cursor_id = p.ipc_cursor_id; 670 int32 ipc_cursor_id = p.ipc_cursor_id;
632 const std::vector<IndexedDBKey>& keys = p.keys; 671 const std::vector<IndexedDBKey>& keys = p.keys;
633 const std::vector<IndexedDBKey>& primary_keys = p.primary_keys; 672 const std::vector<IndexedDBKey>& primary_keys = p.primary_keys;
634 std::vector<WebData> values(p.values.size()); 673 std::vector<WebData> values(p.values.size());
674 DCHECK_EQ(p.values.size(), p.blob_or_file_infos.size());
jsbell 2014/04/17 18:37:59 Bleah - sending same-sized vectors through is an a
ericu 2014/04/17 21:56:02 Added a TODO to indexed_db_messages.h for this mes
675 std::vector<WebVector<WebBlobInfo> > blob_infos(p.blob_or_file_infos.size());
635 for (size_t i = 0; i < p.values.size(); ++i) { 676 for (size_t i = 0; i < p.values.size(); ++i) {
636 if (p.values[i].size()) 677 PrepareWebValueAndBlobInfo(
637 values[i].assign(&*p.values[i].begin(), p.values[i].size()); 678 &values[i], p.values[i], p.blob_or_file_infos[i], &blob_infos[i]);
638 } 679 }
639 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; 680 WebIDBCursorImpl* cursor = cursors_[ipc_cursor_id];
640 DCHECK(cursor); 681 DCHECK(cursor);
641 cursor->SetPrefetchData(keys, primary_keys, values); 682 cursor->SetPrefetchData(keys, primary_keys, values, blob_infos);
642 683
643 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 684 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
644 DCHECK(callbacks); 685 DCHECK(callbacks);
645 cursor->CachedContinue(callbacks); 686 cursor->CachedContinue(callbacks);
646 pending_callbacks_.Remove(ipc_callbacks_id); 687 pending_callbacks_.Remove(ipc_callbacks_id);
647 } 688 }
648 689
649 void IndexedDBDispatcher::OnIntBlocked(int32 ipc_thread_id, 690 void IndexedDBDispatcher::OnIntBlocked(int32 ipc_thread_id,
650 int32 ipc_callbacks_id, 691 int32 ipc_callbacks_id,
651 int64 existing_version) { 692 int64 existing_version) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 typedef std::map<int32, WebIDBCursorImpl*>::iterator Iterator; 788 typedef std::map<int32, WebIDBCursorImpl*>::iterator Iterator;
748 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { 789 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) {
749 if (i->first == ipc_exception_cursor_id || 790 if (i->first == ipc_exception_cursor_id ||
750 i->second->transaction_id() != transaction_id) 791 i->second->transaction_id() != transaction_id)
751 continue; 792 continue;
752 i->second->ResetPrefetchCache(); 793 i->second->ResetPrefetchCache();
753 } 794 }
754 } 795 }
755 796
756 } // namespace content 797 } // namespace content
OLDNEW
« no previous file with comments | « content/child/indexed_db/indexed_db_dispatcher.h ('k') | content/child/indexed_db/indexed_db_dispatcher_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698