| Index: net/quic/chromium/quic_stream_factory.cc | 
| diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc | 
| index 378985bbf25ad21af847fc2eace88b3fd1bbbe00..b3bb81ba3fac873bc824a055ba5a660071f1af80 100644 | 
| --- a/net/quic/chromium/quic_stream_factory.cc | 
| +++ b/net/quic/chromium/quic_stream_factory.cc | 
| @@ -326,6 +326,7 @@ class QuicStreamFactory::CertVerifierJob { | 
| class QuicStreamFactory::Job { | 
| public: | 
| Job(QuicStreamFactory* factory, | 
| +      const QuicVersion& quic_version, | 
| HostResolver* host_resolver, | 
| const QuicSessionKey& key, | 
| bool was_alternative_service_recently_broken, | 
| @@ -366,6 +367,7 @@ class QuicStreamFactory::Job { | 
| IoState io_state_; | 
|  | 
| QuicStreamFactory* factory_; | 
| +  QuicVersion quic_version_; | 
| HostResolver* host_resolver_; | 
| std::unique_ptr<HostResolver::Request> request_; | 
| const QuicSessionKey key_; | 
| @@ -383,6 +385,7 @@ class QuicStreamFactory::Job { | 
| }; | 
|  | 
| QuicStreamFactory::Job::Job(QuicStreamFactory* factory, | 
| +                            const QuicVersion& quic_version, | 
| HostResolver* host_resolver, | 
| const QuicSessionKey& key, | 
| bool was_alternative_service_recently_broken, | 
| @@ -390,6 +393,7 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory, | 
| const NetLogWithSource& net_log) | 
| : io_state_(STATE_RESOLVE_HOST), | 
| factory_(factory), | 
| +      quic_version_(quic_version), | 
| host_resolver_(host_resolver), | 
| key_(key), | 
| cert_verify_flags_(cert_verify_flags), | 
| @@ -508,10 +512,11 @@ int QuicStreamFactory::Job::DoConnect() { | 
| NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT, | 
| NetLog::BoolCallback("require_confirmation", require_confirmation)); | 
|  | 
| -  int rv = | 
| -      factory_->CreateSession(key_, cert_verify_flags_, require_confirmation, | 
| -                              address_list_, dns_resolution_start_time_, | 
| -                              dns_resolution_end_time_, net_log_, &session_); | 
| +  DCHECK_NE(quic_version_, QUIC_VERSION_UNSUPPORTED); | 
| +  int rv = factory_->CreateSession( | 
| +      key_, quic_version_, cert_verify_flags_, require_confirmation, | 
| +      address_list_, dns_resolution_start_time_, dns_resolution_end_time_, | 
| +      net_log_, &session_); | 
| if (rv != OK) { | 
| DCHECK(rv != ERR_IO_PENDING); | 
| DCHECK(!session_); | 
| @@ -581,6 +586,7 @@ QuicStreamRequest::~QuicStreamRequest() { | 
| } | 
|  | 
| int QuicStreamRequest::Request(const HostPortPair& destination, | 
| +                               const QuicVersionVector& advertised_versions, | 
| PrivacyMode privacy_mode, | 
| int cert_verify_flags, | 
| const GURL& url, | 
| @@ -591,8 +597,8 @@ int QuicStreamRequest::Request(const HostPortPair& destination, | 
| DCHECK(factory_); | 
| server_id_ = QuicServerId(HostPortPair::FromURL(url), privacy_mode); | 
|  | 
| -  int rv = factory_->Create(server_id_, destination, cert_verify_flags, url, | 
| -                            method, net_log, this); | 
| +  int rv = factory_->Create(server_id_, destination, advertised_versions, | 
| +                            cert_verify_flags, url, method, net_log, this); | 
| if (rv == ERR_IO_PENDING) { | 
| net_log_ = net_log; | 
| callback_ = callback; | 
| @@ -849,6 +855,7 @@ bool QuicStreamFactory::CanUseExistingSession(const QuicServerId& server_id, | 
|  | 
| int QuicStreamFactory::Create(const QuicServerId& server_id, | 
| const HostPortPair& destination, | 
| +                              const QuicVersionVector& advertised_versions, | 
| int cert_verify_flags, | 
| const GURL& url, | 
| QuicStringPiece method, | 
| @@ -926,8 +933,10 @@ int QuicStreamFactory::Create(const QuicServerId& server_id, | 
| ignore_result(StartCertVerifyJob(server_id, cert_verify_flags, net_log)); | 
|  | 
| QuicSessionKey key(destination, server_id); | 
| +  QuicVersion quic_version = SelectQuicVersion(advertised_versions); | 
| +  DCHECK_NE(quic_version, QUIC_VERSION_UNSUPPORTED); | 
| std::unique_ptr<Job> job = base::MakeUnique<Job>( | 
| -      this, host_resolver_, key, WasQuicRecentlyBroken(server_id), | 
| +      this, quic_version, host_resolver_, key, WasQuicRecentlyBroken(server_id), | 
| cert_verify_flags, net_log); | 
| int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, | 
| base::Unretained(this), job.get())); | 
| @@ -1445,15 +1454,15 @@ int QuicStreamFactory::ConfigureSocket(DatagramClientSocket* socket, | 
| return OK; | 
| } | 
|  | 
| -int QuicStreamFactory::CreateSession( | 
| -    const QuicSessionKey& key, | 
| -    int cert_verify_flags, | 
| -    bool require_confirmation, | 
| -    const AddressList& address_list, | 
| -    base::TimeTicks dns_resolution_start_time, | 
| -    base::TimeTicks dns_resolution_end_time, | 
| -    const NetLogWithSource& net_log, | 
| -    QuicChromiumClientSession** session) { | 
| +int QuicStreamFactory::CreateSession(const QuicSessionKey& key, | 
| +                                     const QuicVersion& quic_version, | 
| +                                     int cert_verify_flags, | 
| +                                     bool require_confirmation, | 
| +                                     const AddressList& address_list, | 
| +                                     base::TimeTicks dns_resolution_start_time, | 
| +                                     base::TimeTicks dns_resolution_end_time, | 
| +                                     const NetLogWithSource& net_log, | 
| +                                     QuicChromiumClientSession** session) { | 
| TRACE_EVENT0(kNetTracingCategory, "QuicStreamFactory::CreateSession"); | 
| IPEndPoint addr = *address_list.begin(); | 
| const QuicServerId& server_id = key.server_id(); | 
| @@ -1486,6 +1495,7 @@ int QuicStreamFactory::CreateSession( | 
| InitializeCachedStateInCryptoConfig(server_id, server_info, &connection_id); | 
|  | 
| QuicChromiumPacketWriter* writer = new QuicChromiumPacketWriter(socket.get()); | 
| +  // TODO(zhongyi): pass over |quic_version| to QuicConnection; | 
| QuicConnection* connection = new QuicConnection( | 
| connection_id, QuicSocketAddress(QuicSocketAddressImpl(addr)), | 
| helper_.get(), alarm_factory_.get(), writer, true /* owns_writer */, | 
| @@ -1579,6 +1589,18 @@ void QuicStreamFactory::ConfigureInitialRttEstimate( | 
| SetInitialRttEstimate(base::TimeDelta(), INITIAL_RTT_DEFAULT, config); | 
| } | 
|  | 
| +QuicVersion QuicStreamFactory::SelectQuicVersion( | 
| +    const QuicVersionVector& advertised_versions) const { | 
| +  for (const auto& supported : supported_versions_) { | 
| +    for (const auto& advertised : advertised_versions) { | 
| +      if (supported == advertised) | 
| +        return supported; | 
| +    } | 
| +  } | 
| + | 
| +  return supported_versions_[0]; | 
| +} | 
| + | 
| const base::TimeDelta* QuicStreamFactory::GetServerNetworkStatsSmoothedRtt( | 
| const QuicServerId& server_id) const { | 
| url::SchemeHostPort server("https", server_id.host_port_pair().host(), | 
|  |