diff options
author | michaeln@google.com <michaeln@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-19 00:49:15 +0000 |
---|---|---|
committer | michaeln@google.com <michaeln@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-19 00:49:15 +0000 |
commit | c034941e26f9e62e7f5c9b58cd7a3f52bac1b1db (patch) | |
tree | f30ac577ee0832957e9df113393ab33e307b6697 /webkit/appcache | |
parent | 2f69b38816cc86ffff8c255a6984376e2aa02c10 (diff) | |
download | chromium_src-c034941e26f9e62e7f5c9b58cd7a3f52bac1b1db.zip chromium_src-c034941e26f9e62e7f5c9b58cd7a3f52bac1b1db.tar.gz chromium_src-c034941e26f9e62e7f5c9b58cd7a3f52bac1b1db.tar.bz2 |
Defend against selectCache() being called multiple times. There is a bug filed upstream to fix the HTML parser such that
it won't generate multiple calls to this, but given the complexity of the parser I'm putting this defense directly in the
appcache system.
BUG=72986,73118
TEST=manually run Poppit
Review URL: http://codereview.chromium.org/6546004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75481 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/appcache')
-rw-r--r-- | webkit/appcache/appcache_host.cc | 22 | ||||
-rw-r--r-- | webkit/appcache/web_application_cache_host_impl.cc | 11 | ||||
-rw-r--r-- | webkit/appcache/web_application_cache_host_impl.h | 1 |
3 files changed, 13 insertions, 21 deletions
diff --git a/webkit/appcache/appcache_host.cc b/webkit/appcache/appcache_host.cc index 5e8e4db..2bc463f 100644 --- a/webkit/appcache/appcache_host.cc +++ b/webkit/appcache/appcache_host.cc @@ -65,31 +65,13 @@ void AppCacheHost::SelectCache(const GURL& document_url, const GURL& manifest_url) { DCHECK(!pending_start_update_callback_ && !pending_swap_cache_callback_ && - !pending_get_status_callback_); + !pending_get_status_callback_ && + !is_selection_pending()); if (main_resource_blocked_) frontend_->OnContentBlocked(host_id_, blocked_manifest_url_); - // First we handle an unusual case of SelectCache being called a second - // time. Generally this shouldn't happen, but with bad content I think - // this can occur... <html manifest=foo> <html manifest=bar></html></html> - // We handle this by killing whatever loading we have initiated, and by - // unassociating any hosts we currently have associated... and starting - // anew with the inputs to this SelectCache call. - // TODO(michaeln): at some point determine what behavior the algorithms - // described in the HTML5 draft produce and have our impl produce those - // results (or suggest changes to the algorihtms described in the spec - // if the resulting behavior is just too insane). - if (is_selection_pending()) { - service_->storage()->CancelDelegateCallbacks(this); - pending_selected_manifest_url_ = GURL(); - pending_selected_cache_id_ = kNoCacheId; - } else if (associated_cache()) { - AssociateCache(NULL); - } - new_master_entry_url_ = GURL(); - // 6.9.6 The application cache selection algorithm. // The algorithm is started here and continues in FinishCacheSelection, // after cache or group loading is complete. diff --git a/webkit/appcache/web_application_cache_host_impl.cc b/webkit/appcache/web_application_cache_host_impl.cc index 3d9deb9..0bdc11f 100644 --- a/webkit/appcache/web_application_cache_host_impl.cc +++ b/webkit/appcache/web_application_cache_host_impl.cc @@ -72,7 +72,8 @@ WebApplicationCacheHostImpl::WebApplicationCacheHostImpl( status_(UNCACHED), is_scheme_supported_(false), is_get_method_(false), - is_new_master_entry_(MAYBE) { + is_new_master_entry_(MAYBE), + was_select_cache_called_(false) { DCHECK(client && backend && (host_id_ != kNoHostId)); backend_->RegisterHost(host_id_); @@ -171,6 +172,10 @@ void WebApplicationCacheHostImpl::willStartSubResourceRequest( } void WebApplicationCacheHostImpl::selectCacheWithoutManifest() { + if (was_select_cache_called_) + return; + was_select_cache_called_ = true; + status_ = (document_response_.appCacheID() == kNoCacheId) ? UNCACHED : CHECKING; is_new_master_entry_ = NO; @@ -181,6 +186,10 @@ void WebApplicationCacheHostImpl::selectCacheWithoutManifest() { bool WebApplicationCacheHostImpl::selectCacheWithManifest( const WebURL& manifest_url) { + if (was_select_cache_called_) + return true; + was_select_cache_called_ = true; + GURL manifest_gurl(ClearUrlRef(manifest_url)); // 6.9.6 The application cache selection algorithm diff --git a/webkit/appcache/web_application_cache_host_impl.h b/webkit/appcache/web_application_cache_host_impl.h index 4304783..c7af54a 100644 --- a/webkit/appcache/web_application_cache_host_impl.h +++ b/webkit/appcache/web_application_cache_host_impl.h @@ -75,6 +75,7 @@ class WebApplicationCacheHostImpl : public WebKit::WebApplicationCacheHost { IsNewMasterEntry is_new_master_entry_; appcache::AppCacheInfo cache_info_; GURL original_main_resource_url_; // Used to detect redirection. + bool was_select_cache_called_; }; } // namespace |