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/io_thread.h" | 5 #include "chrome/browser/io_thread.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 // * A "holdback" group with SPDY disabled, and corresponding control | 129 // * A "holdback" group with SPDY disabled, and corresponding control |
130 // (SPDY/3.1). The primary purpose of the holdback group is to encourage site | 130 // (SPDY/3.1). The primary purpose of the holdback group is to encourage site |
131 // operators to do feature detection rather than UA-sniffing. As such, this | 131 // operators to do feature detection rather than UA-sniffing. As such, this |
132 // trial runs continuously. | 132 // trial runs continuously. |
133 // * A SPDY/4 experiment, for SPDY/4 (aka HTTP/2) vs SPDY/3.1 comparisons and | 133 // * A SPDY/4 experiment, for SPDY/4 (aka HTTP/2) vs SPDY/3.1 comparisons and |
134 // eventual SPDY/4 deployment. | 134 // eventual SPDY/4 deployment. |
135 const char kSpdyFieldTrialName[] = "SPDY"; | 135 const char kSpdyFieldTrialName[] = "SPDY"; |
136 const char kSpdyFieldTrialHoldbackGroupNamePrefix[] = "SpdyDisabled"; | 136 const char kSpdyFieldTrialHoldbackGroupNamePrefix[] = "SpdyDisabled"; |
137 const char kSpdyFieldTrialSpdy31GroupNamePrefix[] = "Spdy31Enabled"; | 137 const char kSpdyFieldTrialSpdy31GroupNamePrefix[] = "Spdy31Enabled"; |
138 const char kSpdyFieldTrialSpdy4GroupNamePrefix[] = "Spdy4Enabled"; | 138 const char kSpdyFieldTrialSpdy4GroupNamePrefix[] = "Spdy4Enabled"; |
| 139 const char kSpdyFieldTrialParametrizedPrefix[] = "Parametrized"; |
139 | 140 |
140 // Field trial for Cache-Control: stale-while-revalidate directive. | 141 // Field trial for Cache-Control: stale-while-revalidate directive. |
141 const char kStaleWhileRevalidateFieldTrialName[] = "StaleWhileRevalidate"; | 142 const char kStaleWhileRevalidateFieldTrialName[] = "StaleWhileRevalidate"; |
142 | 143 |
143 #if defined(OS_MACOSX) && !defined(OS_IOS) | 144 #if defined(OS_MACOSX) && !defined(OS_IOS) |
144 void ObserveKeychainEvents() { | 145 void ObserveKeychainEvents() { |
145 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
146 net::CertDatabase::GetInstance()->SetMessageLoopForKeychainEvents(); | 147 net::CertDatabase::GetInstance()->SetMessageLoopForKeychainEvents(); |
147 } | 148 } |
148 #endif | 149 #endif |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 const base::CommandLine& command_line) { | 313 const base::CommandLine& command_line) { |
313 const std::string group_name = | 314 const std::string group_name = |
314 base::FieldTrialList::FindFullName("CTRequiredForEVTrial"); | 315 base::FieldTrialList::FindFullName("CTRequiredForEVTrial"); |
315 if (command_line.HasSwitch( | 316 if (command_line.HasSwitch( |
316 switches::kDisableCertificateTransparencyRequirementForEV)) | 317 switches::kDisableCertificateTransparencyRequirementForEV)) |
317 return false; | 318 return false; |
318 | 319 |
319 return group_name == "RequirementEnforced"; | 320 return group_name == "RequirementEnforced"; |
320 } | 321 } |
321 | 322 |
| 323 // Parse kUseSpdy command line flag options, which may contain the following: |
| 324 // |
| 325 // "off" : Disables SPDY support entirely. |
| 326 // "ssl" : Forces SPDY for all HTTPS requests. |
| 327 // "no-ssl" : Forces SPDY for all HTTP requests. |
| 328 // "no-ping" : Disables SPDY ping connection testing. |
| 329 // "exclude=<host>" : Disables SPDY support for the host <host>. |
| 330 // "no-compress" : Disables SPDY header compression. |
| 331 // "no-alt-protocols : Disables alternate protocol support. |
| 332 // "force-alt-protocols : Forces an alternate protocol of SPDY/3 |
| 333 // on port 443. |
| 334 // "single-domain" : Forces all spdy traffic to a single domain. |
| 335 // "init-max-streams=<limit>" : Specifies the maximum number of concurrent |
| 336 // streams for a SPDY session, unless the |
| 337 // specifies a different value via SETTINGS. |
| 338 void ConfigureSpdyGlobalsFromUseSpdyArgument(const std::string& mode, |
| 339 IOThread::Globals* globals) { |
| 340 static const char kOff[] = "off"; |
| 341 static const char kSSL[] = "ssl"; |
| 342 static const char kDisableSSL[] = "no-ssl"; |
| 343 static const char kDisablePing[] = "no-ping"; |
| 344 static const char kExclude[] = "exclude"; // Hosts to exclude |
| 345 static const char kDisableCompression[] = "no-compress"; |
| 346 static const char kDisableAltProtocols[] = "no-alt-protocols"; |
| 347 static const char kForceAltProtocols[] = "force-alt-protocols"; |
| 348 static const char kSingleDomain[] = "single-domain"; |
| 349 |
| 350 static const char kInitialMaxConcurrentStreams[] = "init-max-streams"; |
| 351 |
| 352 std::vector<std::string> spdy_options; |
| 353 base::SplitString(mode, ',', &spdy_options); |
| 354 |
| 355 for (const std::string& element : spdy_options) { |
| 356 std::vector<std::string> name_value; |
| 357 base::SplitString(element, '=', &name_value); |
| 358 const std::string& option = |
| 359 name_value.size() > 0 ? name_value[0] : std::string(); |
| 360 const std::string value = |
| 361 name_value.size() > 1 ? name_value[1] : std::string(); |
| 362 |
| 363 if (option == kOff) { |
| 364 net::HttpStreamFactory::set_spdy_enabled(false); |
| 365 continue; |
| 366 } |
| 367 if (option == kDisableSSL) { |
| 368 globals->spdy_default_protocol.set(net::kProtoSPDY31); |
| 369 globals->force_spdy_over_ssl.set(false); |
| 370 globals->force_spdy_always.set(true); |
| 371 continue; |
| 372 } |
| 373 if (option == kSSL) { |
| 374 globals->spdy_default_protocol.set(net::kProtoSPDY31); |
| 375 globals->force_spdy_over_ssl.set(true); |
| 376 globals->force_spdy_always.set(true); |
| 377 continue; |
| 378 } |
| 379 if (option == kDisablePing) { |
| 380 globals->enable_spdy_ping_based_connection_checking.set(false); |
| 381 continue; |
| 382 } |
| 383 if (option == kExclude) { |
| 384 globals->forced_spdy_exclusions.insert( |
| 385 net::HostPortPair::FromURL(GURL(value))); |
| 386 continue; |
| 387 } |
| 388 if (option == kDisableCompression) { |
| 389 globals->enable_spdy_compression.set(false); |
| 390 continue; |
| 391 } |
| 392 if (option == kDisableAltProtocols) { |
| 393 globals->use_alternate_protocols.set(false); |
| 394 continue; |
| 395 } |
| 396 if (option == kForceAltProtocols) { |
| 397 net::AlternateProtocolInfo pair(443, net::NPN_SPDY_3, 1); |
| 398 net::HttpServerPropertiesImpl::ForceAlternateProtocol(pair); |
| 399 continue; |
| 400 } |
| 401 if (option == kSingleDomain) { |
| 402 DVLOG(1) << "FORCING SINGLE DOMAIN"; |
| 403 globals->force_spdy_single_domain.set(true); |
| 404 continue; |
| 405 } |
| 406 if (option == kInitialMaxConcurrentStreams) { |
| 407 int streams; |
| 408 if (base::StringToInt(value, &streams)) { |
| 409 globals->initial_max_spdy_concurrent_streams.set(streams); |
| 410 continue; |
| 411 } |
| 412 } |
| 413 LOG(DFATAL) << "Unrecognized spdy option: " << option; |
| 414 } |
| 415 } |
| 416 |
322 } // namespace | 417 } // namespace |
323 | 418 |
324 class IOThread::LoggingNetworkChangeObserver | 419 class IOThread::LoggingNetworkChangeObserver |
325 : public net::NetworkChangeNotifier::IPAddressObserver, | 420 : public net::NetworkChangeNotifier::IPAddressObserver, |
326 public net::NetworkChangeNotifier::ConnectionTypeObserver, | 421 public net::NetworkChangeNotifier::ConnectionTypeObserver, |
327 public net::NetworkChangeNotifier::NetworkChangeObserver { | 422 public net::NetworkChangeNotifier::NetworkChangeObserver { |
328 public: | 423 public: |
329 // |net_log| must remain valid throughout our lifetime. | 424 // |net_log| must remain valid throughout our lifetime. |
330 explicit LoggingNetworkChangeObserver(net::NetLog* net_log) | 425 explicit LoggingNetworkChangeObserver(net::NetLog* net_log) |
331 : net_log_(net_log) { | 426 : net_log_(net_log) { |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 } | 953 } |
859 | 954 |
860 void IOThread::InitializeNetworkOptions(const base::CommandLine& command_line) { | 955 void IOThread::InitializeNetworkOptions(const base::CommandLine& command_line) { |
861 // Only handle use-spdy command line flags if "spdy.disabled" preference is | 956 // Only handle use-spdy command line flags if "spdy.disabled" preference is |
862 // not disabled via policy. | 957 // not disabled via policy. |
863 if (is_spdy_disabled_by_policy_) { | 958 if (is_spdy_disabled_by_policy_) { |
864 base::FieldTrial* trial = base::FieldTrialList::Find(kSpdyFieldTrialName); | 959 base::FieldTrial* trial = base::FieldTrialList::Find(kSpdyFieldTrialName); |
865 if (trial) | 960 if (trial) |
866 trial->Disable(); | 961 trial->Disable(); |
867 } else { | 962 } else { |
868 if (command_line.HasSwitch(switches::kTrustedSpdyProxy)) { | 963 std::string group = base::FieldTrialList::FindFullName(kSpdyFieldTrialName); |
869 globals_->trusted_spdy_proxy.set( | 964 VariationParameters params; |
870 command_line.GetSwitchValueASCII(switches::kTrustedSpdyProxy)); | 965 if (!variations::GetVariationParams(kSpdyFieldTrialName, ¶ms)) { |
| 966 params.clear(); |
871 } | 967 } |
872 if (command_line.HasSwitch(switches::kIgnoreUrlFetcherCertRequests)) | 968 ConfigureSpdyGlobals(command_line, group, params, globals_); |
873 net::URLFetcher::SetIgnoreCertificateRequests(true); | |
874 | |
875 if (command_line.HasSwitch(switches::kUseSpdy)) { | |
876 std::string spdy_mode = | |
877 command_line.GetSwitchValueASCII(switches::kUseSpdy); | |
878 EnableSpdy(spdy_mode); | |
879 } else if (command_line.HasSwitch(switches::kEnableSpdy4)) { | |
880 globals_->next_protos = net::NextProtosSpdy4Http2(); | |
881 globals_->use_alternate_protocols.set(true); | |
882 } else if (command_line.HasSwitch(switches::kEnableNpnHttpOnly)) { | |
883 globals_->next_protos = net::NextProtosHttpOnly(); | |
884 globals_->use_alternate_protocols.set(false); | |
885 } else { | |
886 // No SPDY command-line flags have been specified. Examine trial groups. | |
887 ConfigureSpdyFromTrial( | |
888 base::FieldTrialList::FindFullName(kSpdyFieldTrialName), globals_); | |
889 } | |
890 } | 969 } |
891 | 970 |
892 ConfigureTCPFastOpen(command_line); | 971 ConfigureTCPFastOpen(command_line); |
893 ConfigureSdch(); | 972 ConfigureSdch(); |
894 | 973 |
895 // TODO(rch): Make the client socket factory a per-network session | 974 // TODO(rch): Make the client socket factory a per-network session |
896 // instance, constructed from a NetworkSession::Params, to allow us | 975 // instance, constructed from a NetworkSession::Params, to allow us |
897 // to move this option to IOThread::Globals & | 976 // to move this option to IOThread::Globals & |
898 // HttpNetworkSession::Params. | 977 // HttpNetworkSession::Params. |
899 } | 978 } |
(...skipping 23 matching lines...) Expand all Loading... |
923 base::FieldTrialList::FindFullName(kSdchFieldTrialName); | 1002 base::FieldTrialList::FindFullName(kSdchFieldTrialName); |
924 base::StringPiece sdch_trial_group(sdch_trial_group_string); | 1003 base::StringPiece sdch_trial_group(sdch_trial_group_string); |
925 if (sdch_trial_group.starts_with(kEnabledHttpOnlyGroupName)) { | 1004 if (sdch_trial_group.starts_with(kEnabledHttpOnlyGroupName)) { |
926 net::SdchManager::EnableSdchSupport(true); | 1005 net::SdchManager::EnableSdchSupport(true); |
927 net::SdchManager::EnableSecureSchemeSupport(false); | 1006 net::SdchManager::EnableSecureSchemeSupport(false); |
928 } else if (sdch_trial_group.starts_with(kDisabledAllGroupName)) { | 1007 } else if (sdch_trial_group.starts_with(kDisabledAllGroupName)) { |
929 net::SdchManager::EnableSdchSupport(false); | 1008 net::SdchManager::EnableSdchSupport(false); |
930 } | 1009 } |
931 } | 1010 } |
932 | 1011 |
933 void IOThread::ConfigureSpdyFromTrial(base::StringPiece spdy_trial_group, | |
934 Globals* globals) { | |
935 if (spdy_trial_group.starts_with(kSpdyFieldTrialHoldbackGroupNamePrefix)) { | |
936 // TODO(jgraettinger): Use net::NextProtosHttpOnly() instead? | |
937 net::HttpStreamFactory::set_spdy_enabled(false); | |
938 } else if (spdy_trial_group.starts_with( | |
939 kSpdyFieldTrialSpdy31GroupNamePrefix)) { | |
940 globals->next_protos = net::NextProtosSpdy31(); | |
941 globals->use_alternate_protocols.set(true); | |
942 } else if (spdy_trial_group.starts_with( | |
943 kSpdyFieldTrialSpdy4GroupNamePrefix)) { | |
944 globals->next_protos = net::NextProtosSpdy4Http2(); | |
945 globals->use_alternate_protocols.set(true); | |
946 } else { | |
947 // By default, enable HTTP/2. | |
948 globals->next_protos = net::NextProtosSpdy4Http2(); | |
949 globals->use_alternate_protocols.set(true); | |
950 } | |
951 } | |
952 | |
953 void IOThread::EnableSpdy(const std::string& mode) { | |
954 static const char kOff[] = "off"; | |
955 static const char kSSL[] = "ssl"; | |
956 static const char kDisableSSL[] = "no-ssl"; | |
957 static const char kDisablePing[] = "no-ping"; | |
958 static const char kExclude[] = "exclude"; // Hosts to exclude | |
959 static const char kDisableCompression[] = "no-compress"; | |
960 static const char kDisableAltProtocols[] = "no-alt-protocols"; | |
961 static const char kForceAltProtocols[] = "force-alt-protocols"; | |
962 static const char kSingleDomain[] = "single-domain"; | |
963 | |
964 static const char kInitialMaxConcurrentStreams[] = "init-max-streams"; | |
965 | |
966 std::vector<std::string> spdy_options; | |
967 base::SplitString(mode, ',', &spdy_options); | |
968 | |
969 for (std::vector<std::string>::iterator it = spdy_options.begin(); | |
970 it != spdy_options.end(); ++it) { | |
971 const std::string& element = *it; | |
972 std::vector<std::string> name_value; | |
973 base::SplitString(element, '=', &name_value); | |
974 const std::string& option = | |
975 name_value.size() > 0 ? name_value[0] : std::string(); | |
976 const std::string value = | |
977 name_value.size() > 1 ? name_value[1] : std::string(); | |
978 | |
979 if (option == kOff) { | |
980 net::HttpStreamFactory::set_spdy_enabled(false); | |
981 } else if (option == kDisableSSL) { | |
982 globals_->spdy_default_protocol.set(net::kProtoSPDY31); | |
983 globals_->force_spdy_over_ssl.set(false); | |
984 globals_->force_spdy_always.set(true); | |
985 } else if (option == kSSL) { | |
986 globals_->spdy_default_protocol.set(net::kProtoSPDY31); | |
987 globals_->force_spdy_over_ssl.set(true); | |
988 globals_->force_spdy_always.set(true); | |
989 } else if (option == kDisablePing) { | |
990 globals_->enable_spdy_ping_based_connection_checking.set(false); | |
991 } else if (option == kExclude) { | |
992 globals_->forced_spdy_exclusions.insert( | |
993 net::HostPortPair::FromURL(GURL(value))); | |
994 } else if (option == kDisableCompression) { | |
995 globals_->enable_spdy_compression.set(false); | |
996 } else if (option == kDisableAltProtocols) { | |
997 globals_->use_alternate_protocols.set(false); | |
998 } else if (option == kForceAltProtocols) { | |
999 net::AlternateProtocolInfo pair(443, net::NPN_SPDY_3, 1); | |
1000 net::HttpServerPropertiesImpl::ForceAlternateProtocol(pair); | |
1001 } else if (option == kSingleDomain) { | |
1002 DVLOG(1) << "FORCING SINGLE DOMAIN"; | |
1003 globals_->force_spdy_single_domain.set(true); | |
1004 } else if (option == kInitialMaxConcurrentStreams) { | |
1005 int streams; | |
1006 if (base::StringToInt(value, &streams)) | |
1007 globals_->initial_max_spdy_concurrent_streams.set(streams); | |
1008 } else if (option.empty() && it == spdy_options.begin()) { | |
1009 continue; | |
1010 } else { | |
1011 LOG(DFATAL) << "Unrecognized spdy option: " << option; | |
1012 } | |
1013 } | |
1014 } | |
1015 | |
1016 // static | 1012 // static |
| 1013 void IOThread::ConfigureSpdyGlobals( |
| 1014 const base::CommandLine& command_line, |
| 1015 base::StringPiece spdy_trial_group, |
| 1016 const VariationParameters& spdy_trial_params, |
| 1017 IOThread::Globals* globals) { |
| 1018 if (command_line.HasSwitch(switches::kTrustedSpdyProxy)) { |
| 1019 globals->trusted_spdy_proxy.set( |
| 1020 command_line.GetSwitchValueASCII(switches::kTrustedSpdyProxy)); |
| 1021 } |
| 1022 if (command_line.HasSwitch(switches::kIgnoreUrlFetcherCertRequests)) |
| 1023 net::URLFetcher::SetIgnoreCertificateRequests(true); |
| 1024 |
| 1025 if (command_line.HasSwitch(switches::kUseSpdy)) { |
| 1026 std::string spdy_mode = |
| 1027 command_line.GetSwitchValueASCII(switches::kUseSpdy); |
| 1028 ConfigureSpdyGlobalsFromUseSpdyArgument(spdy_mode, globals); |
| 1029 return; |
| 1030 } |
| 1031 |
| 1032 globals->next_protos.clear(); |
| 1033 globals->next_protos.push_back(net::kProtoHTTP11); |
| 1034 bool enable_quic = false; |
| 1035 globals->enable_quic.CopyToIfSet(&enable_quic); |
| 1036 if (enable_quic) { |
| 1037 globals->next_protos.push_back(net::kProtoQUIC1SPDY3); |
| 1038 } |
| 1039 |
| 1040 if (command_line.HasSwitch(switches::kEnableSpdy4)) { |
| 1041 globals->next_protos.push_back(net::kProtoSPDY31); |
| 1042 globals->next_protos.push_back(net::kProtoSPDY4_14); |
| 1043 globals->next_protos.push_back(net::kProtoSPDY4); |
| 1044 globals->use_alternate_protocols.set(true); |
| 1045 return; |
| 1046 } |
| 1047 if (command_line.HasSwitch(switches::kEnableNpnHttpOnly)) { |
| 1048 globals->use_alternate_protocols.set(false); |
| 1049 return; |
| 1050 } |
| 1051 |
| 1052 // No SPDY command-line flags have been specified. Examine trial groups. |
| 1053 if (spdy_trial_group.starts_with(kSpdyFieldTrialHoldbackGroupNamePrefix)) { |
| 1054 net::HttpStreamFactory::set_spdy_enabled(false); |
| 1055 return; |
| 1056 } |
| 1057 if (spdy_trial_group.starts_with(kSpdyFieldTrialSpdy31GroupNamePrefix)) { |
| 1058 globals->next_protos.push_back(net::kProtoSPDY31); |
| 1059 globals->use_alternate_protocols.set(true); |
| 1060 return; |
| 1061 } |
| 1062 if (spdy_trial_group.starts_with(kSpdyFieldTrialSpdy4GroupNamePrefix)) { |
| 1063 globals->next_protos.push_back(net::kProtoSPDY31); |
| 1064 globals->next_protos.push_back(net::kProtoSPDY4_14); |
| 1065 globals->next_protos.push_back(net::kProtoSPDY4); |
| 1066 globals->use_alternate_protocols.set(true); |
| 1067 return; |
| 1068 } |
| 1069 if (spdy_trial_group.starts_with(kSpdyFieldTrialParametrizedPrefix)) { |
| 1070 bool spdy_enabled = false; |
| 1071 if (LowerCaseEqualsASCII( |
| 1072 GetVariationParam(spdy_trial_params, "enable_spdy31"), "true")) { |
| 1073 globals->next_protos.push_back(net::kProtoSPDY31); |
| 1074 spdy_enabled = true; |
| 1075 } |
| 1076 if (LowerCaseEqualsASCII( |
| 1077 GetVariationParam(spdy_trial_params, "enable_http2_14"), "true")) { |
| 1078 globals->next_protos.push_back(net::kProtoSPDY4_14); |
| 1079 spdy_enabled = true; |
| 1080 } |
| 1081 if (LowerCaseEqualsASCII( |
| 1082 GetVariationParam(spdy_trial_params, "enable_http2"), "true")) { |
| 1083 globals->next_protos.push_back(net::kProtoSPDY4); |
| 1084 spdy_enabled = true; |
| 1085 } |
| 1086 // TODO(bnc): HttpStreamFactory::spdy_enabled_ is redundant with |
| 1087 // globals->next_protos, can it be eliminated? |
| 1088 net::HttpStreamFactory::set_spdy_enabled(spdy_enabled); |
| 1089 globals->use_alternate_protocols.set(true); |
| 1090 return; |
| 1091 } |
| 1092 |
| 1093 // By default, enable HTTP/2. |
| 1094 globals->next_protos.push_back(net::kProtoSPDY31); |
| 1095 globals->next_protos.push_back(net::kProtoSPDY4_14); |
| 1096 globals->next_protos.push_back(net::kProtoSPDY4); |
| 1097 globals->use_alternate_protocols.set(true); |
| 1098 } |
| 1099 |
| 1100 // static |
1017 void IOThread::RegisterPrefs(PrefRegistrySimple* registry) { | 1101 void IOThread::RegisterPrefs(PrefRegistrySimple* registry) { |
1018 registry->RegisterStringPref(prefs::kAuthSchemes, | 1102 registry->RegisterStringPref(prefs::kAuthSchemes, |
1019 "basic,digest,ntlm,negotiate," | 1103 "basic,digest,ntlm,negotiate," |
1020 "spdyproxy"); | 1104 "spdyproxy"); |
1021 registry->RegisterBooleanPref(prefs::kDisableAuthNegotiateCnameLookup, false); | 1105 registry->RegisterBooleanPref(prefs::kDisableAuthNegotiateCnameLookup, false); |
1022 registry->RegisterBooleanPref(prefs::kEnableAuthNegotiatePort, false); | 1106 registry->RegisterBooleanPref(prefs::kEnableAuthNegotiatePort, false); |
1023 registry->RegisterStringPref(prefs::kAuthServerWhitelist, std::string()); | 1107 registry->RegisterStringPref(prefs::kAuthServerWhitelist, std::string()); |
1024 registry->RegisterStringPref(prefs::kAuthNegotiateDelegateWhitelist, | 1108 registry->RegisterStringPref(prefs::kAuthNegotiateDelegateWhitelist, |
1025 std::string()); | 1109 std::string()); |
1026 registry->RegisterStringPref(prefs::kGSSAPILibraryName, std::string()); | 1110 registry->RegisterStringPref(prefs::kGSSAPILibraryName, std::string()); |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1514 net::QuicVersionVector supported_versions = net::QuicSupportedVersions(); | 1598 net::QuicVersionVector supported_versions = net::QuicSupportedVersions(); |
1515 for (size_t i = 0; i < supported_versions.size(); ++i) { | 1599 for (size_t i = 0; i < supported_versions.size(); ++i) { |
1516 net::QuicVersion version = supported_versions[i]; | 1600 net::QuicVersion version = supported_versions[i]; |
1517 if (net::QuicVersionToString(version) == quic_version) { | 1601 if (net::QuicVersionToString(version) == quic_version) { |
1518 return version; | 1602 return version; |
1519 } | 1603 } |
1520 } | 1604 } |
1521 | 1605 |
1522 return net::QUIC_VERSION_UNSUPPORTED; | 1606 return net::QUIC_VERSION_UNSUPPORTED; |
1523 } | 1607 } |
OLD | NEW |