OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef WEBKIT_APPCACHE_APPCACHE_UPDATE_JOB_H_ | 5 #ifndef WEBKIT_APPCACHE_APPCACHE_UPDATE_JOB_H_ |
6 #define WEBKIT_APPCACHE_APPCACHE_UPDATE_JOB_H_ | 6 #define WEBKIT_APPCACHE_APPCACHE_UPDATE_JOB_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
11 #include <string> | 11 #include <string> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/ref_counted.h" | 14 #include "base/ref_counted.h" |
15 #include "base/task.h" | 15 #include "base/task.h" |
16 #include "googleurl/src/gurl.h" | 16 #include "googleurl/src/gurl.h" |
17 #include "net/base/completion_callback.h" | 17 #include "net/base/completion_callback.h" |
18 #include "net/url_request/url_request.h" | 18 #include "net/url_request/url_request.h" |
19 #include "testing/gtest/include/gtest/gtest_prod.h" | 19 #include "testing/gtest/include/gtest/gtest_prod.h" |
20 #include "webkit/appcache/appcache.h" | 20 #include "webkit/appcache/appcache.h" |
21 #include "webkit/appcache/appcache_host.h" | 21 #include "webkit/appcache/appcache_host.h" |
22 #include "webkit/appcache/appcache_interfaces.h" | 22 #include "webkit/appcache/appcache_interfaces.h" |
| 23 #include "webkit/appcache/appcache_response.h" |
23 #include "webkit/appcache/appcache_storage.h" | 24 #include "webkit/appcache/appcache_storage.h" |
24 | 25 |
25 namespace appcache { | 26 namespace appcache { |
26 | 27 |
27 class UpdateJobInfo; | 28 class UpdateJobInfo; |
28 class HostNotifier; | 29 class HostNotifier; |
29 | 30 |
30 // Application cache Update algorithm and state. | 31 // Application cache Update algorithm and state. |
31 class AppCacheUpdateJob : public URLRequest::Delegate, | 32 class AppCacheUpdateJob : public URLRequest::Delegate, |
32 public AppCacheStorage::Delegate, | 33 public AppCacheStorage::Delegate, |
33 public AppCacheHost::Observer { | 34 public AppCacheHost::Observer { |
34 public: | 35 public: |
35 AppCacheUpdateJob(AppCacheService* service, AppCacheGroup* group); | 36 AppCacheUpdateJob(AppCacheService* service, AppCacheGroup* group); |
36 ~AppCacheUpdateJob(); | 37 ~AppCacheUpdateJob(); |
37 | 38 |
38 // Triggers the update process or adds more info if this update is already | 39 // Triggers the update process or adds more info if this update is already |
39 // in progress. | 40 // in progress. |
40 void StartUpdate(AppCacheHost* host, const GURL& new_master_resource); | 41 void StartUpdate(AppCacheHost* host, const GURL& new_master_resource); |
41 | 42 |
42 private: | 43 private: |
43 friend class ScopedRunnableMethodFactory<AppCacheUpdateJob>; | 44 friend class ScopedRunnableMethodFactory<AppCacheUpdateJob>; |
44 friend class AppCacheUpdateJobTest; | 45 friend class AppCacheUpdateJobTest; |
45 friend class UpdateJobInfo; | 46 friend class UpdateJobInfo; |
46 | 47 |
47 // Master entries have multiple hosts, for example, the same page is opened | 48 // Master entries have multiple hosts, for example, the same page is opened |
48 // in different tabs. | 49 // in different tabs. |
49 typedef std::vector<AppCacheHost*> PendingHosts; | 50 typedef std::vector<AppCacheHost*> PendingHosts; |
50 typedef std::map<GURL, PendingHosts> PendingMasters; | 51 typedef std::map<GURL, PendingHosts> PendingMasters; |
51 typedef std::map<GURL, URLRequest*> PendingUrlFetches; | 52 typedef std::map<GURL, URLRequest*> PendingUrlFetches; |
52 typedef std::pair<GURL, bool> UrlsToFetch; // flag TRUE if storage checked | |
53 typedef std::map<int64, GURL> LoadingResponses; | 53 typedef std::map<int64, GURL> LoadingResponses; |
54 | 54 |
55 static const int kRerunDelayMs = 1000; | 55 static const int kRerunDelayMs = 1000; |
56 | 56 |
57 // TODO(michaeln): Rework the set of states vs update types vs stored states. | 57 // TODO(michaeln): Rework the set of states vs update types vs stored states. |
58 // The NO_UPDATE state is really more of an update type. For all update types | 58 // The NO_UPDATE state is really more of an update type. For all update types |
59 // storing the results is relevant. | 59 // storing the results is relevant. |
60 | 60 |
61 enum UpdateType { | 61 enum UpdateType { |
62 UNKNOWN_TYPE, | 62 UNKNOWN_TYPE, |
(...skipping 12 matching lines...) Expand all Loading... |
75 CANCELLED, | 75 CANCELLED, |
76 COMPLETED, | 76 COMPLETED, |
77 }; | 77 }; |
78 | 78 |
79 enum StoredState { | 79 enum StoredState { |
80 UNSTORED, | 80 UNSTORED, |
81 STORING, | 81 STORING, |
82 STORED, | 82 STORED, |
83 }; | 83 }; |
84 | 84 |
| 85 struct UrlToFetch { |
| 86 GURL url; |
| 87 bool storage_checked; |
| 88 scoped_refptr<AppCacheResponseInfo> existing_response_info; |
| 89 UrlToFetch(const GURL& url, bool checked, AppCacheResponseInfo* info) |
| 90 : url(url), storage_checked(checked), existing_response_info(info) {} |
| 91 }; |
| 92 |
| 93 UpdateJobInfo* GetUpdateJobInfo(URLRequest* request); |
| 94 |
85 // Methods for URLRequest::Delegate. | 95 // Methods for URLRequest::Delegate. |
86 void OnResponseStarted(URLRequest* request); | 96 void OnResponseStarted(URLRequest* request); |
87 void OnReadCompleted(URLRequest* request, int bytes_read); | 97 void OnReadCompleted(URLRequest* request, int bytes_read); |
88 void OnReceivedRedirect(URLRequest* request, | 98 void OnReceivedRedirect(URLRequest* request, |
89 const GURL& new_url, | 99 const GURL& new_url, |
90 bool* defer_redirect); | 100 bool* defer_redirect); |
91 // TODO(jennb): any other delegate callbacks to handle? certificate? | 101 // TODO(jennb): any other delegate callbacks to handle? certificate? |
92 | 102 |
93 // Methods for AppCacheStorage::Delegate. | 103 // Methods for AppCacheStorage::Delegate. |
94 void OnResponseInfoLoaded(AppCacheResponseInfo* response_info, | 104 void OnResponseInfoLoaded(AppCacheResponseInfo* response_info, |
95 int64 response_id); | 105 int64 response_id); |
96 void OnGroupAndNewestCacheStored(AppCacheGroup* group, AppCache* newest_cache, | 106 void OnGroupAndNewestCacheStored(AppCacheGroup* group, AppCache* newest_cache, |
97 bool success); | 107 bool success); |
98 void OnGroupMadeObsolete(AppCacheGroup* group, bool success); | 108 void OnGroupMadeObsolete(AppCacheGroup* group, bool success); |
99 | 109 |
100 // Methods for AppCacheHost::Observer. | 110 // Methods for AppCacheHost::Observer. |
101 void OnCacheSelectionComplete(AppCacheHost* host) {} // N/A | 111 void OnCacheSelectionComplete(AppCacheHost* host) {} // N/A |
102 void OnDestructionImminent(AppCacheHost* host); | 112 void OnDestructionImminent(AppCacheHost* host); |
103 | 113 |
104 void CheckPolicy(); | 114 void CheckPolicy(); |
105 void OnPolicyCheckComplete(int rv); | 115 void OnPolicyCheckComplete(int rv); |
106 | 116 |
107 void HandleCacheFailure(const std::string& error_message); | 117 void HandleCacheFailure(const std::string& error_message); |
108 | 118 |
109 void FetchManifest(bool is_first_fetch); | 119 void FetchManifest(bool is_first_fetch); |
110 | 120 |
111 // Add extra HTTP headers to the request based on the response info and | 121 // Add extra conditional HTTP headers to the request based on the |
112 // start the URL request. | 122 // currently cached response headers. |
113 void AddHttpHeadersAndFetch(URLRequest* request, | 123 void AddConditionalHeaders(URLRequest* request, |
114 const net::HttpResponseInfo* info); | 124 const net::HttpResponseInfo* info); |
115 | 125 |
116 void OnResponseCompleted(URLRequest* request); | 126 void OnResponseCompleted(URLRequest* request); |
117 | 127 |
118 // Retries a 503 request with retry-after header of 0. | 128 // Retries a 503 request with retry-after header of 0. |
119 // Returns true if request should be retried and deletes original request. | 129 // Returns true if request should be retried and deletes original request. |
120 bool RetryRequest(URLRequest* request); | 130 bool RetryRequest(URLRequest* request); |
121 | 131 |
122 void ReadResponseData(URLRequest* request); | 132 void ReadResponseData(URLRequest* request); |
123 | 133 |
124 // Returns false if response data is processed asynchronously, in which | 134 // Returns false if response data is processed asynchronously, in which |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 void AddMasterEntryToFetchList(AppCacheHost* host, const GURL& url, | 183 void AddMasterEntryToFetchList(AppCacheHost* host, const GURL& url, |
174 bool is_new); | 184 bool is_new); |
175 void FetchMasterEntries(); | 185 void FetchMasterEntries(); |
176 void CancelAllMasterEntryFetches(const std::string& error_message); | 186 void CancelAllMasterEntryFetches(const std::string& error_message); |
177 | 187 |
178 // Asynchronously loads the entry from the newest complete cache if the | 188 // Asynchronously loads the entry from the newest complete cache if the |
179 // HTTP caching semantics allow. | 189 // HTTP caching semantics allow. |
180 // Returns false if immediately obvious that data cannot be loaded from | 190 // Returns false if immediately obvious that data cannot be loaded from |
181 // newest complete cache. | 191 // newest complete cache. |
182 bool MaybeLoadFromNewestCache(const GURL& url, AppCacheEntry& entry); | 192 bool MaybeLoadFromNewestCache(const GURL& url, AppCacheEntry& entry); |
183 void LoadFromNewestCacheFailed(const GURL& url); | 193 void LoadFromNewestCacheFailed(const GURL& url, |
| 194 AppCacheResponseInfo* newest_response_info); |
184 | 195 |
185 // Does nothing if update process is still waiting for pending master | 196 // Does nothing if update process is still waiting for pending master |
186 // entries or URL fetches to complete downloading. Otherwise, completes | 197 // entries or URL fetches to complete downloading. Otherwise, completes |
187 // the update process. | 198 // the update process. |
188 void MaybeCompleteUpdate(); | 199 void MaybeCompleteUpdate(); |
189 | 200 |
190 // Schedules a rerun of the entire update with the same parameters as | 201 // Schedules a rerun of the entire update with the same parameters as |
191 // this update job after a short delay. | 202 // this update job after a short delay. |
192 void ScheduleUpdateRetry(int delay_ms); | 203 void ScheduleUpdateRetry(int delay_ms); |
193 | 204 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 std::set<GURL> master_entries_to_fetch_; | 237 std::set<GURL> master_entries_to_fetch_; |
227 PendingUrlFetches master_entry_fetches_; | 238 PendingUrlFetches master_entry_fetches_; |
228 | 239 |
229 // URLs of files to fetch along with their flags. | 240 // URLs of files to fetch along with their flags. |
230 AppCache::EntryMap url_file_list_; | 241 AppCache::EntryMap url_file_list_; |
231 size_t url_fetches_completed_; | 242 size_t url_fetches_completed_; |
232 | 243 |
233 // Helper container to track which urls have not been fetched yet. URLs are | 244 // Helper container to track which urls have not been fetched yet. URLs are |
234 // removed when the fetch is initiated. Flag indicates whether an attempt | 245 // removed when the fetch is initiated. Flag indicates whether an attempt |
235 // to load the URL from storage has already been tried and failed. | 246 // to load the URL from storage has already been tried and failed. |
236 std::deque<UrlsToFetch> urls_to_fetch_; | 247 std::deque<UrlToFetch> urls_to_fetch_; |
237 | 248 |
238 // Helper container to track which urls are being loaded from response | 249 // Helper container to track which urls are being loaded from response |
239 // storage. | 250 // storage. |
240 LoadingResponses loading_responses_; | 251 LoadingResponses loading_responses_; |
241 | 252 |
242 // Keep track of pending URL requests so we can cancel them if necessary. | 253 // Keep track of pending URL requests so we can cancel them if necessary. |
243 URLRequest* manifest_url_request_; | 254 URLRequest* manifest_url_request_; |
244 PendingUrlFetches pending_url_fetches_; | 255 PendingUrlFetches pending_url_fetches_; |
245 | 256 |
246 // Temporary storage of manifest response data for parsing and comparison. | 257 // Temporary storage of manifest response data for parsing and comparison. |
(...skipping 26 matching lines...) Expand all Loading... |
273 scoped_refptr<net::CancelableCompletionCallback<AppCacheUpdateJob> > | 284 scoped_refptr<net::CancelableCompletionCallback<AppCacheUpdateJob> > |
274 policy_callback_; | 285 policy_callback_; |
275 | 286 |
276 FRIEND_TEST(AppCacheGroupTest, QueueUpdate); | 287 FRIEND_TEST(AppCacheGroupTest, QueueUpdate); |
277 DISALLOW_COPY_AND_ASSIGN(AppCacheUpdateJob); | 288 DISALLOW_COPY_AND_ASSIGN(AppCacheUpdateJob); |
278 }; | 289 }; |
279 | 290 |
280 } // namespace appcache | 291 } // namespace appcache |
281 | 292 |
282 #endif // WEBKIT_APPCACHE_APPCACHE_UPDATE_JOB_H_ | 293 #endif // WEBKIT_APPCACHE_APPCACHE_UPDATE_JOB_H_ |
OLD | NEW |