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 3 // found in the LICENSE file. 4 5 #include "content/child/indexed_db/indexed_db_message_filter.h" 6 7 #include "base/bind.h" 8 #include "base/location.h" 9 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/pickle.h" 11 #include "content/child/indexed_db/indexed_db_dispatcher.h" 12 #include "content/child/thread_safe_sender.h" 13 #include "content/common/indexed_db/indexed_db_messages.h" 14 #include "webkit/child/worker_task_runner.h" 15 16 using webkit_glue::WorkerTaskRunner; 17 18 namespace content { 19 20 IndexedDBMessageFilter::IndexedDBMessageFilter( 21 ThreadSafeSender* thread_safe_sender) 22 : main_thread_loop_proxy_(base::MessageLoopProxy::current()), 23 thread_safe_sender_(thread_safe_sender) { 24 } 25 26 bool IndexedDBMessageFilter::OnMessageReceived(const IPC::Message& msg) { 27 if (IPC_MESSAGE_CLASS(msg) != IndexedDBMsgStart) 28 return false; 29 int ipc_thread_id = -1; 30 bool result = PickleIterator(msg).ReadInt(&ipc_thread_id); 31 DCHECK(result); 32 base::Closure closure = base::Bind( 33 &IndexedDBMessageFilter::DispatchMessage, this, msg); 34 if (!ipc_thread_id) { 35 main_thread_loop_proxy_->PostTask(FROM_HERE, closure); 36 return true; 37 } 38 if (WorkerTaskRunner::Instance()->PostTask(ipc_thread_id, closure)) 39 return true; 40 41 // Message for a terminated worker - perform necessary cleanup 42 OnStaleMessageReceived(msg); 43 return true; 44 } 45 46 IndexedDBMessageFilter::~IndexedDBMessageFilter() {} 47 48 void IndexedDBMessageFilter::DispatchMessage(const IPC::Message& msg) { 49 IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get()) 50 ->OnMessageReceived(msg); 51 } 52 53 void IndexedDBMessageFilter::OnStaleMessageReceived(const IPC::Message& msg) { 54 IPC_BEGIN_MESSAGE_MAP(IndexedDBMessageFilter, msg) 55 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, 56 OnStaleSuccessIDBDatabase) 57 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksUpgradeNeeded, 58 OnStaleUpgradeNeeded) 59 IPC_END_MESSAGE_MAP() 60 } 61 62 void IndexedDBMessageFilter::OnStaleSuccessIDBDatabase( 63 int32 ipc_thread_id, 64 int32 ipc_callbacks_id, 65 int32 ipc_database_callbacks_id, 66 int32 ipc_database_id, 67 const IndexedDBDatabaseMetadata& idb_metadata) { 68 thread_safe_sender_->Send( 69 new IndexedDBHostMsg_DatabaseClose(ipc_database_id)); 70 } 71 72 void IndexedDBMessageFilter::OnStaleUpgradeNeeded( 73 const IndexedDBMsg_CallbacksUpgradeNeeded_Params& p) { 74 thread_safe_sender_->Send( 75 new IndexedDBHostMsg_DatabaseClose(p.ipc_database_id)); 76 } 77 78 } // namespace content 79