| Index: content/browser/appcache/appcache_url_loader_job.cc
|
| diff --git a/content/browser/appcache/appcache_url_loader_job.cc b/content/browser/appcache/appcache_url_loader_job.cc
|
| index 09f15459e3bd1a54fd050e1c1669795c9991956b..4745fa6dad0c85603614b20021bbcc190199eef7 100644
|
| --- a/content/browser/appcache/appcache_url_loader_job.cc
|
| +++ b/content/browser/appcache/appcache_url_loader_job.cc
|
| @@ -3,7 +3,9 @@
|
| // found in the LICENSE file.
|
|
|
| #include "content/browser/appcache/appcache_url_loader_job.h"
|
| -#include "content/browser/appcache/appcache_entry.h"
|
| +#include "content/browser/appcache/appcache_histograms.h"
|
| +#include "content/public/common/resource_type.h"
|
| +#include "net/base/io_buffer.h"
|
|
|
| namespace content {
|
|
|
| @@ -12,42 +14,116 @@ AppCacheURLLoaderJob::~AppCacheURLLoaderJob() {}
|
| void AppCacheURLLoaderJob::Kill() {}
|
|
|
| bool AppCacheURLLoaderJob::IsStarted() const {
|
| - return false;
|
| + return delivery_type_ != AWAITING_DELIVERY_ORDERS;
|
| }
|
|
|
| -bool AppCacheURLLoaderJob::IsWaiting() const {
|
| - return false;
|
| -}
|
| +void AppCacheURLLoaderJob::DeliverAppCachedResponse(const GURL& manifest_url,
|
| + int64_t cache_id,
|
| + const AppCacheEntry& entry,
|
| + bool is_fallback) {
|
| + delivery_type_ = APPCACHED_DELIVERY;
|
|
|
| -bool AppCacheURLLoaderJob::IsDeliveringAppCacheResponse() const {
|
| - return false;
|
| -}
|
| + AppCacheHistograms::AddAppCacheJobStartDelaySample(base::TimeTicks::Now() -
|
| + start_time_tick_);
|
|
|
| -bool AppCacheURLLoaderJob::IsDeliveringNetworkResponse() const {
|
| - return false;
|
| -}
|
| + manifest_url_ = manifest_url;
|
| + cache_id_ = cache_id;
|
| + entry_ = entry;
|
| + is_fallback_ = is_fallback;
|
|
|
| -bool AppCacheURLLoaderJob::IsDeliveringErrorResponse() const {
|
| - return false;
|
| + storage_->LoadResponseInfo(manifest_url_, entry_.response_id(), this);
|
| }
|
|
|
| -bool AppCacheURLLoaderJob::IsCacheEntryNotFound() const {
|
| - return false;
|
| +void AppCacheURLLoaderJob::DeliverNetworkResponse() {
|
| + delivery_type_ = NETWORK_DELIVERY;
|
| +
|
| + AppCacheHistograms::AddNetworkJobStartDelaySample(base::TimeTicks::Now() -
|
| + start_time_tick_);
|
| +
|
| + if (delegate_)
|
| + delegate_->SendNetworkResponse();
|
| }
|
|
|
| -void AppCacheURLLoaderJob::DeliverAppCachedResponse(const GURL& manifest_url,
|
| - int64_t cache_id,
|
| - const AppCacheEntry& entry,
|
| - bool is_fallback) {}
|
| +void AppCacheURLLoaderJob::DeliverErrorResponse() {
|
| + delivery_type_ = ERROR_DELIVERY;
|
|
|
| -void AppCacheURLLoaderJob::DeliverNetworkResponse() {}
|
| + AppCacheHistograms::AddErrorJobStartDelaySample(base::TimeTicks::Now() -
|
| + start_time_tick_);
|
|
|
| -void AppCacheURLLoaderJob::DeliverErrorResponse() {}
|
| + if (delegate_)
|
| + delegate_->SendErrorResponse();
|
| +}
|
|
|
| const GURL& AppCacheURLLoaderJob::GetURL() const {
|
| - return url_;
|
| + return request_.url;
|
| }
|
|
|
| -AppCacheURLLoaderJob::AppCacheURLLoaderJob() {}
|
| +AppCacheURLLoaderJob* AppCacheURLLoaderJob::AsURLLoaderJob() {
|
| + return this;
|
| +}
|
| +
|
| +AppCacheURLLoaderJob::AppCacheURLLoaderJob(const ResourceRequest& request,
|
| + AppCacheStorage* storage)
|
| + : request_(request),
|
| + delegate_(nullptr),
|
| + storage_(storage),
|
| + start_time_tick_(base::TimeTicks::Now()),
|
| + cache_id_(kAppCacheNoCacheId),
|
| + is_fallback_(false),
|
| + buffer_(nullptr) {}
|
| +
|
| +void AppCacheURLLoaderJob::OnResponseInfoLoaded(
|
| + AppCacheResponseInfo* response_info,
|
| + int64_t response_id) {
|
| + DCHECK(IsDeliveringAppCacheResponse());
|
| +
|
| + if (response_info) {
|
| + info_ = response_info;
|
| + reader_.reset(
|
| + storage_->CreateResponseReader(manifest_url_, entry_.response_id()));
|
| +
|
| + // TODO(ananta)
|
| + // Handle range requests.
|
| +
|
| + buffer_ =
|
| + new net::IOBuffer(static_cast<size_t>(info_->response_data_size()));
|
| + reader_->ReadData(buffer_.get(), info_->response_data_size(),
|
| + base::Bind(&AppCacheURLLoaderJob::OnReadComplete,
|
| + base::Unretained(this)));
|
| + if (delegate_)
|
| + delegate_->HandleAppCacheResponseStart(response_info);
|
| + } else {
|
| + // Error case here. We fallback to the network.
|
| + DeliverNetworkResponse();
|
| + AppCacheHistograms::CountResponseRetrieval(
|
| + false, IsResourceTypeFrame(request_.resource_type),
|
| + manifest_url_.GetOrigin());
|
| +
|
| + cache_entry_not_found_ = true;
|
| + }
|
| +}
|
| +
|
| +void AppCacheURLLoaderJob::OnCacheLoaded(AppCache* cache, int64_t cache_id) {
|
| + NOTREACHED() << "Unhandled at the moment.";
|
| +}
|
| +
|
| +void AppCacheURLLoaderJob::OnReadComplete(int result) {
|
| + DLOG(WARNING) << "AppCache read completed with result: " << result;
|
| +
|
| + bool is_main_resource = IsResourceTypeFrame(request_.resource_type);
|
| +
|
| + if (result == 0) {
|
| + AppCacheHistograms::CountResponseRetrieval(true, is_main_resource,
|
| + manifest_url_.GetOrigin());
|
| + } else if (result < 0) {
|
| + // Error case here. We fallback to the network.
|
| + DeliverNetworkResponse();
|
| + AppCacheHistograms::CountResponseRetrieval(false, is_main_resource,
|
| + manifest_url_.GetOrigin());
|
| + return;
|
| + }
|
| + if (delegate_)
|
| + delegate_->HandleAppCacheData(buffer_.get(), result);
|
| +}
|
|
|
| } // namespace content
|
|
|