quota_dispatcher.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
1// Copyright (c) 2011 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/quota_dispatcher.h"
6
7#include "base/basictypes.h"
8#include "content/child/child_thread.h"
9#include "content/common/quota_messages.h"
10#include "third_party/WebKit/public/web/WebStorageQuotaCallbacks.h"
11#include "third_party/WebKit/public/web/WebStorageQuotaType.h"
12#include "url/gurl.h"
13
14using quota::QuotaStatusCode;
15using quota::StorageType;
16
17using WebKit::WebStorageQuotaCallbacks;
18using WebKit::WebStorageQuotaError;
19using WebKit::WebStorageQuotaType;
20
21namespace content {
22namespace {
23
24// QuotaDispatcher::Callback implementation for WebStorageQuotaCallbacks.
25class WebStorageQuotaDispatcherCallback : public QuotaDispatcher::Callback {
26 public:
27  WebStorageQuotaDispatcherCallback(WebKit::WebStorageQuotaCallbacks* callback)
28      : callbacks_(callback) {
29    DCHECK(callbacks_);
30  }
31  virtual ~WebStorageQuotaDispatcherCallback() {}
32  virtual void DidQueryStorageUsageAndQuota(int64 usage, int64 quota) OVERRIDE {
33    callbacks_->didQueryStorageUsageAndQuota(usage, quota);
34  }
35  virtual void DidGrantStorageQuota(int64 granted_quota) OVERRIDE {
36    callbacks_->didGrantStorageQuota(granted_quota);
37  }
38  virtual void DidFail(quota::QuotaStatusCode error) OVERRIDE {
39    callbacks_->didFail(static_cast<WebStorageQuotaError>(error));
40  }
41
42 private:
43  // Not owned (self-destructed).
44  WebKit::WebStorageQuotaCallbacks* callbacks_;
45};
46
47}  // namespace
48
49QuotaDispatcher::QuotaDispatcher() {
50}
51
52QuotaDispatcher::~QuotaDispatcher() {
53  IDMap<Callback, IDMapOwnPointer>::iterator iter(&pending_quota_callbacks_);
54  while (!iter.IsAtEnd()) {
55    iter.GetCurrentValue()->DidFail(quota::kQuotaErrorAbort);
56    iter.Advance();
57  }
58}
59
60bool QuotaDispatcher::OnMessageReceived(const IPC::Message& msg) {
61  bool handled = true;
62  IPC_BEGIN_MESSAGE_MAP(QuotaDispatcher, msg)
63    IPC_MESSAGE_HANDLER(QuotaMsg_DidGrantStorageQuota,
64                        DidGrantStorageQuota)
65    IPC_MESSAGE_HANDLER(QuotaMsg_DidQueryStorageUsageAndQuota,
66                        DidQueryStorageUsageAndQuota);
67    IPC_MESSAGE_HANDLER(QuotaMsg_DidFail, DidFail);
68    IPC_MESSAGE_UNHANDLED(handled = false)
69  IPC_END_MESSAGE_MAP()
70  return handled;
71}
72
73void QuotaDispatcher::QueryStorageUsageAndQuota(
74    const GURL& origin_url,
75    StorageType type,
76    Callback* callback) {
77  DCHECK(callback);
78  int request_id = pending_quota_callbacks_.Add(callback);
79  ChildThread::current()->Send(new QuotaHostMsg_QueryStorageUsageAndQuota(
80      request_id, origin_url, type));
81}
82
83void QuotaDispatcher::RequestStorageQuota(
84    int render_view_id,
85    const GURL& origin_url,
86    StorageType type,
87    int64 requested_size,
88    Callback* callback) {
89  DCHECK(callback);
90  int request_id = pending_quota_callbacks_.Add(callback);
91  ChildThread::current()->Send(new QuotaHostMsg_RequestStorageQuota(
92      render_view_id, request_id, origin_url, type, requested_size));
93}
94
95// static
96QuotaDispatcher::Callback*
97QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(
98    WebKit::WebStorageQuotaCallbacks* callbacks) {
99  return new WebStorageQuotaDispatcherCallback(callbacks);
100}
101
102void QuotaDispatcher::DidGrantStorageQuota(
103    int request_id,
104    int64 granted_quota) {
105  Callback* callback = pending_quota_callbacks_.Lookup(request_id);
106  DCHECK(callback);
107  callback->DidGrantStorageQuota(granted_quota);
108  pending_quota_callbacks_.Remove(request_id);
109}
110
111void QuotaDispatcher::DidQueryStorageUsageAndQuota(
112    int request_id,
113    int64 current_usage,
114    int64 current_quota) {
115  Callback* callback = pending_quota_callbacks_.Lookup(request_id);
116  DCHECK(callback);
117  callback->DidQueryStorageUsageAndQuota(current_usage, current_quota);
118  pending_quota_callbacks_.Remove(request_id);
119}
120
121void QuotaDispatcher::DidFail(
122    int request_id,
123    QuotaStatusCode error) {
124  Callback* callback = pending_quota_callbacks_.Lookup(request_id);
125  DCHECK(callback);
126  callback->DidFail(error);
127  pending_quota_callbacks_.Remove(request_id);
128}
129
130COMPILE_ASSERT(int(WebKit::WebStorageQuotaTypeTemporary) == \
131               int(quota::kStorageTypeTemporary), mismatching_enums);
132COMPILE_ASSERT(int(WebKit::WebStorageQuotaTypePersistent) == \
133               int(quota::kStorageTypePersistent), mismatching_enums);
134
135COMPILE_ASSERT(int(WebKit::WebStorageQuotaErrorNotSupported) == \
136               int(quota::kQuotaErrorNotSupported), mismatching_enums);
137COMPILE_ASSERT(int(WebKit::WebStorageQuotaErrorAbort) == \
138               int(quota::kQuotaErrorAbort), mismatching_enums);
139
140}  // namespace content
141