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/message_loop/message_loop_proxy.h" 8 #include "content/child/indexed_db/indexed_db_dispatcher.h" 9 #include "content/child/thread_safe_sender.h" 10 #include "content/child/worker_thread_task_runner.h" 11 #include "content/common/indexed_db/indexed_db_constants.h" 12 #include "content/common/indexed_db/indexed_db_messages.h" 13 14 namespace content { 15 16 IndexedDBMessageFilter::IndexedDBMessageFilter( 17 ThreadSafeSender* thread_safe_sender) 18 : main_thread_loop_(base::MessageLoopProxy::current()), 19 thread_safe_sender_(thread_safe_sender) {} 20 21 IndexedDBMessageFilter::~IndexedDBMessageFilter() {} 22 23 base::TaskRunner* IndexedDBMessageFilter::OverrideTaskRunnerForMessage( 24 const IPC::Message& msg) { 25 if (IPC_MESSAGE_CLASS(msg) != IndexedDBMsgStart) 26 return NULL; 27 int ipc_thread_id = 0; 28 const bool success = PickleIterator(msg).ReadInt(&ipc_thread_id); 29 DCHECK(success); 30 if (!ipc_thread_id) 31 return main_thread_loop_.get(); 32 return new WorkerThreadTaskRunner(ipc_thread_id); 33 } 34 35 bool IndexedDBMessageFilter::OnMessageReceived(const IPC::Message& msg) { 36 if (IPC_MESSAGE_CLASS(msg) != IndexedDBMsgStart) 37 return false; 38 IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get()) 39 ->OnMessageReceived(msg); 40 return true; 41 } 42 43 void IndexedDBMessageFilter::OnStaleMessageReceived(const IPC::Message& msg) { 44 IPC_BEGIN_MESSAGE_MAP(IndexedDBMessageFilter, msg) 45 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, 46 OnStaleSuccessIDBDatabase) 47 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksUpgradeNeeded, 48 OnStaleUpgradeNeeded) 49 IPC_END_MESSAGE_MAP() 50 } 51 52 void IndexedDBMessageFilter::OnStaleSuccessIDBDatabase( 53 int32 ipc_thread_id, 54 int32 ipc_callbacks_id, 55 int32 ipc_database_callbacks_id, 56 int32 ipc_database_id, 57 const IndexedDBDatabaseMetadata& idb_metadata) { 58 if (ipc_database_id == kNoDatabase) 59 return; 60 thread_safe_sender_->Send( 61 new IndexedDBHostMsg_DatabaseClose(ipc_database_id)); 62 } 63 64 void IndexedDBMessageFilter::OnStaleUpgradeNeeded( 65 const IndexedDBMsg_CallbacksUpgradeNeeded_Params& p) { 66 thread_safe_sender_->Send( 67 new IndexedDBHostMsg_DatabaseClose(p.ipc_database_id)); 68 } 69 70 } // namespace content 71