| Index: webkit/browser/appcache/appcache_update_job.h
|
| diff --git a/webkit/browser/appcache/appcache_update_job.h b/webkit/browser/appcache/appcache_update_job.h
|
| deleted file mode 100644
|
| index ba155411d52f8606ac6d1758f29e51acdfda4b70..0000000000000000000000000000000000000000
|
| --- a/webkit/browser/appcache/appcache_update_job.h
|
| +++ /dev/null
|
| @@ -1,352 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#ifndef WEBKIT_BROWSER_APPCACHE_APPCACHE_UPDATE_JOB_H_
|
| -#define WEBKIT_BROWSER_APPCACHE_APPCACHE_UPDATE_JOB_H_
|
| -
|
| -#include <deque>
|
| -#include <map>
|
| -#include <set>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/time/time.h"
|
| -#include "net/base/completion_callback.h"
|
| -#include "net/http/http_response_headers.h"
|
| -#include "net/url_request/url_request.h"
|
| -#include "url/gurl.h"
|
| -#include "webkit/browser/appcache/appcache.h"
|
| -#include "webkit/browser/appcache/appcache_host.h"
|
| -#include "webkit/browser/appcache/appcache_response.h"
|
| -#include "webkit/browser/appcache/appcache_service_impl.h"
|
| -#include "webkit/browser/appcache/appcache_storage.h"
|
| -#include "webkit/browser/webkit_storage_browser_export.h"
|
| -#include "webkit/common/appcache/appcache_interfaces.h"
|
| -
|
| -namespace content {
|
| -FORWARD_DECLARE_TEST(AppCacheGroupTest, QueueUpdate);
|
| -class AppCacheGroupTest;
|
| -class AppCacheUpdateJobTest;
|
| -}
|
| -
|
| -namespace appcache {
|
| -
|
| -class HostNotifier;
|
| -
|
| -// Application cache Update algorithm and state.
|
| -class WEBKIT_STORAGE_BROWSER_EXPORT AppCacheUpdateJob
|
| - : public AppCacheStorage::Delegate,
|
| - public AppCacheHost::Observer,
|
| - public AppCacheServiceImpl::Observer {
|
| - public:
|
| - // Used for uma stats only for now, so new values are append only.
|
| - enum ResultType {
|
| - UPDATE_OK, DB_ERROR, DISKCACHE_ERROR, APPCACHE_QUOTA_ERROR, REDIRECT_ERROR,
|
| - APPCACHE_MANIFEST_ERROR, NETWORK_ERROR, SERVER_ERROR, CANCELLED_ERROR,
|
| - NUM_UPDATE_JOB_RESULT_TYPES
|
| - };
|
| -
|
| - AppCacheUpdateJob(AppCacheServiceImpl* service, AppCacheGroup* group);
|
| - virtual ~AppCacheUpdateJob();
|
| -
|
| - // Triggers the update process or adds more info if this update is already
|
| - // in progress.
|
| - void StartUpdate(AppCacheHost* host, const GURL& new_master_resource);
|
| -
|
| - private:
|
| - friend class content::AppCacheGroupTest;
|
| - friend class content::AppCacheUpdateJobTest;
|
| - class URLFetcher;
|
| -
|
| - // Master entries have multiple hosts, for example, the same page is opened
|
| - // in different tabs.
|
| - typedef std::vector<AppCacheHost*> PendingHosts;
|
| - typedef std::map<GURL, PendingHosts> PendingMasters;
|
| - typedef std::map<GURL, URLFetcher*> PendingUrlFetches;
|
| - typedef std::map<int64, GURL> LoadingResponses;
|
| -
|
| - static const int kRerunDelayMs = 1000;
|
| -
|
| - // TODO(michaeln): Rework the set of states vs update types vs stored states.
|
| - // The NO_UPDATE state is really more of an update type. For all update types
|
| - // storing the results is relevant.
|
| -
|
| - enum UpdateType {
|
| - UNKNOWN_TYPE,
|
| - UPGRADE_ATTEMPT,
|
| - CACHE_ATTEMPT,
|
| - };
|
| -
|
| - enum InternalUpdateState {
|
| - FETCH_MANIFEST,
|
| - NO_UPDATE,
|
| - DOWNLOADING,
|
| -
|
| - // Every state after this comment indicates the update is terminating.
|
| - REFETCH_MANIFEST,
|
| - CACHE_FAILURE,
|
| - CANCELLED,
|
| - COMPLETED,
|
| - };
|
| -
|
| - enum StoredState {
|
| - UNSTORED,
|
| - STORING,
|
| - STORED,
|
| - };
|
| -
|
| - struct UrlToFetch {
|
| - UrlToFetch(const GURL& url, bool checked, AppCacheResponseInfo* info);
|
| - ~UrlToFetch();
|
| -
|
| - GURL url;
|
| - bool storage_checked;
|
| - scoped_refptr<AppCacheResponseInfo> existing_response_info;
|
| - };
|
| -
|
| - class URLFetcher : public net::URLRequest::Delegate {
|
| - public:
|
| - enum FetchType {
|
| - MANIFEST_FETCH,
|
| - URL_FETCH,
|
| - MASTER_ENTRY_FETCH,
|
| - MANIFEST_REFETCH,
|
| - };
|
| - URLFetcher(const GURL& url,
|
| - FetchType fetch_type,
|
| - AppCacheUpdateJob* job);
|
| - virtual ~URLFetcher();
|
| - void Start();
|
| - FetchType fetch_type() const { return fetch_type_; }
|
| - net::URLRequest* request() const { return request_.get(); }
|
| - const AppCacheEntry& existing_entry() const { return existing_entry_; }
|
| - const std::string& manifest_data() const { return manifest_data_; }
|
| - AppCacheResponseWriter* response_writer() const {
|
| - return response_writer_.get();
|
| - }
|
| - void set_existing_response_headers(net::HttpResponseHeaders* headers) {
|
| - existing_response_headers_ = headers;
|
| - }
|
| - void set_existing_entry(const AppCacheEntry& entry) {
|
| - existing_entry_ = entry;
|
| - }
|
| - ResultType result() const { return result_; }
|
| - int redirect_response_code() const { return redirect_response_code_; }
|
| -
|
| - private:
|
| - // URLRequest::Delegate overrides
|
| - virtual void OnReceivedRedirect(net::URLRequest* request,
|
| - const GURL& new_url,
|
| - bool* defer_redirect) OVERRIDE;
|
| - virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE;
|
| - virtual void OnReadCompleted(net::URLRequest* request,
|
| - int bytes_read) OVERRIDE;
|
| -
|
| - void AddConditionalHeaders(const net::HttpResponseHeaders* headers);
|
| - void OnWriteComplete(int result);
|
| - void ReadResponseData();
|
| - bool ConsumeResponseData(int bytes_read);
|
| - void OnResponseCompleted();
|
| - bool MaybeRetryRequest();
|
| -
|
| - GURL url_;
|
| - AppCacheUpdateJob* job_;
|
| - FetchType fetch_type_;
|
| - int retry_503_attempts_;
|
| - scoped_refptr<net::IOBuffer> buffer_;
|
| - scoped_ptr<net::URLRequest> request_;
|
| - AppCacheEntry existing_entry_;
|
| - scoped_refptr<net::HttpResponseHeaders> existing_response_headers_;
|
| - std::string manifest_data_;
|
| - ResultType result_;
|
| - int redirect_response_code_;
|
| - scoped_ptr<AppCacheResponseWriter> response_writer_;
|
| - }; // class URLFetcher
|
| -
|
| - AppCacheResponseWriter* CreateResponseWriter();
|
| -
|
| - // Methods for AppCacheStorage::Delegate.
|
| - virtual void OnResponseInfoLoaded(AppCacheResponseInfo* response_info,
|
| - int64 response_id) OVERRIDE;
|
| - virtual void OnGroupAndNewestCacheStored(AppCacheGroup* group,
|
| - AppCache* newest_cache,
|
| - bool success,
|
| - bool would_exceed_quota) OVERRIDE;
|
| - virtual void OnGroupMadeObsolete(AppCacheGroup* group,
|
| - bool success,
|
| - int response_code) OVERRIDE;
|
| -
|
| - // Methods for AppCacheHost::Observer.
|
| - virtual void OnCacheSelectionComplete(AppCacheHost* host) OVERRIDE {} // N/A
|
| - virtual void OnDestructionImminent(AppCacheHost* host) OVERRIDE;
|
| -
|
| - // Methods for AppCacheServiceImpl::Observer.
|
| - virtual void OnServiceReinitialized(
|
| - AppCacheStorageReference* old_storage) OVERRIDE;
|
| -
|
| - void HandleCacheFailure(const AppCacheErrorDetails& details,
|
| - ResultType result,
|
| - const GURL& failed_resource_url);
|
| -
|
| - void FetchManifest(bool is_first_fetch);
|
| - void HandleManifestFetchCompleted(URLFetcher* fetcher);
|
| - void ContinueHandleManifestFetchCompleted(bool changed);
|
| -
|
| - void HandleUrlFetchCompleted(URLFetcher* fetcher);
|
| - void HandleMasterEntryFetchCompleted(URLFetcher* fetcher);
|
| -
|
| - void HandleManifestRefetchCompleted(URLFetcher* fetcher);
|
| - void OnManifestInfoWriteComplete(int result);
|
| - void OnManifestDataWriteComplete(int result);
|
| -
|
| - void StoreGroupAndCache();
|
| -
|
| - void NotifySingleHost(AppCacheHost* host, AppCacheEventID event_id);
|
| - void NotifyAllAssociatedHosts(AppCacheEventID event_id);
|
| - void NotifyAllProgress(const GURL& url);
|
| - void NotifyAllFinalProgress();
|
| - void NotifyAllError(const AppCacheErrorDetails& detals);
|
| - void LogConsoleMessageToAll(const std::string& message);
|
| - void AddAllAssociatedHostsToNotifier(HostNotifier* notifier);
|
| -
|
| - // Checks if manifest is byte for byte identical with the manifest
|
| - // in the newest application cache.
|
| - void CheckIfManifestChanged();
|
| - void OnManifestDataReadComplete(int result);
|
| -
|
| - // Creates the list of files that may need to be fetched and initiates
|
| - // fetches. Section 6.9.4 steps 12-17
|
| - void BuildUrlFileList(const Manifest& manifest);
|
| - void AddUrlToFileList(const GURL& url, int type);
|
| - void FetchUrls();
|
| - void CancelAllUrlFetches();
|
| - bool ShouldSkipUrlFetch(const AppCacheEntry& entry);
|
| -
|
| - // If entry already exists in the cache currently being updated, merge
|
| - // the entry type information with the existing entry.
|
| - // Returns true if entry exists in cache currently being updated.
|
| - bool AlreadyFetchedEntry(const GURL& url, int entry_type);
|
| -
|
| - // TODO(jennb): Delete when update no longer fetches master entries directly.
|
| - // Creates the list of master entries that need to be fetched and initiates
|
| - // fetches.
|
| - void AddMasterEntryToFetchList(AppCacheHost* host, const GURL& url,
|
| - bool is_new);
|
| - void FetchMasterEntries();
|
| - void CancelAllMasterEntryFetches(const AppCacheErrorDetails& details);
|
| -
|
| - // Asynchronously loads the entry from the newest complete cache if the
|
| - // HTTP caching semantics allow.
|
| - // Returns false if immediately obvious that data cannot be loaded from
|
| - // newest complete cache.
|
| - bool MaybeLoadFromNewestCache(const GURL& url, AppCacheEntry& entry);
|
| - void LoadFromNewestCacheFailed(const GURL& url,
|
| - AppCacheResponseInfo* newest_response_info);
|
| -
|
| - // Does nothing if update process is still waiting for pending master
|
| - // entries or URL fetches to complete downloading. Otherwise, completes
|
| - // the update process.
|
| - void MaybeCompleteUpdate();
|
| -
|
| - // Schedules a rerun of the entire update with the same parameters as
|
| - // this update job after a short delay.
|
| - void ScheduleUpdateRetry(int delay_ms);
|
| -
|
| - void Cancel();
|
| - void ClearPendingMasterEntries();
|
| - void DiscardInprogressCache();
|
| - void DiscardDuplicateResponses();
|
| -
|
| - void LogHistogramStats(ResultType result, const GURL& failed_resource_url);
|
| - void MadeProgress() { last_progress_time_ = base::Time::Now(); }
|
| -
|
| - // Deletes this object after letting the stack unwind.
|
| - void DeleteSoon();
|
| -
|
| - bool IsTerminating() { return internal_state_ >= REFETCH_MANIFEST ||
|
| - stored_state_ != UNSTORED; }
|
| -
|
| - AppCacheServiceImpl* service_;
|
| - const GURL manifest_url_; // here for easier access
|
| -
|
| - // Defined prior to refs to AppCaches and Groups because destruction
|
| - // order matters, the disabled_storage_reference_ must outlive those
|
| - // objects.
|
| - scoped_refptr<AppCacheStorageReference> disabled_storage_reference_;
|
| -
|
| - scoped_refptr<AppCache> inprogress_cache_;
|
| -
|
| - AppCacheGroup* group_;
|
| -
|
| - UpdateType update_type_;
|
| - InternalUpdateState internal_state_;
|
| - base::Time last_progress_time_;
|
| -
|
| - PendingMasters pending_master_entries_;
|
| - size_t master_entries_completed_;
|
| -
|
| - // TODO(jennb): Delete when update no longer fetches master entries directly.
|
| - // Helper containers to track which pending master entries have yet to be
|
| - // fetched and which are currently being fetched. Master entries that
|
| - // are listed in the manifest may be fetched as a regular URL instead of
|
| - // as a separate master entry fetch to optimize against duplicate fetches.
|
| - std::set<GURL> master_entries_to_fetch_;
|
| - PendingUrlFetches master_entry_fetches_;
|
| -
|
| - // URLs of files to fetch along with their flags.
|
| - AppCache::EntryMap url_file_list_;
|
| - size_t url_fetches_completed_;
|
| -
|
| - // Helper container to track which urls have not been fetched yet. URLs are
|
| - // removed when the fetch is initiated. Flag indicates whether an attempt
|
| - // to load the URL from storage has already been tried and failed.
|
| - std::deque<UrlToFetch> urls_to_fetch_;
|
| -
|
| - // Helper container to track which urls are being loaded from response
|
| - // storage.
|
| - LoadingResponses loading_responses_;
|
| -
|
| - // Keep track of pending URL requests so we can cancel them if necessary.
|
| - URLFetcher* manifest_fetcher_;
|
| - PendingUrlFetches pending_url_fetches_;
|
| -
|
| - // Temporary storage of manifest response data for parsing and comparison.
|
| - std::string manifest_data_;
|
| - scoped_ptr<net::HttpResponseInfo> manifest_response_info_;
|
| - scoped_ptr<AppCacheResponseWriter> manifest_response_writer_;
|
| - scoped_refptr<net::IOBuffer> read_manifest_buffer_;
|
| - std::string loaded_manifest_data_;
|
| - scoped_ptr<AppCacheResponseReader> manifest_response_reader_;
|
| - bool manifest_has_valid_mime_type_;
|
| -
|
| - // New master entries added to the cache by this job, used to cleanup
|
| - // in error conditions.
|
| - std::vector<GURL> added_master_entries_;
|
| -
|
| - // Response ids stored by this update job, used to cleanup in
|
| - // error conditions.
|
| - std::vector<int64> stored_response_ids_;
|
| -
|
| - // In some cases we fetch the same resource multiple times, and then
|
| - // have to delete the duplicates upon successful update. These ids
|
| - // are also in the stored_response_ids_ collection so we only schedule
|
| - // these for deletion on success.
|
| - // TODO(michaeln): Rework when we no longer fetches master entries directly.
|
| - std::vector<int64> duplicate_response_ids_;
|
| -
|
| - // Whether we've stored the resulting group/cache yet.
|
| - StoredState stored_state_;
|
| -
|
| - AppCacheStorage* storage_;
|
| -
|
| - FRIEND_TEST_ALL_PREFIXES(content::AppCacheGroupTest, QueueUpdate);
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AppCacheUpdateJob);
|
| -};
|
| -
|
| -} // namespace appcache
|
| -
|
| -#endif // WEBKIT_BROWSER_APPCACHE_APPCACHE_UPDATE_JOB_H_
|
|
|