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 16using webkit_glue::WorkerTaskRunner; 17 18namespace content { 19 20IndexedDBMessageFilter::IndexedDBMessageFilter( 21 ThreadSafeSender* thread_safe_sender) 22 : main_thread_loop_proxy_(base::MessageLoopProxy::current()), 23 thread_safe_sender_(thread_safe_sender) { 24} 25 26bool 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 46IndexedDBMessageFilter::~IndexedDBMessageFilter() {} 47 48void IndexedDBMessageFilter::DispatchMessage(const IPC::Message& msg) { 49 IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get()) 50 ->OnMessageReceived(msg); 51} 52 53void 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 62void 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 72void 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