Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2109)

Unified Diff: webkit/browser/appcache/appcache_request_handler.cc

Issue 344493002: Move all remaining appcache-related code to content namespace (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/browser/appcache/appcache_request_handler.cc
diff --git a/webkit/browser/appcache/appcache_request_handler.cc b/webkit/browser/appcache/appcache_request_handler.cc
deleted file mode 100644
index 0777044a2dd1aebe408295010654064b1318dddc..0000000000000000000000000000000000000000
--- a/webkit/browser/appcache/appcache_request_handler.cc
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "webkit/browser/appcache/appcache_request_handler.h"
-
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_job.h"
-#include "webkit/browser/appcache/appcache.h"
-#include "webkit/browser/appcache/appcache_backend_impl.h"
-#include "webkit/browser/appcache/appcache_policy.h"
-#include "webkit/browser/appcache/appcache_url_request_job.h"
-
-namespace appcache {
-
-AppCacheRequestHandler::AppCacheRequestHandler(
- AppCacheHost* host, ResourceType::Type resource_type)
- : host_(host), resource_type_(resource_type),
- is_waiting_for_cache_selection_(false), found_group_id_(0),
- found_cache_id_(0), found_network_namespace_(false),
- cache_entry_not_found_(false), maybe_load_resource_executed_(false) {
- DCHECK(host_);
- host_->AddObserver(this);
-}
-
-AppCacheRequestHandler::~AppCacheRequestHandler() {
- if (host_) {
- storage()->CancelDelegateCallbacks(this);
- host_->RemoveObserver(this);
- }
-}
-
-AppCacheStorage* AppCacheRequestHandler::storage() const {
- DCHECK(host_);
- return host_->storage();
-}
-
-AppCacheURLRequestJob* AppCacheRequestHandler::MaybeLoadResource(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) {
- maybe_load_resource_executed_ = true;
- if (!host_ || !IsSchemeAndMethodSupported(request) || cache_entry_not_found_)
- return NULL;
-
- // This method can get called multiple times over the life
- // of a request. The case we detect here is having scheduled
- // delivery of a "network response" using a job setup on an
- // earlier call thru this method. To send the request thru
- // to the network involves restarting the request altogether,
- // which will call thru to our interception layer again.
- // This time thru, we return NULL so the request hits the wire.
- if (job_.get()) {
- DCHECK(job_->is_delivering_network_response() ||
- job_->cache_entry_not_found());
- if (job_->cache_entry_not_found())
- cache_entry_not_found_ = true;
- job_ = NULL;
- storage()->CancelDelegateCallbacks(this);
- return NULL;
- }
-
- // Clear out our 'found' fields since we're starting a request for a
- // new resource, any values in those fields are no longer valid.
- found_entry_ = AppCacheEntry();
- found_fallback_entry_ = AppCacheEntry();
- found_cache_id_ = kAppCacheNoCacheId;
- found_manifest_url_ = GURL();
- found_network_namespace_ = false;
-
- if (is_main_resource())
- MaybeLoadMainResource(request, network_delegate);
- else
- MaybeLoadSubResource(request, network_delegate);
-
- // If its been setup to deliver a network response, we can just delete
- // it now and return NULL instead to achieve that since it couldn't
- // have been started yet.
- if (job_.get() && job_->is_delivering_network_response()) {
- DCHECK(!job_->has_been_started());
- job_ = NULL;
- }
-
- return job_.get();
-}
-
-AppCacheURLRequestJob* AppCacheRequestHandler::MaybeLoadFallbackForRedirect(
- net::URLRequest* request,
- net::NetworkDelegate* network_delegate,
- const GURL& location) {
- if (!host_ || !IsSchemeAndMethodSupported(request) || cache_entry_not_found_)
- return NULL;
- if (is_main_resource())
- return NULL;
- // TODO(vabr) This is a temporary fix (see crbug/141114). We should get rid of
- // it once a more general solution to crbug/121325 is in place.
- if (!maybe_load_resource_executed_)
- return NULL;
- if (request->url().GetOrigin() == location.GetOrigin())
- return NULL;
-
- DCHECK(!job_.get()); // our jobs never generate redirects
-
- if (found_fallback_entry_.has_response_id()) {
- // 6.9.6, step 4: If this results in a redirect to another origin,
- // get the resource of the fallback entry.
- job_ = new AppCacheURLRequestJob(request, network_delegate,
- storage(), host_, is_main_resource());
- DeliverAppCachedResponse(
- found_fallback_entry_, found_cache_id_, found_group_id_,
- found_manifest_url_, true, found_namespace_entry_url_);
- } else if (!found_network_namespace_) {
- // 6.9.6, step 6: Fail the resource load.
- job_ = new AppCacheURLRequestJob(request, network_delegate,
- storage(), host_, is_main_resource());
- DeliverErrorResponse();
- } else {
- // 6.9.6 step 3 and 5: Fetch the resource normally.
- }
-
- return job_.get();
-}
-
-AppCacheURLRequestJob* AppCacheRequestHandler::MaybeLoadFallbackForResponse(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) {
- if (!host_ || !IsSchemeAndMethodSupported(request) || cache_entry_not_found_)
- return NULL;
- if (!found_fallback_entry_.has_response_id())
- return NULL;
-
- if (request->status().status() == net::URLRequestStatus::CANCELED) {
- // 6.9.6, step 4: But not if the user canceled the download.
- return NULL;
- }
-
- // We don't fallback for responses that we delivered.
- if (job_.get()) {
- DCHECK(!job_->is_delivering_network_response());
- return NULL;
- }
-
- if (request->status().is_success()) {
- int code_major = request->GetResponseCode() / 100;
- if (code_major !=4 && code_major != 5)
- return NULL;
-
- // Servers can override the fallback behavior with a response header.
- const std::string kFallbackOverrideHeader(
- "x-chromium-appcache-fallback-override");
- const std::string kFallbackOverrideValue(
- "disallow-fallback");
- std::string header_value;
- request->GetResponseHeaderByName(kFallbackOverrideHeader, &header_value);
- if (header_value == kFallbackOverrideValue)
- return NULL;
- }
-
- // 6.9.6, step 4: If this results in a 4xx or 5xx status code
- // or there were network errors, get the resource of the fallback entry.
- job_ = new AppCacheURLRequestJob(request, network_delegate,
- storage(), host_, is_main_resource());
- DeliverAppCachedResponse(
- found_fallback_entry_, found_cache_id_, found_group_id_,
- found_manifest_url_, true, found_namespace_entry_url_);
- return job_.get();
-}
-
-void AppCacheRequestHandler::GetExtraResponseInfo(
- int64* cache_id, GURL* manifest_url) {
- if (job_.get() && job_->is_delivering_appcache_response()) {
- *cache_id = job_->cache_id();
- *manifest_url = job_->manifest_url();
- }
-}
-
-void AppCacheRequestHandler::PrepareForCrossSiteTransfer(int old_process_id) {
- if (!host_)
- return;
- AppCacheBackendImpl* backend = host_->service()->GetBackend(old_process_id);
- host_for_cross_site_transfer_ = backend->TransferHostOut(host_->host_id());
- DCHECK_EQ(host_, host_for_cross_site_transfer_.get());
-}
-
-void AppCacheRequestHandler::CompleteCrossSiteTransfer(
- int new_process_id, int new_host_id) {
- if (!host_for_cross_site_transfer_.get())
- return;
- DCHECK_EQ(host_, host_for_cross_site_transfer_.get());
- AppCacheBackendImpl* backend = host_->service()->GetBackend(new_process_id);
- backend->TransferHostIn(new_host_id, host_for_cross_site_transfer_.Pass());
-}
-
-void AppCacheRequestHandler::OnDestructionImminent(AppCacheHost* host) {
- storage()->CancelDelegateCallbacks(this);
- host_ = NULL; // no need to RemoveObserver, the host is being deleted
-
- // Since the host is being deleted, we don't have to complete any job
- // that is current running. It's destined for the bit bucket anyway.
- if (job_.get()) {
- job_->Kill();
- job_ = NULL;
- }
-}
-
-void AppCacheRequestHandler::DeliverAppCachedResponse(
- const AppCacheEntry& entry, int64 cache_id, int64 group_id,
- const GURL& manifest_url, bool is_fallback,
- const GURL& namespace_entry_url) {
- DCHECK(host_ && job_.get() && job_->is_waiting());
- DCHECK(entry.has_response_id());
-
- if (ResourceType::IsFrame(resource_type_) && !namespace_entry_url.is_empty())
- host_->NotifyMainResourceIsNamespaceEntry(namespace_entry_url);
-
- job_->DeliverAppCachedResponse(manifest_url, group_id, cache_id,
- entry, is_fallback);
-}
-
-void AppCacheRequestHandler::DeliverErrorResponse() {
- DCHECK(job_.get() && job_->is_waiting());
- job_->DeliverErrorResponse();
-}
-
-void AppCacheRequestHandler::DeliverNetworkResponse() {
- DCHECK(job_.get() && job_->is_waiting());
- job_->DeliverNetworkResponse();
-}
-
-// Main-resource handling ----------------------------------------------
-
-void AppCacheRequestHandler::MaybeLoadMainResource(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) {
- DCHECK(!job_.get());
- DCHECK(host_);
-
- const AppCacheHost* spawning_host =
- ResourceType::IsSharedWorker(resource_type_) ?
- host_ : host_->GetSpawningHost();
- GURL preferred_manifest_url = spawning_host ?
- spawning_host->preferred_manifest_url() : GURL();
-
- // We may have to wait for our storage query to complete, but
- // this query can also complete syncrhonously.
- job_ = new AppCacheURLRequestJob(request, network_delegate,
- storage(), host_, is_main_resource());
- storage()->FindResponseForMainRequest(
- request->url(), preferred_manifest_url, this);
-}
-
-void AppCacheRequestHandler::OnMainResponseFound(
- const GURL& url, const AppCacheEntry& entry,
- const GURL& namespace_entry_url, const AppCacheEntry& fallback_entry,
- int64 cache_id, int64 group_id, const GURL& manifest_url) {
- DCHECK(job_.get());
- DCHECK(host_);
- DCHECK(is_main_resource());
- DCHECK(!entry.IsForeign());
- DCHECK(!fallback_entry.IsForeign());
- DCHECK(!(entry.has_response_id() && fallback_entry.has_response_id()));
-
- if (!job_.get())
- return;
-
- AppCachePolicy* policy = host_->service()->appcache_policy();
- bool was_blocked_by_policy = !manifest_url.is_empty() && policy &&
- !policy->CanLoadAppCache(manifest_url, host_->first_party_url());
-
- if (was_blocked_by_policy) {
- if (ResourceType::IsFrame(resource_type_)) {
- host_->NotifyMainResourceBlocked(manifest_url);
- } else {
- DCHECK(ResourceType::IsSharedWorker(resource_type_));
- host_->frontend()->OnContentBlocked(host_->host_id(), manifest_url);
- }
- DeliverNetworkResponse();
- return;
- }
-
- if (ResourceType::IsFrame(resource_type_) && cache_id != kAppCacheNoCacheId) {
- // AppCacheHost loads and holds a reference to the main resource cache
- // for two reasons, firstly to preload the cache into the working set
- // in advance of subresource loads happening, secondly to prevent the
- // AppCache from falling out of the working set on frame navigations.
- host_->LoadMainResourceCache(cache_id);
- host_->set_preferred_manifest_url(manifest_url);
- }
-
- // 6.11.1 Navigating across documents, steps 10 and 14.
-
- found_entry_ = entry;
- found_namespace_entry_url_ = namespace_entry_url;
- found_fallback_entry_ = fallback_entry;
- found_cache_id_ = cache_id;
- found_group_id_ = group_id;
- found_manifest_url_ = manifest_url;
- found_network_namespace_ = false; // not applicable to main requests
-
- if (found_entry_.has_response_id()) {
- DCHECK(!found_fallback_entry_.has_response_id());
- DeliverAppCachedResponse(
- found_entry_, found_cache_id_, found_group_id_, found_manifest_url_,
- false, found_namespace_entry_url_);
- } else {
- DeliverNetworkResponse();
- }
-}
-
-// Sub-resource handling ----------------------------------------------
-
-void AppCacheRequestHandler::MaybeLoadSubResource(
- net::URLRequest* request, net::NetworkDelegate* network_delegate) {
- DCHECK(!job_.get());
-
- if (host_->is_selection_pending()) {
- // We have to wait until cache selection is complete and the
- // selected cache is loaded.
- is_waiting_for_cache_selection_ = true;
- job_ = new AppCacheURLRequestJob(request, network_delegate,
- storage(), host_, is_main_resource());
- return;
- }
-
- if (!host_->associated_cache() ||
- !host_->associated_cache()->is_complete() ||
- host_->associated_cache()->owning_group()->is_being_deleted()) {
- return;
- }
-
- job_ = new AppCacheURLRequestJob(request, network_delegate,
- storage(), host_, is_main_resource());
- ContinueMaybeLoadSubResource();
-}
-
-void AppCacheRequestHandler::ContinueMaybeLoadSubResource() {
- // 6.9.6 Changes to the networking model
- // If the resource is not to be fetched using the HTTP GET mechanism or
- // equivalent ... then fetch the resource normally.
- DCHECK(job_.get());
- DCHECK(host_->associated_cache() && host_->associated_cache()->is_complete());
-
- const GURL& url = job_->request()->url();
- AppCache* cache = host_->associated_cache();
- storage()->FindResponseForSubRequest(
- host_->associated_cache(), url,
- &found_entry_, &found_fallback_entry_, &found_network_namespace_);
-
- if (found_entry_.has_response_id()) {
- // Step 2: If there's an entry, get it instead.
- DCHECK(!found_network_namespace_ &&
- !found_fallback_entry_.has_response_id());
- found_cache_id_ = cache->cache_id();
- found_group_id_ = cache->owning_group()->group_id();
- found_manifest_url_ = cache->owning_group()->manifest_url();
- DeliverAppCachedResponse(
- found_entry_, found_cache_id_, found_group_id_, found_manifest_url_,
- false, GURL());
- return;
- }
-
- if (found_fallback_entry_.has_response_id()) {
- // Step 4: Fetch the resource normally, if this results
- // in certain conditions, then use the fallback.
- DCHECK(!found_network_namespace_ &&
- !found_entry_.has_response_id());
- found_cache_id_ = cache->cache_id();
- found_manifest_url_ = cache->owning_group()->manifest_url();
- DeliverNetworkResponse();
- return;
- }
-
- if (found_network_namespace_) {
- // Step 3 and 5: Fetch the resource normally.
- DCHECK(!found_entry_.has_response_id() &&
- !found_fallback_entry_.has_response_id());
- DeliverNetworkResponse();
- return;
- }
-
- // Step 6: Fail the resource load.
- DeliverErrorResponse();
-}
-
-void AppCacheRequestHandler::OnCacheSelectionComplete(AppCacheHost* host) {
- DCHECK(host == host_);
- if (is_main_resource())
- return;
- if (!is_waiting_for_cache_selection_)
- return;
-
- is_waiting_for_cache_selection_ = false;
-
- if (!host_->associated_cache() ||
- !host_->associated_cache()->is_complete()) {
- DeliverNetworkResponse();
- return;
- }
-
- ContinueMaybeLoadSubResource();
-}
-
-} // namespace appcache

Powered by Google App Engine
This is Rietveld 408576698