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