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

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

Issue 17955002: Fix IndexedDB after r208777. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix unittests Created 7 years, 5 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 "base/format_macros.h" 7 #include "base/format_macros.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/threading/thread_local.h" 10 #include "base/threading/thread_local.h"
11 #include "content/child/child_thread.h"
12 #include "content/child/indexed_db/proxy_webidbcursor_impl.h" 11 #include "content/child/indexed_db/proxy_webidbcursor_impl.h"
13 #include "content/child/indexed_db/proxy_webidbdatabase_impl.h" 12 #include "content/child/indexed_db/proxy_webidbdatabase_impl.h"
13 #include "content/child/thread_safe_sender.h"
14 #include "content/common/indexed_db/indexed_db_messages.h" 14 #include "content/common/indexed_db/indexed_db_messages.h"
15 #include "ipc/ipc_channel.h" 15 #include "ipc/ipc_channel.h"
16 #include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h" 16 #include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h"
17 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" 17 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h"
18 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" 18 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h"
19 #include "third_party/WebKit/public/platform/WebIDBKeyRange.h" 19 #include "third_party/WebKit/public/platform/WebIDBKeyRange.h"
20 20
21 using WebKit::WebData; 21 using WebKit::WebData;
22 using WebKit::WebIDBCallbacks; 22 using WebKit::WebIDBCallbacks;
23 using WebKit::WebIDBDatabase; 23 using WebKit::WebIDBDatabase;
(...skipping 16 matching lines...) Expand all
40 IndexedDBDispatcher* const kHasBeenDeleted = 40 IndexedDBDispatcher* const kHasBeenDeleted =
41 reinterpret_cast<IndexedDBDispatcher*>(0x1); 41 reinterpret_cast<IndexedDBDispatcher*>(0x1);
42 42
43 int32 CurrentWorkerId() { 43 int32 CurrentWorkerId() {
44 return WorkerTaskRunner::Instance()->CurrentWorkerId(); 44 return WorkerTaskRunner::Instance()->CurrentWorkerId();
45 } 45 }
46 } // unnamed namespace 46 } // unnamed namespace
47 47
48 const size_t kMaxIDBValueSizeInBytes = 64 * 1024 * 1024; 48 const size_t kMaxIDBValueSizeInBytes = 64 * 1024 * 1024;
49 49
50 IndexedDBDispatcher::IndexedDBDispatcher() { 50 IndexedDBDispatcher::IndexedDBDispatcher(ThreadSafeSender* thread_safe_sender)
51 : thread_safe_sender_(thread_safe_sender) {
51 g_idb_dispatcher_tls.Pointer()->Set(this); 52 g_idb_dispatcher_tls.Pointer()->Set(this);
52 } 53 }
53 54
54 IndexedDBDispatcher::~IndexedDBDispatcher() { 55 IndexedDBDispatcher::~IndexedDBDispatcher() {
55 // Clear any pending callbacks - which may result in dispatch requests - 56 // Clear any pending callbacks - which may result in dispatch requests -
56 // before marking the dispatcher as deleted. 57 // before marking the dispatcher as deleted.
57 pending_callbacks_.Clear(); 58 pending_callbacks_.Clear();
58 pending_database_callbacks_.Clear(); 59 pending_database_callbacks_.Clear();
59 60
60 DCHECK(pending_callbacks_.IsEmpty()); 61 DCHECK(pending_callbacks_.IsEmpty());
61 DCHECK(pending_database_callbacks_.IsEmpty()); 62 DCHECK(pending_database_callbacks_.IsEmpty());
62 63
63 g_idb_dispatcher_tls.Pointer()->Set(kHasBeenDeleted); 64 g_idb_dispatcher_tls.Pointer()->Set(kHasBeenDeleted);
64 } 65 }
65 66
66 IndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance() { 67 IndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance(
68 ThreadSafeSender* thread_safe_sender) {
67 if (g_idb_dispatcher_tls.Pointer()->Get() == kHasBeenDeleted) { 69 if (g_idb_dispatcher_tls.Pointer()->Get() == kHasBeenDeleted) {
68 NOTREACHED() << "Re-instantiating TLS IndexedDBDispatcher."; 70 NOTREACHED() << "Re-instantiating TLS IndexedDBDispatcher.";
69 g_idb_dispatcher_tls.Pointer()->Set(NULL); 71 g_idb_dispatcher_tls.Pointer()->Set(NULL);
70 } 72 }
71 if (g_idb_dispatcher_tls.Pointer()->Get()) 73 if (g_idb_dispatcher_tls.Pointer()->Get())
72 return g_idb_dispatcher_tls.Pointer()->Get(); 74 return g_idb_dispatcher_tls.Pointer()->Get();
73 75
74 IndexedDBDispatcher* dispatcher = new IndexedDBDispatcher; 76 IndexedDBDispatcher* dispatcher = new IndexedDBDispatcher(thread_safe_sender);
75 if (WorkerTaskRunner::Instance()->CurrentWorkerId()) 77 if (WorkerTaskRunner::Instance()->CurrentWorkerId())
76 webkit_glue::WorkerTaskRunner::Instance()->AddStopObserver(dispatcher); 78 webkit_glue::WorkerTaskRunner::Instance()->AddStopObserver(dispatcher);
77 return dispatcher; 79 return dispatcher;
78 } 80 }
79 81
80 void IndexedDBDispatcher::OnWorkerRunLoopStopped() { delete this; } 82 void IndexedDBDispatcher::OnWorkerRunLoopStopped() { delete this; }
81 83
82 WebIDBMetadata IndexedDBDispatcher::ConvertMetadata( 84 WebIDBMetadata IndexedDBDispatcher::ConvertMetadata(
83 const IndexedDBDatabaseMetadata& idb_metadata) { 85 const IndexedDBDatabaseMetadata& idb_metadata) {
84 WebIDBMetadata web_metadata; 86 WebIDBMetadata web_metadata;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksComplete, OnComplete) 156 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksComplete, OnComplete)
155 IPC_MESSAGE_UNHANDLED(handled = false) 157 IPC_MESSAGE_UNHANDLED(handled = false)
156 IPC_END_MESSAGE_MAP() 158 IPC_END_MESSAGE_MAP()
157 // If a message gets here, IndexedDBMessageFilter already determined that it 159 // If a message gets here, IndexedDBMessageFilter already determined that it
158 // is an IndexedDB message. 160 // is an IndexedDB message.
159 DCHECK(handled) << "Didn't handle a message defined at line " 161 DCHECK(handled) << "Didn't handle a message defined at line "
160 << IPC_MESSAGE_ID_LINE(msg.type()); 162 << IPC_MESSAGE_ID_LINE(msg.type());
161 } 163 }
162 164
163 bool IndexedDBDispatcher::Send(IPC::Message* msg) { 165 bool IndexedDBDispatcher::Send(IPC::Message* msg) {
164 if (!ChildThread::current()) { 166 return thread_safe_sender_->Send(msg);
165 // Unexpected - this may be happening during shutdown.
166 NOTREACHED();
167 return false;
168 }
169 if (CurrentWorkerId()) {
170 scoped_refptr<IPC::SyncMessageFilter> filter(
171 ChildThread::current()->sync_message_filter());
172 return filter->Send(msg);
173 }
174 return ChildThread::current()->Send(msg);
175 } 167 }
176 168
177 void IndexedDBDispatcher::RequestIDBCursorAdvance( 169 void IndexedDBDispatcher::RequestIDBCursorAdvance(
178 unsigned long count, 170 unsigned long count,
179 WebIDBCallbacks* callbacks_ptr, 171 WebIDBCallbacks* callbacks_ptr,
180 int32 ipc_cursor_id) { 172 int32 ipc_cursor_id) {
181 // Reset all cursor prefetch caches except for this cursor. 173 // Reset all cursor prefetch caches except for this cursor.
182 ResetCursorPrefetchCaches(ipc_cursor_id); 174 ResetCursorPrefetchCaches(ipc_cursor_id);
183 175
184 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 176 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 int32 ipc_object_id, 453 int32 ipc_object_id,
462 const IndexedDBDatabaseMetadata& idb_metadata) { 454 const IndexedDBDatabaseMetadata& idb_metadata) {
463 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 455 DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
464 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 456 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
465 if (!callbacks) 457 if (!callbacks)
466 return; 458 return;
467 WebIDBMetadata metadata(ConvertMetadata(idb_metadata)); 459 WebIDBMetadata metadata(ConvertMetadata(idb_metadata));
468 // If an upgrade was performed, count will be non-zero. 460 // If an upgrade was performed, count will be non-zero.
469 if (!databases_.count(ipc_object_id)) 461 if (!databases_.count(ipc_object_id))
470 databases_[ipc_object_id] = new RendererWebIDBDatabaseImpl( 462 databases_[ipc_object_id] = new RendererWebIDBDatabaseImpl(
471 ipc_object_id, ipc_database_callbacks_id); 463 ipc_object_id, ipc_database_callbacks_id, thread_safe_sender_);
472 DCHECK_EQ(databases_.count(ipc_object_id), 1u); 464 DCHECK_EQ(databases_.count(ipc_object_id), 1u);
473 callbacks->onSuccess(databases_[ipc_object_id], metadata); 465 callbacks->onSuccess(databases_[ipc_object_id], metadata);
474 pending_callbacks_.Remove(ipc_callbacks_id); 466 pending_callbacks_.Remove(ipc_callbacks_id);
475 } 467 }
476 468
477 void IndexedDBDispatcher::OnSuccessIndexedDBKey(int32 ipc_thread_id, 469 void IndexedDBDispatcher::OnSuccessIndexedDBKey(int32 ipc_thread_id,
478 int32 ipc_callbacks_id, 470 int32 ipc_callbacks_id,
479 const IndexedDBKey& key) { 471 const IndexedDBKey& key) {
480 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 472 DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
481 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 473 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 const IndexedDBKey& primary_key = p.primary_key; 550 const IndexedDBKey& primary_key = p.primary_key;
559 WebData web_value; 551 WebData web_value;
560 if (p.value.size()) 552 if (p.value.size())
561 web_value.assign(&p.value.front(), p.value.size()); 553 web_value.assign(&p.value.front(), p.value.size());
562 554
563 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 555 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
564 if (!callbacks) 556 if (!callbacks)
565 return; 557 return;
566 558
567 RendererWebIDBCursorImpl* cursor = 559 RendererWebIDBCursorImpl* cursor =
568 new RendererWebIDBCursorImpl(ipc_object_id); 560 new RendererWebIDBCursorImpl(ipc_object_id, thread_safe_sender_);
569 cursors_[ipc_object_id] = cursor; 561 cursors_[ipc_object_id] = cursor;
570 callbacks->onSuccess(cursor, key, primary_key, web_value); 562 callbacks->onSuccess(cursor, key, primary_key, web_value);
571 563
572 pending_callbacks_.Remove(ipc_callbacks_id); 564 pending_callbacks_.Remove(ipc_callbacks_id);
573 } 565 }
574 566
575 void IndexedDBDispatcher::OnSuccessCursorContinue( 567 void IndexedDBDispatcher::OnSuccessCursorContinue(
576 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { 568 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) {
577 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 569 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId());
578 int32 ipc_callbacks_id = p.ipc_callbacks_id; 570 int32 ipc_callbacks_id = p.ipc_callbacks_id;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 } 620 }
629 621
630 void IndexedDBDispatcher::OnUpgradeNeeded( 622 void IndexedDBDispatcher::OnUpgradeNeeded(
631 const IndexedDBMsg_CallbacksUpgradeNeeded_Params& p) { 623 const IndexedDBMsg_CallbacksUpgradeNeeded_Params& p) {
632 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 624 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId());
633 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(p.ipc_callbacks_id); 625 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(p.ipc_callbacks_id);
634 DCHECK(callbacks); 626 DCHECK(callbacks);
635 WebIDBMetadata metadata(ConvertMetadata(p.idb_metadata)); 627 WebIDBMetadata metadata(ConvertMetadata(p.idb_metadata));
636 DCHECK(!databases_.count(p.ipc_database_id)); 628 DCHECK(!databases_.count(p.ipc_database_id));
637 databases_[p.ipc_database_id] = new RendererWebIDBDatabaseImpl( 629 databases_[p.ipc_database_id] = new RendererWebIDBDatabaseImpl(
638 p.ipc_database_id, p.ipc_database_callbacks_id); 630 p.ipc_database_id, p.ipc_database_callbacks_id, thread_safe_sender_);
639 callbacks->onUpgradeNeeded( 631 callbacks->onUpgradeNeeded(
640 p.old_version, 632 p.old_version,
641 databases_[p.ipc_database_id], 633 databases_[p.ipc_database_id],
642 metadata, 634 metadata,
643 static_cast<WebIDBCallbacks::DataLoss>(p.data_loss)); 635 static_cast<WebIDBCallbacks::DataLoss>(p.data_loss));
644 } 636 }
645 637
646 void IndexedDBDispatcher::OnError(int32 ipc_thread_id, 638 void IndexedDBDispatcher::OnError(int32 ipc_thread_id,
647 int32 ipc_callbacks_id, 639 int32 ipc_callbacks_id,
648 int code, 640 int code,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 int32 ipc_exception_cursor_id) { 699 int32 ipc_exception_cursor_id) {
708 typedef std::map<int32, RendererWebIDBCursorImpl*>::iterator Iterator; 700 typedef std::map<int32, RendererWebIDBCursorImpl*>::iterator Iterator;
709 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { 701 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) {
710 if (i->first == ipc_exception_cursor_id) 702 if (i->first == ipc_exception_cursor_id)
711 continue; 703 continue;
712 i->second->ResetPrefetchCache(); 704 i->second->ResetPrefetchCache();
713 } 705 }
714 } 706 }
715 707
716 } // namespace content 708 } // 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