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

Side by Side Diff: net/http/http_server_properties_manager.cc

Issue 1824903002: Change the AlternativeServiceMap with SchemeOriginPair key. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "net/http/http_server_properties_manager.h" 5 #include "net/http/http_server_properties_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/metrics/histogram_macros.h" 8 #include "base/metrics/histogram_macros.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 } 138 }
139 139
140 void HttpServerPropertiesManager::Clear(const base::Closure& completion) { 140 void HttpServerPropertiesManager::Clear(const base::Closure& completion) {
141 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 141 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
142 142
143 http_server_properties_impl_->Clear(); 143 http_server_properties_impl_->Clear();
144 UpdatePrefsFromCacheOnNetworkThread(completion); 144 UpdatePrefsFromCacheOnNetworkThread(completion);
145 } 145 }
146 146
147 bool HttpServerPropertiesManager::SupportsRequestPriority( 147 bool HttpServerPropertiesManager::SupportsRequestPriority(
148 const HostPortPair& server) { 148 const url::SchemeHostPort& server) {
149 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 149 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
150 return http_server_properties_impl_->SupportsRequestPriority(server); 150 return http_server_properties_impl_->SupportsRequestPriority(server);
151 } 151 }
152 152
153 bool HttpServerPropertiesManager::GetSupportsSpdy(const HostPortPair& server) { 153 bool HttpServerPropertiesManager::GetSupportsSpdy(const HostPortPair& server) {
154 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 154 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
155 return http_server_properties_impl_->GetSupportsSpdy(server); 155 return http_server_properties_impl_->GetSupportsSpdy(server);
156 } 156 }
157 157
158 void HttpServerPropertiesManager::SetSupportsSpdy(const HostPortPair& server, 158 void HttpServerPropertiesManager::SetSupportsSpdy(const HostPortPair& server,
(...skipping 20 matching lines...) Expand all
179 ScheduleUpdatePrefsOnNetworkThread(HTTP_11_REQUIRED); 179 ScheduleUpdatePrefsOnNetworkThread(HTTP_11_REQUIRED);
180 } 180 }
181 181
182 void HttpServerPropertiesManager::MaybeForceHTTP11(const HostPortPair& server, 182 void HttpServerPropertiesManager::MaybeForceHTTP11(const HostPortPair& server,
183 SSLConfig* ssl_config) { 183 SSLConfig* ssl_config) {
184 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 184 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
185 http_server_properties_impl_->MaybeForceHTTP11(server, ssl_config); 185 http_server_properties_impl_->MaybeForceHTTP11(server, ssl_config);
186 } 186 }
187 187
188 AlternativeServiceVector HttpServerPropertiesManager::GetAlternativeServices( 188 AlternativeServiceVector HttpServerPropertiesManager::GetAlternativeServices(
189 const HostPortPair& origin) { 189 const url::SchemeHostPort& origin) {
190 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 190 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
191 return http_server_properties_impl_->GetAlternativeServices(origin); 191 return http_server_properties_impl_->GetAlternativeServices(origin);
192 } 192 }
193 193
194 bool HttpServerPropertiesManager::SetAlternativeService( 194 bool HttpServerPropertiesManager::SetAlternativeService(
195 const HostPortPair& origin, 195 const url::SchemeHostPort& origin,
196 const AlternativeService& alternative_service, 196 const AlternativeService& alternative_service,
197 base::Time expiration) { 197 base::Time expiration) {
198 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 198 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
199 const bool changed = http_server_properties_impl_->SetAlternativeService( 199 const bool changed = http_server_properties_impl_->SetAlternativeService(
200 origin, alternative_service, expiration); 200 origin, alternative_service, expiration);
201 if (changed) { 201 if (changed) {
202 ScheduleUpdatePrefsOnNetworkThread(SET_ALTERNATIVE_SERVICES); 202 ScheduleUpdatePrefsOnNetworkThread(SET_ALTERNATIVE_SERVICES);
203 } 203 }
204 return changed; 204 return changed;
205 } 205 }
206 206
207 bool HttpServerPropertiesManager::SetAlternativeServices( 207 bool HttpServerPropertiesManager::SetAlternativeServices(
208 const HostPortPair& origin, 208 const url::SchemeHostPort& origin,
209 const AlternativeServiceInfoVector& alternative_service_info_vector) { 209 const AlternativeServiceInfoVector& alternative_service_info_vector) {
210 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 210 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
211 const bool changed = http_server_properties_impl_->SetAlternativeServices( 211 const bool changed = http_server_properties_impl_->SetAlternativeServices(
212 origin, alternative_service_info_vector); 212 origin, alternative_service_info_vector);
213 if (changed) { 213 if (changed) {
214 ScheduleUpdatePrefsOnNetworkThread(SET_ALTERNATIVE_SERVICES); 214 ScheduleUpdatePrefsOnNetworkThread(SET_ALTERNATIVE_SERVICES);
215 } 215 }
216 return changed; 216 return changed;
217 } 217 }
218 218
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 http_server_properties_impl_->ConfirmAlternativeService(alternative_service); 254 http_server_properties_impl_->ConfirmAlternativeService(alternative_service);
255 bool new_value = http_server_properties_impl_->IsAlternativeServiceBroken( 255 bool new_value = http_server_properties_impl_->IsAlternativeServiceBroken(
256 alternative_service); 256 alternative_service);
257 // For persisting, we only care about the value returned by 257 // For persisting, we only care about the value returned by
258 // IsAlternativeServiceBroken. If that value changes, then call persist. 258 // IsAlternativeServiceBroken. If that value changes, then call persist.
259 if (old_value != new_value) 259 if (old_value != new_value)
260 ScheduleUpdatePrefsOnNetworkThread(CONFIRM_ALTERNATIVE_SERVICE); 260 ScheduleUpdatePrefsOnNetworkThread(CONFIRM_ALTERNATIVE_SERVICE);
261 } 261 }
262 262
263 void HttpServerPropertiesManager::ClearAlternativeServices( 263 void HttpServerPropertiesManager::ClearAlternativeServices(
264 const HostPortPair& origin) { 264 const url::SchemeHostPort& origin) {
265 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 265 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
266 const AlternativeServiceMap& map = 266 const AlternativeServiceMap& map =
267 http_server_properties_impl_->alternative_service_map(); 267 http_server_properties_impl_->alternative_service_map();
268 size_t old_size = map.size(); 268 size_t old_size = map.size();
269 http_server_properties_impl_->ClearAlternativeServices(origin); 269 http_server_properties_impl_->ClearAlternativeServices(origin);
270 size_t new_size = map.size(); 270 size_t new_size = map.size();
271 // Persist only if we have deleted an entry. 271 // Persist only if we have deleted an entry.
272 if (old_size != new_size) 272 if (old_size != new_size)
273 ScheduleUpdatePrefsOnNetworkThread(CLEAR_ALTERNATIVE_SERVICE); 273 ScheduleUpdatePrefsOnNetworkThread(CLEAR_ALTERNATIVE_SERVICE);
274 } 274 }
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 scoped_ptr<AlternativeServiceMap> alternative_service_map( 496 scoped_ptr<AlternativeServiceMap> alternative_service_map(
497 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist)); 497 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist));
498 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map( 498 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map(
499 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist)); 499 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist));
500 scoped_ptr<QuicServerInfoMap> quic_server_info_map( 500 scoped_ptr<QuicServerInfoMap> quic_server_info_map(
501 new QuicServerInfoMap(QuicServerInfoMap::NO_AUTO_EVICT)); 501 new QuicServerInfoMap(QuicServerInfoMap::NO_AUTO_EVICT));
502 502
503 if (version < 4) { 503 if (version < 4) {
504 if (!AddServersData(*servers_dict, spdy_servers.get(), 504 if (!AddServersData(*servers_dict, spdy_servers.get(),
505 spdy_settings_map.get(), alternative_service_map.get(), 505 spdy_settings_map.get(), alternative_service_map.get(),
506 server_network_stats_map.get())) { 506 server_network_stats_map.get(), version)) {
507 detected_corrupted_prefs = true; 507 detected_corrupted_prefs = true;
508 } 508 }
509 } else { 509 } else {
510 for (base::ListValue::const_iterator it = servers_list->begin(); 510 for (base::ListValue::const_iterator it = servers_list->begin();
511 it != servers_list->end(); ++it) { 511 it != servers_list->end(); ++it) {
512 if (!(*it)->GetAsDictionary(&servers_dict)) { 512 if (!(*it)->GetAsDictionary(&servers_dict)) {
513 DVLOG(1) << "Malformed http_server_properties for servers dictionary."; 513 DVLOG(1) << "Malformed http_server_properties for servers dictionary.";
514 detected_corrupted_prefs = true; 514 detected_corrupted_prefs = true;
515 continue; 515 continue;
516 } 516 }
517 if (!AddServersData( 517 if (!AddServersData(*servers_dict, spdy_servers.get(),
518 *servers_dict, spdy_servers.get(), spdy_settings_map.get(), 518 spdy_settings_map.get(),
519 alternative_service_map.get(), server_network_stats_map.get())) { 519 alternative_service_map.get(),
520 server_network_stats_map.get(), version)) {
520 detected_corrupted_prefs = true; 521 detected_corrupted_prefs = true;
521 } 522 }
522 } 523 }
523 } 524 }
524 525
525 if (!AddToQuicServerInfoMap(http_server_properties_dict, 526 if (!AddToQuicServerInfoMap(http_server_properties_dict,
526 quic_server_info_map.get())) { 527 quic_server_info_map.get())) {
527 detected_corrupted_prefs = true; 528 detected_corrupted_prefs = true;
528 } 529 }
529 530
530 network_task_runner_->PostTask( 531 network_task_runner_->PostTask(
531 FROM_HERE, 532 FROM_HERE,
532 base::Bind( 533 base::Bind(
533 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, 534 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread,
534 base::Unretained(this), base::Owned(spdy_servers.release()), 535 base::Unretained(this), base::Owned(spdy_servers.release()),
535 base::Owned(spdy_settings_map.release()), 536 base::Owned(spdy_settings_map.release()),
536 base::Owned(alternative_service_map.release()), base::Owned(addr), 537 base::Owned(alternative_service_map.release()), base::Owned(addr),
537 base::Owned(server_network_stats_map.release()), 538 base::Owned(server_network_stats_map.release()),
538 base::Owned(quic_server_info_map.release()), 539 base::Owned(quic_server_info_map.release()),
539 detected_corrupted_prefs)); 540 detected_corrupted_prefs));
540 } 541 }
541 542
542 bool HttpServerPropertiesManager::AddServersData( 543 bool HttpServerPropertiesManager::AddServersData(
543 const base::DictionaryValue& servers_dict, 544 const base::DictionaryValue& servers_dict,
544 ServerList* spdy_servers, 545 ServerList* spdy_servers,
545 SpdySettingsMap* spdy_settings_map, 546 SpdySettingsMap* spdy_settings_map,
546 AlternativeServiceMap* alternative_service_map, 547 AlternativeServiceMap* alternative_service_map,
547 ServerNetworkStatsMap* network_stats_map) { 548 ServerNetworkStatsMap* network_stats_map,
549 int version) {
548 for (base::DictionaryValue::Iterator it(servers_dict); !it.IsAtEnd(); 550 for (base::DictionaryValue::Iterator it(servers_dict); !it.IsAtEnd();
549 it.Advance()) { 551 it.Advance()) {
550 // Get server's host/pair. 552 // Get server's host/pair.
551 const std::string& server_str = it.key(); 553 const std::string& server_str = it.key();
552 HostPortPair server = HostPortPair::FromString(server_str); 554 HostPortPair server = HostPortPair::FromString(server_str);
553 if (server.host().empty()) { 555 if (server.host().empty()) {
554 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; 556 DVLOG(1) << "Malformed http_server_properties for server: " << server_str;
555 return false; 557 return false;
556 } 558 }
557 559
558 const base::DictionaryValue* server_pref_dict = nullptr; 560 const base::DictionaryValue* server_pref_dict = nullptr;
559 if (!it.value().GetAsDictionary(&server_pref_dict)) { 561 if (!it.value().GetAsDictionary(&server_pref_dict)) {
560 DVLOG(1) << "Malformed http_server_properties server: " << server_str; 562 DVLOG(1) << "Malformed http_server_properties server: " << server_str;
561 return false; 563 return false;
562 } 564 }
563 565
564 // Get if server supports Spdy. 566 // Get if server supports Spdy.
565 bool supports_spdy = false; 567 bool supports_spdy = false;
566 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && 568 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) &&
567 supports_spdy) { 569 supports_spdy) {
568 spdy_servers->push_back(server_str); 570 spdy_servers->push_back(server_str);
569 } 571 }
570 572
571 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map); 573 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map);
572 if (!AddToAlternativeServiceMap(server, *server_pref_dict, 574
575 // TODO(zhongyi): persist server's scheme/host/pair in a new version.
576 // Never call AddToAlternativeServiceMap for old versions disk data.
577 url::SchemeHostPort scheme_origin_pair("https", server.host(),
578 server.port());
579 if (version <= 4) {
580 DVLOG(1) << "Old version, won't update Alt-Svc from disck data";
581 }
582 if (!AddToAlternativeServiceMap(scheme_origin_pair, *server_pref_dict,
573 alternative_service_map) || 583 alternative_service_map) ||
574 !AddToNetworkStatsMap(server, *server_pref_dict, network_stats_map)) { 584 !AddToNetworkStatsMap(server, *server_pref_dict, network_stats_map)) {
575 return false; 585 return false;
576 } 586 }
577 } 587 }
578 return true; 588 return true;
579 } 589 }
580 590
581 void HttpServerPropertiesManager::AddToSpdySettingsMap( 591 void HttpServerPropertiesManager::AddToSpdySettingsMap(
582 const HostPortPair& server, 592 const HostPortPair& server,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 base::Time::FromInternalValue(expiration_int64); 684 base::Time::FromInternalValue(expiration_int64);
675 return true; 685 return true;
676 } 686 }
677 687
678 DVLOG(1) << "Malformed alternative service expiration for server: " 688 DVLOG(1) << "Malformed alternative service expiration for server: "
679 << server_str; 689 << server_str;
680 return false; 690 return false;
681 } 691 }
682 692
683 bool HttpServerPropertiesManager::AddToAlternativeServiceMap( 693 bool HttpServerPropertiesManager::AddToAlternativeServiceMap(
684 const HostPortPair& server, 694 const url::SchemeHostPort& server,
685 const base::DictionaryValue& server_pref_dict, 695 const base::DictionaryValue& server_pref_dict,
686 AlternativeServiceMap* alternative_service_map) { 696 AlternativeServiceMap* alternative_service_map) {
687 DCHECK(alternative_service_map->Peek(server) == 697 DCHECK(alternative_service_map->Peek(server) ==
688 alternative_service_map->end()); 698 alternative_service_map->end());
689 const base::ListValue* alternative_service_list; 699 const base::ListValue* alternative_service_list;
690 if (!server_pref_dict.GetListWithoutPathExpansion( 700 if (!server_pref_dict.GetListWithoutPathExpansion(
691 kAlternativeServiceKey, &alternative_service_list)) { 701 kAlternativeServiceKey, &alternative_service_list)) {
692 return true; 702 return true;
693 } 703 }
694 704
695 AlternativeServiceInfoVector alternative_service_info_vector; 705 AlternativeServiceInfoVector alternative_service_info_vector;
696 for (const base::Value* alternative_service_list_item : 706 for (const base::Value* alternative_service_list_item :
697 *alternative_service_list) { 707 *alternative_service_list) {
698 const base::DictionaryValue* alternative_service_dict; 708 const base::DictionaryValue* alternative_service_dict;
699 if (!alternative_service_list_item->GetAsDictionary( 709 if (!alternative_service_list_item->GetAsDictionary(
700 &alternative_service_dict)) 710 &alternative_service_dict))
701 return false; 711 return false;
702 AlternativeServiceInfo alternative_service_info; 712 AlternativeServiceInfo alternative_service_info;
703 if (!ParseAlternativeServiceDict(*alternative_service_dict, 713 if (!ParseAlternativeServiceDict(
704 server.ToString(), 714 *alternative_service_dict,
705 &alternative_service_info)) { 715 HostPortPair::FromSchemeHostPort(server).ToString(),
716 &alternative_service_info)) {
706 return false; 717 return false;
707 } 718 }
708 if (base::Time::Now() < alternative_service_info.expiration) { 719 if (base::Time::Now() < alternative_service_info.expiration) {
709 alternative_service_info_vector.push_back(alternative_service_info); 720 alternative_service_info_vector.push_back(alternative_service_info);
710 } 721 }
711 } 722 }
712 723
713 if (alternative_service_info_vector.empty()) { 724 if (alternative_service_info_vector.empty()) {
714 return false; 725 return false;
715 } 726 }
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 const AlternativeServiceMap& map = 922 const AlternativeServiceMap& map =
912 http_server_properties_impl_->alternative_service_map(); 923 http_server_properties_impl_->alternative_service_map();
913 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers.Memory", 924 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers.Memory",
914 map.size()); 925 map.size());
915 count = 0; 926 count = 0;
916 typedef std::map<std::string, bool> CanonicalHostPersistedMap; 927 typedef std::map<std::string, bool> CanonicalHostPersistedMap;
917 CanonicalHostPersistedMap persisted_map; 928 CanonicalHostPersistedMap persisted_map;
918 // Maintain MRU order. 929 // Maintain MRU order.
919 for (AlternativeServiceMap::const_reverse_iterator it = map.rbegin(); 930 for (AlternativeServiceMap::const_reverse_iterator it = map.rbegin();
920 it != map.rend() && count < kMaxAlternateProtocolHostsToPersist; ++it) { 931 it != map.rend() && count < kMaxAlternateProtocolHostsToPersist; ++it) {
921 const HostPortPair& server = it->first; 932 const url::SchemeHostPort& server = it->first;
922 AlternativeServiceInfoVector notbroken_alternative_service_info_vector; 933 AlternativeServiceInfoVector notbroken_alternative_service_info_vector;
923 for (const AlternativeServiceInfo& alternative_service_info : it->second) { 934 for (const AlternativeServiceInfo& alternative_service_info : it->second) {
924 // Do not persist expired entries. 935 // Do not persist expired entries.
925 if (alternative_service_info.expiration < base::Time::Now()) { 936 if (alternative_service_info.expiration < base::Time::Now()) {
926 continue; 937 continue;
927 } 938 }
928 AlternativeService alternative_service( 939 AlternativeService alternative_service(
929 alternative_service_info.alternative_service); 940 alternative_service_info.alternative_service);
930 if (!IsAlternateProtocolValid(alternative_service.protocol)) { 941 if (!IsAlternateProtocolValid(alternative_service.protocol)) {
931 continue; 942 continue;
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 server_pref_map.Put(server, server_pref); 1072 server_pref_map.Put(server, server_pref);
1062 } else { 1073 } else {
1063 it->second.settings_map = &map_it->second; 1074 it->second.settings_map = &map_it->second;
1064 } 1075 }
1065 } 1076 }
1066 1077
1067 // Add alternative services to server_pref_map in the MRU order. 1078 // Add alternative services to server_pref_map in the MRU order.
1068 for (AlternativeServiceMap::const_reverse_iterator map_it = 1079 for (AlternativeServiceMap::const_reverse_iterator map_it =
1069 alternative_service_map->rbegin(); 1080 alternative_service_map->rbegin();
1070 map_it != alternative_service_map->rend(); ++map_it) { 1081 map_it != alternative_service_map->rend(); ++map_it) {
1071 const HostPortPair& server = map_it->first; 1082 const HostPortPair& server =
1083 HostPortPair::FromSchemeHostPort(map_it->first);
1072 ServerPrefMap::iterator it = server_pref_map.Get(server); 1084 ServerPrefMap::iterator it = server_pref_map.Get(server);
1073 if (it == server_pref_map.end()) { 1085 if (it == server_pref_map.end()) {
1074 ServerPref server_pref; 1086 ServerPref server_pref;
1075 server_pref.alternative_service_info_vector = &map_it->second; 1087 server_pref.alternative_service_info_vector = &map_it->second;
1076 server_pref_map.Put(server, server_pref); 1088 server_pref_map.Put(server, server_pref);
1077 } else { 1089 } else {
1078 it->second.alternative_service_info_vector = &map_it->second; 1090 it->second.alternative_service_info_vector = &map_it->second;
1079 } 1091 }
1080 } 1092 }
1081 1093
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 quic_servers_dict); 1251 quic_servers_dict);
1240 } 1252 }
1241 1253
1242 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { 1254 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() {
1243 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); 1255 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
1244 if (!setting_prefs_) 1256 if (!setting_prefs_)
1245 ScheduleUpdateCacheOnPrefThread(); 1257 ScheduleUpdateCacheOnPrefThread();
1246 } 1258 }
1247 1259
1248 } // namespace net 1260 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_server_properties_manager.h ('k') | net/http/http_server_properties_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698