OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 CONTENT_BROWSER_APPCACHE_APPCACHE_STORAGE_H_ | 5 #ifndef CONTENT_BROWSER_APPCACHE_APPCACHE_STORAGE_H_ |
6 #define CONTENT_BROWSER_APPCACHE_APPCACHE_STORAGE_H_ | 6 #define CONTENT_BROWSER_APPCACHE_APPCACHE_STORAGE_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 // the delegate will be called back with a NULL group pointer. | 107 // the delegate will be called back with a NULL group pointer. |
108 virtual void LoadOrCreateGroup( | 108 virtual void LoadOrCreateGroup( |
109 const GURL& manifest_url, Delegate* delegate) = 0; | 109 const GURL& manifest_url, Delegate* delegate) = 0; |
110 | 110 |
111 // Schedules response info to be loaded from storage. | 111 // Schedules response info to be loaded from storage. |
112 // Upon load completion the delegate will be called back. If the data | 112 // Upon load completion the delegate will be called back. If the data |
113 // already resides in memory, the delegate will be called back | 113 // already resides in memory, the delegate will be called back |
114 // immediately without returning to the message loop. If the load fails, | 114 // immediately without returning to the message loop. If the load fails, |
115 // the delegate will be called back with a NULL pointer. | 115 // the delegate will be called back with a NULL pointer. |
116 virtual void LoadResponseInfo(const GURL& manifest_url, | 116 virtual void LoadResponseInfo(const GURL& manifest_url, |
117 int64_t group_id, | |
118 int64_t response_id, | 117 int64_t response_id, |
119 Delegate* delegate); | 118 Delegate* delegate); |
120 | 119 |
121 // Schedules a group and its newest complete cache to be initially stored or | 120 // Schedules a group and its newest complete cache to be initially stored or |
122 // incrementally updated with new changes. Upon completion the delegate | 121 // incrementally updated with new changes. Upon completion the delegate |
123 // will be called back. A group without a newest cache cannot be stored. | 122 // will be called back. A group without a newest cache cannot be stored. |
124 // It's a programming error to call this method without a newest cache. A | 123 // It's a programming error to call this method without a newest cache. A |
125 // side effect of storing a new newest cache is the removal of the group's | 124 // side effect of storing a new newest cache is the removal of the group's |
126 // old caches and responses from persistent storage (although they may still | 125 // old caches and responses from persistent storage (although they may still |
127 // linger in the in-memory working set until no longer needed). The new | 126 // linger in the in-memory working set until no longer needed). The new |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 // take place. The callbacks for subsequently scheduled operations are | 165 // take place. The callbacks for subsequently scheduled operations are |
167 // unaffected. | 166 // unaffected. |
168 void CancelDelegateCallbacks(Delegate* delegate) { | 167 void CancelDelegateCallbacks(Delegate* delegate) { |
169 DelegateReference* delegate_reference = GetDelegateReference(delegate); | 168 DelegateReference* delegate_reference = GetDelegateReference(delegate); |
170 if (delegate_reference) | 169 if (delegate_reference) |
171 delegate_reference->CancelReference(); | 170 delegate_reference->CancelReference(); |
172 } | 171 } |
173 | 172 |
174 // Creates a reader to read a response from storage. | 173 // Creates a reader to read a response from storage. |
175 virtual AppCacheResponseReader* CreateResponseReader(const GURL& manifest_url, | 174 virtual AppCacheResponseReader* CreateResponseReader(const GURL& manifest_url, |
176 int64_t group_id, | |
177 int64_t response_id) = 0; | 175 int64_t response_id) = 0; |
178 | 176 |
179 // Creates a writer to write a new response to storage. This call | 177 // Creates a writer to write a new response to storage. This call |
180 // establishes a new response id. | 178 // establishes a new response id. |
181 virtual AppCacheResponseWriter* CreateResponseWriter(const GURL& manifest_url, | 179 virtual AppCacheResponseWriter* CreateResponseWriter( |
182 int64_t group_id) = 0; | 180 const GURL& manifest_url) = 0; |
183 | 181 |
184 // Creates a metadata writer to write metadata of response to storage. | 182 // Creates a metadata writer to write metadata of response to storage. |
185 virtual AppCacheResponseMetadataWriter* CreateResponseMetadataWriter( | 183 virtual AppCacheResponseMetadataWriter* CreateResponseMetadataWriter( |
186 int64_t group_id, | |
187 int64_t response_id) = 0; | 184 int64_t response_id) = 0; |
188 | 185 |
189 // Schedules the lazy deletion of responses and saves the ids | 186 // Schedules the lazy deletion of responses and saves the ids |
190 // persistently such that the responses will be deleted upon restart | 187 // persistently such that the responses will be deleted upon restart |
191 // if they aren't deleted prior to shutdown. | 188 // if they aren't deleted prior to shutdown. |
192 virtual void DoomResponses(const GURL& manifest_url, | 189 virtual void DoomResponses(const GURL& manifest_url, |
193 const std::vector<int64_t>& response_ids) = 0; | 190 const std::vector<int64_t>& response_ids) = 0; |
194 | 191 |
195 // Schedules the lazy deletion of responses without persistently saving | 192 // Schedules the lazy deletion of responses without persistently saving |
196 // the response ids. | 193 // the response ids. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 }; | 244 }; |
248 typedef std::map<Delegate*, DelegateReference*> DelegateReferenceMap; | 245 typedef std::map<Delegate*, DelegateReference*> DelegateReferenceMap; |
249 typedef std::vector<scoped_refptr<DelegateReference> > | 246 typedef std::vector<scoped_refptr<DelegateReference> > |
250 DelegateReferenceVector; | 247 DelegateReferenceVector; |
251 | 248 |
252 // Helper used to manage an async LoadResponseInfo calls on behalf of | 249 // Helper used to manage an async LoadResponseInfo calls on behalf of |
253 // multiple callers. | 250 // multiple callers. |
254 class ResponseInfoLoadTask { | 251 class ResponseInfoLoadTask { |
255 public: | 252 public: |
256 ResponseInfoLoadTask(const GURL& manifest_url, | 253 ResponseInfoLoadTask(const GURL& manifest_url, |
257 int64_t group_id, | |
258 int64_t response_id, | 254 int64_t response_id, |
259 AppCacheStorage* storage); | 255 AppCacheStorage* storage); |
260 ~ResponseInfoLoadTask(); | 256 ~ResponseInfoLoadTask(); |
261 | 257 |
262 int64_t response_id() const { return response_id_; } | 258 int64_t response_id() const { return response_id_; } |
263 const GURL& manifest_url() const { return manifest_url_; } | 259 const GURL& manifest_url() const { return manifest_url_; } |
264 int64_t group_id() const { return group_id_; } | |
265 | 260 |
266 void AddDelegate(DelegateReference* delegate_reference) { | 261 void AddDelegate(DelegateReference* delegate_reference) { |
267 delegates_.push_back(delegate_reference); | 262 delegates_.push_back(delegate_reference); |
268 } | 263 } |
269 | 264 |
270 void StartIfNeeded(); | 265 void StartIfNeeded(); |
271 | 266 |
272 private: | 267 private: |
273 void OnReadComplete(int result); | 268 void OnReadComplete(int result); |
274 | 269 |
275 AppCacheStorage* storage_; | 270 AppCacheStorage* storage_; |
276 GURL manifest_url_; | 271 GURL manifest_url_; |
277 int64_t group_id_; | |
278 int64_t response_id_; | 272 int64_t response_id_; |
279 std::unique_ptr<AppCacheResponseReader> reader_; | 273 std::unique_ptr<AppCacheResponseReader> reader_; |
280 DelegateReferenceVector delegates_; | 274 DelegateReferenceVector delegates_; |
281 scoped_refptr<HttpResponseInfoIOBuffer> info_buffer_; | 275 scoped_refptr<HttpResponseInfoIOBuffer> info_buffer_; |
282 }; | 276 }; |
283 | 277 |
284 typedef std::map<int64_t, ResponseInfoLoadTask*> PendingResponseInfoLoads; | 278 typedef std::map<int64_t, ResponseInfoLoadTask*> PendingResponseInfoLoads; |
285 | 279 |
286 DelegateReference* GetDelegateReference(Delegate* delegate) { | 280 DelegateReference* GetDelegateReference(Delegate* delegate) { |
287 DelegateReferenceMap::iterator iter = | 281 DelegateReferenceMap::iterator iter = |
288 delegate_references_.find(delegate); | 282 delegate_references_.find(delegate); |
289 if (iter != delegate_references_.end()) | 283 if (iter != delegate_references_.end()) |
290 return iter->second; | 284 return iter->second; |
291 return NULL; | 285 return NULL; |
292 } | 286 } |
293 | 287 |
294 DelegateReference* GetOrCreateDelegateReference(Delegate* delegate) { | 288 DelegateReference* GetOrCreateDelegateReference(Delegate* delegate) { |
295 DelegateReference* reference = GetDelegateReference(delegate); | 289 DelegateReference* reference = GetDelegateReference(delegate); |
296 if (reference) | 290 if (reference) |
297 return reference; | 291 return reference; |
298 return new DelegateReference(delegate, this); | 292 return new DelegateReference(delegate, this); |
299 } | 293 } |
300 | 294 |
301 ResponseInfoLoadTask* GetOrCreateResponseInfoLoadTask( | 295 ResponseInfoLoadTask* GetOrCreateResponseInfoLoadTask( |
302 const GURL& manifest_url, | 296 const GURL& manifest_url, |
303 int64_t group_id, | |
304 int64_t response_id) { | 297 int64_t response_id) { |
305 PendingResponseInfoLoads::iterator iter = | 298 PendingResponseInfoLoads::iterator iter = |
306 pending_info_loads_.find(response_id); | 299 pending_info_loads_.find(response_id); |
307 if (iter != pending_info_loads_.end()) | 300 if (iter != pending_info_loads_.end()) |
308 return iter->second; | 301 return iter->second; |
309 return new ResponseInfoLoadTask(manifest_url, group_id, response_id, this); | 302 return new ResponseInfoLoadTask(manifest_url, response_id, this); |
310 } | 303 } |
311 | 304 |
312 // Should only be called when creating a new response writer. | 305 // Should only be called when creating a new response writer. |
313 int64_t NewResponseId() { return ++last_response_id_; } | 306 int64_t NewResponseId() { return ++last_response_id_; } |
314 | 307 |
315 // Helpers to query and notify the QuotaManager. | 308 // Helpers to query and notify the QuotaManager. |
316 void UpdateUsageMapAndNotify(const GURL& origin, int64_t new_usage); | 309 void UpdateUsageMapAndNotify(const GURL& origin, int64_t new_usage); |
317 void ClearUsageMapAndNotify(); | 310 void ClearUsageMapAndNotify(); |
318 void NotifyStorageAccessed(const GURL& origin); | 311 void NotifyStorageAccessed(const GURL& origin); |
319 | 312 |
(...skipping 13 matching lines...) Expand all Loading... |
333 | 326 |
334 FRIEND_TEST_ALL_PREFIXES(content::AppCacheStorageTest, DelegateReferences); | 327 FRIEND_TEST_ALL_PREFIXES(content::AppCacheStorageTest, DelegateReferences); |
335 FRIEND_TEST_ALL_PREFIXES(content::AppCacheStorageTest, UsageMap); | 328 FRIEND_TEST_ALL_PREFIXES(content::AppCacheStorageTest, UsageMap); |
336 | 329 |
337 DISALLOW_COPY_AND_ASSIGN(AppCacheStorage); | 330 DISALLOW_COPY_AND_ASSIGN(AppCacheStorage); |
338 }; | 331 }; |
339 | 332 |
340 } // namespace content | 333 } // namespace content |
341 | 334 |
342 #endif // CONTENT_BROWSER_APPCACHE_APPCACHE_STORAGE_H_ | 335 #endif // CONTENT_BROWSER_APPCACHE_APPCACHE_STORAGE_H_ |
OLD | NEW |