Home | History | Annotate | Download | only in indexed_db
      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