| Index: webrtc/api/peerconnection.cc
 | 
| diff --git a/webrtc/api/peerconnection.cc b/webrtc/api/peerconnection.cc
 | 
| index e217f8089fe8f98b7d942034857d48fc7ee42aa0..d4deb84d108a09ce43911833bddd3ee1b4100bda 100644
 | 
| --- a/webrtc/api/peerconnection.cc
 | 
| +++ b/webrtc/api/peerconnection.cc
 | 
| @@ -907,6 +907,23 @@ PeerConnection::CreateDataChannel(
 | 
|      const std::string& label,
 | 
|      const DataChannelInit* config) {
 | 
|    TRACE_EVENT0("webrtc", "PeerConnection::CreateDataChannel");
 | 
| +#ifdef HAVE_QUIC
 | 
| +  if (session_->data_channel_type() == cricket::DCT_QUIC) {
 | 
| +    // TODO(zhihuang): Handle case when config is NULL.
 | 
| +    if (!config) {
 | 
| +      LOG(LS_ERROR) << "Missing config for QUIC data channel.";
 | 
| +      return nullptr;
 | 
| +    }
 | 
| +    // TODO(zhihuang): Allow unreliable or ordered QUIC data channels.
 | 
| +    if (!config->reliable || config->ordered) {
 | 
| +      LOG(LS_ERROR) << "QUIC data channel does not implement unreliable or "
 | 
| +                       "ordered delivery.";
 | 
| +      return nullptr;
 | 
| +    }
 | 
| +    return session_->quic_data_transport()->CreateDataChannel(label, config);
 | 
| +  }
 | 
| +#endif  // HAVE_QUIC
 | 
| +
 | 
|    bool first_datachannel = !HasDataChannels();
 | 
|  
 | 
|    std::unique_ptr<InternalDataChannelInit> internal_config;
 | 
| @@ -1618,8 +1635,8 @@ bool PeerConnection::GetOptionsForOffer(
 | 
|        (session_options->has_audio() || session_options->has_video() ||
 | 
|         session_options->has_data());
 | 
|  
 | 
| -  if (session_->data_channel_type() == cricket::DCT_SCTP && HasDataChannels()) {
 | 
| -    session_options->data_channel_type = cricket::DCT_SCTP;
 | 
| +  if (HasDataChannels()) {
 | 
| +    session_options->data_channel_type = session_->data_channel_type();
 | 
|    }
 | 
|  
 | 
|    session_options->rtcp_cname = rtcp_cname_;
 | 
| @@ -1647,9 +1664,7 @@ void PeerConnection::FinishOptionsForAnswer(
 | 
|    // RTP data channel is handled in MediaSessionOptions::AddStream. SCTP streams
 | 
|    // are not signaled in the SDP so does not go through that path and must be
 | 
|    // handled here.
 | 
| -  if (session_->data_channel_type() == cricket::DCT_SCTP) {
 | 
| -    session_options->data_channel_type = cricket::DCT_SCTP;
 | 
| -  }
 | 
| +  session_options->data_channel_type = session_->data_channel_type();
 | 
|  }
 | 
|  
 | 
|  bool PeerConnection::GetOptionsForAnswer(
 | 
| @@ -2052,7 +2067,13 @@ rtc::scoped_refptr<DataChannel> PeerConnection::InternalCreateDataChannel(
 | 
|  }
 | 
|  
 | 
|  bool PeerConnection::HasDataChannels() const {
 | 
| +#ifdef HAVE_QUIC
 | 
| +  return !rtp_data_channels_.empty() || !sctp_data_channels_.empty() ||
 | 
| +         (session_->quic_data_transport() &&
 | 
| +          session_->quic_data_transport()->HasDataChannels());
 | 
| +#else
 | 
|    return !rtp_data_channels_.empty() || !sctp_data_channels_.empty();
 | 
| +#endif  // HAVE_QUIC
 | 
|  }
 | 
|  
 | 
|  void PeerConnection::AllocateSctpSids(rtc::SSLRole role) {
 | 
| 
 |