| 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 |