diff options
Diffstat (limited to 'webkit/appcache/appcache_host.cc')
-rw-r--r-- | webkit/appcache/appcache_host.cc | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/webkit/appcache/appcache_host.cc b/webkit/appcache/appcache_host.cc index cb040ef..ddc9bd2 100644 --- a/webkit/appcache/appcache_host.cc +++ b/webkit/appcache/appcache_host.cc @@ -9,6 +9,7 @@ #include "base/stringprintf.h" #include "webkit/appcache/appcache.h" #include "webkit/appcache/appcache_backend_impl.h" +#include "webkit/appcache/appcache_policy.h" #include "webkit/appcache/appcache_request_handler.h" #include "webkit/quota/quota_manager.h" @@ -95,6 +96,19 @@ void AppCacheHost::SelectCache(const GURL& document_url, if (!manifest_url.is_empty() && (manifest_url.GetOrigin() == document_url.GetOrigin())) { + DCHECK(!first_party_url_.is_empty()); + AppCachePolicy* policy = service()->appcache_policy(); + if (policy && + !policy->CanCreateAppCache(manifest_url, first_party_url_)) { + FinishCacheSelection(NULL, NULL); + std::vector<int> host_ids(1, host_id_); + frontend_->OnEventRaised(host_ids, CHECKING_EVENT); + frontend_->OnErrorEventRaised( + host_ids, "Cache creation was blocked by the content policy"); + frontend_->OnContentBlocked(host_id_, manifest_url); + return; + } + // Note: The client detects if the document was not loaded using HTTP GET // and invokes SelectCache without a manifest url, so that detection step // is also skipped here. See WebApplicationCacheHostImpl.cc @@ -267,8 +281,12 @@ AppCacheRequestHandler* AppCacheHost::CreateRequestHandler( return NULL; } - if (AppCacheRequestHandler::IsMainResourceType(resource_type)) + if (AppCacheRequestHandler::IsMainResourceType(resource_type)) { + // Store the first party origin so that it can be used later in SelectCache + // for checking whether the creation of the appcache is allowed. + first_party_url_ = request->first_party_for_cookies(); return new AppCacheRequestHandler(this, resource_type); + } if ((associated_cache() && associated_cache()->is_complete()) || is_selection_pending()) { @@ -421,10 +439,6 @@ void AppCacheHost::OnUpdateComplete(AppCacheGroup* group) { } } -void AppCacheHost::OnContentBlocked(AppCacheGroup* group) { - frontend_->OnContentBlocked(host_id_, group->manifest_url()); -} - void AppCacheHost::SetSwappableCache(AppCacheGroup* group) { if (!group) { swappable_cache_ = NULL; |