Index: net/base/sdch_manager.cc |
diff --git a/net/base/sdch_manager.cc b/net/base/sdch_manager.cc |
index ad260a58e3f0c28d099c33ec65e677f6a0f85818..3cd838f4777f92308864a9c7d249d777ccbe47e9 100644 |
--- a/net/base/sdch_manager.cc |
+++ b/net/base/sdch_manager.cc |
@@ -219,11 +219,24 @@ SdchManager::~SdchManager() { |
DCHECK(CalledOnValidThread()); |
while (!dictionaries_.empty()) { |
DictionaryMap::iterator it = dictionaries_.begin(); |
- it->second->Release(); |
dictionaries_.erase(it->first); |
} |
} |
+void SdchManager::ClearData() { |
+ blacklisted_domains_.clear(); |
+ exponential_blacklist_count_.clear(); |
+ allow_latency_experiment_.clear(); |
+ if (fetcher_.get()) |
+ fetcher_->Cancel(); |
+ |
+ // Note that this may result in not having dictionaries we've advertised |
+ // for incoming responses. The window is relatively small (as ClearData() |
+ // is not expected to be called frequently), so we rely on meta-refresh |
+ // to handle this case. |
+ dictionaries_.clear(); |
+} |
+ |
// static |
void SdchManager::SdchErrorRecovery(ProblemCodes problem) { |
UMA_HISTOGRAM_ENUMERATION("Sdch3.ProblemCodes_4", problem, MAX_PROBLEM_CODE); |
@@ -252,9 +265,9 @@ void SdchManager::BlacklistDomain(const GURL& url) { |
if (count > 0) |
return; // Domain is already blacklisted. |
- count = 1 + 2 * exponential_blacklist_count[domain]; |
+ count = 1 + 2 * exponential_blacklist_count_[domain]; |
if (count > 0) |
- exponential_blacklist_count[domain] = count; |
+ exponential_blacklist_count_[domain] = count; |
else |
count = INT_MAX; |
@@ -265,13 +278,13 @@ void SdchManager::BlacklistDomainForever(const GURL& url) { |
SetAllowLatencyExperiment(url, false); |
std::string domain(StringToLowerASCII(url.host())); |
- exponential_blacklist_count[domain] = INT_MAX; |
+ exponential_blacklist_count_[domain] = INT_MAX; |
blacklisted_domains_[domain] = INT_MAX; |
} |
void SdchManager::ClearBlacklistings() { |
blacklisted_domains_.clear(); |
- exponential_blacklist_count.clear(); |
+ exponential_blacklist_count_.clear(); |
} |
void SdchManager::ClearDomainBlacklisting(const std::string& domain) { |
@@ -285,10 +298,10 @@ int SdchManager::BlackListDomainCount(const std::string& domain) { |
} |
int SdchManager::BlacklistDomainExponential(const std::string& domain) { |
- if (exponential_blacklist_count.end() == |
- exponential_blacklist_count.find(domain)) |
+ if (exponential_blacklist_count_.end() == |
+ exponential_blacklist_count_.find(domain)) |
return 0; |
- return exponential_blacklist_count[StringToLowerASCII(domain)]; |
+ return exponential_blacklist_count_[StringToLowerASCII(domain)]; |
} |
bool SdchManager::IsInSupportedDomain(const GURL& url) { |
@@ -455,20 +468,21 @@ bool SdchManager::AddSdchDictionary(const std::string& dictionary_text, |
Dictionary* dictionary = |
new Dictionary(dictionary_text, header_end + 2, client_hash, |
dictionary_url, domain, path, expiration, ports); |
- dictionary->AddRef(); |
dictionaries_[server_hash] = dictionary; |
return true; |
} |
-void SdchManager::GetVcdiffDictionary(const std::string& server_hash, |
- const GURL& referring_url, Dictionary** dictionary) { |
+void SdchManager::GetVcdiffDictionary( |
+ const std::string& server_hash, |
+ const GURL& referring_url, |
+ scoped_refptr<Dictionary>* dictionary) { |
DCHECK(CalledOnValidThread()); |
*dictionary = NULL; |
DictionaryMap::iterator it = dictionaries_.find(server_hash); |
if (it == dictionaries_.end()) { |
return; |
} |
- Dictionary* matching_dictionary = it->second; |
+ scoped_refptr<Dictionary> matching_dictionary = it->second; |
if (!IsInSupportedDomain(referring_url)) |
return; |
if (!matching_dictionary->CanUse(referring_url)) |