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

Unified Diff: webkit/browser/appcache/appcache_host.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_host.cc
diff --git a/webkit/browser/appcache/appcache_host.cc b/webkit/browser/appcache/appcache_host.cc
deleted file mode 100644
index b656b06cfd34b09c14f47c69de5bcbaf717d5c93..0000000000000000000000000000000000000000
--- a/webkit/browser/appcache/appcache_host.cc
+++ /dev/null
@@ -1,546 +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_host.h"
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "net/url_request/url_request.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_request_handler.h"
-#include "webkit/browser/quota/quota_manager_proxy.h"
-
-namespace appcache {
-
-namespace {
-
-void FillCacheInfo(const AppCache* cache,
- const GURL& manifest_url,
- AppCacheStatus status, AppCacheInfo* info) {
- info->manifest_url = manifest_url;
- info->status = status;
-
- if (!cache)
- return;
-
- info->cache_id = cache->cache_id();
-
- if (!cache->is_complete())
- return;
-
- DCHECK(cache->owning_group());
- info->is_complete = true;
- info->group_id = cache->owning_group()->group_id();
- info->last_update_time = cache->update_time();
- info->creation_time = cache->owning_group()->creation_time();
- info->size = cache->cache_size();
-}
-
-} // Anonymous namespace
-
-AppCacheHost::AppCacheHost(int host_id, AppCacheFrontend* frontend,
- AppCacheServiceImpl* service)
- : host_id_(host_id),
- spawning_host_id_(kAppCacheNoHostId), spawning_process_id_(0),
- parent_host_id_(kAppCacheNoHostId), parent_process_id_(0),
- pending_main_resource_cache_id_(kAppCacheNoCacheId),
- pending_selected_cache_id_(kAppCacheNoCacheId),
- frontend_(frontend), service_(service),
- storage_(service->storage()),
- pending_callback_param_(NULL),
- main_resource_was_namespace_entry_(false),
- main_resource_blocked_(false),
- associated_cache_info_pending_(false) {
- service_->AddObserver(this);
-}
-
-AppCacheHost::~AppCacheHost() {
- service_->RemoveObserver(this);
- FOR_EACH_OBSERVER(Observer, observers_, OnDestructionImminent(this));
- if (associated_cache_.get())
- associated_cache_->UnassociateHost(this);
- if (group_being_updated_.get())
- group_being_updated_->RemoveUpdateObserver(this);
- storage()->CancelDelegateCallbacks(this);
- if (service()->quota_manager_proxy() && !origin_in_use_.is_empty())
- service()->quota_manager_proxy()->NotifyOriginNoLongerInUse(origin_in_use_);
-}
-
-void AppCacheHost::AddObserver(Observer* observer) {
- observers_.AddObserver(observer);
-}
-
-void AppCacheHost::RemoveObserver(Observer* observer) {
- observers_.RemoveObserver(observer);
-}
-
-void AppCacheHost::SelectCache(const GURL& document_url,
- const int64 cache_document_was_loaded_from,
- const GURL& manifest_url) {
- DCHECK(pending_start_update_callback_.is_null() &&
- pending_swap_cache_callback_.is_null() &&
- pending_get_status_callback_.is_null() &&
- !is_selection_pending());
-
- origin_in_use_ = document_url.GetOrigin();
- if (service()->quota_manager_proxy() && !origin_in_use_.is_empty())
- service()->quota_manager_proxy()->NotifyOriginInUse(origin_in_use_);
-
- if (main_resource_blocked_)
- frontend_->OnContentBlocked(host_id_,
- blocked_manifest_url_);
-
- // 6.9.6 The application cache selection algorithm.
- // The algorithm is started here and continues in FinishCacheSelection,
- // after cache or group loading is complete.
- // Note: Foreign entries are detected on the client side and
- // MarkAsForeignEntry is called in that case, so that detection
- // step is skipped here. See WebApplicationCacheHostImpl.cc
-
- if (cache_document_was_loaded_from != kAppCacheNoCacheId) {
- LoadSelectedCache(cache_document_was_loaded_from);
- return;
- }
-
- if (!manifest_url.is_empty() &&
- (manifest_url.GetOrigin() == document_url.GetOrigin())) {
- DCHECK(!first_party_url_.is_empty());
- AppCachePolicy* policy = service()->appcache_policy();
- if (policy &&
- !policy->CanCreateAppCache(manifest_url, first_party_url_)) {
- FinishCacheSelection(NULL, NULL);
- std::vector<int> host_ids(1, host_id_);
- frontend_->OnEventRaised(host_ids, APPCACHE_CHECKING_EVENT);
- frontend_->OnErrorEventRaised(
- host_ids,
- AppCacheErrorDetails(
- "Cache creation was blocked by the content policy",
- APPCACHE_POLICY_ERROR,
- GURL(),
- 0,
- false /*is_cross_origin*/));
- frontend_->OnContentBlocked(host_id_, manifest_url);
- return;
- }
-
- // Note: The client detects if the document was not loaded using HTTP GET
- // and invokes SelectCache without a manifest url, so that detection step
- // is also skipped here. See WebApplicationCacheHostImpl.cc
- set_preferred_manifest_url(manifest_url);
- new_master_entry_url_ = document_url;
- LoadOrCreateGroup(manifest_url);
- return;
- }
-
- // TODO(michaeln): If there was a manifest URL, the user agent may report
- // to the user that it was ignored, to aid in application development.
- FinishCacheSelection(NULL, NULL);
-}
-
-void AppCacheHost::SelectCacheForWorker(int parent_process_id,
- int parent_host_id) {
- DCHECK(pending_start_update_callback_.is_null() &&
- pending_swap_cache_callback_.is_null() &&
- pending_get_status_callback_.is_null() &&
- !is_selection_pending());
-
- parent_process_id_ = parent_process_id;
- parent_host_id_ = parent_host_id;
- FinishCacheSelection(NULL, NULL);
-}
-
-void AppCacheHost::SelectCacheForSharedWorker(int64 appcache_id) {
- DCHECK(pending_start_update_callback_.is_null() &&
- pending_swap_cache_callback_.is_null() &&
- pending_get_status_callback_.is_null() &&
- !is_selection_pending());
-
- if (appcache_id != kAppCacheNoCacheId) {
- LoadSelectedCache(appcache_id);
- return;
- }
- FinishCacheSelection(NULL, NULL);
-}
-
-// TODO(michaeln): change method name to MarkEntryAsForeign for consistency
-void AppCacheHost::MarkAsForeignEntry(const GURL& document_url,
- int64 cache_document_was_loaded_from) {
- // The document url is not the resource url in the fallback case.
- storage()->MarkEntryAsForeign(
- main_resource_was_namespace_entry_ ? namespace_entry_url_ : document_url,
- cache_document_was_loaded_from);
- SelectCache(document_url, kAppCacheNoCacheId, GURL());
-}
-
-void AppCacheHost::GetStatusWithCallback(const GetStatusCallback& callback,
- void* callback_param) {
- DCHECK(pending_start_update_callback_.is_null() &&
- pending_swap_cache_callback_.is_null() &&
- pending_get_status_callback_.is_null());
-
- pending_get_status_callback_ = callback;
- pending_callback_param_ = callback_param;
- if (is_selection_pending())
- return;
-
- DoPendingGetStatus();
-}
-
-void AppCacheHost::DoPendingGetStatus() {
- DCHECK_EQ(false, pending_get_status_callback_.is_null());
-
- pending_get_status_callback_.Run(GetStatus(), pending_callback_param_);
- pending_get_status_callback_.Reset();
- pending_callback_param_ = NULL;
-}
-
-void AppCacheHost::StartUpdateWithCallback(const StartUpdateCallback& callback,
- void* callback_param) {
- DCHECK(pending_start_update_callback_.is_null() &&
- pending_swap_cache_callback_.is_null() &&
- pending_get_status_callback_.is_null());
-
- pending_start_update_callback_ = callback;
- pending_callback_param_ = callback_param;
- if (is_selection_pending())
- return;
-
- DoPendingStartUpdate();
-}
-
-void AppCacheHost::DoPendingStartUpdate() {
- DCHECK_EQ(false, pending_start_update_callback_.is_null());
-
- // 6.9.8 Application cache API
- bool success = false;
- if (associated_cache_.get() && associated_cache_->owning_group()) {
- AppCacheGroup* group = associated_cache_->owning_group();
- if (!group->is_obsolete() && !group->is_being_deleted()) {
- success = true;
- group->StartUpdate();
- }
- }
-
- pending_start_update_callback_.Run(success, pending_callback_param_);
- pending_start_update_callback_.Reset();
- pending_callback_param_ = NULL;
-}
-
-void AppCacheHost::SwapCacheWithCallback(const SwapCacheCallback& callback,
- void* callback_param) {
- DCHECK(pending_start_update_callback_.is_null() &&
- pending_swap_cache_callback_.is_null() &&
- pending_get_status_callback_.is_null());
-
- pending_swap_cache_callback_ = callback;
- pending_callback_param_ = callback_param;
- if (is_selection_pending())
- return;
-
- DoPendingSwapCache();
-}
-
-void AppCacheHost::DoPendingSwapCache() {
- DCHECK_EQ(false, pending_swap_cache_callback_.is_null());
-
- // 6.9.8 Application cache API
- bool success = false;
- if (associated_cache_.get() && associated_cache_->owning_group()) {
- if (associated_cache_->owning_group()->is_obsolete()) {
- success = true;
- AssociateNoCache(GURL());
- } else if (swappable_cache_.get()) {
- DCHECK(swappable_cache_.get() ==
- swappable_cache_->owning_group()->newest_complete_cache());
- success = true;
- AssociateCompleteCache(swappable_cache_.get());
- }
- }
-
- pending_swap_cache_callback_.Run(success, pending_callback_param_);
- pending_swap_cache_callback_.Reset();
- pending_callback_param_ = NULL;
-}
-
-void AppCacheHost::SetSpawningHostId(
- int spawning_process_id, int spawning_host_id) {
- spawning_process_id_ = spawning_process_id;
- spawning_host_id_ = spawning_host_id;
-}
-
-const AppCacheHost* AppCacheHost::GetSpawningHost() const {
- AppCacheBackendImpl* backend = service_->GetBackend(spawning_process_id_);
- return backend ? backend->GetHost(spawning_host_id_) : NULL;
-}
-
-AppCacheHost* AppCacheHost::GetParentAppCacheHost() const {
- DCHECK(is_for_dedicated_worker());
- AppCacheBackendImpl* backend = service_->GetBackend(parent_process_id_);
- return backend ? backend->GetHost(parent_host_id_) : NULL;
-}
-
-AppCacheRequestHandler* AppCacheHost::CreateRequestHandler(
- net::URLRequest* request,
- ResourceType::Type resource_type) {
- if (is_for_dedicated_worker()) {
- AppCacheHost* parent_host = GetParentAppCacheHost();
- if (parent_host)
- return parent_host->CreateRequestHandler(request, resource_type);
- return NULL;
- }
-
- if (AppCacheRequestHandler::IsMainResourceType(resource_type)) {
- // Store the first party origin so that it can be used later in SelectCache
- // for checking whether the creation of the appcache is allowed.
- first_party_url_ = request->first_party_for_cookies();
- return new AppCacheRequestHandler(this, resource_type);
- }
-
- if ((associated_cache() && associated_cache()->is_complete()) ||
- is_selection_pending()) {
- return new AppCacheRequestHandler(this, resource_type);
- }
- return NULL;
-}
-
-void AppCacheHost::GetResourceList(
- AppCacheResourceInfoVector* resource_infos) {
- if (associated_cache_.get() && associated_cache_->is_complete())
- associated_cache_->ToResourceInfoVector(resource_infos);
-}
-
-AppCacheStatus AppCacheHost::GetStatus() {
- // 6.9.8 Application cache API
- AppCache* cache = associated_cache();
- if (!cache)
- return APPCACHE_STATUS_UNCACHED;
-
- // A cache without an owning group represents the cache being constructed
- // during the application cache update process.
- if (!cache->owning_group())
- return APPCACHE_STATUS_DOWNLOADING;
-
- if (cache->owning_group()->is_obsolete())
- return APPCACHE_STATUS_OBSOLETE;
- if (cache->owning_group()->update_status() == AppCacheGroup::CHECKING)
- return APPCACHE_STATUS_CHECKING;
- if (cache->owning_group()->update_status() == AppCacheGroup::DOWNLOADING)
- return APPCACHE_STATUS_DOWNLOADING;
- if (swappable_cache_.get())
- return APPCACHE_STATUS_UPDATE_READY;
- return APPCACHE_STATUS_IDLE;
-}
-
-void AppCacheHost::LoadOrCreateGroup(const GURL& manifest_url) {
- DCHECK(manifest_url.is_valid());
- pending_selected_manifest_url_ = manifest_url;
- storage()->LoadOrCreateGroup(manifest_url, this);
-}
-
-void AppCacheHost::OnGroupLoaded(AppCacheGroup* group,
- const GURL& manifest_url) {
- DCHECK(manifest_url == pending_selected_manifest_url_);
- pending_selected_manifest_url_ = GURL();
- FinishCacheSelection(NULL, group);
-}
-
-void AppCacheHost::LoadSelectedCache(int64 cache_id) {
- DCHECK(cache_id != kAppCacheNoCacheId);
- pending_selected_cache_id_ = cache_id;
- storage()->LoadCache(cache_id, this);
-}
-
-void AppCacheHost::OnCacheLoaded(AppCache* cache, int64 cache_id) {
- if (cache_id == pending_main_resource_cache_id_) {
- pending_main_resource_cache_id_ = kAppCacheNoCacheId;
- main_resource_cache_ = cache;
- } else if (cache_id == pending_selected_cache_id_) {
- pending_selected_cache_id_ = kAppCacheNoCacheId;
- FinishCacheSelection(cache, NULL);
- }
-}
-
-void AppCacheHost::FinishCacheSelection(
- AppCache *cache, AppCacheGroup* group) {
- DCHECK(!associated_cache());
-
- // 6.9.6 The application cache selection algorithm
- if (cache) {
- // If document was loaded from an application cache, Associate document
- // with the application cache from which it was loaded. Invoke the
- // application cache update process for that cache and with the browsing
- // context being navigated.
- DCHECK(cache->owning_group());
- DCHECK(new_master_entry_url_.is_empty());
- DCHECK_EQ(cache->owning_group()->manifest_url(), preferred_manifest_url_);
- AppCacheGroup* owing_group = cache->owning_group();
- const char* kFormatString =
- "Document was loaded from Application Cache with manifest %s";
- frontend_->OnLogMessage(
- host_id_, APPCACHE_LOG_INFO,
- base::StringPrintf(
- kFormatString, owing_group->manifest_url().spec().c_str()));
- AssociateCompleteCache(cache);
- if (!owing_group->is_obsolete() && !owing_group->is_being_deleted()) {
- owing_group->StartUpdateWithHost(this);
- ObserveGroupBeingUpdated(owing_group);
- }
- } else if (group && !group->is_being_deleted()) {
- // If document was loaded using HTTP GET or equivalent, and, there is a
- // manifest URL, and manifest URL has the same origin as document.
- // Invoke the application cache update process for manifest URL, with
- // the browsing context being navigated, and with document and the
- // resource from which document was loaded as the new master resourse.
- DCHECK(!group->is_obsolete());
- DCHECK(new_master_entry_url_.is_valid());
- DCHECK_EQ(group->manifest_url(), preferred_manifest_url_);
- const char* kFormatString = group->HasCache() ?
- "Adding master entry to Application Cache with manifest %s" :
- "Creating Application Cache with manifest %s";
- frontend_->OnLogMessage(
- host_id_, APPCACHE_LOG_INFO,
- base::StringPrintf(kFormatString,
- group->manifest_url().spec().c_str()));
- // The UpdateJob may produce one for us later.
- AssociateNoCache(preferred_manifest_url_);
- group->StartUpdateWithNewMasterEntry(this, new_master_entry_url_);
- ObserveGroupBeingUpdated(group);
- } else {
- // Otherwise, the Document is not associated with any application cache.
- new_master_entry_url_ = GURL();
- AssociateNoCache(GURL());
- }
-
- // Respond to pending callbacks now that we have a selection.
- if (!pending_get_status_callback_.is_null())
- DoPendingGetStatus();
- else if (!pending_start_update_callback_.is_null())
- DoPendingStartUpdate();
- else if (!pending_swap_cache_callback_.is_null())
- DoPendingSwapCache();
-
- FOR_EACH_OBSERVER(Observer, observers_, OnCacheSelectionComplete(this));
-}
-
-void AppCacheHost::OnServiceReinitialized(
- AppCacheStorageReference* old_storage_ref) {
- // We continue to use the disabled instance, but arrange for its
- // deletion when its no longer needed.
- if (old_storage_ref->storage() == storage())
- disabled_storage_reference_ = old_storage_ref;
-}
-
-void AppCacheHost::ObserveGroupBeingUpdated(AppCacheGroup* group) {
- DCHECK(!group_being_updated_.get());
- group_being_updated_ = group;
- newest_cache_of_group_being_updated_ = group->newest_complete_cache();
- group->AddUpdateObserver(this);
-}
-
-void AppCacheHost::OnUpdateComplete(AppCacheGroup* group) {
- DCHECK_EQ(group, group_being_updated_);
- group->RemoveUpdateObserver(this);
-
- // Add a reference to the newest complete cache.
- SetSwappableCache(group);
-
- group_being_updated_ = NULL;
- newest_cache_of_group_being_updated_ = NULL;
-
- if (associated_cache_info_pending_ && associated_cache_.get() &&
- associated_cache_->is_complete()) {
- AppCacheInfo info;
- FillCacheInfo(
- associated_cache_.get(), preferred_manifest_url_, GetStatus(), &info);
- associated_cache_info_pending_ = false;
- frontend_->OnCacheSelected(host_id_, info);
- }
-}
-
-void AppCacheHost::SetSwappableCache(AppCacheGroup* group) {
- if (!group) {
- swappable_cache_ = NULL;
- } else {
- AppCache* new_cache = group->newest_complete_cache();
- if (new_cache != associated_cache_.get())
- swappable_cache_ = new_cache;
- else
- swappable_cache_ = NULL;
- }
-}
-
-void AppCacheHost::LoadMainResourceCache(int64 cache_id) {
- DCHECK(cache_id != kAppCacheNoCacheId);
- if (pending_main_resource_cache_id_ == cache_id ||
- (main_resource_cache_.get() &&
- main_resource_cache_->cache_id() == cache_id)) {
- return;
- }
- pending_main_resource_cache_id_ = cache_id;
- storage()->LoadCache(cache_id, this);
-}
-
-void AppCacheHost::NotifyMainResourceIsNamespaceEntry(
- const GURL& namespace_entry_url) {
- main_resource_was_namespace_entry_ = true;
- namespace_entry_url_ = namespace_entry_url;
-}
-
-void AppCacheHost::NotifyMainResourceBlocked(const GURL& manifest_url) {
- main_resource_blocked_ = true;
- blocked_manifest_url_ = manifest_url;
-}
-
-void AppCacheHost::PrepareForTransfer() {
- // This can only happen prior to the document having been loaded.
- DCHECK(!associated_cache());
- DCHECK(!is_selection_pending());
- DCHECK(!group_being_updated_);
- host_id_ = kAppCacheNoHostId;
- frontend_ = NULL;
-}
-
-void AppCacheHost::CompleteTransfer(int host_id, AppCacheFrontend* frontend) {
- host_id_ = host_id;
- frontend_ = frontend;
-}
-
-void AppCacheHost::AssociateNoCache(const GURL& manifest_url) {
- // manifest url can be empty.
- AssociateCacheHelper(NULL, manifest_url);
-}
-
-void AppCacheHost::AssociateIncompleteCache(AppCache* cache,
- const GURL& manifest_url) {
- DCHECK(cache && !cache->is_complete());
- DCHECK(!manifest_url.is_empty());
- AssociateCacheHelper(cache, manifest_url);
-}
-
-void AppCacheHost::AssociateCompleteCache(AppCache* cache) {
- DCHECK(cache && cache->is_complete());
- AssociateCacheHelper(cache, cache->owning_group()->manifest_url());
-}
-
-void AppCacheHost::AssociateCacheHelper(AppCache* cache,
- const GURL& manifest_url) {
- if (associated_cache_.get()) {
- associated_cache_->UnassociateHost(this);
- }
-
- associated_cache_ = cache;
- SetSwappableCache(cache ? cache->owning_group() : NULL);
- associated_cache_info_pending_ = cache && !cache->is_complete();
- AppCacheInfo info;
- if (cache)
- cache->AssociateHost(this);
-
- FillCacheInfo(cache, manifest_url, GetStatus(), &info);
- frontend_->OnCacheSelected(host_id_, info);
-}
-
-} // namespace appcache

Powered by Google App Engine
This is Rietveld 408576698