OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/quota_dispatcher_host.h" | 5 #include "content/browser/renderer_host/quota_dispatcher_host.h" |
6 | 6 |
| 7 #include "base/bind.h" |
7 #include "base/memory/scoped_callback_factory.h" | 8 #include "base/memory/scoped_callback_factory.h" |
8 #include "content/browser/quota_permission_context.h" | 9 #include "content/browser/quota_permission_context.h" |
9 #include "content/common/quota_messages.h" | 10 #include "content/common/quota_messages.h" |
10 #include "googleurl/src/gurl.h" | 11 #include "googleurl/src/gurl.h" |
11 #include "net/base/net_util.h" | 12 #include "net/base/net_util.h" |
12 #include "webkit/quota/quota_manager.h" | 13 #include "webkit/quota/quota_manager.h" |
13 | 14 |
14 using quota::QuotaClient; | 15 using quota::QuotaClient; |
15 using quota::QuotaManager; | 16 using quota::QuotaManager; |
16 using quota::QuotaStatusCode; | 17 using quota::QuotaStatusCode; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 int request_id_; | 51 int request_id_; |
51 }; | 52 }; |
52 | 53 |
53 class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher | 54 class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher |
54 : public RequestDispatcher { | 55 : public RequestDispatcher { |
55 public: | 56 public: |
56 QueryUsageAndQuotaDispatcher( | 57 QueryUsageAndQuotaDispatcher( |
57 QuotaDispatcherHost* dispatcher_host, | 58 QuotaDispatcherHost* dispatcher_host, |
58 int request_id) | 59 int request_id) |
59 : RequestDispatcher(dispatcher_host, request_id), | 60 : RequestDispatcher(dispatcher_host, request_id), |
60 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} | 61 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} |
61 virtual ~QueryUsageAndQuotaDispatcher() {} | 62 virtual ~QueryUsageAndQuotaDispatcher() {} |
62 | 63 |
63 void QueryStorageUsageAndQuota(const GURL& origin, StorageType type) { | 64 void QueryStorageUsageAndQuota(const GURL& origin, StorageType type) { |
64 quota_manager()->GetUsageAndQuota(origin, type, | 65 quota_manager()->GetUsageAndQuota( |
65 callback_factory_.NewCallback( | 66 origin, type, |
66 &QueryUsageAndQuotaDispatcher::DidQueryStorageUsageAndQuota)); | 67 base::Bind(&QueryUsageAndQuotaDispatcher::DidQueryStorageUsageAndQuota, |
| 68 weak_factory_.GetWeakPtr())); |
67 } | 69 } |
68 | 70 |
69 private: | 71 private: |
70 void DidQueryStorageUsageAndQuota( | 72 void DidQueryStorageUsageAndQuota( |
71 QuotaStatusCode status, int64 usage, int64 quota) { | 73 QuotaStatusCode status, int64 usage, int64 quota) { |
72 DCHECK(dispatcher_host()); | 74 DCHECK(dispatcher_host()); |
73 if (status != quota::kQuotaStatusOk) { | 75 if (status != quota::kQuotaStatusOk) { |
74 dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status)); | 76 dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status)); |
75 } else { | 77 } else { |
76 dispatcher_host()->Send(new QuotaMsg_DidQueryStorageUsageAndQuota( | 78 dispatcher_host()->Send(new QuotaMsg_DidQueryStorageUsageAndQuota( |
77 request_id(), usage, quota)); | 79 request_id(), usage, quota)); |
78 } | 80 } |
79 Completed(); | 81 Completed(); |
80 } | 82 } |
81 | 83 |
82 base::ScopedCallbackFactory<QueryUsageAndQuotaDispatcher> callback_factory_; | 84 base::WeakPtrFactory<QueryUsageAndQuotaDispatcher> weak_factory_; |
83 }; | 85 }; |
84 | 86 |
85 class QuotaDispatcherHost::RequestQuotaDispatcher | 87 class QuotaDispatcherHost::RequestQuotaDispatcher |
86 : public RequestDispatcher { | 88 : public RequestDispatcher { |
87 public: | 89 public: |
88 typedef RequestQuotaDispatcher self_type; | 90 typedef RequestQuotaDispatcher self_type; |
89 | 91 |
90 RequestQuotaDispatcher(QuotaDispatcherHost* dispatcher_host, | 92 RequestQuotaDispatcher(QuotaDispatcherHost* dispatcher_host, |
91 int request_id, | 93 int request_id, |
92 const GURL& origin, | 94 const GURL& origin, |
93 StorageType type, | 95 StorageType type, |
94 int64 requested_quota, | 96 int64 requested_quota, |
95 int render_view_id) | 97 int render_view_id) |
96 : RequestDispatcher(dispatcher_host, request_id), | 98 : RequestDispatcher(dispatcher_host, request_id), |
97 origin_(origin), | 99 origin_(origin), |
98 host_(net::GetHostOrSpecFromURL(origin)), | 100 host_(net::GetHostOrSpecFromURL(origin)), |
99 type_(type), | 101 type_(type), |
100 current_quota_(0), | 102 current_quota_(0), |
101 requested_quota_(requested_quota), | 103 requested_quota_(requested_quota), |
102 render_view_id_(render_view_id), | 104 render_view_id_(render_view_id), |
| 105 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
103 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} | 106 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {} |
104 virtual ~RequestQuotaDispatcher() {} | 107 virtual ~RequestQuotaDispatcher() {} |
105 | 108 |
106 void Start() { | 109 void Start() { |
107 DCHECK(type_ == quota::kStorageTypeTemporary || | 110 DCHECK(type_ == quota::kStorageTypeTemporary || |
108 type_ == quota::kStorageTypePersistent); | 111 type_ == quota::kStorageTypePersistent); |
109 if (type_ == quota::kStorageTypePersistent) { | 112 if (type_ == quota::kStorageTypePersistent) { |
110 quota_manager()->GetPersistentHostQuota( | 113 quota_manager()->GetPersistentHostQuota( |
111 host_, | 114 host_, |
112 callback_factory_.NewCallback(&self_type::DidGetHostQuota)); | 115 base::Bind(&self_type::DidGetHostQuota, |
| 116 weak_factory_.GetWeakPtr())); |
113 } else { | 117 } else { |
114 quota_manager()->GetUsageAndQuota( | 118 quota_manager()->GetUsageAndQuota( |
115 origin_, type_, | 119 origin_, type_, |
116 callback_factory_.NewCallback( | 120 base::Bind(&self_type::DidGetTemporaryUsageAndQuota, |
117 &self_type::DidGetTemporaryUsageAndQuota)); | 121 weak_factory_.GetWeakPtr())); |
118 } | 122 } |
119 } | 123 } |
120 | 124 |
121 private: | 125 private: |
122 void DidGetHostQuota(QuotaStatusCode status, | 126 void DidGetHostQuota(QuotaStatusCode status, |
123 const std::string& host, | 127 const std::string& host, |
124 StorageType type, | 128 StorageType type, |
125 int64 quota) { | 129 int64 quota) { |
126 DCHECK_EQ(type_, type); | 130 DCHECK_EQ(type_, type); |
127 DCHECK_EQ(host_, host); | 131 DCHECK_EQ(host_, host); |
(...skipping 23 matching lines...) Expand all Loading... |
151 | 155 |
152 void DidGetPermissionResponse(QuotaPermissionContext::Response response) { | 156 void DidGetPermissionResponse(QuotaPermissionContext::Response response) { |
153 if (response != QuotaPermissionContext::kResponseAllow) { | 157 if (response != QuotaPermissionContext::kResponseAllow) { |
154 // User didn't allow the new quota. Just returning the current quota. | 158 // User didn't allow the new quota. Just returning the current quota. |
155 DidFinish(quota::kQuotaStatusOk, current_quota_); | 159 DidFinish(quota::kQuotaStatusOk, current_quota_); |
156 return; | 160 return; |
157 } | 161 } |
158 // Now we're allowed to set the new quota. | 162 // Now we're allowed to set the new quota. |
159 quota_manager()->SetPersistentHostQuota( | 163 quota_manager()->SetPersistentHostQuota( |
160 host_, requested_quota_, | 164 host_, requested_quota_, |
161 callback_factory_.NewCallback(&self_type::DidSetHostQuota)); | 165 base::Bind(&self_type::DidSetHostQuota, |
| 166 weak_factory_.GetWeakPtr())); |
162 } | 167 } |
163 | 168 |
164 void DidSetHostQuota(QuotaStatusCode status, | 169 void DidSetHostQuota(QuotaStatusCode status, |
165 const std::string& host, | 170 const std::string& host, |
166 StorageType type, | 171 StorageType type, |
167 int64 new_quota) { | 172 int64 new_quota) { |
168 DCHECK_EQ(host_, host); | 173 DCHECK_EQ(host_, host); |
169 DCHECK_EQ(type_, type); | 174 DCHECK_EQ(type_, type); |
170 DidFinish(status, new_quota); | 175 DidFinish(status, new_quota); |
171 } | 176 } |
172 | 177 |
173 void DidFinish(QuotaStatusCode status, int64 granted_quota) { | 178 void DidFinish(QuotaStatusCode status, int64 granted_quota) { |
174 DCHECK(dispatcher_host()); | 179 DCHECK(dispatcher_host()); |
175 if (status != quota::kQuotaStatusOk) { | 180 if (status != quota::kQuotaStatusOk) { |
176 dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status)); | 181 dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status)); |
177 } else { | 182 } else { |
178 dispatcher_host()->Send(new QuotaMsg_DidGrantStorageQuota( | 183 dispatcher_host()->Send(new QuotaMsg_DidGrantStorageQuota( |
179 request_id(), granted_quota)); | 184 request_id(), granted_quota)); |
180 } | 185 } |
181 Completed(); | 186 Completed(); |
182 } | 187 } |
183 | 188 |
184 const GURL origin_; | 189 const GURL origin_; |
185 const std::string host_; | 190 const std::string host_; |
186 const StorageType type_; | 191 const StorageType type_; |
187 int64 current_quota_; | 192 int64 current_quota_; |
188 const int64 requested_quota_; | 193 const int64 requested_quota_; |
189 const int render_view_id_; | 194 const int render_view_id_; |
| 195 base::WeakPtrFactory<self_type> weak_factory_; |
190 base::ScopedCallbackFactory<self_type> callback_factory_; | 196 base::ScopedCallbackFactory<self_type> callback_factory_; |
191 }; | 197 }; |
192 | 198 |
193 QuotaDispatcherHost::QuotaDispatcherHost( | 199 QuotaDispatcherHost::QuotaDispatcherHost( |
194 int process_id, | 200 int process_id, |
195 QuotaManager* quota_manager, | 201 QuotaManager* quota_manager, |
196 QuotaPermissionContext* permission_context) | 202 QuotaPermissionContext* permission_context) |
197 : process_id_(process_id), | 203 : process_id_(process_id), |
198 quota_manager_(quota_manager), | 204 quota_manager_(quota_manager), |
199 permission_context_(permission_context) { | 205 permission_context_(permission_context) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 type != quota::kStorageTypePersistent) { | 247 type != quota::kStorageTypePersistent) { |
242 // Unsupported storage types. | 248 // Unsupported storage types. |
243 Send(new QuotaMsg_DidFail(request_id, quota::kQuotaErrorNotSupported)); | 249 Send(new QuotaMsg_DidFail(request_id, quota::kQuotaErrorNotSupported)); |
244 return; | 250 return; |
245 } | 251 } |
246 | 252 |
247 RequestQuotaDispatcher* dispatcher = new RequestQuotaDispatcher( | 253 RequestQuotaDispatcher* dispatcher = new RequestQuotaDispatcher( |
248 this, request_id, origin, type, requested_size, render_view_id); | 254 this, request_id, origin, type, requested_size, render_view_id); |
249 dispatcher->Start(); | 255 dispatcher->Start(); |
250 } | 256 } |
OLD | NEW |