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/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