Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: content/browser/quota_dispatcher_host.cc

Issue 142903002: Quota: Return a pair of usage and granted_quota on requesting quota. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | content/child/quota_dispatcher.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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/quota_dispatcher_host.h" 5 #include "content/browser/quota_dispatcher_host.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/weak_ptr.h" 8 #include "base/memory/weak_ptr.h"
9 #include "content/common/quota_messages.h" 9 #include "content/common/quota_messages.h"
10 #include "content/public/browser/quota_permission_context.h" 10 #include "content/public/browser/quota_permission_context.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 typedef RequestQuotaDispatcher self_type; 99 typedef RequestQuotaDispatcher self_type;
100 100
101 RequestQuotaDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host, 101 RequestQuotaDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
102 int request_id, 102 int request_id,
103 const GURL& origin, 103 const GURL& origin,
104 StorageType type, 104 StorageType type,
105 int64 requested_quota, 105 int64 requested_quota,
106 int render_view_id) 106 int render_view_id)
107 : RequestDispatcher(dispatcher_host, request_id), 107 : RequestDispatcher(dispatcher_host, request_id),
108 origin_(origin), 108 origin_(origin),
109 host_(net::GetHostOrSpecFromURL(origin)),
110 type_(type), 109 type_(type),
110 current_usage_(0),
111 current_quota_(0), 111 current_quota_(0),
112 requested_quota_(requested_quota), 112 requested_quota_(requested_quota),
113 render_view_id_(render_view_id), 113 render_view_id_(render_view_id),
114 weak_factory_(this) {} 114 weak_factory_(this) {}
115 virtual ~RequestQuotaDispatcher() {} 115 virtual ~RequestQuotaDispatcher() {}
116 116
117 void Start() { 117 void Start() {
118 DCHECK(dispatcher_host()); 118 DCHECK(dispatcher_host());
119 if (requested_quota_ < 0) {
120 DidFinish(quota::kQuotaErrorInvalidModification, 0, 0);
121 return;
122 }
123
119 DCHECK(type_ == quota::kStorageTypeTemporary || 124 DCHECK(type_ == quota::kStorageTypeTemporary ||
120 type_ == quota::kStorageTypePersistent || 125 type_ == quota::kStorageTypePersistent ||
121 type_ == quota::kStorageTypeSyncable); 126 type_ == quota::kStorageTypeSyncable);
122 if (type_ == quota::kStorageTypePersistent) { 127 if (type_ == quota::kStorageTypePersistent) {
123 quota_manager()->GetPersistentHostQuota( 128 quota_manager()->GetUsageAndQuotaForWebApps(
124 host_, 129 origin_, type_,
125 base::Bind(&self_type::DidGetHostQuota, 130 base::Bind(&self_type::DidGetPersistentUsageAndQuota,
126 weak_factory_.GetWeakPtr(), host_, type_)); 131 weak_factory_.GetWeakPtr()));
127 } else { 132 } else {
128 quota_manager()->GetUsageAndQuotaForWebApps( 133 quota_manager()->GetUsageAndQuotaForWebApps(
129 origin_, type_, 134 origin_, type_,
130 base::Bind(&self_type::DidGetTemporaryUsageAndQuota, 135 base::Bind(&self_type::DidGetTemporaryUsageAndQuota,
131 weak_factory_.GetWeakPtr())); 136 weak_factory_.GetWeakPtr()));
132 } 137 }
133 } 138 }
134 139
135 private: 140 private:
136 void DidGetHostQuota(const std::string& host, 141 void DidGetPersistentUsageAndQuota(QuotaStatusCode status,
137 StorageType type, 142 int64 usage,
138 QuotaStatusCode status, 143 int64 quota) {
139 int64 quota) {
140 if (!dispatcher_host()) 144 if (!dispatcher_host())
141 return; 145 return;
142 DCHECK_EQ(type_, type);
143 DCHECK_EQ(host_, host);
144 if (status != quota::kQuotaStatusOk) { 146 if (status != quota::kQuotaStatusOk) {
145 DidFinish(status, 0); 147 DidFinish(status, 0, 0);
146 return; 148 return;
147 } 149 }
148 if (requested_quota_ < 0) { 150
149 DidFinish(quota::kQuotaErrorInvalidModification, 0); 151 if (quota_manager()->IsStorageUnlimited(origin_, type_) ||
152 requested_quota_ <= quota) {
153 // Seems like we can just let it go.
154 DidFinish(quota::kQuotaStatusOk, usage, requested_quota_);
150 return; 155 return;
151 } 156 }
152 if (requested_quota_ <= quota) { 157 current_usage_ = usage;
153 // Seems like we can just let it go.
154 DidFinish(quota::kQuotaStatusOk, requested_quota_);
155 return;
156 }
157 current_quota_ = quota; 158 current_quota_ = quota;
159
158 // Otherwise we need to consult with the permission context and 160 // Otherwise we need to consult with the permission context and
159 // possibly show an infobar. 161 // possibly show an infobar.
160 DCHECK(permission_context()); 162 DCHECK(permission_context());
161 permission_context()->RequestQuotaPermission( 163 permission_context()->RequestQuotaPermission(
162 origin_, type_, requested_quota_, render_process_id(), render_view_id_, 164 origin_, type_, requested_quota_, render_process_id(), render_view_id_,
163 base::Bind(&self_type::DidGetPermissionResponse, 165 base::Bind(&self_type::DidGetPermissionResponse,
164 weak_factory_.GetWeakPtr())); 166 weak_factory_.GetWeakPtr()));
165 } 167 }
166 168
167 void DidGetTemporaryUsageAndQuota(QuotaStatusCode status, 169 void DidGetTemporaryUsageAndQuota(QuotaStatusCode status,
168 int64 usage_unused, 170 int64 usage,
169 int64 quota) { 171 int64 quota) {
170 DidFinish(status, std::min(requested_quota_, quota)); 172 DidFinish(status, usage, std::min(requested_quota_, quota));
171 } 173 }
172 174
173 void DidGetPermissionResponse( 175 void DidGetPermissionResponse(
174 QuotaPermissionContext::QuotaPermissionResponse response) { 176 QuotaPermissionContext::QuotaPermissionResponse response) {
175 if (!dispatcher_host()) 177 if (!dispatcher_host())
176 return; 178 return;
177 if (response != QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW) { 179 if (response != QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW) {
178 // User didn't allow the new quota. Just returning the current quota. 180 // User didn't allow the new quota. Just returning the current quota.
179 DidFinish(quota::kQuotaStatusOk, current_quota_); 181 DidFinish(quota::kQuotaStatusOk, current_usage_, current_quota_);
180 return; 182 return;
181 } 183 }
182 // Now we're allowed to set the new quota. 184 // Now we're allowed to set the new quota.
183 quota_manager()->SetPersistentHostQuota( 185 quota_manager()->SetPersistentHostQuota(
184 host_, requested_quota_, 186 net::GetHostOrSpecFromURL(origin_), requested_quota_,
185 base::Bind(&self_type::DidSetHostQuota, weak_factory_.GetWeakPtr())); 187 base::Bind(&self_type::DidSetHostQuota, weak_factory_.GetWeakPtr()));
186 } 188 }
187 189
188 void DidSetHostQuota(QuotaStatusCode status, int64 new_quota) { 190 void DidSetHostQuota(QuotaStatusCode status, int64 new_quota) {
189 DidFinish(status, new_quota); 191 DidFinish(status, current_usage_, new_quota);
190 } 192 }
191 193
192 void DidFinish(QuotaStatusCode status, int64 granted_quota) { 194 void DidFinish(QuotaStatusCode status,
195 int64 usage,
196 int64 granted_quota) {
193 if (!dispatcher_host()) 197 if (!dispatcher_host())
194 return; 198 return;
195 DCHECK(dispatcher_host()); 199 DCHECK(dispatcher_host());
196 if (status != quota::kQuotaStatusOk) { 200 if (status != quota::kQuotaStatusOk) {
197 dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status)); 201 dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status));
198 } else { 202 } else {
199 dispatcher_host()->Send(new QuotaMsg_DidGrantStorageQuota( 203 dispatcher_host()->Send(new QuotaMsg_DidGrantStorageQuota(
200 request_id(), granted_quota)); 204 request_id(), usage, granted_quota));
201 } 205 }
202 Completed(); 206 Completed();
203 } 207 }
204 208
205 const GURL origin_; 209 const GURL origin_;
206 const std::string host_;
207 const StorageType type_; 210 const StorageType type_;
211 int64 current_usage_;
208 int64 current_quota_; 212 int64 current_quota_;
209 const int64 requested_quota_; 213 const int64 requested_quota_;
210 const int render_view_id_; 214 const int render_view_id_;
211 base::WeakPtrFactory<self_type> weak_factory_; 215 base::WeakPtrFactory<self_type> weak_factory_;
212 }; 216 };
213 217
214 QuotaDispatcherHost::QuotaDispatcherHost( 218 QuotaDispatcherHost::QuotaDispatcherHost(
215 int process_id, 219 int process_id,
216 QuotaManager* quota_manager, 220 QuotaManager* quota_manager,
217 QuotaPermissionContext* permission_context) 221 QuotaPermissionContext* permission_context)
(...skipping 27 matching lines...) Expand all
245 weak_factory_.GetWeakPtr(), request_id); 249 weak_factory_.GetWeakPtr(), request_id);
246 dispatcher->QueryStorageUsageAndQuota(origin, type); 250 dispatcher->QueryStorageUsageAndQuota(origin, type);
247 } 251 }
248 252
249 void QuotaDispatcherHost::OnRequestStorageQuota( 253 void QuotaDispatcherHost::OnRequestStorageQuota(
250 int render_view_id, 254 int render_view_id,
251 int request_id, 255 int request_id,
252 const GURL& origin, 256 const GURL& origin,
253 StorageType type, 257 StorageType type,
254 int64 requested_size) { 258 int64 requested_size) {
255 if (quota_manager_->IsStorageUnlimited(origin, type)) {
256 // If the origin is marked 'unlimited' we always just return ok.
257 Send(new QuotaMsg_DidGrantStorageQuota(request_id, requested_size));
258 return;
259 }
260
261 if (type != quota::kStorageTypeTemporary && 259 if (type != quota::kStorageTypeTemporary &&
262 type != quota::kStorageTypePersistent) { 260 type != quota::kStorageTypePersistent) {
263 // Unsupported storage types. 261 // Unsupported storage types.
264 Send(new QuotaMsg_DidFail(request_id, quota::kQuotaErrorNotSupported)); 262 Send(new QuotaMsg_DidFail(request_id, quota::kQuotaErrorNotSupported));
265 return; 263 return;
266 } 264 }
267 265
268 RequestQuotaDispatcher* dispatcher = new RequestQuotaDispatcher( 266 RequestQuotaDispatcher* dispatcher = new RequestQuotaDispatcher(
269 weak_factory_.GetWeakPtr(), request_id, origin, type, 267 weak_factory_.GetWeakPtr(), request_id, origin, type,
270 requested_size, render_view_id); 268 requested_size, render_view_id);
271 dispatcher->Start(); 269 dispatcher->Start();
272 } 270 }
273 271
274 } // namespace content 272 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/child/quota_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698