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

Side by Side Diff: content/browser/service_worker/service_worker_cache.cc

Issue 674873002: [ServiceWorkerCache] Call QuotaManager::NotifyStorageModified from Cache. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix refptr check Created 6 years, 1 month 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/service_worker/service_worker_cache.h" 5 #include "content/browser/service_worker/service_worker_cache.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/guid.h" 10 #include "base/guid.h"
11 #include "base/message_loop/message_loop_proxy.h" 11 #include "base/message_loop/message_loop_proxy.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 #include "content/browser/service_worker/service_worker_cache.pb.h" 13 #include "content/browser/service_worker/service_worker_cache.pb.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "net/base/io_buffer.h" 15 #include "net/base/io_buffer.h"
16 #include "net/base/net_errors.h" 16 #include "net/base/net_errors.h"
17 #include "net/disk_cache/disk_cache.h" 17 #include "net/disk_cache/disk_cache.h"
18 #include "net/url_request/url_request_context.h" 18 #include "net/url_request/url_request_context.h"
19 #include "storage/browser/blob/blob_data_handle.h" 19 #include "storage/browser/blob/blob_data_handle.h"
20 #include "storage/browser/blob/blob_storage_context.h" 20 #include "storage/browser/blob/blob_storage_context.h"
21 #include "storage/browser/blob/blob_url_request_job_factory.h" 21 #include "storage/browser/blob/blob_url_request_job_factory.h"
22 #include "storage/browser/quota/quota_manager_proxy.h"
22 #include "third_party/WebKit/public/platform/WebServiceWorkerResponseType.h" 23 #include "third_party/WebKit/public/platform/WebServiceWorkerResponseType.h"
23 24
24 namespace content { 25 namespace content {
25 26
26 namespace { 27 namespace {
27 28
28 typedef scoped_ptr<disk_cache::Backend> ScopedBackendPtr; 29 typedef scoped_ptr<disk_cache::Backend> ScopedBackendPtr;
29 typedef base::Callback<void(bool)> BoolCallback; 30 typedef base::Callback<void(bool)> BoolCallback;
30 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)> 31 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)>
31 EntryBoolCallback; 32 EntryBoolCallback;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 scoped_refptr<net::IOBufferWithSize> buffer; 87 scoped_refptr<net::IOBufferWithSize> buffer;
87 scoped_refptr<storage::BlobData> blob_data; 88 scoped_refptr<storage::BlobData> blob_data;
88 int total_bytes_read; 89 int total_bytes_read;
89 90
90 DISALLOW_COPY_AND_ASSIGN(ResponseReadContext); 91 DISALLOW_COPY_AND_ASSIGN(ResponseReadContext);
91 }; 92 };
92 93
93 // Streams data from a blob and writes it to a given disk_cache::Entry. 94 // Streams data from a blob and writes it to a given disk_cache::Entry.
94 class BlobReader : public net::URLRequest::Delegate { 95 class BlobReader : public net::URLRequest::Delegate {
95 public: 96 public:
96 typedef base::Callback<void(bool)> BoolCallback; 97 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)>
98 EntryAndBoolCallback;
97 99
98 BlobReader(disk_cache::ScopedEntryPtr entry) 100 BlobReader()
99 : cache_entry_offset_(0), 101 : cache_entry_offset_(0),
100 buffer_(new net::IOBufferWithSize(kBufferSize)), 102 buffer_(new net::IOBufferWithSize(kBufferSize)),
101 weak_ptr_factory_(this) { 103 weak_ptr_factory_(this) {}
104
105 // |entry| is passed to the callback once complete.
106 void StreamBlobToCache(disk_cache::ScopedEntryPtr entry,
107 net::URLRequestContext* request_context,
108 scoped_ptr<storage::BlobDataHandle> blob_data_handle,
109 const EntryAndBoolCallback& callback) {
102 DCHECK(entry); 110 DCHECK(entry);
103 entry_ = entry.Pass(); 111 entry_ = entry.Pass();
104 }
105
106 void StreamBlobToCache(net::URLRequestContext* request_context,
107 scoped_ptr<storage::BlobDataHandle> blob_data_handle,
108 const BoolCallback& callback) {
109 callback_ = callback; 112 callback_ = callback;
110 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest( 113 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest(
111 blob_data_handle.Pass(), request_context, this); 114 blob_data_handle.Pass(), request_context, this);
112 blob_request_->Start(); 115 blob_request_->Start();
113 } 116 }
114 117
115 // net::URLRequest::Delegate overrides for reading blobs. 118 // net::URLRequest::Delegate overrides for reading blobs.
116 void OnReceivedRedirect(net::URLRequest* request, 119 void OnReceivedRedirect(net::URLRequest* request,
117 const net::RedirectInfo& redirect_info, 120 const net::RedirectInfo& redirect_info,
118 bool* defer_redirect) override { 121 bool* defer_redirect) override {
(...skipping 12 matching lines...) Expand all
131 const net::SSLInfo& ssl_info, 134 const net::SSLInfo& ssl_info,
132 bool fatal) override { 135 bool fatal) override {
133 NOTREACHED(); 136 NOTREACHED();
134 } 137 }
135 void OnBeforeNetworkStart(net::URLRequest* request, bool* defer) override { 138 void OnBeforeNetworkStart(net::URLRequest* request, bool* defer) override {
136 NOTREACHED(); 139 NOTREACHED();
137 } 140 }
138 141
139 void OnResponseStarted(net::URLRequest* request) override { 142 void OnResponseStarted(net::URLRequest* request) override {
140 if (!request->status().is_success()) { 143 if (!request->status().is_success()) {
141 callback_.Run(false); 144 callback_.Run(entry_.Pass(), false);
142 return; 145 return;
143 } 146 }
144 ReadFromBlob(); 147 ReadFromBlob();
145 } 148 }
146 149
147 virtual void ReadFromBlob() { 150 virtual void ReadFromBlob() {
148 int bytes_read = 0; 151 int bytes_read = 0;
149 bool done = 152 bool done =
150 blob_request_->Read(buffer_.get(), buffer_->size(), &bytes_read); 153 blob_request_->Read(buffer_.get(), buffer_->size(), &bytes_read);
151 if (done) 154 if (done)
152 OnReadCompleted(blob_request_.get(), bytes_read); 155 OnReadCompleted(blob_request_.get(), bytes_read);
153 } 156 }
154 157
155 void OnReadCompleted(net::URLRequest* request, int bytes_read) override { 158 void OnReadCompleted(net::URLRequest* request, int bytes_read) override {
156 if (!request->status().is_success()) { 159 if (!request->status().is_success()) {
157 callback_.Run(false); 160 callback_.Run(entry_.Pass(), false);
158 return; 161 return;
159 } 162 }
160 163
161 if (bytes_read == 0) { 164 if (bytes_read == 0) {
162 callback_.Run(true); 165 callback_.Run(entry_.Pass(), true);
163 return; 166 return;
164 } 167 }
165 168
166 net::CompletionCallback cache_write_callback = 169 net::CompletionCallback cache_write_callback =
167 base::Bind(&BlobReader::DidWriteDataToEntry, 170 base::Bind(&BlobReader::DidWriteDataToEntry,
168 weak_ptr_factory_.GetWeakPtr(), 171 weak_ptr_factory_.GetWeakPtr(),
169 bytes_read); 172 bytes_read);
170 173
171 int rv = entry_->WriteData(INDEX_RESPONSE_BODY, 174 int rv = entry_->WriteData(INDEX_RESPONSE_BODY,
172 cache_entry_offset_, 175 cache_entry_offset_,
173 buffer_.get(), 176 buffer_.get(),
174 bytes_read, 177 bytes_read,
175 cache_write_callback, 178 cache_write_callback,
176 true /* truncate */); 179 true /* truncate */);
177 if (rv != net::ERR_IO_PENDING) 180 if (rv != net::ERR_IO_PENDING)
178 cache_write_callback.Run(rv); 181 cache_write_callback.Run(rv);
179 } 182 }
180 183
181 void DidWriteDataToEntry(int expected_bytes, int rv) { 184 void DidWriteDataToEntry(int expected_bytes, int rv) {
182 if (rv != expected_bytes) { 185 if (rv != expected_bytes) {
183 callback_.Run(false); 186 callback_.Run(entry_.Pass(), false);
184 return; 187 return;
185 } 188 }
186 189
187 cache_entry_offset_ += rv; 190 cache_entry_offset_ += rv;
188 ReadFromBlob(); 191 ReadFromBlob();
189 } 192 }
190 193
191 private: 194 private:
192 int cache_entry_offset_; 195 int cache_entry_offset_;
193 disk_cache::ScopedEntryPtr entry_; 196 disk_cache::ScopedEntryPtr entry_;
194 scoped_ptr<net::URLRequest> blob_request_; 197 scoped_ptr<net::URLRequest> blob_request_;
195 BoolCallback callback_; 198 EntryAndBoolCallback callback_;
196 scoped_refptr<net::IOBufferWithSize> buffer_; 199 scoped_refptr<net::IOBufferWithSize> buffer_;
197 base::WeakPtrFactory<BlobReader> weak_ptr_factory_; 200 base::WeakPtrFactory<BlobReader> weak_ptr_factory_;
198 }; 201 };
199 202
200 // The state needed to pass between ServiceWorkerCache::Put callbacks. 203 // The state needed to pass between ServiceWorkerCache::Put callbacks.
201 struct PutContext { 204 struct PutContext {
202 PutContext(scoped_ptr<ServiceWorkerFetchRequest> request, 205 PutContext(
203 scoped_ptr<ServiceWorkerResponse> response, 206 const GURL& origin,
204 scoped_ptr<storage::BlobDataHandle> blob_data_handle, 207 scoped_ptr<ServiceWorkerFetchRequest> request,
205 const ServiceWorkerCache::ResponseCallback& callback, 208 scoped_ptr<ServiceWorkerResponse> response,
206 net::URLRequestContext* request_context) 209 scoped_ptr<storage::BlobDataHandle> blob_data_handle,
207 : request(request.Pass()), 210 const ServiceWorkerCache::ResponseCallback& callback,
211 net::URLRequestContext* request_context,
212 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy)
213 : origin(origin),
214 request(request.Pass()),
208 response(response.Pass()), 215 response(response.Pass()),
209 blob_data_handle(blob_data_handle.Pass()), 216 blob_data_handle(blob_data_handle.Pass()),
210 callback(callback), 217 callback(callback),
211 request_context(request_context), 218 request_context(request_context),
219 quota_manager_proxy(quota_manager_proxy),
212 cache_entry(NULL) {} 220 cache_entry(NULL) {}
213 ~PutContext() { 221 ~PutContext() {
214 if (cache_entry) 222 if (cache_entry)
215 cache_entry->Close(); 223 cache_entry->Close();
216 } 224 }
217 225
218 // Input parameters to the Put function. 226 // Input parameters to the Put function.
227 GURL origin;
219 scoped_ptr<ServiceWorkerFetchRequest> request; 228 scoped_ptr<ServiceWorkerFetchRequest> request;
220 scoped_ptr<ServiceWorkerResponse> response; 229 scoped_ptr<ServiceWorkerResponse> response;
221 scoped_ptr<storage::BlobDataHandle> blob_data_handle; 230 scoped_ptr<storage::BlobDataHandle> blob_data_handle;
222 ServiceWorkerCache::ResponseCallback callback; 231 ServiceWorkerCache::ResponseCallback callback;
223
224 net::URLRequestContext* request_context; 232 net::URLRequestContext* request_context;
233 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy;
225 234
226 // This isn't a scoped_ptr because the disk_cache needs an Entry** as input to 235 // This isn't a scoped_ptr because the disk_cache needs an Entry** as input to
227 // CreateEntry. 236 // CreateEntry.
228 disk_cache::Entry* cache_entry; 237 disk_cache::Entry* cache_entry;
229 238
230 // The BlobDataHandle for the output ServiceWorkerResponse. 239 // The BlobDataHandle for the output ServiceWorkerResponse.
231 scoped_ptr<storage::BlobDataHandle> out_blob_data_handle; 240 scoped_ptr<storage::BlobDataHandle> out_blob_data_handle;
232 241
233 DISALLOW_COPY_AND_ASSIGN(PutContext); 242 DISALLOW_COPY_AND_ASSIGN(PutContext);
234 }; 243 };
235 244
236 // Put callbacks 245 // Put callbacks
237 void PutDidCreateEntry(scoped_ptr<PutContext> put_context, int rv); 246 void PutDidCreateEntry(scoped_ptr<PutContext> put_context, int rv);
238 void PutDidWriteHeaders(scoped_ptr<PutContext> put_context, 247 void PutDidWriteHeaders(scoped_ptr<PutContext> put_context,
239 int expected_bytes, 248 int expected_bytes,
240 int rv); 249 int rv);
241 void PutDidWriteBlobToCache(scoped_ptr<PutContext> put_context, 250 void PutDidWriteBlobToCache(scoped_ptr<PutContext> put_context,
242 scoped_ptr<BlobReader> blob_reader, 251 scoped_ptr<BlobReader> blob_reader,
252 disk_cache::ScopedEntryPtr entry,
243 bool success); 253 bool success);
244 254
245 // Match callbacks 255 // Match callbacks
246 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, 256 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request,
247 const ServiceWorkerCache::ResponseCallback& callback, 257 const ServiceWorkerCache::ResponseCallback& callback,
248 base::WeakPtr<storage::BlobStorageContext> blob_storage, 258 base::WeakPtr<storage::BlobStorageContext> blob_storage,
249 scoped_ptr<disk_cache::Entry*> entryptr, 259 scoped_ptr<disk_cache::Entry*> entryptr,
250 int rv); 260 int rv);
251 void MatchDidReadHeaderData( 261 void MatchDidReadHeaderData(
252 scoped_ptr<ServiceWorkerFetchRequest> request, 262 scoped_ptr<ServiceWorkerFetchRequest> request,
253 const ServiceWorkerCache::ResponseCallback& callback, 263 const ServiceWorkerCache::ResponseCallback& callback,
254 base::WeakPtr<storage::BlobStorageContext> blob_storage, 264 base::WeakPtr<storage::BlobStorageContext> blob_storage,
255 disk_cache::ScopedEntryPtr entry, 265 disk_cache::ScopedEntryPtr entry,
256 scoped_ptr<ServiceWorkerRequestResponseHeaders> headers); 266 scoped_ptr<ServiceWorkerRequestResponseHeaders> headers);
257 void MatchDidReadResponseBodyData( 267 void MatchDidReadResponseBodyData(
258 scoped_ptr<ServiceWorkerFetchRequest> request, 268 scoped_ptr<ServiceWorkerFetchRequest> request,
259 const ServiceWorkerCache::ResponseCallback& callback, 269 const ServiceWorkerCache::ResponseCallback& callback,
260 base::WeakPtr<storage::BlobStorageContext> blob_storage, 270 base::WeakPtr<storage::BlobStorageContext> blob_storage,
261 disk_cache::ScopedEntryPtr entry, 271 disk_cache::ScopedEntryPtr entry,
262 scoped_ptr<ServiceWorkerResponse> response, 272 scoped_ptr<ServiceWorkerResponse> response,
263 scoped_ptr<ResponseReadContext> response_context, 273 scoped_ptr<ResponseReadContext> response_context,
264 int rv); 274 int rv);
265 void MatchDoneWithBody(scoped_ptr<ServiceWorkerFetchRequest> request, 275 void MatchDoneWithBody(scoped_ptr<ServiceWorkerFetchRequest> request,
266 const ServiceWorkerCache::ResponseCallback& callback, 276 const ServiceWorkerCache::ResponseCallback& callback,
267 base::WeakPtr<storage::BlobStorageContext> blob_storage, 277 base::WeakPtr<storage::BlobStorageContext> blob_storage,
268 scoped_ptr<ServiceWorkerResponse> response, 278 scoped_ptr<ServiceWorkerResponse> response,
269 scoped_ptr<ResponseReadContext> response_context); 279 scoped_ptr<ResponseReadContext> response_context);
270 280
271 // Delete callbacks 281 // Delete callbacks
272 void DeleteDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, 282 void DeleteDidOpenEntry(
273 const ServiceWorkerCache::ErrorCallback& callback, 283 const GURL& origin,
274 scoped_ptr<disk_cache::Entry*> entryptr, 284 scoped_ptr<ServiceWorkerFetchRequest> request,
275 int rv); 285 const ServiceWorkerCache::ErrorCallback& callback,
286 scoped_ptr<disk_cache::Entry*> entryptr,
287 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
288 int rv);
276 289
277 // Copy headers out of a cache entry and into a protobuf. The callback is 290 // Copy headers out of a cache entry and into a protobuf. The callback is
278 // guaranteed to be run. 291 // guaranteed to be run.
279 void ReadHeaders(disk_cache::Entry* entry, const HeadersCallback& callback); 292 void ReadHeaders(disk_cache::Entry* entry, const HeadersCallback& callback);
280 void ReadHeadersDidReadHeaderData( 293 void ReadHeadersDidReadHeaderData(
281 disk_cache::Entry* entry, 294 disk_cache::Entry* entry,
282 const HeadersCallback& callback, 295 const HeadersCallback& callback,
283 const scoped_refptr<net::IOBufferWithSize>& buffer, 296 const scoped_refptr<net::IOBufferWithSize>& buffer,
284 int rv); 297 int rv);
285 298
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage, 374 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage,
362 scoped_ptr<ServiceWorkerResponse>(), 375 scoped_ptr<ServiceWorkerResponse>(),
363 scoped_ptr<storage::BlobDataHandle>()); 376 scoped_ptr<storage::BlobDataHandle>());
364 return; 377 return;
365 } 378 }
366 379
367 // The metadata is written, now for the response content. The data is streamed 380 // The metadata is written, now for the response content. The data is streamed
368 // from the blob into the cache entry. 381 // from the blob into the cache entry.
369 382
370 if (put_context->response->blob_uuid.empty()) { 383 if (put_context->response->blob_uuid.empty()) {
384 if (put_context->quota_manager_proxy.get()) {
385 put_context->quota_manager_proxy->NotifyStorageModified(
386 storage::QuotaClient::kServiceWorkerCache,
387 put_context->origin,
388 storage::kStorageTypeTemporary,
389 put_context->cache_entry->GetDataSize(INDEX_HEADERS));
390 }
391
371 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK, 392 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK,
372 put_context->response.Pass(), 393 put_context->response.Pass(),
373 scoped_ptr<storage::BlobDataHandle>()); 394 scoped_ptr<storage::BlobDataHandle>());
374 return; 395 return;
375 } 396 }
376 397
377 DCHECK(put_context->blob_data_handle); 398 DCHECK(put_context->blob_data_handle);
378 399
379 disk_cache::ScopedEntryPtr entry(put_context->cache_entry); 400 disk_cache::ScopedEntryPtr entry(put_context->cache_entry);
380 put_context->cache_entry = NULL; 401 put_context->cache_entry = NULL;
381 scoped_ptr<BlobReader> reader(new BlobReader(entry.Pass())); 402 scoped_ptr<BlobReader> reader(new BlobReader());
382
383 BlobReader* reader_ptr = reader.get(); 403 BlobReader* reader_ptr = reader.get();
384 404
385 // Grab some pointers before passing put_context in Bind. 405 // Grab some pointers before passing put_context in Bind.
386 net::URLRequestContext* request_context = put_context->request_context; 406 net::URLRequestContext* request_context = put_context->request_context;
387 scoped_ptr<storage::BlobDataHandle> blob_data_handle = 407 scoped_ptr<storage::BlobDataHandle> blob_data_handle =
388 put_context->blob_data_handle.Pass(); 408 put_context->blob_data_handle.Pass();
389 409
390 reader_ptr->StreamBlobToCache(request_context, 410 reader_ptr->StreamBlobToCache(entry.Pass(),
411 request_context,
391 blob_data_handle.Pass(), 412 blob_data_handle.Pass(),
392 base::Bind(PutDidWriteBlobToCache, 413 base::Bind(PutDidWriteBlobToCache,
393 base::Passed(put_context.Pass()), 414 base::Passed(put_context.Pass()),
394 base::Passed(reader.Pass()))); 415 base::Passed(reader.Pass())));
395 } 416 }
396 417
397 void PutDidWriteBlobToCache(scoped_ptr<PutContext> put_context, 418 void PutDidWriteBlobToCache(scoped_ptr<PutContext> put_context,
398 scoped_ptr<BlobReader> blob_reader, 419 scoped_ptr<BlobReader> blob_reader,
420 disk_cache::ScopedEntryPtr entry,
399 bool success) { 421 bool success) {
422 DCHECK(entry);
423 put_context->cache_entry = entry.release();
424
400 if (!success) { 425 if (!success) {
401 put_context->cache_entry->Doom(); 426 put_context->cache_entry->Doom();
402 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage, 427 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage,
403 scoped_ptr<ServiceWorkerResponse>(), 428 scoped_ptr<ServiceWorkerResponse>(),
404 scoped_ptr<storage::BlobDataHandle>()); 429 scoped_ptr<storage::BlobDataHandle>());
405 return; 430 return;
406 } 431 }
407 432
433 if (put_context->quota_manager_proxy.get()) {
434 put_context->quota_manager_proxy->NotifyStorageModified(
435 storage::QuotaClient::kServiceWorkerCache,
436 put_context->origin,
437 storage::kStorageTypeTemporary,
438 put_context->cache_entry->GetDataSize(INDEX_HEADERS) +
439 put_context->cache_entry->GetDataSize(INDEX_RESPONSE_BODY));
440 }
441
408 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK, 442 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK,
409 put_context->response.Pass(), 443 put_context->response.Pass(),
410 put_context->out_blob_data_handle.Pass()); 444 put_context->out_blob_data_handle.Pass());
411 } 445 }
412 446
413 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, 447 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request,
414 const ServiceWorkerCache::ResponseCallback& callback, 448 const ServiceWorkerCache::ResponseCallback& callback,
415 base::WeakPtr<storage::BlobStorageContext> blob_storage, 449 base::WeakPtr<storage::BlobStorageContext> blob_storage,
416 scoped_ptr<disk_cache::Entry*> entryptr, 450 scoped_ptr<disk_cache::Entry*> entryptr,
417 int rv) { 451 int rv) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 } 666 }
633 667
634 scoped_ptr<storage::BlobDataHandle> blob_data_handle( 668 scoped_ptr<storage::BlobDataHandle> blob_data_handle(
635 blob_storage->AddFinishedBlob(response_context->blob_data.get())); 669 blob_storage->AddFinishedBlob(response_context->blob_data.get()));
636 670
637 callback.Run(ServiceWorkerCache::ErrorTypeOK, 671 callback.Run(ServiceWorkerCache::ErrorTypeOK,
638 response.Pass(), 672 response.Pass(),
639 blob_data_handle.Pass()); 673 blob_data_handle.Pass());
640 } 674 }
641 675
642 void DeleteDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, 676 void DeleteDidOpenEntry(
643 const ServiceWorkerCache::ErrorCallback& callback, 677 const GURL& origin,
644 scoped_ptr<disk_cache::Entry*> entryptr, 678 scoped_ptr<ServiceWorkerFetchRequest> request,
645 int rv) { 679 const ServiceWorkerCache::ErrorCallback& callback,
680 scoped_ptr<disk_cache::Entry*> entryptr,
681 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
682 int rv) {
646 if (rv != net::OK) { 683 if (rv != net::OK) {
647 callback.Run(ServiceWorkerCache::ErrorTypeNotFound); 684 callback.Run(ServiceWorkerCache::ErrorTypeNotFound);
648 return; 685 return;
649 } 686 }
650 687
651 DCHECK(entryptr); 688 DCHECK(entryptr);
652 disk_cache::ScopedEntryPtr entry(*entryptr); 689 disk_cache::ScopedEntryPtr entry(*entryptr);
653 690
691 if (quota_manager_proxy.get()) {
692 quota_manager_proxy->NotifyStorageModified(
693 storage::QuotaClient::kServiceWorkerCache,
694 origin,
695 storage::kStorageTypeTemporary,
696 -1 * (entry->GetDataSize(INDEX_HEADERS) +
697 entry->GetDataSize(INDEX_RESPONSE_BODY)));
698 }
699
654 entry->Doom(); 700 entry->Doom();
655 callback.Run(ServiceWorkerCache::ErrorTypeOK); 701 callback.Run(ServiceWorkerCache::ErrorTypeOK);
656 } 702 }
657 703
658 void ReadHeaders(disk_cache::Entry* entry, const HeadersCallback& callback) { 704 void ReadHeaders(disk_cache::Entry* entry, const HeadersCallback& callback) {
659 DCHECK(entry); 705 DCHECK(entry);
660 706
661 scoped_refptr<net::IOBufferWithSize> buffer( 707 scoped_refptr<net::IOBufferWithSize> buffer(
662 new net::IOBufferWithSize(entry->GetDataSize(INDEX_HEADERS))); 708 new net::IOBufferWithSize(entry->GetDataSize(INDEX_HEADERS)));
663 709
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 783
738 // Used for enumerating cache entries. 784 // Used for enumerating cache entries.
739 scoped_ptr<disk_cache::Backend::Iterator> backend_iterator; 785 scoped_ptr<disk_cache::Backend::Iterator> backend_iterator;
740 disk_cache::Entry* enumerated_entry; 786 disk_cache::Entry* enumerated_entry;
741 787
742 DISALLOW_COPY_AND_ASSIGN(KeysContext); 788 DISALLOW_COPY_AND_ASSIGN(KeysContext);
743 }; 789 };
744 790
745 // static 791 // static
746 scoped_refptr<ServiceWorkerCache> ServiceWorkerCache::CreateMemoryCache( 792 scoped_refptr<ServiceWorkerCache> ServiceWorkerCache::CreateMemoryCache(
793 const GURL& origin,
747 net::URLRequestContext* request_context, 794 net::URLRequestContext* request_context,
795 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
748 base::WeakPtr<storage::BlobStorageContext> blob_context) { 796 base::WeakPtr<storage::BlobStorageContext> blob_context) {
749 return make_scoped_refptr( 797 return make_scoped_refptr(new ServiceWorkerCache(origin,
750 new ServiceWorkerCache(base::FilePath(), request_context, blob_context)); 798 base::FilePath(),
799 request_context,
800 quota_manager_proxy,
801 blob_context));
751 } 802 }
752 803
753 // static 804 // static
754 scoped_refptr<ServiceWorkerCache> ServiceWorkerCache::CreatePersistentCache( 805 scoped_refptr<ServiceWorkerCache> ServiceWorkerCache::CreatePersistentCache(
806 const GURL& origin,
755 const base::FilePath& path, 807 const base::FilePath& path,
756 net::URLRequestContext* request_context, 808 net::URLRequestContext* request_context,
809 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
757 base::WeakPtr<storage::BlobStorageContext> blob_context) { 810 base::WeakPtr<storage::BlobStorageContext> blob_context) {
758 return make_scoped_refptr( 811 return make_scoped_refptr(new ServiceWorkerCache(
759 new ServiceWorkerCache(path, request_context, blob_context)); 812 origin, path, request_context, quota_manager_proxy, blob_context));
760 } 813 }
761 814
762 ServiceWorkerCache::~ServiceWorkerCache() { 815 ServiceWorkerCache::~ServiceWorkerCache() {
763 } 816 }
764 817
765 base::WeakPtr<ServiceWorkerCache> ServiceWorkerCache::AsWeakPtr() { 818 base::WeakPtr<ServiceWorkerCache> ServiceWorkerCache::AsWeakPtr() {
766 return weak_ptr_factory_.GetWeakPtr(); 819 return weak_ptr_factory_.GetWeakPtr();
767 } 820 }
768 821
769 void ServiceWorkerCache::Put(scoped_ptr<ServiceWorkerFetchRequest> request, 822 void ServiceWorkerCache::Put(scoped_ptr<ServiceWorkerFetchRequest> request,
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 } 906 }
854 907
855 scoped_ptr<disk_cache::Entry*> entry(new disk_cache::Entry*); 908 scoped_ptr<disk_cache::Entry*> entry(new disk_cache::Entry*);
856 909
857 disk_cache::Entry** entry_ptr = entry.get(); 910 disk_cache::Entry** entry_ptr = entry.get();
858 911
859 ServiceWorkerFetchRequest* request_ptr = request.get(); 912 ServiceWorkerFetchRequest* request_ptr = request.get();
860 913
861 net::CompletionCallback open_entry_callback = 914 net::CompletionCallback open_entry_callback =
862 base::Bind(DeleteDidOpenEntry, 915 base::Bind(DeleteDidOpenEntry,
916 origin_,
863 base::Passed(request.Pass()), 917 base::Passed(request.Pass()),
864 callback, 918 callback,
865 base::Passed(entry.Pass())); 919 base::Passed(entry.Pass()),
920 quota_manager_proxy_);
866 921
867 int rv = backend_->OpenEntry( 922 int rv = backend_->OpenEntry(
868 request_ptr->url.spec(), entry_ptr, open_entry_callback); 923 request_ptr->url.spec(), entry_ptr, open_entry_callback);
869 if (rv != net::ERR_IO_PENDING) 924 if (rv != net::ERR_IO_PENDING)
870 open_entry_callback.Run(rv); 925 open_entry_callback.Run(rv);
871 } 926 }
872 927
873 void ServiceWorkerCache::Keys(const RequestsCallback& callback) { 928 void ServiceWorkerCache::Keys(const RequestsCallback& callback) {
874 if (!initialized_) { 929 if (!initialized_) {
875 Init(base::Bind( 930 Init(base::Bind(
(...skipping 29 matching lines...) Expand all
905 960
906 if (rv != net::ERR_IO_PENDING) 961 if (rv != net::ERR_IO_PENDING)
907 open_entry_callback.Run(rv); 962 open_entry_callback.Run(rv);
908 } 963 }
909 964
910 void ServiceWorkerCache::Close() { 965 void ServiceWorkerCache::Close() {
911 backend_.reset(); 966 backend_.reset();
912 } 967 }
913 968
914 ServiceWorkerCache::ServiceWorkerCache( 969 ServiceWorkerCache::ServiceWorkerCache(
970 const GURL& origin,
915 const base::FilePath& path, 971 const base::FilePath& path,
916 net::URLRequestContext* request_context, 972 net::URLRequestContext* request_context,
973 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
917 base::WeakPtr<storage::BlobStorageContext> blob_context) 974 base::WeakPtr<storage::BlobStorageContext> blob_context)
918 : path_(path), 975 : origin_(origin),
976 path_(path),
919 request_context_(request_context), 977 request_context_(request_context),
978 quota_manager_proxy_(quota_manager_proxy),
920 blob_storage_context_(blob_context), 979 blob_storage_context_(blob_context),
921 initialized_(false), 980 initialized_(false),
922 weak_ptr_factory_(this) { 981 weak_ptr_factory_(this) {
923 } 982 }
924 983
925 void ServiceWorkerCache::PutImpl( 984 void ServiceWorkerCache::PutImpl(
926 scoped_ptr<ServiceWorkerFetchRequest> request, 985 scoped_ptr<ServiceWorkerFetchRequest> request,
927 scoped_ptr<ServiceWorkerResponse> response, 986 scoped_ptr<ServiceWorkerResponse> response,
928 scoped_ptr<storage::BlobDataHandle> blob_data_handle, 987 scoped_ptr<storage::BlobDataHandle> blob_data_handle,
929 const ResponseCallback& callback) { 988 const ResponseCallback& callback) {
930 if (!backend_) { 989 if (!backend_) {
931 callback.Run(ErrorTypeStorage, 990 callback.Run(ErrorTypeStorage,
932 scoped_ptr<ServiceWorkerResponse>(), 991 scoped_ptr<ServiceWorkerResponse>(),
933 scoped_ptr<storage::BlobDataHandle>()); 992 scoped_ptr<storage::BlobDataHandle>());
934 return; 993 return;
935 } 994 }
936 995
937 scoped_ptr<PutContext> put_context(new PutContext(request.Pass(), 996 scoped_ptr<PutContext> put_context(new PutContext(origin_,
997 request.Pass(),
938 response.Pass(), 998 response.Pass(),
939 blob_data_handle.Pass(), 999 blob_data_handle.Pass(),
940 callback, 1000 callback,
941 request_context_)); 1001 request_context_,
1002 quota_manager_proxy_));
942 1003
943 if (put_context->blob_data_handle) { 1004 if (put_context->blob_data_handle) {
944 // Grab another handle to the blob for the callback response. 1005 // Grab another handle to the blob for the callback response.
945 put_context->out_blob_data_handle = 1006 put_context->out_blob_data_handle =
946 blob_storage_context_->GetBlobDataFromUUID( 1007 blob_storage_context_->GetBlobDataFromUUID(
947 put_context->response->blob_uuid); 1008 put_context->response->blob_uuid);
948 } 1009 }
949 1010
950 disk_cache::Entry** entry_ptr = &put_context->cache_entry; 1011 disk_cache::Entry** entry_ptr = &put_context->cache_entry;
951 ServiceWorkerFetchRequest* request_ptr = put_context->request.get(); 1012 ServiceWorkerFetchRequest* request_ptr = put_context->request.get();
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1097 initialized_ = true; 1158 initialized_ = true;
1098 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); 1159 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin();
1099 it != init_callbacks_.end(); 1160 it != init_callbacks_.end();
1100 ++it) { 1161 ++it) {
1101 it->Run(); 1162 it->Run();
1102 } 1163 }
1103 init_callbacks_.clear(); 1164 init_callbacks_.clear();
1104 } 1165 }
1105 1166
1106 } // namespace content 1167 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_cache.h ('k') | content/browser/service_worker/service_worker_cache_storage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698