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" |
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 "third_party/WebKit/public/platform/WebServiceWorkerResponseType.h" |
22 | 23 |
23 namespace content { | 24 namespace content { |
24 | 25 |
25 namespace { | 26 namespace { |
26 | 27 |
27 typedef scoped_ptr<disk_cache::Backend> ScopedBackendPtr; | 28 typedef scoped_ptr<disk_cache::Backend> ScopedBackendPtr; |
28 typedef base::Callback<void(bool)> BoolCallback; | 29 typedef base::Callback<void(bool)> BoolCallback; |
29 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)> | 30 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)> |
30 EntryBoolCallback; | 31 EntryBoolCallback; |
31 typedef base::Callback<void(scoped_ptr<ServiceWorkerRequestResponseHeaders>)> | 32 typedef base::Callback<void(scoped_ptr<ServiceWorkerRequestResponseHeaders>)> |
32 HeadersCallback; | 33 HeadersCallback; |
33 | 34 |
34 enum EntryIndex { INDEX_HEADERS = 0, INDEX_RESPONSE_BODY }; | 35 enum EntryIndex { INDEX_HEADERS = 0, INDEX_RESPONSE_BODY }; |
35 | 36 |
36 // The maximum size of an individual cache. Ultimately cache size is controlled | 37 // The maximum size of an individual cache. Ultimately cache size is controlled |
37 // per-origin. | 38 // per-origin. |
38 const int kMaxCacheBytes = 512 * 1024 * 1024; | 39 const int kMaxCacheBytes = 512 * 1024 * 1024; |
39 | 40 |
40 // Buffer size for cache and blob reading/writing. | 41 // Buffer size for cache and blob reading/writing. |
41 const int kBufferSize = 1024 * 512; | 42 const int kBufferSize = 1024 * 512; |
42 | 43 |
| 44 blink::WebServiceWorkerResponseType ProtoResponseTypeToWebResponseType( |
| 45 ServiceWorkerRequestResponseHeaders_ResponseType response_type) { |
| 46 switch (response_type) { |
| 47 case ServiceWorkerRequestResponseHeaders_ResponseType_BASIC_TYPE: |
| 48 return blink::WebServiceWorkerResponseTypeBasic; |
| 49 case ServiceWorkerRequestResponseHeaders_ResponseType_CORS_TYPE: |
| 50 return blink::WebServiceWorkerResponseTypeCORS; |
| 51 case ServiceWorkerRequestResponseHeaders_ResponseType_DEFAULT_TYPE: |
| 52 return blink::WebServiceWorkerResponseTypeDefault; |
| 53 case ServiceWorkerRequestResponseHeaders_ResponseType_ERROR_TYPE: |
| 54 return blink::WebServiceWorkerResponseTypeError; |
| 55 case ServiceWorkerRequestResponseHeaders_ResponseType_OPAQUE_TYPE: |
| 56 return blink::WebServiceWorkerResponseTypeOpaque; |
| 57 } |
| 58 NOTREACHED(); |
| 59 return blink::WebServiceWorkerResponseTypeOpaque; |
| 60 } |
| 61 |
| 62 ServiceWorkerRequestResponseHeaders_ResponseType |
| 63 WebResponseTypeToProtoResponseType( |
| 64 blink::WebServiceWorkerResponseType response_type) { |
| 65 switch (response_type) { |
| 66 case blink::WebServiceWorkerResponseTypeBasic: |
| 67 return ServiceWorkerRequestResponseHeaders_ResponseType_BASIC_TYPE; |
| 68 case blink::WebServiceWorkerResponseTypeCORS: |
| 69 return ServiceWorkerRequestResponseHeaders_ResponseType_CORS_TYPE; |
| 70 case blink::WebServiceWorkerResponseTypeDefault: |
| 71 return ServiceWorkerRequestResponseHeaders_ResponseType_DEFAULT_TYPE; |
| 72 case blink::WebServiceWorkerResponseTypeError: |
| 73 return ServiceWorkerRequestResponseHeaders_ResponseType_ERROR_TYPE; |
| 74 case blink::WebServiceWorkerResponseTypeOpaque: |
| 75 return ServiceWorkerRequestResponseHeaders_ResponseType_OPAQUE_TYPE; |
| 76 } |
| 77 NOTREACHED(); |
| 78 return ServiceWorkerRequestResponseHeaders_ResponseType_OPAQUE_TYPE; |
| 79 } |
| 80 |
43 struct ResponseReadContext { | 81 struct ResponseReadContext { |
44 ResponseReadContext(scoped_refptr<net::IOBufferWithSize> buff, | 82 ResponseReadContext(scoped_refptr<net::IOBufferWithSize> buff, |
45 scoped_refptr<storage::BlobData> blob) | 83 scoped_refptr<storage::BlobData> blob) |
46 : buffer(buff), blob_data(blob), total_bytes_read(0) {} | 84 : buffer(buff), blob_data(blob), total_bytes_read(0) {} |
47 | 85 |
48 scoped_refptr<net::IOBufferWithSize> buffer; | 86 scoped_refptr<net::IOBufferWithSize> buffer; |
49 scoped_refptr<storage::BlobData> blob_data; | 87 scoped_refptr<storage::BlobData> blob_data; |
50 int total_bytes_read; | 88 int total_bytes_read; |
51 | 89 |
52 DISALLOW_COPY_AND_ASSIGN(ResponseReadContext); | 90 DISALLOW_COPY_AND_ASSIGN(ResponseReadContext); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 put_context->callback.Run(ServiceWorkerCache::ErrorTypeExists, | 296 put_context->callback.Run(ServiceWorkerCache::ErrorTypeExists, |
259 scoped_ptr<ServiceWorkerResponse>(), | 297 scoped_ptr<ServiceWorkerResponse>(), |
260 scoped_ptr<storage::BlobDataHandle>()); | 298 scoped_ptr<storage::BlobDataHandle>()); |
261 return; | 299 return; |
262 } | 300 } |
263 | 301 |
264 DCHECK(put_context->cache_entry); | 302 DCHECK(put_context->cache_entry); |
265 | 303 |
266 ServiceWorkerRequestResponseHeaders headers; | 304 ServiceWorkerRequestResponseHeaders headers; |
267 headers.set_method(put_context->request->method); | 305 headers.set_method(put_context->request->method); |
268 | |
269 headers.set_status_code(put_context->response->status_code); | 306 headers.set_status_code(put_context->response->status_code); |
270 headers.set_status_text(put_context->response->status_text); | 307 headers.set_status_text(put_context->response->status_text); |
| 308 headers.set_response_type( |
| 309 WebResponseTypeToProtoResponseType(put_context->response->response_type)); |
271 for (ServiceWorkerHeaderMap::const_iterator it = | 310 for (ServiceWorkerHeaderMap::const_iterator it = |
272 put_context->request->headers.begin(); | 311 put_context->request->headers.begin(); |
273 it != put_context->request->headers.end(); | 312 it != put_context->request->headers.end(); |
274 ++it) { | 313 ++it) { |
275 ServiceWorkerRequestResponseHeaders::HeaderMap* header_map = | 314 ServiceWorkerRequestResponseHeaders::HeaderMap* header_map = |
276 headers.add_request_headers(); | 315 headers.add_request_headers(); |
277 header_map->set_name(it->first); | 316 header_map->set_name(it->first); |
278 header_map->set_value(it->second); | 317 header_map->set_value(it->second); |
279 } | 318 } |
280 | 319 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 base::WeakPtr<storage::BlobStorageContext> blob_storage, | 481 base::WeakPtr<storage::BlobStorageContext> blob_storage, |
443 disk_cache::ScopedEntryPtr entry, | 482 disk_cache::ScopedEntryPtr entry, |
444 scoped_ptr<ServiceWorkerRequestResponseHeaders> headers) { | 483 scoped_ptr<ServiceWorkerRequestResponseHeaders> headers) { |
445 if (!headers) { | 484 if (!headers) { |
446 callback.Run(ServiceWorkerCache::ErrorTypeStorage, | 485 callback.Run(ServiceWorkerCache::ErrorTypeStorage, |
447 scoped_ptr<ServiceWorkerResponse>(), | 486 scoped_ptr<ServiceWorkerResponse>(), |
448 scoped_ptr<storage::BlobDataHandle>()); | 487 scoped_ptr<storage::BlobDataHandle>()); |
449 return; | 488 return; |
450 } | 489 } |
451 | 490 |
452 scoped_ptr<ServiceWorkerResponse> response( | 491 scoped_ptr<ServiceWorkerResponse> response(new ServiceWorkerResponse( |
453 new ServiceWorkerResponse(request->url, | 492 request->url, |
454 headers->status_code(), | 493 headers->status_code(), |
455 headers->status_text(), | 494 headers->status_text(), |
456 ServiceWorkerHeaderMap(), | 495 ProtoResponseTypeToWebResponseType(headers->response_type()), |
457 "")); | 496 ServiceWorkerHeaderMap(), |
| 497 "")); |
458 | 498 |
459 for (int i = 0; i < headers->response_headers_size(); ++i) { | 499 for (int i = 0; i < headers->response_headers_size(); ++i) { |
460 const ServiceWorkerRequestResponseHeaders::HeaderMap header = | 500 const ServiceWorkerRequestResponseHeaders::HeaderMap header = |
461 headers->response_headers(i); | 501 headers->response_headers(i); |
462 response->headers.insert(std::make_pair(header.name(), header.value())); | 502 response->headers.insert(std::make_pair(header.name(), header.value())); |
463 } | 503 } |
464 | 504 |
465 ServiceWorkerHeaderMap cached_request_headers; | 505 ServiceWorkerHeaderMap cached_request_headers; |
466 for (int i = 0; i < headers->request_headers_size(); ++i) { | 506 for (int i = 0; i < headers->request_headers_size(); ++i) { |
467 const ServiceWorkerRequestResponseHeaders::HeaderMap header = | 507 const ServiceWorkerRequestResponseHeaders::HeaderMap header = |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1056 initialized_ = true; | 1096 initialized_ = true; |
1057 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); | 1097 for (std::vector<base::Closure>::iterator it = init_callbacks_.begin(); |
1058 it != init_callbacks_.end(); | 1098 it != init_callbacks_.end(); |
1059 ++it) { | 1099 ++it) { |
1060 it->Run(); | 1100 it->Run(); |
1061 } | 1101 } |
1062 init_callbacks_.clear(); | 1102 init_callbacks_.clear(); |
1063 } | 1103 } |
1064 | 1104 |
1065 } // namespace content | 1105 } // namespace content |
OLD | NEW |