OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "webkit/appcache/appcache_host.h" | 5 #include "webkit/appcache/appcache_host.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "webkit/appcache/appcache.h" | 10 #include "webkit/appcache/appcache.h" |
11 #include "webkit/appcache/appcache_backend_impl.h" | 11 #include "webkit/appcache/appcache_backend_impl.h" |
| 12 #include "webkit/appcache/appcache_policy.h" |
12 #include "webkit/appcache/appcache_request_handler.h" | 13 #include "webkit/appcache/appcache_request_handler.h" |
13 #include "webkit/quota/quota_manager.h" | 14 #include "webkit/quota/quota_manager.h" |
14 | 15 |
15 namespace appcache { | 16 namespace appcache { |
16 | 17 |
17 namespace { | 18 namespace { |
18 | 19 |
19 void FillCacheInfo( | 20 void FillCacheInfo( |
20 const AppCache* cache, Status status, AppCacheInfo* info) { | 21 const AppCache* cache, Status status, AppCacheInfo* info) { |
21 DCHECK(cache); | 22 DCHECK(cache); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 // MarkAsForeignEntry is called in that case, so that detection | 89 // MarkAsForeignEntry is called in that case, so that detection |
89 // step is skipped here. See WebApplicationCacheHostImpl.cc | 90 // step is skipped here. See WebApplicationCacheHostImpl.cc |
90 | 91 |
91 if (cache_document_was_loaded_from != kNoCacheId) { | 92 if (cache_document_was_loaded_from != kNoCacheId) { |
92 LoadSelectedCache(cache_document_was_loaded_from); | 93 LoadSelectedCache(cache_document_was_loaded_from); |
93 return; | 94 return; |
94 } | 95 } |
95 | 96 |
96 if (!manifest_url.is_empty() && | 97 if (!manifest_url.is_empty() && |
97 (manifest_url.GetOrigin() == document_url.GetOrigin())) { | 98 (manifest_url.GetOrigin() == document_url.GetOrigin())) { |
| 99 DCHECK(!first_party_url_.is_empty()); |
| 100 AppCachePolicy* policy = service()->appcache_policy(); |
| 101 if (policy && |
| 102 !policy->CanCreateAppCache(manifest_url, first_party_url_)) { |
| 103 FinishCacheSelection(NULL, NULL); |
| 104 std::vector<int> host_ids(1, host_id_); |
| 105 frontend_->OnEventRaised(host_ids, CHECKING_EVENT); |
| 106 frontend_->OnErrorEventRaised( |
| 107 host_ids, "Cache creation was blocked by the content policy"); |
| 108 frontend_->OnContentBlocked(host_id_, manifest_url); |
| 109 return; |
| 110 } |
| 111 |
98 // Note: The client detects if the document was not loaded using HTTP GET | 112 // Note: The client detects if the document was not loaded using HTTP GET |
99 // and invokes SelectCache without a manifest url, so that detection step | 113 // and invokes SelectCache without a manifest url, so that detection step |
100 // is also skipped here. See WebApplicationCacheHostImpl.cc | 114 // is also skipped here. See WebApplicationCacheHostImpl.cc |
101 set_preferred_manifest_url(manifest_url); | 115 set_preferred_manifest_url(manifest_url); |
102 new_master_entry_url_ = document_url; | 116 new_master_entry_url_ = document_url; |
103 LoadOrCreateGroup(manifest_url); | 117 LoadOrCreateGroup(manifest_url); |
104 return; | 118 return; |
105 } | 119 } |
106 | 120 |
107 // TODO(michaeln): If there was a manifest URL, the user agent may report | 121 // TODO(michaeln): If there was a manifest URL, the user agent may report |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 AppCacheRequestHandler* AppCacheHost::CreateRequestHandler( | 274 AppCacheRequestHandler* AppCacheHost::CreateRequestHandler( |
261 net::URLRequest* request, | 275 net::URLRequest* request, |
262 ResourceType::Type resource_type) { | 276 ResourceType::Type resource_type) { |
263 if (is_for_dedicated_worker()) { | 277 if (is_for_dedicated_worker()) { |
264 AppCacheHost* parent_host = GetParentAppCacheHost(); | 278 AppCacheHost* parent_host = GetParentAppCacheHost(); |
265 if (parent_host) | 279 if (parent_host) |
266 return parent_host->CreateRequestHandler(request, resource_type); | 280 return parent_host->CreateRequestHandler(request, resource_type); |
267 return NULL; | 281 return NULL; |
268 } | 282 } |
269 | 283 |
270 if (AppCacheRequestHandler::IsMainResourceType(resource_type)) | 284 if (AppCacheRequestHandler::IsMainResourceType(resource_type)) { |
| 285 // Store the first party origin so that it can be used later in SelectCache |
| 286 // for checking whether the creation of the appcache is allowed. |
| 287 first_party_url_ = request->first_party_for_cookies(); |
271 return new AppCacheRequestHandler(this, resource_type); | 288 return new AppCacheRequestHandler(this, resource_type); |
| 289 } |
272 | 290 |
273 if ((associated_cache() && associated_cache()->is_complete()) || | 291 if ((associated_cache() && associated_cache()->is_complete()) || |
274 is_selection_pending()) { | 292 is_selection_pending()) { |
275 return new AppCacheRequestHandler(this, resource_type); | 293 return new AppCacheRequestHandler(this, resource_type); |
276 } | 294 } |
277 return NULL; | 295 return NULL; |
278 } | 296 } |
279 | 297 |
280 void AppCacheHost::GetResourceList( | 298 void AppCacheHost::GetResourceList( |
281 AppCacheResourceInfoVector* resource_infos) { | 299 AppCacheResourceInfoVector* resource_infos) { |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 | 432 |
415 if (associated_cache_info_pending_ && associated_cache_.get() && | 433 if (associated_cache_info_pending_ && associated_cache_.get() && |
416 associated_cache_->is_complete()) { | 434 associated_cache_->is_complete()) { |
417 AppCacheInfo info; | 435 AppCacheInfo info; |
418 FillCacheInfo(associated_cache_.get(), GetStatus(), &info); | 436 FillCacheInfo(associated_cache_.get(), GetStatus(), &info); |
419 associated_cache_info_pending_ = false; | 437 associated_cache_info_pending_ = false; |
420 frontend_->OnCacheSelected(host_id_, info); | 438 frontend_->OnCacheSelected(host_id_, info); |
421 } | 439 } |
422 } | 440 } |
423 | 441 |
424 void AppCacheHost::OnContentBlocked(AppCacheGroup* group) { | |
425 frontend_->OnContentBlocked(host_id_, group->manifest_url()); | |
426 } | |
427 | |
428 void AppCacheHost::SetSwappableCache(AppCacheGroup* group) { | 442 void AppCacheHost::SetSwappableCache(AppCacheGroup* group) { |
429 if (!group) { | 443 if (!group) { |
430 swappable_cache_ = NULL; | 444 swappable_cache_ = NULL; |
431 } else { | 445 } else { |
432 AppCache* new_cache = group->newest_complete_cache(); | 446 AppCache* new_cache = group->newest_complete_cache(); |
433 if (new_cache != associated_cache_) | 447 if (new_cache != associated_cache_) |
434 swappable_cache_ = new_cache; | 448 swappable_cache_ = new_cache; |
435 else | 449 else |
436 swappable_cache_ = NULL; | 450 swappable_cache_ = NULL; |
437 } | 451 } |
(...skipping 29 matching lines...) Expand all Loading... |
467 associated_cache_info_pending_ = cache && !cache->is_complete(); | 481 associated_cache_info_pending_ = cache && !cache->is_complete(); |
468 AppCacheInfo info; | 482 AppCacheInfo info; |
469 if (cache) { | 483 if (cache) { |
470 cache->AssociateHost(this); | 484 cache->AssociateHost(this); |
471 FillCacheInfo(cache, GetStatus(), &info); | 485 FillCacheInfo(cache, GetStatus(), &info); |
472 } | 486 } |
473 frontend_->OnCacheSelected(host_id_, info); | 487 frontend_->OnCacheSelected(host_id_, info); |
474 } | 488 } |
475 | 489 |
476 } // namespace appcache | 490 } // namespace appcache |
OLD | NEW |