| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "webkit/browser/appcache/appcache_url_request_job.h" | 5 #include "webkit/browser/appcache/appcache_url_request_job.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "webkit/browser/appcache/appcache_histograms.h" | 26 #include "webkit/browser/appcache/appcache_histograms.h" |
| 27 #include "webkit/browser/appcache/appcache_host.h" | 27 #include "webkit/browser/appcache/appcache_host.h" |
| 28 #include "webkit/browser/appcache/appcache_service.h" | 28 #include "webkit/browser/appcache/appcache_service.h" |
| 29 | 29 |
| 30 namespace appcache { | 30 namespace appcache { |
| 31 | 31 |
| 32 AppCacheURLRequestJob::AppCacheURLRequestJob( | 32 AppCacheURLRequestJob::AppCacheURLRequestJob( |
| 33 net::URLRequest* request, | 33 net::URLRequest* request, |
| 34 net::NetworkDelegate* network_delegate, | 34 net::NetworkDelegate* network_delegate, |
| 35 AppCacheStorage* storage, | 35 AppCacheStorage* storage, |
| 36 AppCacheHost* host) | 36 AppCacheHost* host, |
| 37 bool is_main_resource) |
| 37 : net::URLRequestJob(request, network_delegate), | 38 : net::URLRequestJob(request, network_delegate), |
| 38 host_(host), | 39 host_(host), |
| 39 storage_(storage), | 40 storage_(storage), |
| 40 has_been_started_(false), has_been_killed_(false), | 41 has_been_started_(false), has_been_killed_(false), |
| 41 delivery_type_(AWAITING_DELIVERY_ORDERS), | 42 delivery_type_(AWAITING_DELIVERY_ORDERS), |
| 42 group_id_(0), cache_id_(kNoCacheId), is_fallback_(false), | 43 group_id_(0), cache_id_(kNoCacheId), is_fallback_(false), |
| 44 is_main_resource_(is_main_resource), |
| 43 cache_entry_not_found_(false), | 45 cache_entry_not_found_(false), |
| 44 weak_factory_(this) { | 46 weak_factory_(this) { |
| 45 DCHECK(storage_); | 47 DCHECK(storage_); |
| 46 } | 48 } |
| 47 | 49 |
| 48 void AppCacheURLRequestJob::DeliverAppCachedResponse( | 50 void AppCacheURLRequestJob::DeliverAppCachedResponse( |
| 49 const GURL& manifest_url, int64 group_id, int64 cache_id, | 51 const GURL& manifest_url, int64 group_id, int64 cache_id, |
| 50 const AppCacheEntry& entry, bool is_fallback) { | 52 const AppCacheEntry& entry, bool is_fallback) { |
| 51 DCHECK(!has_delivery_orders()); | 53 DCHECK(!has_delivery_orders()); |
| 52 DCHECK(entry.has_response_id()); | 54 DCHECK(entry.has_response_id()); |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 NotifyHeadersComplete(); | 282 NotifyHeadersComplete(); |
| 281 } else { | 283 } else { |
| 282 if (storage_->service()->storage() == storage_) { | 284 if (storage_->service()->storage() == storage_) { |
| 283 // A resource that is expected to be in the appcache is missing. | 285 // A resource that is expected to be in the appcache is missing. |
| 284 // See http://code.google.com/p/chromium/issues/detail?id=50657 | 286 // See http://code.google.com/p/chromium/issues/detail?id=50657 |
| 285 // Instead of failing the request, we restart the request. The retry | 287 // Instead of failing the request, we restart the request. The retry |
| 286 // attempt will fallthru to the network instead of trying to load | 288 // attempt will fallthru to the network instead of trying to load |
| 287 // from the appcache. | 289 // from the appcache. |
| 288 storage_->service()->CheckAppCacheResponse(manifest_url_, cache_id_, | 290 storage_->service()->CheckAppCacheResponse(manifest_url_, cache_id_, |
| 289 entry_.response_id()); | 291 entry_.response_id()); |
| 292 AppCacheHistograms::CountResponseRetrieval( |
| 293 false, is_main_resource_, manifest_url_.GetOrigin()); |
| 290 } | 294 } |
| 291 cache_entry_not_found_ = true; | 295 cache_entry_not_found_ = true; |
| 292 NotifyRestartRequired(); | 296 NotifyRestartRequired(); |
| 293 } | 297 } |
| 294 } | 298 } |
| 295 | 299 |
| 296 const net::HttpResponseInfo* AppCacheURLRequestJob::http_info() const { | 300 const net::HttpResponseInfo* AppCacheURLRequestJob::http_info() const { |
| 297 if (!info_.get()) | 301 if (!info_.get()) |
| 298 return NULL; | 302 return NULL; |
| 299 if (range_response_info_) | 303 if (range_response_info_) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 324 new net::HttpResponseInfo(*info_->http_response_info())); | 328 new net::HttpResponseInfo(*info_->http_response_info())); |
| 325 net::HttpResponseHeaders* headers = range_response_info_->headers.get(); | 329 net::HttpResponseHeaders* headers = range_response_info_->headers.get(); |
| 326 headers->UpdateWithNewRange( | 330 headers->UpdateWithNewRange( |
| 327 range_requested_, resource_size, true /* replace status line */); | 331 range_requested_, resource_size, true /* replace status line */); |
| 328 } | 332 } |
| 329 | 333 |
| 330 void AppCacheURLRequestJob::OnReadComplete(int result) { | 334 void AppCacheURLRequestJob::OnReadComplete(int result) { |
| 331 DCHECK(is_delivering_appcache_response()); | 335 DCHECK(is_delivering_appcache_response()); |
| 332 if (result == 0) { | 336 if (result == 0) { |
| 333 NotifyDone(net::URLRequestStatus()); | 337 NotifyDone(net::URLRequestStatus()); |
| 338 AppCacheHistograms::CountResponseRetrieval( |
| 339 true, is_main_resource_, manifest_url_.GetOrigin()); |
| 334 } else if (result < 0) { | 340 } else if (result < 0) { |
| 335 if (storage_->service()->storage() == storage_) { | 341 if (storage_->service()->storage() == storage_) { |
| 336 storage_->service()->CheckAppCacheResponse(manifest_url_, cache_id_, | 342 storage_->service()->CheckAppCacheResponse(manifest_url_, cache_id_, |
| 337 entry_.response_id()); | 343 entry_.response_id()); |
| 338 } | 344 } |
| 339 NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); | 345 NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result)); |
| 346 AppCacheHistograms::CountResponseRetrieval( |
| 347 false, is_main_resource_, manifest_url_.GetOrigin()); |
| 340 } else { | 348 } else { |
| 341 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status | 349 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status |
| 342 } | 350 } |
| 343 NotifyReadComplete(result); | 351 NotifyReadComplete(result); |
| 344 } | 352 } |
| 345 | 353 |
| 346 // net::URLRequestJob overrides ------------------------------------------------ | 354 // net::URLRequestJob overrides ------------------------------------------------ |
| 347 | 355 |
| 348 void AppCacheURLRequestJob::Start() { | 356 void AppCacheURLRequestJob::Start() { |
| 349 DCHECK(!has_been_started()); | 357 DCHECK(!has_been_started()); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 return; | 439 return; |
| 432 } | 440 } |
| 433 | 441 |
| 434 // If multiple ranges are requested, we play dumb and | 442 // If multiple ranges are requested, we play dumb and |
| 435 // return the entire response with 200 OK. | 443 // return the entire response with 200 OK. |
| 436 if (ranges.size() == 1U) | 444 if (ranges.size() == 1U) |
| 437 range_requested_ = ranges[0]; | 445 range_requested_ = ranges[0]; |
| 438 } | 446 } |
| 439 | 447 |
| 440 } // namespace appcache | 448 } // namespace appcache |
| OLD | NEW |