Index: webkit/appcache/appcache_host.h |
=================================================================== |
--- webkit/appcache/appcache_host.h (revision 26254) |
+++ webkit/appcache/appcache_host.h (working copy) |
@@ -6,42 +6,126 @@ |
#define WEBKIT_APPCACHE_APPCACHE_HOST_H_ |
#include "base/ref_counted.h" |
+#include "base/task.h" |
+#include "base/weak_ptr.h" |
+#include "googleurl/src/gurl.h" |
+#include "testing/gtest/include/gtest/gtest_prod.h" |
+#include "webkit/appcache/appcache.h" |
+#include "webkit/appcache/appcache_interfaces.h" |
+#include "webkit/appcache/appcache_service.h" |
+class URLRequest; |
+ |
namespace appcache { |
class AppCache; |
class AppCacheFrontend; |
class AppCacheGroup; |
+class AppCacheRequestHandler; |
+typedef Callback2<Status, void*>::Type GetStatusCallback; |
+typedef Callback2<bool, void*>::Type StartUpdateCallback; |
+typedef Callback2<bool, void*>::Type SwapCacheCallback; |
+ |
// Server-side representation of an application cache host. |
-class AppCacheHost { |
+class AppCacheHost : public base::SupportsWeakPtr<AppCacheHost>, |
+ public AppCacheService::LoadClient { |
public: |
- AppCacheHost(int host_id, AppCacheFrontend* frontend); |
+ AppCacheHost(int host_id, AppCacheFrontend* frontend, |
+ AppCacheService* service); |
~AppCacheHost(); |
- int host_id() { return host_id_; } |
- AppCacheFrontend* frontend() { return frontend_; } |
+ // Support for cache selection and scriptable method calls. |
+ void SelectCache(const GURL& document_url, |
+ const int64 cache_document_was_loaded_from, |
+ const GURL& manifest_url); |
+ void MarkAsForeignEntry(const GURL& document_url, |
+ int64 cache_document_was_loaded_from); |
+ void GetStatusWithCallback(GetStatusCallback* callback, |
+ void* callback_param); |
+ void StartUpdateWithCallback(StartUpdateCallback* callback, |
+ void* callback_param); |
+ void SwapCacheWithCallback(SwapCacheCallback* callback, |
+ void* callback_param); |
- AppCache* selected_cache() { return selected_cache_; } |
- void set_selected_cache(AppCache* cache); |
+ // Support for loading resources out of the appcache. |
+ // Returns NULL if the host is not associated with a complete cache. |
+ AppCacheRequestHandler* CreateRequestHandler(URLRequest* request, |
+ bool is_main_request); |
- bool is_selection_pending() { |
- return false; // TODO(michaeln) |
+ // Establishes an association between this host and a cache. 'cache' may be |
+ // NULL to break any existing association. Associations are established |
+ // either thru the cache selection algorithm implemented (in this class), |
+ // or by the update algorithm (see AppCacheUpdateJob). |
+ void AssociateCache(AppCache* cache); |
+ |
+ int host_id() const { return host_id_; } |
+ AppCacheService* service() const { return service_; } |
+ AppCacheFrontend* frontend() const { return frontend_; } |
+ AppCache* associated_cache() const { return associated_cache_.get(); } |
+ |
+ private: |
+ bool is_selection_pending() const { |
+ return pending_selected_cache_id_ != kNoCacheId || |
+ !pending_selected_manifest_url_.is_empty(); |
} |
+ Status GetStatus(); |
+ void LoadCache(int64 cache_id); |
+ void LoadOrCreateGroup(const GURL& manifest_url); |
- private: |
- // identifies the corresponding appcache host in the child process |
+ // LoadClient impl |
+ virtual void CacheLoadedCallback(AppCache* cache, int64 cache_id); |
+ virtual void GroupLoadedCallback(AppCacheGroup* group, |
+ const GURL& manifest_url); |
+ |
+ void FinishCacheSelection(AppCache* cache, AppCacheGroup* group); |
+ void DoPendingGetStatus(); |
+ void DoPendingStartUpdate(); |
+ void DoPendingSwapCache(); |
+ |
+ // Identifies the corresponding appcache host in the child process. |
int host_id_; |
- // application cache associated with this host, if any |
- scoped_refptr<AppCache> selected_cache_; |
+ // The cache associated with this host, if any. |
+ scoped_refptr<AppCache> associated_cache_; |
- // The reference to the appcache group ensures the group exists as long |
- // as there is a host using a cache belonging to that group. |
+ // The reference to the group ensures the group exists |
+ // while we have an association with a cache in the group. |
scoped_refptr<AppCacheGroup> group_; |
- // frontend to deliver notifications about this host to child process |
+ // Cache loading is async, if we're loading a specific cache or group |
+ // for the purposes of cache selection, one or the other of these will |
+ // indicate which cache or group is being loaded. |
+ int64 pending_selected_cache_id_; |
+ GURL pending_selected_manifest_url_; |
+ |
+ // A new master entry to be added to the cache, may be empty. |
+ GURL new_master_entry_url_; |
+ |
+ // The frontend proxy to deliver notifications to the child process. |
AppCacheFrontend* frontend_; |
+ |
+ // Our central service object. |
+ AppCacheService* service_; |
+ |
+ // Since these are synchronous scriptable api calls in the client, |
+ // there can only be one type of callback pending. |
+ // Also, we have to wait until we have a cache selection prior |
+ // to responding to these calls, as cache selection involves |
+ // async loading of a cache or a group from storage. |
+ GetStatusCallback* pending_get_status_callback_; |
+ StartUpdateCallback* pending_start_update_callback_; |
+ SwapCacheCallback* pending_swap_cache_callback_; |
+ void* pending_callback_param_; |
+ |
+ FRIEND_TEST(AppCacheTest, CleanupUnusedCache); |
+ FRIEND_TEST(AppCacheGroupTest, CleanupUnusedGroup); |
+ FRIEND_TEST(AppCacheHostTest, Basic); |
+ FRIEND_TEST(AppCacheHostTest, SelectNoCache); |
+ FRIEND_TEST(AppCacheHostTest, ForeignEntry); |
+ FRIEND_TEST(AppCacheHostTest, FailedCacheLoad); |
+ FRIEND_TEST(AppCacheHostTest, FailedGroupLoad); |
+ DISALLOW_COPY_AND_ASSIGN(AppCacheHost); |
}; |
} // namespace appcache |