Index: chrome/browser/net/http_server_properties_manager.cc |
diff --git a/chrome/browser/net/http_server_properties_manager.cc b/chrome/browser/net/http_server_properties_manager.cc |
index d99af2c82767c90d19089934cc737c739a68c1fc..85961e0035efcea1023583c25b3b00b33ab1b8bd 100644 |
--- a/chrome/browser/net/http_server_properties_manager.cc |
+++ b/chrome/browser/net/http_server_properties_manager.cc |
@@ -30,11 +30,6 @@ namespace { |
// timer. |
const int64 kUpdateCacheDelayMs = 1000; |
-// Time to wait before starting an update the preferences from the |
-// http_server_properties_impl_ cache. Scheduling another update during this |
-// period will reset the timer. |
-const int64 kUpdatePrefsDelayMs = 5000; |
- |
// "version" 0 indicates, http_server_properties doesn't have "version" |
// property. |
const int kMissingVersion = 0; |
@@ -53,9 +48,6 @@ const int kMaxAlternateProtocolHostsToPersist = 1000; |
// Persist 200 MRU SpdySettingsHostPortPairs. |
const int kMaxSpdySettingsHostsToPersist = 200; |
-// Persist 300 MRU SupportsSpdyServerHostPortPairs. |
-const int kMaxSupportsSpdyServerHostsToPersist = 300; |
- |
} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
@@ -80,18 +72,18 @@ HttpServerPropertiesManager::HttpServerPropertiesManager( |
} |
HttpServerPropertiesManager::~HttpServerPropertiesManager() { |
+ // Why does destruction happen on the IO thread? |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- io_weak_ptr_factory_.reset(); |
} |
void HttpServerPropertiesManager::InitializeOnIOThread() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- io_weak_ptr_factory_.reset( |
- new base::WeakPtrFactory<HttpServerPropertiesManager>(this)); |
- http_server_properties_impl_.reset(new net::HttpServerPropertiesImpl()); |
+ ChromeHttpServerProperties::UpdateCallback io_callback = |
+ base::Bind(&HttpServerPropertiesManager::UpdatePrefsOnIO, |
+ ui_weak_ptr_); |
- io_prefs_update_timer_.reset( |
- new base::OneShotTimer<HttpServerPropertiesManager>); |
+ http_server_properties_impl_.reset( |
+ new ChromeHttpServerProperties(io_callback)); |
BrowserThread::PostTask( |
BrowserThread::UI, |
@@ -108,6 +100,11 @@ void HttpServerPropertiesManager::ShutdownOnUIThread() { |
pref_change_registrar_.RemoveAll(); |
} |
+net::HttpServerProperties* HttpServerPropertiesManager::http_server_properties() { |
+ return http_server_properties_impl_.get(); |
+} |
+ |
+ |
// static |
void HttpServerPropertiesManager::RegisterProfilePrefs( |
user_prefs::PrefRegistrySyncable* prefs) { |
@@ -127,159 +124,6 @@ void HttpServerPropertiesManager::SetVersion( |
http_server_properties_dict->SetInteger("version", version_number); |
} |
-// This is required for conformance with the HttpServerProperties interface. |
-base::WeakPtr<net::HttpServerProperties> |
- HttpServerPropertiesManager::GetWeakPtr() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return io_weak_ptr_factory_->GetWeakPtr(); |
-} |
- |
-void HttpServerPropertiesManager::Clear() { |
- Clear(base::Closure()); |
-} |
- |
-void HttpServerPropertiesManager::Clear(const base::Closure& completion) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- http_server_properties_impl_->Clear(); |
- UpdatePrefsFromCacheOnIO(completion); |
-} |
- |
-bool HttpServerPropertiesManager::SupportsSpdy( |
- const net::HostPortPair& server) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->SupportsSpdy(server); |
-} |
- |
-void HttpServerPropertiesManager::SetSupportsSpdy( |
- const net::HostPortPair& server, |
- bool support_spdy) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- http_server_properties_impl_->SetSupportsSpdy(server, support_spdy); |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
-bool HttpServerPropertiesManager::HasAlternateProtocol( |
- const net::HostPortPair& server) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->HasAlternateProtocol(server); |
-} |
- |
-net::PortAlternateProtocolPair |
-HttpServerPropertiesManager::GetAlternateProtocol( |
- const net::HostPortPair& server) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->GetAlternateProtocol(server); |
-} |
- |
-void HttpServerPropertiesManager::SetAlternateProtocol( |
- const net::HostPortPair& server, |
- uint16 alternate_port, |
- net::AlternateProtocol alternate_protocol) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- http_server_properties_impl_->SetAlternateProtocol( |
- server, alternate_port, alternate_protocol); |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
-void HttpServerPropertiesManager::SetBrokenAlternateProtocol( |
- const net::HostPortPair& server) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- http_server_properties_impl_->SetBrokenAlternateProtocol(server); |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
-bool HttpServerPropertiesManager::WasAlternateProtocolRecentlyBroken( |
- const net::HostPortPair& server) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->WasAlternateProtocolRecentlyBroken( |
- server); |
-} |
- |
-void HttpServerPropertiesManager::ConfirmAlternateProtocol( |
- const net::HostPortPair& server) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- http_server_properties_impl_->ConfirmAlternateProtocol(server); |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
-void HttpServerPropertiesManager::ClearAlternateProtocol( |
- const net::HostPortPair& server) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- http_server_properties_impl_->ClearAlternateProtocol(server); |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
-const net::AlternateProtocolMap& |
-HttpServerPropertiesManager::alternate_protocol_map() const { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->alternate_protocol_map(); |
-} |
- |
-void HttpServerPropertiesManager::SetAlternateProtocolExperiment( |
- net::AlternateProtocolExperiment experiment) { |
- http_server_properties_impl_->SetAlternateProtocolExperiment(experiment); |
-} |
- |
-net::AlternateProtocolExperiment |
-HttpServerPropertiesManager::GetAlternateProtocolExperiment() const { |
- return http_server_properties_impl_->GetAlternateProtocolExperiment(); |
-} |
- |
-const net::SettingsMap& |
-HttpServerPropertiesManager::GetSpdySettings( |
- const net::HostPortPair& host_port_pair) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->GetSpdySettings(host_port_pair); |
-} |
- |
-bool HttpServerPropertiesManager::SetSpdySetting( |
- const net::HostPortPair& host_port_pair, |
- net::SpdySettingsIds id, |
- net::SpdySettingsFlags flags, |
- uint32 value) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- bool persist = http_server_properties_impl_->SetSpdySetting( |
- host_port_pair, id, flags, value); |
- if (persist) |
- ScheduleUpdatePrefsOnIO(); |
- return persist; |
-} |
- |
-void HttpServerPropertiesManager::ClearSpdySettings( |
- const net::HostPortPair& host_port_pair) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- http_server_properties_impl_->ClearSpdySettings(host_port_pair); |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
-void HttpServerPropertiesManager::ClearAllSpdySettings() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- http_server_properties_impl_->ClearAllSpdySettings(); |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
-const net::SpdySettingsMap& |
-HttpServerPropertiesManager::spdy_settings_map() const { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->spdy_settings_map(); |
-} |
- |
-void HttpServerPropertiesManager::SetServerNetworkStats( |
- const net::HostPortPair& host_port_pair, |
- NetworkStats stats) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- http_server_properties_impl_->SetServerNetworkStats(host_port_pair, stats); |
-} |
- |
-const HttpServerPropertiesManager::NetworkStats* |
-HttpServerPropertiesManager::GetServerNetworkStats( |
- const net::HostPortPair& host_port_pair) const { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- return http_server_properties_impl_->GetServerNetworkStats(host_port_pair); |
-} |
- |
// |
// Update the HttpServerPropertiesImpl's cache with data from preferences. |
// |
@@ -451,9 +295,9 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnUI() { |
BrowserThread::PostTask( |
BrowserThread::IO, |
FROM_HERE, |
- base::Bind(&HttpServerPropertiesManager:: |
+ base::Bind(&ChromeHttpServerProperties:: |
UpdateCacheFromPrefsOnIO, |
- base::Unretained(this), |
+ base::Unretained(http_server_properties_impl_.get()), |
base::Owned(spdy_servers.release()), |
base::Owned(spdy_settings_map.release()), |
base::Owned(alternate_protocol_map.release()), |
@@ -461,117 +305,6 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnUI() { |
detected_corrupted_prefs)); |
} |
-void HttpServerPropertiesManager::UpdateCacheFromPrefsOnIO( |
- StringVector* spdy_servers, |
- net::SpdySettingsMap* spdy_settings_map, |
- net::AlternateProtocolMap* alternate_protocol_map, |
- net::AlternateProtocolExperiment alternate_protocol_experiment, |
- bool detected_corrupted_prefs) { |
- // Preferences have the master data because admins might have pushed new |
- // preferences. Update the cached data with new data from preferences. |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); |
- http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); |
- |
- // Update the cached data and use the new spdy_settings from preferences. |
- UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); |
- http_server_properties_impl_->InitializeSpdySettingsServers( |
- spdy_settings_map); |
- |
- // Update the cached data and use the new Alternate-Protocol server list from |
- // preferences. |
- UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", |
- alternate_protocol_map->size()); |
- http_server_properties_impl_->InitializeAlternateProtocolServers( |
- alternate_protocol_map); |
- http_server_properties_impl_->SetAlternateProtocolExperiment( |
- alternate_protocol_experiment); |
- |
- // Update the prefs with what we have read (delete all corrupted prefs). |
- if (detected_corrupted_prefs) |
- ScheduleUpdatePrefsOnIO(); |
-} |
- |
- |
-// |
-// Update Preferences with data from the cached data. |
-// |
-void HttpServerPropertiesManager::ScheduleUpdatePrefsOnIO() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- // Cancel pending updates, if any. |
- io_prefs_update_timer_->Stop(); |
- StartPrefsUpdateTimerOnIO( |
- base::TimeDelta::FromMilliseconds(kUpdatePrefsDelayMs)); |
-} |
- |
-void HttpServerPropertiesManager::StartPrefsUpdateTimerOnIO( |
- base::TimeDelta delay) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- // This is overridden in tests to post the task without the delay. |
- io_prefs_update_timer_->Start( |
- FROM_HERE, delay, this, |
- &HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO); |
-} |
- |
-// This is required so we can set this as the callback for a timer. |
-void HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO() { |
- UpdatePrefsFromCacheOnIO(base::Closure()); |
-} |
- |
-void HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO( |
- const base::Closure& completion) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- base::ListValue* spdy_server_list = new base::ListValue; |
- http_server_properties_impl_->GetSpdyServerList( |
- spdy_server_list, kMaxSupportsSpdyServerHostsToPersist); |
- |
- net::SpdySettingsMap* spdy_settings_map = |
- new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist); |
- const net::SpdySettingsMap& main_map = |
- http_server_properties_impl_->spdy_settings_map(); |
- int count = 0; |
- for (net::SpdySettingsMap::const_iterator it = main_map.begin(); |
- it != main_map.end() && count < kMaxSpdySettingsHostsToPersist; |
- ++it, ++count) { |
- spdy_settings_map->Put(it->first, it->second); |
- } |
- |
- net::AlternateProtocolMap* alternate_protocol_map = |
- new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist); |
- const net::AlternateProtocolMap& map = |
- http_server_properties_impl_->alternate_protocol_map(); |
- count = 0; |
- typedef std::map<std::string, bool> CanonicalHostPersistedMap; |
- CanonicalHostPersistedMap persisted_map; |
- for (net::AlternateProtocolMap::const_iterator it = map.begin(); |
- it != map.end() && count < kMaxAlternateProtocolHostsToPersist; |
- ++it) { |
- const net::HostPortPair& server = it->first; |
- std::string canonical_suffix = |
- http_server_properties_impl_->GetCanonicalSuffix(server); |
- if (!canonical_suffix.empty()) { |
- if (persisted_map.find(canonical_suffix) != persisted_map.end()) |
- continue; |
- persisted_map[canonical_suffix] = true; |
- } |
- alternate_protocol_map->Put(server, it->second); |
- ++count; |
- } |
- |
- // Update the preferences on the UI thread. |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&HttpServerPropertiesManager::UpdatePrefsOnUI, |
- ui_weak_ptr_, |
- base::Owned(spdy_server_list), |
- base::Owned(spdy_settings_map), |
- base::Owned(alternate_protocol_map), |
- completion)); |
-} |
- |
// A local or temporary data structure to hold |supports_spdy|, SpdySettings, |
// and PortAlternateProtocolPair preferences for a server. This is used only in |
// UpdatePrefsOnUI. |
@@ -717,6 +450,25 @@ void HttpServerPropertiesManager::UpdatePrefsOnUI( |
completion.Run(); |
} |
+// static |
+void HttpServerPropertiesManager::UpdatePrefsOnIO( |
+ base::WeakPtr<HttpServerPropertiesManager> ui_weak_ptr, |
+ base::ListValue* spdy_server_list, |
+ net::SpdySettingsMap* spdy_settings_map, |
+ net::AlternateProtocolMap* alternate_protocol_map, |
+ const base::Closure& completion) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&HttpServerPropertiesManager::UpdatePrefsOnUI, |
+ ui_weak_ptr, |
+ spdy_server_list, |
+ spdy_settings_map, |
+ alternate_protocol_map, |
+ completion)); |
+} |
+ |
void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
if (!setting_prefs_) |