blob: 5c76192bcd8377058a53f138db08686bca71b237 [file] [log] [blame]
// Copyright 2018 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 "third_party/blink/renderer/modules/peerconnection/rtc_dtls_transport.h"
#include <memory>
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/events/event.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
#include "third_party/blink/renderer/modules/peerconnection/adapters/dtls_transport_proxy.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_error_util.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
#include "third_party/webrtc/api/dtls_transport_interface.h"
#include "third_party/webrtc/api/peer_connection_interface.h"
namespace blink {
namespace {
String TransportStateToString(webrtc::DtlsTransportState state) {
switch (state) {
case webrtc::DtlsTransportState::kNew:
return String("new");
break;
case webrtc::DtlsTransportState::kConnecting:
return String("connecting");
break;
case webrtc::DtlsTransportState::kConnected:
return String("connected");
break;
case webrtc::DtlsTransportState::kClosed:
return String("closed");
break;
case webrtc::DtlsTransportState::kFailed:
return String("failed");
break;
default:
NOTREACHED();
return String("failed");
break;
}
}
std::unique_ptr<DtlsTransportProxy> CreateProxy(
ExecutionContext* context,
webrtc::DtlsTransportInterface* native_transport,
DtlsTransportProxy::Delegate* delegate) {
LocalFrame* frame = To<Document>(context)->GetFrame();
scoped_refptr<base::SingleThreadTaskRunner> proxy_thread =
frame->GetTaskRunner(TaskType::kNetworking);
scoped_refptr<base::SingleThreadTaskRunner> host_thread =
Platform::Current()->GetWebRtcWorkerThread();
return DtlsTransportProxy::Create(*frame, proxy_thread, host_thread,
native_transport, delegate);
}
} // namespace
RTCDtlsTransport::RTCDtlsTransport(
ExecutionContext* context,
rtc::scoped_refptr<webrtc::DtlsTransportInterface> native_transport,
RTCIceTransport* ice_transport)
: ContextClient(context),
current_state_(webrtc::DtlsTransportState::kNew),
native_transport_(native_transport),
proxy_(CreateProxy(context, native_transport, this)),
ice_transport_(ice_transport) {}
RTCDtlsTransport::~RTCDtlsTransport() {}
String RTCDtlsTransport::state() const {
if (closed_from_owner_) {
return TransportStateToString(webrtc::DtlsTransportState::kClosed);
}
return TransportStateToString(current_state_.state());
}
RTCIceTransport* RTCDtlsTransport::iceTransport() const {
return ice_transport_;
}
webrtc::DtlsTransportInterface* RTCDtlsTransport::native_transport() {
return native_transport_.get();
}
void RTCDtlsTransport::ChangeState(webrtc::DtlsTransportInformation info) {
DCHECK(current_state_.state() != webrtc::DtlsTransportState::kClosed);
current_state_ = info;
}
void RTCDtlsTransport::Close() {
closed_from_owner_ = true;
if (current_state_.state() != webrtc::DtlsTransportState::kClosed) {
DispatchEvent(*Event::Create(event_type_names::kStatechange));
}
ice_transport_->stop();
}
// Implementation of DtlsTransportProxy::Delegate
void RTCDtlsTransport::OnStartCompleted(webrtc::DtlsTransportInformation info) {
current_state_ = info;
}
void RTCDtlsTransport::OnStateChange(webrtc::DtlsTransportInformation info) {
// We depend on closed only happening once for safe garbage collection.
DCHECK(current_state_.state() != webrtc::DtlsTransportState::kClosed);
current_state_ = info;
if (!closed_from_owner_) {
DispatchEvent(*Event::Create(event_type_names::kStatechange));
}
}
const AtomicString& RTCDtlsTransport::InterfaceName() const {
return event_target_names::kRTCDtlsTransport;
}
ExecutionContext* RTCDtlsTransport::GetExecutionContext() const {
return ContextClient::GetExecutionContext();
}
void RTCDtlsTransport::Trace(Visitor* visitor) {
visitor->Trace(ice_transport_);
DtlsTransportProxy::Delegate::Trace(visitor);
EventTargetWithInlineData::Trace(visitor);
ContextClient::Trace(visitor);
}
} // namespace blink