Commit 061e2a06 authored by Henrik Boström's avatar Henrik Boström Committed by Commit Bot

RTCPeerConnection wired up to use CallSetupStateTracker.

This makes the RTCPeerConnection aware, through the help of the tracker,
what its call setup state is. This is confirmed by unittests.

UMA metrics and trigger point for collecting this will be added in a
follow-up CL.

Bug: 906029
Change-Id: Ib71ec03d7560c5ee9ac65fd5427b297808e8c4fa
Reviewed-on: https://chromium-review.googlesource.com/c/1349340Reviewed-by: default avatarHarald Alvestrand <hta@chromium.org>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Commit-Queue: Henrik Boström <hbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#611088}
parent 52a2c835
......@@ -78,6 +78,7 @@ blink_modules_sources("peerconnection") {
"rtc_rtp_transceiver.h",
"rtc_session_description.cc",
"rtc_session_description.h",
"rtc_session_description_enums.h",
"rtc_session_description_request_impl.cc",
"rtc_session_description_request_impl.h",
"rtc_session_description_request_promise_impl.cc",
......
......@@ -42,10 +42,14 @@
#include "third_party/blink/renderer/modules/crypto/normalize_algorithm.h"
#include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/mediastream/media_stream.h"
#include "third_party/blink/renderer/modules/peerconnection/call_setup_state_tracker.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_ice_candidate.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_enums.h"
#include "third_party/blink/renderer/platform/async_method_runner.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_session_description_request.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_void_request.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
namespace blink {
......@@ -310,6 +314,13 @@ class MODULES_EXPORT RTCPeerConnection final
// WebFeature::kRTCPeerConnectionComplexPlanBSdpUsingDefaultSdpSemantics.
bool ShouldShowComplexPlanBSdpWarning(const RTCSessionDescriptionInit*) const;
const CallSetupStateTracker& call_setup_state_tracker() const;
void NoteSessionDescriptionRequestCompleted(
RTCCreateSessionDescriptionOperation operation,
bool success);
void NoteVoidRequestCompleted(RTCSetSessionDescriptionOperation operation,
bool success);
void Trace(blink::Visitor*) override;
private:
......@@ -458,6 +469,7 @@ class MODULES_EXPORT RTCPeerConnection final
webrtc::PeerConnectionInterface::IceGatheringState ice_gathering_state_;
webrtc::PeerConnectionInterface::IceConnectionState ice_connection_state_;
webrtc::PeerConnectionInterface::PeerConnectionState peer_connection_state_;
CallSetupStateTracker call_setup_state_tracker_;
// A map containing any track that is in use by the peer connection. This
// includes tracks of |rtp_senders_| and |rtp_receivers_|.
......
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_SESSION_DESCRIPTION_ENUMS_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_SESSION_DESCRIPTION_ENUMS_H_
namespace blink {
// RTCPeerConnection methods that are used to create session descriptions (SDP).
// See RTCPeerConnection::createOffer() and RTCPeerConnection::createAnswer().
enum class RTCCreateSessionDescriptionOperation {
kCreateOffer,
kCreateAnswer,
};
// RTCPeerConnection operations that are used to set session descriptions (SDP).
// See methods RTCPeerConnection::setLocalDescription() and
// RTCPeerConnection::setRemoteDescription() - the SDP parameter can have the
// type "offer" or "answer".
enum class RTCSetSessionDescriptionOperation {
kSetLocalDescriptionOffer,
kSetLocalDescriptionAnswer,
kSetLocalDescriptionInvalidType,
kSetRemoteDescriptionOffer,
kSetRemoteDescriptionAnswer,
kSetRemoteDescriptionInvalidType,
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_SESSION_DESCRIPTION_ENUMS_H_
......@@ -41,19 +41,22 @@ namespace blink {
RTCSessionDescriptionRequestImpl* RTCSessionDescriptionRequestImpl::Create(
ExecutionContext* context,
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester,
V8RTCSessionDescriptionCallback* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback) {
return new RTCSessionDescriptionRequestImpl(context, requester,
return new RTCSessionDescriptionRequestImpl(context, operation, requester,
success_callback, error_callback);
}
RTCSessionDescriptionRequestImpl::RTCSessionDescriptionRequestImpl(
ExecutionContext* context,
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester,
V8RTCSessionDescriptionCallback* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback)
: ContextLifecycleObserver(context),
operation_(operation),
success_callback_(ToV8PersistentCallbackFunction(success_callback)),
error_callback_(ToV8PersistentCallbackFunction(error_callback)),
requester_(requester) {
......@@ -67,6 +70,7 @@ void RTCSessionDescriptionRequestImpl::RequestSucceeded(
bool should_fire_callback =
requester_ ? requester_->ShouldFireDefaultCallbacks() : false;
if (should_fire_callback && success_callback_) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, true);
auto* description = RTCSessionDescription::Create(web_session_description);
requester_->NoteSdpCreated(*description);
success_callback_->InvokeAndReportException(nullptr, description);
......@@ -79,6 +83,7 @@ void RTCSessionDescriptionRequestImpl::RequestFailed(
bool should_fire_callback =
requester_ ? requester_->ShouldFireDefaultCallbacks() : false;
if (should_fire_callback && error_callback_) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, false);
error_callback_->InvokeAndReportException(
nullptr, CreateDOMExceptionFromRTCError(error));
}
......
......@@ -35,6 +35,7 @@
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_error_callback.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_session_description_callback.h"
#include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_enums.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_session_description_request.h"
......@@ -43,6 +44,9 @@ namespace blink {
class RTCPeerConnection;
class WebRTCSessionDescription;
// TODO(https://crbug.com/908468): Split up the operation-specific codepaths
// into separate request implementations and find a way to consolidate the
// shared code as to not repeat the majority of the implementations.
class RTCSessionDescriptionRequestImpl final
: public RTCSessionDescriptionRequest,
public ContextLifecycleObserver {
......@@ -51,6 +55,7 @@ class RTCSessionDescriptionRequestImpl final
public:
static RTCSessionDescriptionRequestImpl* Create(
ExecutionContext*,
RTCCreateSessionDescriptionOperation,
RTCPeerConnection*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*);
......@@ -66,12 +71,14 @@ class RTCSessionDescriptionRequestImpl final
private:
RTCSessionDescriptionRequestImpl(ExecutionContext*,
RTCCreateSessionDescriptionOperation,
RTCPeerConnection*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*);
void Clear();
RTCCreateSessionDescriptionOperation operation_;
// This request object is held by WebRTCPeerConnectionHandler, which doesn't
// support wrapper-tracing. Thus, this object holds the underlying callback
// functions as persistent handles. This is acceptable because the request
......
......@@ -14,20 +14,25 @@
namespace blink {
RTCSessionDescriptionRequestPromiseImpl*
RTCSessionDescriptionRequestPromiseImpl::Create(RTCPeerConnection* requester,
ScriptPromiseResolver* resolver,
const char* interface_name,
const char* property_name) {
RTCSessionDescriptionRequestPromiseImpl::Create(
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester,
ScriptPromiseResolver* resolver,
const char* interface_name,
const char* property_name) {
return new RTCSessionDescriptionRequestPromiseImpl(
requester, resolver, interface_name, property_name);
operation, requester, resolver, interface_name, property_name);
}
RTCSessionDescriptionRequestPromiseImpl::
RTCSessionDescriptionRequestPromiseImpl(RTCPeerConnection* requester,
ScriptPromiseResolver* resolver,
const char* interface_name,
const char* property_name)
: requester_(requester),
RTCSessionDescriptionRequestPromiseImpl(
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester,
ScriptPromiseResolver* resolver,
const char* interface_name,
const char* property_name)
: operation_(operation),
requester_(requester),
resolver_(resolver),
interface_name_(interface_name),
property_name_(property_name) {
......@@ -41,6 +46,7 @@ RTCSessionDescriptionRequestPromiseImpl::
void RTCSessionDescriptionRequestPromiseImpl::RequestSucceeded(
const WebRTCSessionDescription& web_session_description) {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, true);
auto* description = RTCSessionDescription::Create(web_session_description);
requester_->NoteSdpCreated(*description);
resolver_->Resolve(description);
......@@ -56,6 +62,7 @@ void RTCSessionDescriptionRequestPromiseImpl::RequestSucceeded(
void RTCSessionDescriptionRequestPromiseImpl::RequestFailed(
const webrtc::RTCError& error) {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, false);
ScriptState::Scope scope(resolver_->GetScriptState());
ExceptionState exception_state(resolver_->GetScriptState()->GetIsolate(),
ExceptionState::kExecutionContext,
......
......@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_SESSION_DESCRIPTION_REQUEST_PROMISE_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_SESSION_DESCRIPTION_REQUEST_PROMISE_IMPL_H_
#include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_enums.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_session_description_request.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
......@@ -14,10 +15,14 @@ class RTCPeerConnection;
class ScriptPromiseResolver;
class WebRTCSessionDescription;
// TODO(https://crbug.com/908468): Split up the operation-specific codepaths
// into separate request implementations and find a way to consolidate the
// shared code as to not repeat the majority of the implementations.
class RTCSessionDescriptionRequestPromiseImpl final
: public RTCSessionDescriptionRequest {
public:
static RTCSessionDescriptionRequestPromiseImpl* Create(
RTCCreateSessionDescriptionOperation,
RTCPeerConnection*,
ScriptPromiseResolver*,
const char* interface_name,
......@@ -31,13 +36,15 @@ class RTCSessionDescriptionRequestPromiseImpl final
void Trace(blink::Visitor*) override;
private:
RTCSessionDescriptionRequestPromiseImpl(RTCPeerConnection*,
RTCSessionDescriptionRequestPromiseImpl(RTCCreateSessionDescriptionOperation,
RTCPeerConnection*,
ScriptPromiseResolver*,
const char* interface_name,
const char* property_name);
void Clear();
RTCCreateSessionDescriptionOperation operation_;
Member<RTCPeerConnection> requester_;
Member<ScriptPromiseResolver> resolver_;
const char* interface_name_;
......
......@@ -38,19 +38,22 @@ namespace blink {
RTCVoidRequestImpl* RTCVoidRequestImpl::Create(
ExecutionContext* context,
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester,
V8VoidFunction* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback) {
return new RTCVoidRequestImpl(context, requester, success_callback,
error_callback);
return new RTCVoidRequestImpl(context, std::move(operation), requester,
success_callback, error_callback);
}
RTCVoidRequestImpl::RTCVoidRequestImpl(
ExecutionContext* context,
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester,
V8VoidFunction* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback)
: ContextLifecycleObserver(context),
operation_(std::move(operation)),
success_callback_(ToV8PersistentCallbackFunction(success_callback)),
error_callback_(ToV8PersistentCallbackFunction(error_callback)),
requester_(requester) {
......@@ -62,8 +65,11 @@ RTCVoidRequestImpl::~RTCVoidRequestImpl() = default;
void RTCVoidRequestImpl::RequestSucceeded() {
bool should_fire_callback =
requester_ && requester_->ShouldFireDefaultCallbacks();
if (should_fire_callback && success_callback_)
if (should_fire_callback && success_callback_) {
if (operation_)
requester_->NoteVoidRequestCompleted(*operation_, true);
success_callback_->InvokeAndReportException(nullptr);
}
Clear();
}
......@@ -72,6 +78,8 @@ void RTCVoidRequestImpl::RequestFailed(const webrtc::RTCError& error) {
bool should_fire_callback =
requester_ && requester_->ShouldFireDefaultCallbacks();
if (should_fire_callback && error_callback_.Get()) {
if (operation_)
requester_->NoteVoidRequestCompleted(*operation_, false);
error_callback_->InvokeAndReportException(
nullptr, CreateDOMExceptionFromRTCError(error));
}
......
......@@ -31,9 +31,11 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_VOID_REQUEST_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_VOID_REQUEST_IMPL_H_
#include "base/optional.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_void_function.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_peer_connection_error_callback.h"
#include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_enums.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_void_request.h"
......@@ -41,15 +43,20 @@ namespace blink {
class RTCPeerConnection;
// TODO(https://crbug.com/908468): Split up the operation-specific codepaths
// into separate request implementations and find a way to consolidate the
// shared code as to not repeat the majority of the implementations.
class RTCVoidRequestImpl final : public RTCVoidRequest,
public ContextLifecycleObserver {
USING_GARBAGE_COLLECTED_MIXIN(RTCVoidRequestImpl);
public:
static RTCVoidRequestImpl* Create(ExecutionContext*,
RTCPeerConnection*,
V8VoidFunction*,
V8RTCPeerConnectionErrorCallback*);
static RTCVoidRequestImpl* Create(
ExecutionContext*,
base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*,
V8VoidFunction*,
V8RTCPeerConnectionErrorCallback*);
~RTCVoidRequestImpl() override;
// RTCVoidRequest
......@@ -63,12 +70,14 @@ class RTCVoidRequestImpl final : public RTCVoidRequest,
private:
RTCVoidRequestImpl(ExecutionContext*,
base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*,
V8VoidFunction*,
V8RTCPeerConnectionErrorCallback*);
void Clear();
base::Optional<RTCSetSessionDescriptionOperation> operation_;
// This request object is held by WebRTCPeerConnectionHandler, which doesn't
// support wrapper-tracing. Thus, this object holds the underlying callback
// functions as persistent handles. This is acceptable because the request
......
......@@ -12,20 +12,23 @@
namespace blink {
RTCVoidRequestPromiseImpl* RTCVoidRequestPromiseImpl::Create(
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester,
ScriptPromiseResolver* resolver,
const char* interface_name,
const char* property_name) {
return new RTCVoidRequestPromiseImpl(requester, resolver, interface_name,
property_name);
return new RTCVoidRequestPromiseImpl(std::move(operation), requester,
resolver, interface_name, property_name);
}
RTCVoidRequestPromiseImpl::RTCVoidRequestPromiseImpl(
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester,
ScriptPromiseResolver* resolver,
const char* interface_name,
const char* property_name)
: requester_(requester),
: operation_(std::move(operation)),
requester_(requester),
resolver_(resolver),
interface_name_(interface_name),
property_name_(property_name) {
......@@ -37,6 +40,8 @@ RTCVoidRequestPromiseImpl::~RTCVoidRequestPromiseImpl() = default;
void RTCVoidRequestPromiseImpl::RequestSucceeded() {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
if (operation_)
requester_->NoteVoidRequestCompleted(*operation_, true);
resolver_->Resolve();
} else {
// This is needed to have the resolver release its internal resources
......@@ -49,6 +54,8 @@ void RTCVoidRequestPromiseImpl::RequestSucceeded() {
void RTCVoidRequestPromiseImpl::RequestFailed(const webrtc::RTCError& error) {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
if (operation_)
requester_->NoteVoidRequestCompleted(*operation_, false);
ScriptState::Scope scope(resolver_->GetScriptState());
ExceptionState exception_state(resolver_->GetScriptState()->GetIsolate(),
ExceptionState::kExecutionContext,
......
......@@ -5,6 +5,8 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_VOID_REQUEST_PROMISE_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_VOID_REQUEST_PROMISE_IMPL_H_
#include "base/optional.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_enums.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_void_request.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
......@@ -13,12 +15,17 @@ namespace blink {
class ScriptPromiseResolver;
class RTCPeerConnection;
// TODO(https://crbug.com/908468): Split up the operation-specific codepaths
// into separate request implementations and find a way to consolidate the
// shared code as to not repeat the majority of the implementations.
class RTCVoidRequestPromiseImpl final : public RTCVoidRequest {
public:
static RTCVoidRequestPromiseImpl* Create(RTCPeerConnection*,
ScriptPromiseResolver*,
const char* interface_name,
const char* property_name);
static RTCVoidRequestPromiseImpl* Create(
base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*,
ScriptPromiseResolver*,
const char* interface_name,
const char* property_name);
~RTCVoidRequestPromiseImpl() override;
// RTCVoidRequest
......@@ -28,13 +35,15 @@ class RTCVoidRequestPromiseImpl final : public RTCVoidRequest {
void Trace(blink::Visitor*) override;
private:
RTCVoidRequestPromiseImpl(RTCPeerConnection*,
RTCVoidRequestPromiseImpl(base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*,
ScriptPromiseResolver*,
const char* interface_name,
const char* property_name);
void Clear();
base::Optional<RTCSetSessionDescriptionOperation> operation_;
Member<RTCPeerConnection> requester_;
Member<ScriptPromiseResolver> resolver_;
const char* interface_name_;
......
......@@ -12,6 +12,9 @@
namespace blink {
// TODO(https://crbug.com/908461): This is currently implemented as NO-OPs or to
// create dummy objects whose methods return default values. Consider renaming
// the class, changing it to be GMOCK friendly or deleting it.
class MockWebRTCPeerConnectionHandler : public WebRTCPeerConnectionHandler {
public:
MockWebRTCPeerConnectionHandler();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment