Index: webkit/appcache/appcache.cc |
=================================================================== |
--- webkit/appcache/appcache.cc (revision 113546) |
+++ webkit/appcache/appcache.cc (working copy) |
@@ -82,36 +82,40 @@ |
GURL AppCache::GetFallbackEntryUrl(const GURL& namespace_url) const { |
size_t count = fallback_namespaces_.size(); |
for (size_t i = 0; i < count; ++i) { |
- if (fallback_namespaces_[i].first == namespace_url) |
- return fallback_namespaces_[i].second; |
+ if (fallback_namespaces_[i].namespace_url == namespace_url) |
+ return fallback_namespaces_[i].target_url; |
} |
NOTREACHED(); |
return GURL(); |
} |
namespace { |
-bool SortByLength( |
- const FallbackNamespace& lhs, const FallbackNamespace& rhs) { |
- return lhs.first.spec().length() > rhs.first.spec().length(); |
+bool SortNamespacesByLength( |
+ const Namespace& lhs, const Namespace& rhs) { |
+ return lhs.namespace_url.spec().length() > rhs.namespace_url.spec().length(); |
} |
} |
void AppCache::InitializeWithManifest(Manifest* manifest) { |
DCHECK(manifest); |
+ intercept_namespaces_.swap(manifest->intercept_namespaces); |
fallback_namespaces_.swap(manifest->fallback_namespaces); |
online_whitelist_namespaces_.swap(manifest->online_whitelist_namespaces); |
online_whitelist_all_ = manifest->online_whitelist_all; |
- // Sort the fallback namespaces by url string length, longest to shortest, |
+ // Sort the namespaces by url string length, longest to shortest, |
// since longer matches trump when matching a url to a namespace. |
+ std::sort(intercept_namespaces_.begin(), intercept_namespaces_.end(), |
+ SortNamespacesByLength); |
std::sort(fallback_namespaces_.begin(), fallback_namespaces_.end(), |
- SortByLength); |
+ SortNamespacesByLength); |
} |
void AppCache::InitializeWithDatabaseRecords( |
const AppCacheDatabase::CacheRecord& cache_record, |
const std::vector<AppCacheDatabase::EntryRecord>& entries, |
- const std::vector<AppCacheDatabase::FallbackNameSpaceRecord>& fallbacks, |
+ const std::vector<AppCacheDatabase::NamespaceRecord>& intercepts, |
+ const std::vector<AppCacheDatabase::NamespaceRecord>& fallbacks, |
const std::vector<AppCacheDatabase::OnlineWhiteListRecord>& whitelists) { |
DCHECK(cache_id_ == cache_record.cache_id); |
online_whitelist_all_ = cache_record.online_wildcard; |
@@ -124,16 +128,28 @@ |
} |
DCHECK(cache_size_ == cache_record.cache_size); |
+ for (size_t i = 0; i < intercepts.size(); ++i) { |
+ const AppCacheDatabase::NamespaceRecord& intercept = intercepts.at(i); |
+ intercept_namespaces_.push_back( |
+ Namespace(INTERCEPT_NAMESPACE, |
+ intercept.namespace_url, |
+ intercept.target_url)); |
+ } |
+ |
for (size_t i = 0; i < fallbacks.size(); ++i) { |
- const AppCacheDatabase::FallbackNameSpaceRecord& fallback = fallbacks.at(i); |
+ const AppCacheDatabase::NamespaceRecord& fallback = fallbacks.at(i); |
fallback_namespaces_.push_back( |
- FallbackNamespace(fallback.namespace_url, fallback.fallback_entry_url)); |
+ Namespace(FALLBACK_NAMESPACE, |
+ fallback.namespace_url, |
+ fallback.target_url)); |
} |
// Sort the fallback namespaces by url string length, longest to shortest, |
// since longer matches trump when matching a url to a namespace. |
+ std::sort(intercept_namespaces_.begin(), intercept_namespaces_.end(), |
+ SortNamespacesByLength); |
std::sort(fallback_namespaces_.begin(), fallback_namespaces_.end(), |
- SortByLength); |
+ SortNamespacesByLength); |
if (!online_whitelist_all_) { |
for (size_t i = 0; i < whitelists.size(); ++i) { |
@@ -146,7 +162,8 @@ |
const AppCacheGroup* group, |
AppCacheDatabase::CacheRecord* cache_record, |
std::vector<AppCacheDatabase::EntryRecord>* entries, |
- std::vector<AppCacheDatabase::FallbackNameSpaceRecord>* fallbacks, |
+ std::vector<AppCacheDatabase::NamespaceRecord>* intercepts, |
+ std::vector<AppCacheDatabase::NamespaceRecord>* fallbacks, |
std::vector<AppCacheDatabase::OnlineWhiteListRecord>* whitelists) { |
DCHECK(group && cache_record && entries && fallbacks && whitelists); |
DCHECK(entries->empty() && fallbacks->empty() && whitelists->empty()); |
@@ -171,13 +188,24 @@ |
GURL origin = group->manifest_url().GetOrigin(); |
+ for (size_t i = 0; i < intercept_namespaces_.size(); ++i) { |
+ intercepts->push_back(AppCacheDatabase::NamespaceRecord()); |
+ AppCacheDatabase::NamespaceRecord& record = intercepts->back(); |
+ record.cache_id = cache_id_; |
+ record.origin = origin; |
+ record.type = INTERCEPT_NAMESPACE; |
+ record.namespace_url = intercept_namespaces_[i].namespace_url; |
+ record.target_url = intercept_namespaces_[i].target_url; |
+ } |
+ |
for (size_t i = 0; i < fallback_namespaces_.size(); ++i) { |
- fallbacks->push_back(AppCacheDatabase::FallbackNameSpaceRecord()); |
- AppCacheDatabase::FallbackNameSpaceRecord& record = fallbacks->back(); |
+ fallbacks->push_back(AppCacheDatabase::NamespaceRecord()); |
+ AppCacheDatabase::NamespaceRecord& record = fallbacks->back(); |
record.cache_id = cache_id_; |
record.origin = origin; |
- record.namespace_url = fallback_namespaces_[i].first; |
- record.fallback_entry_url = fallback_namespaces_[i].second; |
+ record.type = FALLBACK_NAMESPACE; |
+ record.namespace_url = fallback_namespaces_[i].namespace_url; |
+ record.target_url = fallback_namespaces_[i].target_url; |
} |
if (!online_whitelist_all_) { |
@@ -216,12 +244,20 @@ |
return true; |
} |
- FallbackNamespace* fallback_namespace = FindFallbackNamespace(url_no_ref); |
+ const Namespace* intercept_namespace = FindInterceptNamespace(url_no_ref); |
+ if (intercept_namespace) { |
+ entry = GetEntry(intercept_namespace->target_url); |
+ DCHECK(entry); |
+ *found_entry = *entry; |
+ return true; |
+ } |
+ |
+ const Namespace* fallback_namespace = FindFallbackNamespace(url_no_ref); |
if (fallback_namespace) { |
- entry = GetEntry(fallback_namespace->second); |
+ entry = GetEntry(fallback_namespace->target_url); |
DCHECK(entry); |
*found_fallback_entry = *entry; |
- *found_fallback_namespace = fallback_namespace->first; |
+ *found_fallback_namespace = fallback_namespace->namespace_url; |
return true; |
} |
@@ -229,12 +265,13 @@ |
return *found_network_namespace; |
} |
-FallbackNamespace* AppCache::FindFallbackNamespace(const GURL& url) { |
- size_t count = fallback_namespaces_.size(); |
+const Namespace* AppCache::FindNamespace( |
+ const NamespaceVector& namespaces, const GURL& url) { |
+ size_t count = namespaces.size(); |
for (size_t i = 0; i < count; ++i) { |
if (StartsWithASCII( |
- url.spec(), fallback_namespaces_[i].first.spec(), true)) { |
- return &fallback_namespaces_[i]; |
+ url.spec(), namespaces[i].namespace_url.spec(), true)) { |
+ return &namespaces[i]; |
} |
} |
return NULL; |