Index: webkit/browser/appcache/appcache_update_job.cc |
diff --git a/webkit/browser/appcache/appcache_update_job.cc b/webkit/browser/appcache/appcache_update_job.cc |
index 4efe947af845e32051033d6640e9cf37cea0e7b3..a59ce163c16c776f5677871df0c7287e2ab4c426 100644 |
--- a/webkit/browser/appcache/appcache_update_job.cc |
+++ b/webkit/browser/appcache/appcache_update_job.cc |
@@ -302,7 +302,8 @@ AppCacheUpdateJob::AppCacheUpdateJob(AppCacheService* service, |
master_entries_completed_(0), |
url_fetches_completed_(0), |
manifest_fetcher_(NULL), |
- stored_state_(UNSTORED) { |
+ stored_state_(UNSTORED), |
+ using_fake_manifest_(false) { |
} |
AppCacheUpdateJob::~AppCacheUpdateJob() { |
@@ -324,6 +325,14 @@ void AppCacheUpdateJob::StartUpdate(AppCacheHost* host, |
DCHECK(group_->update_job() == this); |
DCHECK(!group_->is_obsolete()); |
+ // Hackery for 'registerController' |
+ if (group_->HasCache() && |
+ !group_->newest_complete_cache()->GetEntry(group_->manifest_url())) { |
+ using_fake_manifest_ = true; |
+ DeleteSoon(); |
+ return; |
+ } |
+ |
bool is_new_pending_master_entry = false; |
if (!new_master_resource.is_empty()) { |
DCHECK(new_master_resource == host->pending_master_entry_url()); |
@@ -381,6 +390,29 @@ void AppCacheUpdateJob::StartUpdate(AppCacheHost* host, |
FetchManifest(true); |
} |
+// Hackery for 'registerController' |
+void AppCacheUpdateJob::StartUpdateWithFakeManifest(Manifest* manifest) { |
+ DCHECK(group_->update_job() == this); |
+ DCHECK(!group_->is_obsolete()); |
+ |
+ using_fake_manifest_ = true; |
+ |
+ // Begin the update process for the group. |
+ group_->SetUpdateStatus(AppCacheGroup::CHECKING); |
+ DCHECK(!group_->HasCache()); // we don't ever 'upgrade' these caches |
+ update_type_ = CACHE_ATTEMPT; |
+ |
+ // Jump straight into downloading the controller script. |
+ internal_state_ = DOWNLOADING; |
+ inprogress_cache_ = new AppCache(service_->storage(), |
+ service_->storage()->NewCacheId()); |
+ BuildUrlFileList(*manifest); |
+ inprogress_cache_->InitializeWithManifest(manifest); |
+ group_->SetUpdateStatus(AppCacheGroup::DOWNLOADING); |
+ NotifyAllAssociatedHosts(DOWNLOADING_EVENT); |
+ FetchUrls(); |
+} |
+ |
AppCacheResponseWriter* AppCacheUpdateJob::CreateResponseWriter() { |
AppCacheResponseWriter* writer = |
service_->storage()->CreateResponseWriter(manifest_url_, |
@@ -1222,6 +1254,18 @@ void AppCacheUpdateJob::MaybeCompleteUpdate() { |
return; |
} |
+ // Hackery for 'registerController' |
+ if (using_fake_manifest_) { |
+ if (stored_state_ == UNSTORED) { |
+ // Skip refetching the manifest that does not exist. |
+ StoreGroupAndCache(); |
+ return; |
+ } |
+ if (stored_state_ == STORING) |
+ return; |
+ internal_state_ = REFETCH_MANIFEST; // hackery to fallthru to below |
+ } |
+ |
switch (internal_state_) { |
case NO_UPDATE: |
if (master_entries_completed_ > 0) { |