Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1650)

Unified Diff: chrome/browser/net/http_server_properties_manager.cc

Issue 378823002: Move http_server_properties_manager from chrome/browser/net to net/http. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix renames in comments. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
deleted file mode 100644
index 66e6df85b337780541ffb84d924f09f661088573..0000000000000000000000000000000000000000
--- a/chrome/browser/net/http_server_properties_manager.cc
+++ /dev/null
@@ -1,746 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/net/http_server_properties_manager.h"
-
-#include "base/bind.h"
-#include "base/metrics/histogram.h"
-#include "base/prefs/pref_service.h"
-#include "base/rand_util.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/common/pref_names.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_source.h"
-
-using content::BrowserThread;
-
-namespace chrome_browser_net {
-
-namespace {
-
-// Time to wait before starting an update the http_server_properties_impl_ cache
-// from preferences. Scheduling another update during this period will reset the
-// 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;
-
-// The version number of persisted http_server_properties.
-const int kVersionNumber = 3;
-
-typedef std::vector<std::string> StringVector;
-
-// Load either 200 or 1000 servers based on a coin flip.
-const int k200AlternateProtocolHostsToLoad = 200;
-const int k1000AlternateProtocolHostsToLoad = 1000;
-// Persist 1000 MRU AlternateProtocolHostPortPairs.
-const int kMaxAlternateProtocolHostsToPersist = 1000;
-
-// Persist 200 MRU SpdySettingsHostPortPairs.
-const int kMaxSpdySettingsHostsToPersist = 200;
-
-// Persist 300 MRU SupportsSpdyServerHostPortPairs.
-const int kMaxSupportsSpdyServerHostsToPersist = 300;
-
-} // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// HttpServerPropertiesManager
-
-HttpServerPropertiesManager::HttpServerPropertiesManager(
- PrefService* pref_service)
- : pref_service_(pref_service),
- setting_prefs_(false) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- DCHECK(pref_service);
- ui_weak_ptr_factory_.reset(
- new base::WeakPtrFactory<HttpServerPropertiesManager>(this));
- ui_weak_ptr_ = ui_weak_ptr_factory_->GetWeakPtr();
- ui_cache_update_timer_.reset(
- new base::OneShotTimer<HttpServerPropertiesManager>);
- pref_change_registrar_.Init(pref_service_);
- pref_change_registrar_.Add(
- prefs::kHttpServerProperties,
- base::Bind(&HttpServerPropertiesManager::OnHttpServerPropertiesChanged,
- base::Unretained(this)));
-}
-
-HttpServerPropertiesManager::~HttpServerPropertiesManager() {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- io_weak_ptr_factory_.reset();
-}
-
-void HttpServerPropertiesManager::InitializeOnIOThread() {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- io_weak_ptr_factory_.reset(
- new base::WeakPtrFactory<HttpServerPropertiesManager>(this));
- http_server_properties_impl_.reset(new net::HttpServerPropertiesImpl());
-
- io_prefs_update_timer_.reset(
- new base::OneShotTimer<HttpServerPropertiesManager>);
-
- BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&HttpServerPropertiesManager::UpdateCacheFromPrefsOnUI,
- ui_weak_ptr_));
-}
-
-void HttpServerPropertiesManager::ShutdownOnUIThread() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- // Cancel any pending updates, and stop listening for pref change updates.
- ui_cache_update_timer_->Stop();
- ui_weak_ptr_factory_.reset();
- pref_change_registrar_.RemoveAll();
-}
-
-// static
-void HttpServerPropertiesManager::RegisterProfilePrefs(
- user_prefs::PrefRegistrySyncable* prefs) {
- prefs->RegisterDictionaryPref(
- prefs::kHttpServerProperties,
- user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
-}
-
-// static
-void HttpServerPropertiesManager::SetVersion(
- base::DictionaryValue* http_server_properties_dict,
- int version_number) {
- if (version_number < 0)
- version_number = kVersionNumber;
- DCHECK_LE(version_number, kVersionNumber);
- if (version_number <= kVersionNumber)
- http_server_properties_dict->SetInteger("version", version_number);
-}
-
-// This is required for conformance with the HttpServerProperties interface.
-base::WeakPtr<net::HttpServerProperties>
- HttpServerPropertiesManager::GetWeakPtr() {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return io_weak_ptr_factory_->GetWeakPtr();
-}
-
-void HttpServerPropertiesManager::Clear() {
- Clear(base::Closure());
-}
-
-void HttpServerPropertiesManager::Clear(const base::Closure& completion) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- http_server_properties_impl_->Clear();
- UpdatePrefsFromCacheOnIO(completion);
-}
-
-bool HttpServerPropertiesManager::SupportsSpdy(
- const net::HostPortPair& server) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->SupportsSpdy(server);
-}
-
-void HttpServerPropertiesManager::SetSupportsSpdy(
- const net::HostPortPair& server,
- bool support_spdy) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- http_server_properties_impl_->SetSupportsSpdy(server, support_spdy);
- ScheduleUpdatePrefsOnIO();
-}
-
-bool HttpServerPropertiesManager::HasAlternateProtocol(
- const net::HostPortPair& server) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->HasAlternateProtocol(server);
-}
-
-net::AlternateProtocolInfo
-HttpServerPropertiesManager::GetAlternateProtocol(
- const net::HostPortPair& server) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->GetAlternateProtocol(server);
-}
-
-void HttpServerPropertiesManager::SetAlternateProtocol(
- const net::HostPortPair& server,
- uint16 alternate_port,
- net::AlternateProtocol alternate_protocol,
- double alternate_probability) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->SetAlternateProtocol(
- server, alternate_port, alternate_protocol, alternate_probability);
- ScheduleUpdatePrefsOnIO();
-}
-
-void HttpServerPropertiesManager::SetBrokenAlternateProtocol(
- const net::HostPortPair& server) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->SetBrokenAlternateProtocol(server);
- ScheduleUpdatePrefsOnIO();
-}
-
-bool HttpServerPropertiesManager::WasAlternateProtocolRecentlyBroken(
- const net::HostPortPair& server) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->WasAlternateProtocolRecentlyBroken(
- server);
-}
-
-void HttpServerPropertiesManager::ConfirmAlternateProtocol(
- const net::HostPortPair& server) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->ConfirmAlternateProtocol(server);
- ScheduleUpdatePrefsOnIO();
-}
-
-void HttpServerPropertiesManager::ClearAlternateProtocol(
- const net::HostPortPair& server) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->ClearAlternateProtocol(server);
- ScheduleUpdatePrefsOnIO();
-}
-
-const net::AlternateProtocolMap&
-HttpServerPropertiesManager::alternate_protocol_map() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->alternate_protocol_map();
-}
-
-void HttpServerPropertiesManager::SetAlternateProtocolExperiment(
- net::AlternateProtocolExperiment experiment) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->SetAlternateProtocolExperiment(experiment);
-}
-
-void HttpServerPropertiesManager::SetAlternateProtocolProbabilityThreshold(
- double threshold) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->SetAlternateProtocolProbabilityThreshold(
- threshold);
-}
-
-net::AlternateProtocolExperiment
-HttpServerPropertiesManager::GetAlternateProtocolExperiment() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->GetAlternateProtocolExperiment();
-}
-
-const net::SettingsMap&
-HttpServerPropertiesManager::GetSpdySettings(
- const net::HostPortPair& host_port_pair) {
- DCHECK_CURRENTLY_ON(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_CURRENTLY_ON(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_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->ClearSpdySettings(host_port_pair);
- ScheduleUpdatePrefsOnIO();
-}
-
-void HttpServerPropertiesManager::ClearAllSpdySettings() {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->ClearAllSpdySettings();
- ScheduleUpdatePrefsOnIO();
-}
-
-const net::SpdySettingsMap&
-HttpServerPropertiesManager::spdy_settings_map() const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->spdy_settings_map();
-}
-
-void HttpServerPropertiesManager::SetServerNetworkStats(
- const net::HostPortPair& host_port_pair,
- NetworkStats stats) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- http_server_properties_impl_->SetServerNetworkStats(host_port_pair, stats);
-}
-
-const HttpServerPropertiesManager::NetworkStats*
-HttpServerPropertiesManager::GetServerNetworkStats(
- const net::HostPortPair& host_port_pair) const {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- return http_server_properties_impl_->GetServerNetworkStats(host_port_pair);
-}
-
-//
-// Update the HttpServerPropertiesImpl's cache with data from preferences.
-//
-void HttpServerPropertiesManager::ScheduleUpdateCacheOnUI() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- // Cancel pending updates, if any.
- ui_cache_update_timer_->Stop();
- StartCacheUpdateTimerOnUI(
- base::TimeDelta::FromMilliseconds(kUpdateCacheDelayMs));
-}
-
-void HttpServerPropertiesManager::StartCacheUpdateTimerOnUI(
- base::TimeDelta delay) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- ui_cache_update_timer_->Start(
- FROM_HERE, delay, this,
- &HttpServerPropertiesManager::UpdateCacheFromPrefsOnUI);
-}
-
-void HttpServerPropertiesManager::UpdateCacheFromPrefsOnUI() {
- // The preferences can only be read on the UI thread.
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- if (!pref_service_->HasPrefPath(prefs::kHttpServerProperties))
- return;
-
- bool detected_corrupted_prefs = false;
- const base::DictionaryValue& http_server_properties_dict =
- *pref_service_->GetDictionary(prefs::kHttpServerProperties);
-
- int version = kMissingVersion;
- if (!http_server_properties_dict.GetIntegerWithoutPathExpansion(
- "version", &version)) {
- DVLOG(1) << "Missing version. Clearing all properties.";
- return;
- }
-
- // The properties for a given server is in
- // http_server_properties_dict["servers"][server].
- const base::DictionaryValue* servers_dict = NULL;
- if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion(
- "servers", &servers_dict)) {
- DVLOG(1) << "Malformed http_server_properties for servers.";
- return;
- }
-
- // String is host/port pair of spdy server.
- scoped_ptr<StringVector> spdy_servers(new StringVector);
- scoped_ptr<net::SpdySettingsMap> spdy_settings_map(
- new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist));
- scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map(
- new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist));
- // TODO(rtenneti): Delete the following code after the experiment.
- int alternate_protocols_to_load = k200AlternateProtocolHostsToLoad;
- net::AlternateProtocolExperiment alternate_protocol_experiment =
- net::ALTERNATE_PROTOCOL_NOT_PART_OF_EXPERIMENT;
- if (version == kVersionNumber) {
- if (base::RandInt(0, 99) == 0) {
- alternate_protocol_experiment =
- net::ALTERNATE_PROTOCOL_TRUNCATED_200_SERVERS;
- } else {
- alternate_protocols_to_load = k1000AlternateProtocolHostsToLoad;
- alternate_protocol_experiment =
- net::ALTERNATE_PROTOCOL_TRUNCATED_1000_SERVERS;
- }
- DVLOG(1) << "# of servers that support alternate_protocol: "
- << alternate_protocols_to_load;
- }
-
- int count = 0;
- for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd();
- it.Advance()) {
- // Get server's host/pair.
- const std::string& server_str = it.key();
- net::HostPortPair server = net::HostPortPair::FromString(server_str);
- if (server.host().empty()) {
- DVLOG(1) << "Malformed http_server_properties for server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
-
- const base::DictionaryValue* server_pref_dict = NULL;
- if (!it.value().GetAsDictionary(&server_pref_dict)) {
- DVLOG(1) << "Malformed http_server_properties server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
-
- // Get if server supports Spdy.
- bool supports_spdy = false;
- if ((server_pref_dict->GetBoolean(
- "supports_spdy", &supports_spdy)) && supports_spdy) {
- spdy_servers->push_back(server_str);
- }
-
- // Get SpdySettings.
- DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end());
- const base::DictionaryValue* spdy_settings_dict = NULL;
- if (server_pref_dict->GetDictionaryWithoutPathExpansion(
- "settings", &spdy_settings_dict)) {
- net::SettingsMap settings_map;
- for (base::DictionaryValue::Iterator dict_it(*spdy_settings_dict);
- !dict_it.IsAtEnd(); dict_it.Advance()) {
- const std::string& id_str = dict_it.key();
- int id = 0;
- if (!base::StringToInt(id_str, &id)) {
- DVLOG(1) << "Malformed id in SpdySettings for server: " <<
- server_str;
- NOTREACHED();
- continue;
- }
- int value = 0;
- if (!dict_it.value().GetAsInteger(&value)) {
- DVLOG(1) << "Malformed value in SpdySettings for server: " <<
- server_str;
- NOTREACHED();
- continue;
- }
- net::SettingsFlagsAndValue flags_and_value(
- net::SETTINGS_FLAG_PERSISTED, value);
- settings_map[static_cast<net::SpdySettingsIds>(id)] = flags_and_value;
- }
- spdy_settings_map->Put(server, settings_map);
- }
-
- // Get alternate_protocol server.
- DCHECK(alternate_protocol_map->Peek(server) ==
- alternate_protocol_map->end());
- const base::DictionaryValue* port_alternate_protocol_dict = NULL;
- if (!server_pref_dict->GetDictionaryWithoutPathExpansion(
- "alternate_protocol", &port_alternate_protocol_dict)) {
- continue;
- }
-
- if (count >= alternate_protocols_to_load)
- continue;
- do {
- int port = 0;
- if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion(
- "port", &port) || (port > (1 << 16))) {
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
- std::string protocol_str;
- if (!port_alternate_protocol_dict->GetStringWithoutPathExpansion(
- "protocol_str", &protocol_str)) {
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
- net::AlternateProtocol protocol =
- net::AlternateProtocolFromString(protocol_str);
- if (!net::IsAlternateProtocolValid(protocol)) {
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
-
- double probability = 1;
- if (port_alternate_protocol_dict->HasKey("probability") &&
- !port_alternate_protocol_dict->GetDoubleWithoutPathExpansion(
- "probability", &probability)) {
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
-
- net::AlternateProtocolInfo port_alternate_protocol(port,
- protocol,
- probability);
- alternate_protocol_map->Put(server, port_alternate_protocol);
- ++count;
- } while (false);
- }
-
- BrowserThread::PostTask(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&HttpServerPropertiesManager::
- UpdateCacheFromPrefsOnIO,
- base::Unretained(this),
- base::Owned(spdy_servers.release()),
- base::Owned(spdy_settings_map.release()),
- base::Owned(alternate_protocol_map.release()),
- alternate_protocol_experiment,
- 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_CURRENTLY_ON(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_CURRENTLY_ON(BrowserThread::IO);
- // Cancel pending updates, if any.
- io_prefs_update_timer_->Stop();
- StartPrefsUpdateTimerOnIO(
- base::TimeDelta::FromMilliseconds(kUpdatePrefsDelayMs));
-}
-
-void HttpServerPropertiesManager::StartPrefsUpdateTimerOnIO(
- base::TimeDelta delay) {
- DCHECK_CURRENTLY_ON(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_CURRENTLY_ON(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 AlternateProtocolInfo preferences for a server. This is used only in
-// UpdatePrefsOnUI.
-struct ServerPref {
- ServerPref()
- : supports_spdy(false),
- settings_map(NULL),
- alternate_protocol(NULL) {
- }
- ServerPref(bool supports_spdy,
- const net::SettingsMap* settings_map,
- const net::AlternateProtocolInfo* alternate_protocol)
- : supports_spdy(supports_spdy),
- settings_map(settings_map),
- alternate_protocol(alternate_protocol) {
- }
- bool supports_spdy;
- const net::SettingsMap* settings_map;
- const net::AlternateProtocolInfo* alternate_protocol;
-};
-
-void HttpServerPropertiesManager::UpdatePrefsOnUI(
- base::ListValue* spdy_server_list,
- net::SpdySettingsMap* spdy_settings_map,
- net::AlternateProtocolMap* alternate_protocol_map,
- const base::Closure& completion) {
-
- typedef std::map<net::HostPortPair, ServerPref> ServerPrefMap;
- ServerPrefMap server_pref_map;
-
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- // Add servers that support spdy to server_pref_map.
- std::string s;
- for (base::ListValue::const_iterator list_it = spdy_server_list->begin();
- list_it != spdy_server_list->end(); ++list_it) {
- if ((*list_it)->GetAsString(&s)) {
- net::HostPortPair server = net::HostPortPair::FromString(s);
-
- ServerPrefMap::iterator it = server_pref_map.find(server);
- if (it == server_pref_map.end()) {
- ServerPref server_pref(true, NULL, NULL);
- server_pref_map[server] = server_pref;
- } else {
- it->second.supports_spdy = true;
- }
- }
- }
-
- // Add servers that have SpdySettings to server_pref_map.
- for (net::SpdySettingsMap::iterator map_it = spdy_settings_map->begin();
- map_it != spdy_settings_map->end(); ++map_it) {
- const net::HostPortPair& server = map_it->first;
-
- ServerPrefMap::iterator it = server_pref_map.find(server);
- if (it == server_pref_map.end()) {
- ServerPref server_pref(false, &map_it->second, NULL);
- server_pref_map[server] = server_pref;
- } else {
- it->second.settings_map = &map_it->second;
- }
- }
-
- // Add AlternateProtocol servers to server_pref_map.
- for (net::AlternateProtocolMap::const_iterator map_it =
- alternate_protocol_map->begin();
- map_it != alternate_protocol_map->end(); ++map_it) {
- const net::HostPortPair& server = map_it->first;
- const net::AlternateProtocolInfo& port_alternate_protocol =
- map_it->second;
- if (!net::IsAlternateProtocolValid(port_alternate_protocol.protocol)) {
- continue;
- }
-
- ServerPrefMap::iterator it = server_pref_map.find(server);
- if (it == server_pref_map.end()) {
- ServerPref server_pref(false, NULL, &map_it->second);
- server_pref_map[server] = server_pref;
- } else {
- it->second.alternate_protocol = &map_it->second;
- }
- }
-
- // Persist the prefs::kHttpServerProperties.
- base::DictionaryValue http_server_properties_dict;
- base::DictionaryValue* servers_dict = new base::DictionaryValue;
- for (ServerPrefMap::const_iterator map_it =
- server_pref_map.begin();
- map_it != server_pref_map.end(); ++map_it) {
- const net::HostPortPair& server = map_it->first;
- const ServerPref& server_pref = map_it->second;
-
- base::DictionaryValue* server_pref_dict = new base::DictionaryValue;
-
- // Save supports_spdy.
- if (server_pref.supports_spdy)
- server_pref_dict->SetBoolean("supports_spdy", server_pref.supports_spdy);
-
- // Save SPDY settings.
- if (server_pref.settings_map) {
- base::DictionaryValue* spdy_settings_dict = new base::DictionaryValue;
- for (net::SettingsMap::const_iterator it =
- server_pref.settings_map->begin();
- it != server_pref.settings_map->end(); ++it) {
- net::SpdySettingsIds id = it->first;
- uint32 value = it->second.second;
- std::string key = base::StringPrintf("%u", id);
- spdy_settings_dict->SetInteger(key, value);
- }
- server_pref_dict->SetWithoutPathExpansion("settings", spdy_settings_dict);
- }
-
- // Save alternate_protocol.
- if (server_pref.alternate_protocol) {
- base::DictionaryValue* port_alternate_protocol_dict =
- new base::DictionaryValue;
- const net::AlternateProtocolInfo* port_alternate_protocol =
- server_pref.alternate_protocol;
- port_alternate_protocol_dict->SetInteger(
- "port", port_alternate_protocol->port);
- const char* protocol_str =
- net::AlternateProtocolToString(port_alternate_protocol->protocol);
- port_alternate_protocol_dict->SetString("protocol_str", protocol_str);
- port_alternate_protocol_dict->SetDouble(
- "probability", port_alternate_protocol->probability);
- server_pref_dict->SetWithoutPathExpansion(
- "alternate_protocol", port_alternate_protocol_dict);
- }
-
- servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict);
- }
-
- http_server_properties_dict.SetWithoutPathExpansion("servers", servers_dict);
- SetVersion(&http_server_properties_dict, kVersionNumber);
- setting_prefs_ = true;
- pref_service_->Set(prefs::kHttpServerProperties,
- http_server_properties_dict);
- setting_prefs_ = false;
-
- // Note that |completion| will be fired after we have written everything to
- // the Preferences, but likely before these changes are serialized to disk.
- // This is not a problem though, as JSONPrefStore guarantees that this will
- // happen, pretty soon, and even in the case we shut down immediately.
- if (!completion.is_null())
- completion.Run();
-}
-
-void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (!setting_prefs_)
- ScheduleUpdateCacheOnUI();
-}
-
-} // namespace chrome_browser_net
« no previous file with comments | « chrome/browser/net/http_server_properties_manager.h ('k') | chrome/browser/net/http_server_properties_manager_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698