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