| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/net/http_server_properties_manager.h" | 5 #include "chrome/browser/net/http_server_properties_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 const int kVersionNumber = 2; | 42 const int kVersionNumber = 2; |
| 43 | 43 |
| 44 typedef std::vector<std::string> StringVector; | 44 typedef std::vector<std::string> StringVector; |
| 45 | 45 |
| 46 // Persist 200 MRU AlternateProtocolHostPortPairs. | 46 // Persist 200 MRU AlternateProtocolHostPortPairs. |
| 47 const int kMaxAlternateProtocolHostsToPersist = 200; | 47 const int kMaxAlternateProtocolHostsToPersist = 200; |
| 48 | 48 |
| 49 // Persist 200 MRU SpdySettingsHostPortPairs. | 49 // Persist 200 MRU SpdySettingsHostPortPairs. |
| 50 const int kMaxSpdySettingsHostsToPersist = 200; | 50 const int kMaxSpdySettingsHostsToPersist = 200; |
| 51 | 51 |
| 52 // Persist 300 MRU SupportsSpdyServerHostPortPairs. |
| 53 const int kMaxSupportsSpdyServerHostsToPersist = 300; |
| 54 |
| 52 } // namespace | 55 } // namespace |
| 53 | 56 |
| 54 //////////////////////////////////////////////////////////////////////////////// | 57 //////////////////////////////////////////////////////////////////////////////// |
| 55 // HttpServerPropertiesManager | 58 // HttpServerPropertiesManager |
| 56 | 59 |
| 57 HttpServerPropertiesManager::HttpServerPropertiesManager( | 60 HttpServerPropertiesManager::HttpServerPropertiesManager( |
| 58 PrefService* pref_service) | 61 PrefService* pref_service) |
| 59 : pref_service_(pref_service), | 62 : pref_service_(pref_service), |
| 60 setting_prefs_(false) { | 63 setting_prefs_(false) { |
| 61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 64 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 } | 135 } |
| 133 | 136 |
| 134 void HttpServerPropertiesManager::Clear(const base::Closure& completion) { | 137 void HttpServerPropertiesManager::Clear(const base::Closure& completion) { |
| 135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 136 | 139 |
| 137 http_server_properties_impl_->Clear(); | 140 http_server_properties_impl_->Clear(); |
| 138 UpdatePrefsFromCacheOnIO(completion); | 141 UpdatePrefsFromCacheOnIO(completion); |
| 139 } | 142 } |
| 140 | 143 |
| 141 bool HttpServerPropertiesManager::SupportsSpdy( | 144 bool HttpServerPropertiesManager::SupportsSpdy( |
| 142 const net::HostPortPair& server) const { | 145 const net::HostPortPair& server) { |
| 143 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 144 return http_server_properties_impl_->SupportsSpdy(server); | 147 return http_server_properties_impl_->SupportsSpdy(server); |
| 145 } | 148 } |
| 146 | 149 |
| 147 void HttpServerPropertiesManager::SetSupportsSpdy( | 150 void HttpServerPropertiesManager::SetSupportsSpdy( |
| 148 const net::HostPortPair& server, | 151 const net::HostPortPair& server, |
| 149 bool support_spdy) { | 152 bool support_spdy) { |
| 150 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 153 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 151 | 154 |
| 152 http_server_properties_impl_->SetSupportsSpdy(server, support_spdy); | 155 http_server_properties_impl_->SetSupportsSpdy(server, support_spdy); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 | 330 |
| 328 // The properties for a given server is in | 331 // The properties for a given server is in |
| 329 // http_server_properties_dict["servers"][server]. | 332 // http_server_properties_dict["servers"][server]. |
| 330 const base::DictionaryValue* servers_dict = NULL; | 333 const base::DictionaryValue* servers_dict = NULL; |
| 331 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( | 334 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( |
| 332 "servers", &servers_dict)) { | 335 "servers", &servers_dict)) { |
| 333 DVLOG(1) << "Malformed http_server_properties for servers."; | 336 DVLOG(1) << "Malformed http_server_properties for servers."; |
| 334 return; | 337 return; |
| 335 } | 338 } |
| 336 | 339 |
| 337 // TODO(rtenneti): Mark entries with an LRU sequence number (date of access?), | |
| 338 // and then truncate down deleting old stuff. | |
| 339 if (version != kVersionNumber && servers_dict->size() > 300) { | |
| 340 DVLOG(1) << "Size is too large. Clearing all properties."; | |
| 341 return; | |
| 342 } | |
| 343 | |
| 344 // String is host/port pair of spdy server. | 340 // String is host/port pair of spdy server. |
| 345 scoped_ptr<StringVector> spdy_servers(new StringVector); | 341 scoped_ptr<StringVector> spdy_servers(new StringVector); |
| 346 scoped_ptr<net::SpdySettingsMap> spdy_settings_map( | 342 scoped_ptr<net::SpdySettingsMap> spdy_settings_map( |
| 347 new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); | 343 new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); |
| 348 scoped_ptr<net::PipelineCapabilityMap> pipeline_capability_map( | 344 scoped_ptr<net::PipelineCapabilityMap> pipeline_capability_map( |
| 349 new net::PipelineCapabilityMap); | 345 new net::PipelineCapabilityMap); |
| 350 scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map( | 346 scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map( |
| 351 new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); | 347 new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); |
| 352 | 348 |
| 353 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); | 349 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 // This is required so we can set this as the callback for a timer. | 521 // This is required so we can set this as the callback for a timer. |
| 526 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO() { | 522 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO() { |
| 527 UpdatePrefsFromCacheOnIO(base::Closure()); | 523 UpdatePrefsFromCacheOnIO(base::Closure()); |
| 528 } | 524 } |
| 529 | 525 |
| 530 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO( | 526 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnIO( |
| 531 const base::Closure& completion) { | 527 const base::Closure& completion) { |
| 532 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 528 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 533 | 529 |
| 534 base::ListValue* spdy_server_list = new base::ListValue; | 530 base::ListValue* spdy_server_list = new base::ListValue; |
| 535 http_server_properties_impl_->GetSpdyServerList(spdy_server_list); | 531 http_server_properties_impl_->GetSpdyServerList( |
| 532 spdy_server_list, kMaxSupportsSpdyServerHostsToPersist); |
| 536 | 533 |
| 537 net::SpdySettingsMap* spdy_settings_map = | 534 net::SpdySettingsMap* spdy_settings_map = |
| 538 new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist); | 535 new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist); |
| 539 const net::SpdySettingsMap& main_map = | 536 const net::SpdySettingsMap& main_map = |
| 540 http_server_properties_impl_->spdy_settings_map(); | 537 http_server_properties_impl_->spdy_settings_map(); |
| 541 int count = 0; | 538 int count = 0; |
| 542 for (net::SpdySettingsMap::const_iterator it = main_map.begin(); | 539 for (net::SpdySettingsMap::const_iterator it = main_map.begin(); |
| 543 it != main_map.end() && count < kMaxSpdySettingsHostsToPersist; | 540 it != main_map.end() && count < kMaxSpdySettingsHostsToPersist; |
| 544 ++it, ++count) { | 541 ++it, ++count) { |
| 545 spdy_settings_map->Put(it->first, it->second); | 542 spdy_settings_map->Put(it->first, it->second); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 net::HttpPipelinedHostCapability pipeline_capability; | 595 net::HttpPipelinedHostCapability pipeline_capability; |
| 599 }; | 596 }; |
| 600 | 597 |
| 601 void HttpServerPropertiesManager::UpdatePrefsOnUI( | 598 void HttpServerPropertiesManager::UpdatePrefsOnUI( |
| 602 base::ListValue* spdy_server_list, | 599 base::ListValue* spdy_server_list, |
| 603 net::SpdySettingsMap* spdy_settings_map, | 600 net::SpdySettingsMap* spdy_settings_map, |
| 604 net::AlternateProtocolMap* alternate_protocol_map, | 601 net::AlternateProtocolMap* alternate_protocol_map, |
| 605 net::PipelineCapabilityMap* pipeline_capability_map, | 602 net::PipelineCapabilityMap* pipeline_capability_map, |
| 606 const base::Closure& completion) { | 603 const base::Closure& completion) { |
| 607 | 604 |
| 608 // TODO(rtenneti): Fix ServerPrefMap to preserve MRU order of | |
| 609 // spdy_settings_map, alternate_protocol_map and pipeline_capability_map. | |
| 610 typedef std::map<net::HostPortPair, ServerPref> ServerPrefMap; | 605 typedef std::map<net::HostPortPair, ServerPref> ServerPrefMap; |
| 611 ServerPrefMap server_pref_map; | 606 ServerPrefMap server_pref_map; |
| 612 | 607 |
| 613 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 608 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 614 | 609 |
| 615 // Add servers that support spdy to server_pref_map. | 610 // Add servers that support spdy to server_pref_map. |
| 616 std::string s; | 611 std::string s; |
| 617 for (base::ListValue::const_iterator list_it = spdy_server_list->begin(); | 612 for (base::ListValue::const_iterator list_it = spdy_server_list->begin(); |
| 618 list_it != spdy_server_list->end(); ++list_it) { | 613 list_it != spdy_server_list->end(); ++list_it) { |
| 619 if ((*list_it)->GetAsString(&s)) { | 614 if ((*list_it)->GetAsString(&s)) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 base::DictionaryValue* servers_dict = new base::DictionaryValue; | 680 base::DictionaryValue* servers_dict = new base::DictionaryValue; |
| 686 for (ServerPrefMap::const_iterator map_it = | 681 for (ServerPrefMap::const_iterator map_it = |
| 687 server_pref_map.begin(); | 682 server_pref_map.begin(); |
| 688 map_it != server_pref_map.end(); ++map_it) { | 683 map_it != server_pref_map.end(); ++map_it) { |
| 689 const net::HostPortPair& server = map_it->first; | 684 const net::HostPortPair& server = map_it->first; |
| 690 const ServerPref& server_pref = map_it->second; | 685 const ServerPref& server_pref = map_it->second; |
| 691 | 686 |
| 692 base::DictionaryValue* server_pref_dict = new base::DictionaryValue; | 687 base::DictionaryValue* server_pref_dict = new base::DictionaryValue; |
| 693 | 688 |
| 694 // Save supports_spdy. | 689 // Save supports_spdy. |
| 695 server_pref_dict->SetBoolean("supports_spdy", server_pref.supports_spdy); | 690 if (server_pref.supports_spdy) |
| 691 server_pref_dict->SetBoolean("supports_spdy", server_pref.supports_spdy); |
| 696 | 692 |
| 697 // Save SPDY settings. | 693 // Save SPDY settings. |
| 698 if (server_pref.settings_map) { | 694 if (server_pref.settings_map) { |
| 699 base::DictionaryValue* spdy_settings_dict = new base::DictionaryValue; | 695 base::DictionaryValue* spdy_settings_dict = new base::DictionaryValue; |
| 700 for (net::SettingsMap::const_iterator it = | 696 for (net::SettingsMap::const_iterator it = |
| 701 server_pref.settings_map->begin(); | 697 server_pref.settings_map->begin(); |
| 702 it != server_pref.settings_map->end(); ++it) { | 698 it != server_pref.settings_map->end(); ++it) { |
| 703 net::SpdySettingsIds id = it->first; | 699 net::SpdySettingsIds id = it->first; |
| 704 uint32 value = it->second.second; | 700 uint32 value = it->second.second; |
| 705 std::string key = base::StringPrintf("%u", id); | 701 std::string key = base::StringPrintf("%u", id); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 completion.Run(); | 742 completion.Run(); |
| 747 } | 743 } |
| 748 | 744 |
| 749 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { | 745 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { |
| 750 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 746 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 751 if (!setting_prefs_) | 747 if (!setting_prefs_) |
| 752 ScheduleUpdateCacheOnUI(); | 748 ScheduleUpdateCacheOnUI(); |
| 753 } | 749 } |
| 754 | 750 |
| 755 } // namespace chrome_browser_net | 751 } // namespace chrome_browser_net |
| OLD | NEW |