OLD | NEW |
---|---|
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" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
48 scoped_refptr<net::IOBufferWithSize> buffer; | 48 scoped_refptr<net::IOBufferWithSize> buffer; |
49 scoped_refptr<storage::BlobData> blob_data; | 49 scoped_refptr<storage::BlobData> blob_data; |
50 int total_bytes_read; | 50 int total_bytes_read; |
51 | 51 |
52 DISALLOW_COPY_AND_ASSIGN(ResponseReadContext); | 52 DISALLOW_COPY_AND_ASSIGN(ResponseReadContext); |
53 }; | 53 }; |
54 | 54 |
55 // Streams data from a blob and writes it to a given disk_cache::Entry. | 55 // Streams data from a blob and writes it to a given disk_cache::Entry. |
56 class BlobReader : public net::URLRequest::Delegate { | 56 class BlobReader : public net::URLRequest::Delegate { |
57 public: | 57 public: |
58 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)> | 58 typedef base::Callback<void(bool)> BoolCallback; |
59 EntryBoolCallback; | |
60 | 59 |
61 BlobReader(disk_cache::ScopedEntryPtr entry) | 60 BlobReader(disk_cache::ScopedEntryPtr entry) |
62 : cache_entry_offset_(0), | 61 : cache_entry_offset_(0), |
63 buffer_(new net::IOBufferWithSize(kBufferSize)), | 62 buffer_(new net::IOBufferWithSize(kBufferSize)), |
64 weak_ptr_factory_(this) { | 63 weak_ptr_factory_(this) { |
65 DCHECK(entry); | 64 DCHECK(entry); |
66 entry_ = entry.Pass(); | 65 entry_ = entry.Pass(); |
67 } | 66 } |
68 | 67 |
69 void StreamBlobToCache(net::URLRequestContext* request_context, | 68 void StreamBlobToCache(net::URLRequestContext* request_context, |
70 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | 69 scoped_ptr<storage::BlobDataHandle> blob_data_handle, |
71 const EntryBoolCallback& callback) { | 70 const BoolCallback& callback) { |
72 callback_ = callback; | 71 callback_ = callback; |
73 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest( | 72 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest( |
74 blob_data_handle.Pass(), request_context, this); | 73 blob_data_handle.Pass(), request_context, this); |
75 blob_request_->Start(); | 74 blob_request_->Start(); |
76 } | 75 } |
77 | 76 |
78 // net::URLRequest::Delegate overrides for reading blobs. | 77 // net::URLRequest::Delegate overrides for reading blobs. |
79 virtual void OnReceivedRedirect(net::URLRequest* request, | 78 virtual void OnReceivedRedirect(net::URLRequest* request, |
80 const net::RedirectInfo& redirect_info, | 79 const net::RedirectInfo& redirect_info, |
81 bool* defer_redirect) OVERRIDE { | 80 bool* defer_redirect) OVERRIDE { |
(...skipping 13 matching lines...) Expand all Loading... | |
95 bool fatal) OVERRIDE { | 94 bool fatal) OVERRIDE { |
96 NOTREACHED(); | 95 NOTREACHED(); |
97 } | 96 } |
98 virtual void OnBeforeNetworkStart(net::URLRequest* request, | 97 virtual void OnBeforeNetworkStart(net::URLRequest* request, |
99 bool* defer) OVERRIDE { | 98 bool* defer) OVERRIDE { |
100 NOTREACHED(); | 99 NOTREACHED(); |
101 } | 100 } |
102 | 101 |
103 virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE { | 102 virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE { |
104 if (!request->status().is_success()) { | 103 if (!request->status().is_success()) { |
105 callback_.Run(entry_.Pass(), false); | 104 callback_.Run(false); |
106 return; | 105 return; |
107 } | 106 } |
108 ReadFromBlob(); | 107 ReadFromBlob(); |
109 } | 108 } |
110 | 109 |
111 virtual void ReadFromBlob() { | 110 virtual void ReadFromBlob() { |
112 int bytes_read = 0; | 111 int bytes_read = 0; |
113 bool done = | 112 bool done = |
114 blob_request_->Read(buffer_.get(), buffer_->size(), &bytes_read); | 113 blob_request_->Read(buffer_.get(), buffer_->size(), &bytes_read); |
115 if (done) | 114 if (done) |
116 OnReadCompleted(blob_request_.get(), bytes_read); | 115 OnReadCompleted(blob_request_.get(), bytes_read); |
117 } | 116 } |
118 | 117 |
119 virtual void OnReadCompleted(net::URLRequest* request, | 118 virtual void OnReadCompleted(net::URLRequest* request, |
120 int bytes_read) OVERRIDE { | 119 int bytes_read) OVERRIDE { |
121 if (!request->status().is_success()) { | 120 if (!request->status().is_success()) { |
122 callback_.Run(entry_.Pass(), false); | 121 callback_.Run(false); |
123 return; | 122 return; |
124 } | 123 } |
125 | 124 |
126 if (bytes_read == 0) { | 125 if (bytes_read == 0) { |
127 callback_.Run(entry_.Pass(), true); | 126 callback_.Run(true); |
128 return; | 127 return; |
129 } | 128 } |
130 | 129 |
131 net::CompletionCallback cache_write_callback = | 130 net::CompletionCallback cache_write_callback = |
132 base::Bind(&BlobReader::DidWriteDataToEntry, | 131 base::Bind(&BlobReader::DidWriteDataToEntry, |
133 weak_ptr_factory_.GetWeakPtr(), | 132 weak_ptr_factory_.GetWeakPtr(), |
134 bytes_read); | 133 bytes_read); |
135 | 134 |
136 int rv = entry_->WriteData(INDEX_RESPONSE_BODY, | 135 int rv = entry_->WriteData(INDEX_RESPONSE_BODY, |
137 cache_entry_offset_, | 136 cache_entry_offset_, |
138 buffer_.get(), | 137 buffer_.get(), |
139 bytes_read, | 138 bytes_read, |
140 cache_write_callback, | 139 cache_write_callback, |
141 true /* truncate */); | 140 true /* truncate */); |
142 if (rv != net::ERR_IO_PENDING) | 141 if (rv != net::ERR_IO_PENDING) |
143 cache_write_callback.Run(rv); | 142 cache_write_callback.Run(rv); |
144 } | 143 } |
145 | 144 |
146 void DidWriteDataToEntry(int expected_bytes, int rv) { | 145 void DidWriteDataToEntry(int expected_bytes, int rv) { |
147 if (rv != expected_bytes) { | 146 if (rv != expected_bytes) { |
148 callback_.Run(entry_.Pass(), false); | 147 callback_.Run(false); |
149 return; | 148 return; |
150 } | 149 } |
151 | 150 |
152 cache_entry_offset_ += rv; | 151 cache_entry_offset_ += rv; |
153 ReadFromBlob(); | 152 ReadFromBlob(); |
154 } | 153 } |
155 | 154 |
156 private: | 155 private: |
157 int cache_entry_offset_; | 156 int cache_entry_offset_; |
158 disk_cache::ScopedEntryPtr entry_; | 157 disk_cache::ScopedEntryPtr entry_; |
159 scoped_ptr<net::URLRequest> blob_request_; | 158 scoped_ptr<net::URLRequest> blob_request_; |
160 EntryBoolCallback callback_; | 159 BoolCallback callback_; |
161 scoped_refptr<net::IOBufferWithSize> buffer_; | 160 scoped_refptr<net::IOBufferWithSize> buffer_; |
162 base::WeakPtrFactory<BlobReader> weak_ptr_factory_; | 161 base::WeakPtrFactory<BlobReader> weak_ptr_factory_; |
163 }; | 162 }; |
164 | 163 |
164 // The state needed to pass between ServiceWorkerCache::Put callbacks. | |
165 struct PutContext { | |
166 PutContext(scoped_ptr<ServiceWorkerFetchRequest> request, | |
167 scoped_ptr<ServiceWorkerResponse> response, | |
168 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | |
169 const ServiceWorkerCache::ErrorCallback& callback, | |
170 net::URLRequestContext* request_context) | |
171 : request(request.Pass()), | |
172 response(response.Pass()), | |
173 blob_data_handle(blob_data_handle.Pass()), | |
174 callback(callback), | |
175 request_context(request_context), | |
176 cache_entry(NULL) {} | |
177 ~PutContext() { | |
178 if (cache_entry) | |
179 cache_entry->Close(); | |
180 } | |
181 | |
182 // Input parameters to the Put function. | |
183 scoped_ptr<ServiceWorkerFetchRequest> request; | |
184 scoped_ptr<ServiceWorkerResponse> response; | |
185 scoped_ptr<storage::BlobDataHandle> blob_data_handle; | |
186 ServiceWorkerCache::ErrorCallback callback; | |
187 | |
188 net::URLRequestContext* request_context; | |
189 disk_cache::Entry* cache_entry; | |
horo
2014/09/26 02:15:02
Why don't you use ScopedEntryPtr?
jkarlin
2014/09/26 11:15:02
Because the asynchronous disk_cache API wants an E
horo
2014/09/29 03:13:24
Ah, I got it.
| |
190 | |
191 DISALLOW_COPY_AND_ASSIGN(PutContext); | |
192 }; | |
193 | |
165 // Put callbacks | 194 // Put callbacks |
166 void PutDidCreateEntry(scoped_ptr<ServiceWorkerFetchRequest> request, | 195 void PutDidCreateEntry(scoped_ptr<PutContext> put_context, int rv); |
167 scoped_ptr<ServiceWorkerResponse> response, | 196 void PutDidWriteHeaders(scoped_ptr<PutContext> put_context, |
168 const ServiceWorkerCache::ErrorCallback& callback, | |
169 scoped_ptr<disk_cache::Entry*> entryptr, | |
170 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | |
171 net::URLRequestContext* request_context, | |
172 int rv); | |
173 void PutDidWriteHeaders(scoped_ptr<ServiceWorkerResponse> response, | |
174 const ServiceWorkerCache::ErrorCallback& callback, | |
175 disk_cache::ScopedEntryPtr entry, | |
176 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | |
177 net::URLRequestContext* request_context, | |
178 int expected_bytes, | 197 int expected_bytes, |
179 int rv); | 198 int rv); |
180 void PutDidWriteBlobToCache(const ServiceWorkerCache::ErrorCallback& callback, | 199 void PutDidWriteBlobToCache(scoped_ptr<PutContext> put_context, |
181 scoped_ptr<BlobReader> blob_reader, | 200 scoped_ptr<BlobReader> blob_reader, |
182 disk_cache::ScopedEntryPtr entry, | |
183 bool success); | 201 bool success); |
184 | 202 |
185 // Match callbacks | 203 // Match callbacks |
186 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, | 204 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, |
187 const ServiceWorkerCache::ResponseCallback& callback, | 205 const ServiceWorkerCache::ResponseCallback& callback, |
188 base::WeakPtr<storage::BlobStorageContext> blob_storage, | 206 base::WeakPtr<storage::BlobStorageContext> blob_storage, |
189 scoped_ptr<disk_cache::Entry*> entryptr, | 207 scoped_ptr<disk_cache::Entry*> entryptr, |
190 int rv); | 208 int rv); |
191 void MatchDidReadHeaderData( | 209 void MatchDidReadHeaderData( |
192 scoped_ptr<ServiceWorkerFetchRequest> request, | 210 scoped_ptr<ServiceWorkerFetchRequest> request, |
(...skipping 29 matching lines...) Expand all Loading... | |
222 const HeadersCallback& callback, | 240 const HeadersCallback& callback, |
223 const scoped_refptr<net::IOBufferWithSize>& buffer, | 241 const scoped_refptr<net::IOBufferWithSize>& buffer, |
224 int rv); | 242 int rv); |
225 | 243 |
226 // CreateBackend callbacks | 244 // CreateBackend callbacks |
227 void CreateBackendDidCreate(const ServiceWorkerCache::ErrorCallback& callback, | 245 void CreateBackendDidCreate(const ServiceWorkerCache::ErrorCallback& callback, |
228 scoped_ptr<ScopedBackendPtr> backend_ptr, | 246 scoped_ptr<ScopedBackendPtr> backend_ptr, |
229 base::WeakPtr<ServiceWorkerCache> cache, | 247 base::WeakPtr<ServiceWorkerCache> cache, |
230 int rv); | 248 int rv); |
231 | 249 |
232 void PutDidCreateEntry(scoped_ptr<ServiceWorkerFetchRequest> request, | 250 void PutDidCreateEntry(scoped_ptr<PutContext> put_context, int rv) { |
233 scoped_ptr<ServiceWorkerResponse> response, | |
234 const ServiceWorkerCache::ErrorCallback& callback, | |
235 scoped_ptr<disk_cache::Entry*> entryptr, | |
236 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | |
237 net::URLRequestContext* request_context, | |
238 int rv) { | |
239 if (rv != net::OK) { | 251 if (rv != net::OK) { |
240 callback.Run(ServiceWorkerCache::ErrorTypeExists); | 252 put_context->callback.Run(ServiceWorkerCache::ErrorTypeExists); |
241 return; | 253 return; |
242 } | 254 } |
243 | 255 |
244 DCHECK(entryptr); | 256 DCHECK(put_context->cache_entry); |
245 disk_cache::ScopedEntryPtr entry(*entryptr); | |
246 | 257 |
247 ServiceWorkerRequestResponseHeaders headers; | 258 ServiceWorkerRequestResponseHeaders headers; |
248 headers.set_method(request->method); | 259 headers.set_method(put_context->request->method); |
249 | 260 |
250 headers.set_status_code(response->status_code); | 261 headers.set_status_code(put_context->response->status_code); |
251 headers.set_status_text(response->status_text); | 262 headers.set_status_text(put_context->response->status_text); |
252 for (ServiceWorkerHeaderMap::const_iterator it = request->headers.begin(); | 263 for (ServiceWorkerHeaderMap::const_iterator it = |
253 it != request->headers.end(); | 264 put_context->request->headers.begin(); |
265 it != put_context->request->headers.end(); | |
254 ++it) { | 266 ++it) { |
255 ServiceWorkerRequestResponseHeaders::HeaderMap* header_map = | 267 ServiceWorkerRequestResponseHeaders::HeaderMap* header_map = |
256 headers.add_request_headers(); | 268 headers.add_request_headers(); |
257 header_map->set_name(it->first); | 269 header_map->set_name(it->first); |
258 header_map->set_value(it->second); | 270 header_map->set_value(it->second); |
259 } | 271 } |
260 | 272 |
261 for (ServiceWorkerHeaderMap::const_iterator it = response->headers.begin(); | 273 for (ServiceWorkerHeaderMap::const_iterator it = |
262 it != response->headers.end(); | 274 put_context->response->headers.begin(); |
275 it != put_context->response->headers.end(); | |
263 ++it) { | 276 ++it) { |
264 ServiceWorkerRequestResponseHeaders::HeaderMap* header_map = | 277 ServiceWorkerRequestResponseHeaders::HeaderMap* header_map = |
265 headers.add_response_headers(); | 278 headers.add_response_headers(); |
266 header_map->set_name(it->first); | 279 header_map->set_name(it->first); |
267 header_map->set_value(it->second); | 280 header_map->set_value(it->second); |
268 } | 281 } |
269 | 282 |
270 scoped_ptr<std::string> serialized(new std::string()); | 283 scoped_ptr<std::string> serialized(new std::string()); |
271 if (!headers.SerializeToString(serialized.get())) { | 284 if (!headers.SerializeToString(serialized.get())) { |
272 callback.Run(ServiceWorkerCache::ErrorTypeStorage); | 285 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage); |
273 return; | 286 return; |
274 } | 287 } |
275 | 288 |
276 scoped_refptr<net::StringIOBuffer> buffer( | 289 scoped_refptr<net::StringIOBuffer> buffer( |
277 new net::StringIOBuffer(serialized.Pass())); | 290 new net::StringIOBuffer(serialized.Pass())); |
278 | 291 |
279 // Get a temporary copy of the entry pointer before passing it in base::Bind. | 292 // Get a temporary copy of the entry pointer before passing it in base::Bind. |
280 disk_cache::Entry* tmp_entry_ptr = entry.get(); | 293 disk_cache::Entry* tmp_entry_ptr = put_context->cache_entry; |
281 | 294 |
282 net::CompletionCallback write_headers_callback = | 295 net::CompletionCallback write_headers_callback = base::Bind( |
283 base::Bind(PutDidWriteHeaders, | 296 PutDidWriteHeaders, base::Passed(put_context.Pass()), buffer->size()); |
284 base::Passed(response.Pass()), | |
285 callback, | |
286 base::Passed(entry.Pass()), | |
287 base::Passed(blob_data_handle.Pass()), | |
288 request_context, | |
289 buffer->size()); | |
290 | 297 |
291 rv = tmp_entry_ptr->WriteData(INDEX_HEADERS, | 298 rv = tmp_entry_ptr->WriteData(INDEX_HEADERS, |
292 0 /* offset */, | 299 0 /* offset */, |
293 buffer.get(), | 300 buffer.get(), |
294 buffer->size(), | 301 buffer->size(), |
295 write_headers_callback, | 302 write_headers_callback, |
296 true /* truncate */); | 303 true /* truncate */); |
297 | 304 |
298 if (rv != net::ERR_IO_PENDING) | 305 if (rv != net::ERR_IO_PENDING) |
299 write_headers_callback.Run(rv); | 306 write_headers_callback.Run(rv); |
300 } | 307 } |
301 | 308 |
302 void PutDidWriteHeaders(scoped_ptr<ServiceWorkerResponse> response, | 309 void PutDidWriteHeaders(scoped_ptr<PutContext> put_context, |
303 const ServiceWorkerCache::ErrorCallback& callback, | |
304 disk_cache::ScopedEntryPtr entry, | |
305 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | |
306 net::URLRequestContext* request_context, | |
307 int expected_bytes, | 310 int expected_bytes, |
308 int rv) { | 311 int rv) { |
309 if (rv != expected_bytes) { | 312 if (rv != expected_bytes) { |
310 entry->Doom(); | 313 put_context->cache_entry->Doom(); |
311 callback.Run(ServiceWorkerCache::ErrorTypeStorage); | 314 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage); |
312 return; | 315 return; |
313 } | 316 } |
314 | 317 |
315 // The metadata is written, now for the response content. The data is streamed | 318 // The metadata is written, now for the response content. The data is streamed |
316 // from the blob into the cache entry. | 319 // from the blob into the cache entry. |
317 | 320 |
318 if (response->blob_uuid.empty()) { | 321 if (put_context->response->blob_uuid.empty()) { |
319 callback.Run(ServiceWorkerCache::ErrorTypeOK); | 322 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK); |
320 return; | 323 return; |
321 } | 324 } |
322 | 325 |
323 DCHECK(blob_data_handle); | 326 DCHECK(put_context->blob_data_handle); |
324 | 327 |
328 disk_cache::ScopedEntryPtr entry(put_context->cache_entry); | |
329 put_context->cache_entry = NULL; | |
325 scoped_ptr<BlobReader> reader(new BlobReader(entry.Pass())); | 330 scoped_ptr<BlobReader> reader(new BlobReader(entry.Pass())); |
331 | |
326 BlobReader* reader_ptr = reader.get(); | 332 BlobReader* reader_ptr = reader.get(); |
327 | 333 |
328 reader_ptr->StreamBlobToCache( | 334 // Grab some pointers before passing put_context in Bind. |
329 request_context, | 335 net::URLRequestContext* request_context = put_context->request_context; |
330 blob_data_handle.Pass(), | 336 scoped_ptr<storage::BlobDataHandle> blob_data_handle = |
331 base::Bind( | 337 put_context->blob_data_handle.Pass(); |
332 PutDidWriteBlobToCache, callback, base::Passed(reader.Pass()))); | 338 |
339 reader_ptr->StreamBlobToCache(request_context, | |
340 blob_data_handle.Pass(), | |
341 base::Bind(PutDidWriteBlobToCache, | |
342 base::Passed(put_context.Pass()), | |
343 base::Passed(reader.Pass()))); | |
333 } | 344 } |
334 | 345 |
335 void PutDidWriteBlobToCache(const ServiceWorkerCache::ErrorCallback& callback, | 346 void PutDidWriteBlobToCache(scoped_ptr<PutContext> put_context, |
336 scoped_ptr<BlobReader> blob_reader, | 347 scoped_ptr<BlobReader> blob_reader, |
337 disk_cache::ScopedEntryPtr entry, | |
338 bool success) { | 348 bool success) { |
339 if (!success) { | 349 if (!success) { |
340 entry->Doom(); | 350 put_context->cache_entry->Doom(); |
341 callback.Run(ServiceWorkerCache::ErrorTypeStorage); | 351 put_context->callback.Run(ServiceWorkerCache::ErrorTypeStorage); |
342 return; | 352 return; |
343 } | 353 } |
344 | 354 |
345 callback.Run(ServiceWorkerCache::ErrorTypeOK); | 355 put_context->callback.Run(ServiceWorkerCache::ErrorTypeOK); |
346 } | 356 } |
347 | 357 |
348 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, | 358 void MatchDidOpenEntry(scoped_ptr<ServiceWorkerFetchRequest> request, |
349 const ServiceWorkerCache::ResponseCallback& callback, | 359 const ServiceWorkerCache::ResponseCallback& callback, |
350 base::WeakPtr<storage::BlobStorageContext> blob_storage, | 360 base::WeakPtr<storage::BlobStorageContext> blob_storage, |
351 scoped_ptr<disk_cache::Entry*> entryptr, | 361 scoped_ptr<disk_cache::Entry*> entryptr, |
352 int rv) { | 362 int rv) { |
353 if (rv != net::OK) { | 363 if (rv != net::OK) { |
354 callback.Run(ServiceWorkerCache::ErrorTypeNotFound, | 364 callback.Run(ServiceWorkerCache::ErrorTypeNotFound, |
355 scoped_ptr<ServiceWorkerResponse>(), | 365 scoped_ptr<ServiceWorkerResponse>(), |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
662 | 672 |
663 // The vector of open entries in the backend. | 673 // The vector of open entries in the backend. |
664 Entries entries; | 674 Entries entries; |
665 | 675 |
666 // The output of the Keys function. | 676 // The output of the Keys function. |
667 scoped_ptr<ServiceWorkerCache::Requests> out_keys; | 677 scoped_ptr<ServiceWorkerCache::Requests> out_keys; |
668 | 678 |
669 // Used for enumerating cache entries. | 679 // Used for enumerating cache entries. |
670 scoped_ptr<disk_cache::Backend::Iterator> backend_iterator; | 680 scoped_ptr<disk_cache::Backend::Iterator> backend_iterator; |
671 disk_cache::Entry* enumerated_entry; | 681 disk_cache::Entry* enumerated_entry; |
682 | |
683 DISALLOW_COPY_AND_ASSIGN(KeysContext); | |
672 }; | 684 }; |
673 | 685 |
674 // static | 686 // static |
675 scoped_refptr<ServiceWorkerCache> ServiceWorkerCache::CreateMemoryCache( | 687 scoped_refptr<ServiceWorkerCache> ServiceWorkerCache::CreateMemoryCache( |
676 net::URLRequestContext* request_context, | 688 net::URLRequestContext* request_context, |
677 base::WeakPtr<storage::BlobStorageContext> blob_context) { | 689 base::WeakPtr<storage::BlobStorageContext> blob_context) { |
678 return make_scoped_refptr( | 690 return make_scoped_refptr( |
679 new ServiceWorkerCache(base::FilePath(), request_context, blob_context)); | 691 new ServiceWorkerCache(base::FilePath(), request_context, blob_context)); |
680 } | 692 } |
681 | 693 |
(...skipping 10 matching lines...) Expand all Loading... | |
692 } | 704 } |
693 | 705 |
694 base::WeakPtr<ServiceWorkerCache> ServiceWorkerCache::AsWeakPtr() { | 706 base::WeakPtr<ServiceWorkerCache> ServiceWorkerCache::AsWeakPtr() { |
695 return weak_ptr_factory_.GetWeakPtr(); | 707 return weak_ptr_factory_.GetWeakPtr(); |
696 } | 708 } |
697 | 709 |
698 void ServiceWorkerCache::Put(scoped_ptr<ServiceWorkerFetchRequest> request, | 710 void ServiceWorkerCache::Put(scoped_ptr<ServiceWorkerFetchRequest> request, |
699 scoped_ptr<ServiceWorkerResponse> response, | 711 scoped_ptr<ServiceWorkerResponse> response, |
700 const ErrorCallback& callback) { | 712 const ErrorCallback& callback) { |
701 scoped_ptr<storage::BlobDataHandle> blob_data_handle; | 713 scoped_ptr<storage::BlobDataHandle> blob_data_handle; |
702 | |
703 if (!response->blob_uuid.empty()) { | 714 if (!response->blob_uuid.empty()) { |
704 if (!blob_storage_context_) { | 715 if (!blob_storage_context_) { |
705 callback.Run(ErrorTypeStorage); | 716 callback.Run(ErrorTypeStorage); |
706 return; | 717 return; |
707 } | 718 } |
708 blob_data_handle = | 719 blob_data_handle = |
709 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid); | 720 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid); |
710 if (!blob_data_handle) { | 721 if (!blob_data_handle) { |
711 callback.Run(ErrorTypeStorage); | 722 callback.Run(ErrorTypeStorage); |
712 return; | 723 return; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
850 void ServiceWorkerCache::PutImpl( | 861 void ServiceWorkerCache::PutImpl( |
851 scoped_ptr<ServiceWorkerFetchRequest> request, | 862 scoped_ptr<ServiceWorkerFetchRequest> request, |
852 scoped_ptr<ServiceWorkerResponse> response, | 863 scoped_ptr<ServiceWorkerResponse> response, |
853 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | 864 scoped_ptr<storage::BlobDataHandle> blob_data_handle, |
854 const ErrorCallback& callback) { | 865 const ErrorCallback& callback) { |
855 if (!backend_) { | 866 if (!backend_) { |
856 callback.Run(ErrorTypeStorage); | 867 callback.Run(ErrorTypeStorage); |
857 return; | 868 return; |
858 } | 869 } |
859 | 870 |
860 scoped_ptr<disk_cache::Entry*> entry(new disk_cache::Entry*); | 871 scoped_ptr<PutContext> put_context(new PutContext(request.Pass(), |
872 response.Pass(), | |
873 blob_data_handle.Pass(), | |
874 callback, | |
875 request_context_)); | |
861 | 876 |
862 disk_cache::Entry** entry_ptr = entry.get(); | 877 disk_cache::Entry** entry_ptr = &put_context->cache_entry; |
863 | 878 ServiceWorkerFetchRequest* request_ptr = put_context->request.get(); |
864 ServiceWorkerFetchRequest* request_ptr = request.get(); | |
865 | 879 |
866 net::CompletionCallback create_entry_callback = | 880 net::CompletionCallback create_entry_callback = |
867 base::Bind(PutDidCreateEntry, | 881 base::Bind(PutDidCreateEntry, base::Passed(put_context.Pass())); |
868 base::Passed(request.Pass()), | |
869 base::Passed(response.Pass()), | |
870 callback, | |
871 base::Passed(entry.Pass()), | |
872 base::Passed(blob_data_handle.Pass()), | |
873 request_context_); | |
874 | 882 |
875 int rv = backend_->CreateEntry( | 883 int rv = backend_->CreateEntry( |
876 request_ptr->url.spec(), entry_ptr, create_entry_callback); | 884 request_ptr->url.spec(), entry_ptr, create_entry_callback); |
877 | 885 |
878 if (rv != net::ERR_IO_PENDING) | 886 if (rv != net::ERR_IO_PENDING) |
879 create_entry_callback.Run(rv); | 887 create_entry_callback.Run(rv); |
880 } | 888 } |
881 | 889 |
882 // static | 890 // static |
883 void ServiceWorkerCache::KeysDidOpenNextEntry( | 891 void ServiceWorkerCache::KeysDidOpenNextEntry( |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1016 initialized_ = true; | 1024 initialized_ = true; |
1017 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); | 1025 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); |
1018 it != init_callbacks_.end(); | 1026 it != init_callbacks_.end(); |
1019 ++it) { | 1027 ++it) { |
1020 it->Run(); | 1028 it->Run(); |
1021 } | 1029 } |
1022 init_callbacks_.clear(); | 1030 init_callbacks_.clear(); |
1023 } | 1031 } |
1024 | 1032 |
1025 } // namespace content | 1033 } // namespace content |
OLD | NEW |