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") { ...@@ -78,6 +78,7 @@ blink_modules_sources("peerconnection") {
"rtc_rtp_transceiver.h", "rtc_rtp_transceiver.h",
"rtc_session_description.cc", "rtc_session_description.cc",
"rtc_session_description.h", "rtc_session_description.h",
"rtc_session_description_enums.h",
"rtc_session_description_request_impl.cc", "rtc_session_description_request_impl.cc",
"rtc_session_description_request_impl.h", "rtc_session_description_request_impl.h",
"rtc_session_description_request_promise_impl.cc", "rtc_session_description_request_promise_impl.cc",
......
...@@ -42,10 +42,14 @@ ...@@ -42,10 +42,14 @@
#include "third_party/blink/renderer/modules/crypto/normalize_algorithm.h" #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/event_target_modules.h"
#include "third_party/blink/renderer/modules/mediastream/media_stream.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_ice_candidate.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.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/async_method_runner.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.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" #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
namespace blink { namespace blink {
...@@ -310,6 +314,13 @@ class MODULES_EXPORT RTCPeerConnection final ...@@ -310,6 +314,13 @@ class MODULES_EXPORT RTCPeerConnection final
// WebFeature::kRTCPeerConnectionComplexPlanBSdpUsingDefaultSdpSemantics. // WebFeature::kRTCPeerConnectionComplexPlanBSdpUsingDefaultSdpSemantics.
bool ShouldShowComplexPlanBSdpWarning(const RTCSessionDescriptionInit*) const; 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; void Trace(blink::Visitor*) override;
private: private:
...@@ -458,6 +469,7 @@ class MODULES_EXPORT RTCPeerConnection final ...@@ -458,6 +469,7 @@ class MODULES_EXPORT RTCPeerConnection final
webrtc::PeerConnectionInterface::IceGatheringState ice_gathering_state_; webrtc::PeerConnectionInterface::IceGatheringState ice_gathering_state_;
webrtc::PeerConnectionInterface::IceConnectionState ice_connection_state_; webrtc::PeerConnectionInterface::IceConnectionState ice_connection_state_;
webrtc::PeerConnectionInterface::PeerConnectionState peer_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 // A map containing any track that is in use by the peer connection. This
// includes tracks of |rtp_senders_| and |rtp_receivers_|. // 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 { ...@@ -41,19 +41,22 @@ namespace blink {
RTCSessionDescriptionRequestImpl* RTCSessionDescriptionRequestImpl::Create( RTCSessionDescriptionRequestImpl* RTCSessionDescriptionRequestImpl::Create(
ExecutionContext* context, ExecutionContext* context,
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester, RTCPeerConnection* requester,
V8RTCSessionDescriptionCallback* success_callback, V8RTCSessionDescriptionCallback* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback) { V8RTCPeerConnectionErrorCallback* error_callback) {
return new RTCSessionDescriptionRequestImpl(context, requester, return new RTCSessionDescriptionRequestImpl(context, operation, requester,
success_callback, error_callback); success_callback, error_callback);
} }
RTCSessionDescriptionRequestImpl::RTCSessionDescriptionRequestImpl( RTCSessionDescriptionRequestImpl::RTCSessionDescriptionRequestImpl(
ExecutionContext* context, ExecutionContext* context,
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester, RTCPeerConnection* requester,
V8RTCSessionDescriptionCallback* success_callback, V8RTCSessionDescriptionCallback* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback) V8RTCPeerConnectionErrorCallback* error_callback)
: ContextLifecycleObserver(context), : ContextLifecycleObserver(context),
operation_(operation),
success_callback_(ToV8PersistentCallbackFunction(success_callback)), success_callback_(ToV8PersistentCallbackFunction(success_callback)),
error_callback_(ToV8PersistentCallbackFunction(error_callback)), error_callback_(ToV8PersistentCallbackFunction(error_callback)),
requester_(requester) { requester_(requester) {
...@@ -67,6 +70,7 @@ void RTCSessionDescriptionRequestImpl::RequestSucceeded( ...@@ -67,6 +70,7 @@ void RTCSessionDescriptionRequestImpl::RequestSucceeded(
bool should_fire_callback = bool should_fire_callback =
requester_ ? requester_->ShouldFireDefaultCallbacks() : false; requester_ ? requester_->ShouldFireDefaultCallbacks() : false;
if (should_fire_callback && success_callback_) { if (should_fire_callback && success_callback_) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, true);
auto* description = RTCSessionDescription::Create(web_session_description); auto* description = RTCSessionDescription::Create(web_session_description);
requester_->NoteSdpCreated(*description); requester_->NoteSdpCreated(*description);
success_callback_->InvokeAndReportException(nullptr, description); success_callback_->InvokeAndReportException(nullptr, description);
...@@ -79,6 +83,7 @@ void RTCSessionDescriptionRequestImpl::RequestFailed( ...@@ -79,6 +83,7 @@ void RTCSessionDescriptionRequestImpl::RequestFailed(
bool should_fire_callback = bool should_fire_callback =
requester_ ? requester_->ShouldFireDefaultCallbacks() : false; requester_ ? requester_->ShouldFireDefaultCallbacks() : false;
if (should_fire_callback && error_callback_) { if (should_fire_callback && error_callback_) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, false);
error_callback_->InvokeAndReportException( error_callback_->InvokeAndReportException(
nullptr, CreateDOMExceptionFromRTCError(error)); nullptr, CreateDOMExceptionFromRTCError(error));
} }
......
...@@ -35,6 +35,7 @@ ...@@ -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_peer_connection_error_callback.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_session_description_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/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/heap/handle.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_session_description_request.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_session_description_request.h"
...@@ -43,6 +44,9 @@ namespace blink { ...@@ -43,6 +44,9 @@ namespace blink {
class RTCPeerConnection; class RTCPeerConnection;
class WebRTCSessionDescription; 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 class RTCSessionDescriptionRequestImpl final
: public RTCSessionDescriptionRequest, : public RTCSessionDescriptionRequest,
public ContextLifecycleObserver { public ContextLifecycleObserver {
...@@ -51,6 +55,7 @@ class RTCSessionDescriptionRequestImpl final ...@@ -51,6 +55,7 @@ class RTCSessionDescriptionRequestImpl final
public: public:
static RTCSessionDescriptionRequestImpl* Create( static RTCSessionDescriptionRequestImpl* Create(
ExecutionContext*, ExecutionContext*,
RTCCreateSessionDescriptionOperation,
RTCPeerConnection*, RTCPeerConnection*,
V8RTCSessionDescriptionCallback*, V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*); V8RTCPeerConnectionErrorCallback*);
...@@ -66,12 +71,14 @@ class RTCSessionDescriptionRequestImpl final ...@@ -66,12 +71,14 @@ class RTCSessionDescriptionRequestImpl final
private: private:
RTCSessionDescriptionRequestImpl(ExecutionContext*, RTCSessionDescriptionRequestImpl(ExecutionContext*,
RTCCreateSessionDescriptionOperation,
RTCPeerConnection*, RTCPeerConnection*,
V8RTCSessionDescriptionCallback*, V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*); V8RTCPeerConnectionErrorCallback*);
void Clear(); void Clear();
RTCCreateSessionDescriptionOperation operation_;
// This request object is held by WebRTCPeerConnectionHandler, which doesn't // This request object is held by WebRTCPeerConnectionHandler, which doesn't
// support wrapper-tracing. Thus, this object holds the underlying callback // support wrapper-tracing. Thus, this object holds the underlying callback
// functions as persistent handles. This is acceptable because the request // functions as persistent handles. This is acceptable because the request
......
...@@ -14,20 +14,25 @@ ...@@ -14,20 +14,25 @@
namespace blink { namespace blink {
RTCSessionDescriptionRequestPromiseImpl* RTCSessionDescriptionRequestPromiseImpl*
RTCSessionDescriptionRequestPromiseImpl::Create(RTCPeerConnection* requester, RTCSessionDescriptionRequestPromiseImpl::Create(
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester,
ScriptPromiseResolver* resolver, ScriptPromiseResolver* resolver,
const char* interface_name, const char* interface_name,
const char* property_name) { const char* property_name) {
return new RTCSessionDescriptionRequestPromiseImpl( return new RTCSessionDescriptionRequestPromiseImpl(
requester, resolver, interface_name, property_name); operation, requester, resolver, interface_name, property_name);
} }
RTCSessionDescriptionRequestPromiseImpl:: RTCSessionDescriptionRequestPromiseImpl::
RTCSessionDescriptionRequestPromiseImpl(RTCPeerConnection* requester, RTCSessionDescriptionRequestPromiseImpl(
RTCCreateSessionDescriptionOperation operation,
RTCPeerConnection* requester,
ScriptPromiseResolver* resolver, ScriptPromiseResolver* resolver,
const char* interface_name, const char* interface_name,
const char* property_name) const char* property_name)
: requester_(requester), : operation_(operation),
requester_(requester),
resolver_(resolver), resolver_(resolver),
interface_name_(interface_name), interface_name_(interface_name),
property_name_(property_name) { property_name_(property_name) {
...@@ -41,6 +46,7 @@ RTCSessionDescriptionRequestPromiseImpl:: ...@@ -41,6 +46,7 @@ RTCSessionDescriptionRequestPromiseImpl::
void RTCSessionDescriptionRequestPromiseImpl::RequestSucceeded( void RTCSessionDescriptionRequestPromiseImpl::RequestSucceeded(
const WebRTCSessionDescription& web_session_description) { const WebRTCSessionDescription& web_session_description) {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) { if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, true);
auto* description = RTCSessionDescription::Create(web_session_description); auto* description = RTCSessionDescription::Create(web_session_description);
requester_->NoteSdpCreated(*description); requester_->NoteSdpCreated(*description);
resolver_->Resolve(description); resolver_->Resolve(description);
...@@ -56,6 +62,7 @@ void RTCSessionDescriptionRequestPromiseImpl::RequestSucceeded( ...@@ -56,6 +62,7 @@ void RTCSessionDescriptionRequestPromiseImpl::RequestSucceeded(
void RTCSessionDescriptionRequestPromiseImpl::RequestFailed( void RTCSessionDescriptionRequestPromiseImpl::RequestFailed(
const webrtc::RTCError& error) { const webrtc::RTCError& error) {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) { if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
requester_->NoteSessionDescriptionRequestCompleted(operation_, false);
ScriptState::Scope scope(resolver_->GetScriptState()); ScriptState::Scope scope(resolver_->GetScriptState());
ExceptionState exception_state(resolver_->GetScriptState()->GetIsolate(), ExceptionState exception_state(resolver_->GetScriptState()->GetIsolate(),
ExceptionState::kExecutionContext, ExceptionState::kExecutionContext,
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_SESSION_DESCRIPTION_REQUEST_PROMISE_IMPL_H_ #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_ #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/peerconnection/rtc_session_description_request.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
...@@ -14,10 +15,14 @@ class RTCPeerConnection; ...@@ -14,10 +15,14 @@ class RTCPeerConnection;
class ScriptPromiseResolver; class ScriptPromiseResolver;
class WebRTCSessionDescription; 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 class RTCSessionDescriptionRequestPromiseImpl final
: public RTCSessionDescriptionRequest { : public RTCSessionDescriptionRequest {
public: public:
static RTCSessionDescriptionRequestPromiseImpl* Create( static RTCSessionDescriptionRequestPromiseImpl* Create(
RTCCreateSessionDescriptionOperation,
RTCPeerConnection*, RTCPeerConnection*,
ScriptPromiseResolver*, ScriptPromiseResolver*,
const char* interface_name, const char* interface_name,
...@@ -31,13 +36,15 @@ class RTCSessionDescriptionRequestPromiseImpl final ...@@ -31,13 +36,15 @@ class RTCSessionDescriptionRequestPromiseImpl final
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
private: private:
RTCSessionDescriptionRequestPromiseImpl(RTCPeerConnection*, RTCSessionDescriptionRequestPromiseImpl(RTCCreateSessionDescriptionOperation,
RTCPeerConnection*,
ScriptPromiseResolver*, ScriptPromiseResolver*,
const char* interface_name, const char* interface_name,
const char* property_name); const char* property_name);
void Clear(); void Clear();
RTCCreateSessionDescriptionOperation operation_;
Member<RTCPeerConnection> requester_; Member<RTCPeerConnection> requester_;
Member<ScriptPromiseResolver> resolver_; Member<ScriptPromiseResolver> resolver_;
const char* interface_name_; const char* interface_name_;
......
...@@ -38,19 +38,22 @@ namespace blink { ...@@ -38,19 +38,22 @@ namespace blink {
RTCVoidRequestImpl* RTCVoidRequestImpl::Create( RTCVoidRequestImpl* RTCVoidRequestImpl::Create(
ExecutionContext* context, ExecutionContext* context,
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester, RTCPeerConnection* requester,
V8VoidFunction* success_callback, V8VoidFunction* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback) { V8RTCPeerConnectionErrorCallback* error_callback) {
return new RTCVoidRequestImpl(context, requester, success_callback, return new RTCVoidRequestImpl(context, std::move(operation), requester,
error_callback); success_callback, error_callback);
} }
RTCVoidRequestImpl::RTCVoidRequestImpl( RTCVoidRequestImpl::RTCVoidRequestImpl(
ExecutionContext* context, ExecutionContext* context,
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester, RTCPeerConnection* requester,
V8VoidFunction* success_callback, V8VoidFunction* success_callback,
V8RTCPeerConnectionErrorCallback* error_callback) V8RTCPeerConnectionErrorCallback* error_callback)
: ContextLifecycleObserver(context), : ContextLifecycleObserver(context),
operation_(std::move(operation)),
success_callback_(ToV8PersistentCallbackFunction(success_callback)), success_callback_(ToV8PersistentCallbackFunction(success_callback)),
error_callback_(ToV8PersistentCallbackFunction(error_callback)), error_callback_(ToV8PersistentCallbackFunction(error_callback)),
requester_(requester) { requester_(requester) {
...@@ -62,8 +65,11 @@ RTCVoidRequestImpl::~RTCVoidRequestImpl() = default; ...@@ -62,8 +65,11 @@ RTCVoidRequestImpl::~RTCVoidRequestImpl() = default;
void RTCVoidRequestImpl::RequestSucceeded() { void RTCVoidRequestImpl::RequestSucceeded() {
bool should_fire_callback = bool should_fire_callback =
requester_ && requester_->ShouldFireDefaultCallbacks(); 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); success_callback_->InvokeAndReportException(nullptr);
}
Clear(); Clear();
} }
...@@ -72,6 +78,8 @@ void RTCVoidRequestImpl::RequestFailed(const webrtc::RTCError& error) { ...@@ -72,6 +78,8 @@ void RTCVoidRequestImpl::RequestFailed(const webrtc::RTCError& error) {
bool should_fire_callback = bool should_fire_callback =
requester_ && requester_->ShouldFireDefaultCallbacks(); requester_ && requester_->ShouldFireDefaultCallbacks();
if (should_fire_callback && error_callback_.Get()) { if (should_fire_callback && error_callback_.Get()) {
if (operation_)
requester_->NoteVoidRequestCompleted(*operation_, false);
error_callback_->InvokeAndReportException( error_callback_->InvokeAndReportException(
nullptr, CreateDOMExceptionFromRTCError(error)); nullptr, CreateDOMExceptionFromRTCError(error));
} }
......
...@@ -31,9 +31,11 @@ ...@@ -31,9 +31,11 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_VOID_REQUEST_IMPL_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_VOID_REQUEST_IMPL_H_
#define 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/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/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/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/heap/handle.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_void_request.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_void_request.h"
...@@ -41,12 +43,17 @@ namespace blink { ...@@ -41,12 +43,17 @@ namespace blink {
class RTCPeerConnection; 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, class RTCVoidRequestImpl final : public RTCVoidRequest,
public ContextLifecycleObserver { public ContextLifecycleObserver {
USING_GARBAGE_COLLECTED_MIXIN(RTCVoidRequestImpl); USING_GARBAGE_COLLECTED_MIXIN(RTCVoidRequestImpl);
public: public:
static RTCVoidRequestImpl* Create(ExecutionContext*, static RTCVoidRequestImpl* Create(
ExecutionContext*,
base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*, RTCPeerConnection*,
V8VoidFunction*, V8VoidFunction*,
V8RTCPeerConnectionErrorCallback*); V8RTCPeerConnectionErrorCallback*);
...@@ -63,12 +70,14 @@ class RTCVoidRequestImpl final : public RTCVoidRequest, ...@@ -63,12 +70,14 @@ class RTCVoidRequestImpl final : public RTCVoidRequest,
private: private:
RTCVoidRequestImpl(ExecutionContext*, RTCVoidRequestImpl(ExecutionContext*,
base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*, RTCPeerConnection*,
V8VoidFunction*, V8VoidFunction*,
V8RTCPeerConnectionErrorCallback*); V8RTCPeerConnectionErrorCallback*);
void Clear(); void Clear();
base::Optional<RTCSetSessionDescriptionOperation> operation_;
// This request object is held by WebRTCPeerConnectionHandler, which doesn't // This request object is held by WebRTCPeerConnectionHandler, which doesn't
// support wrapper-tracing. Thus, this object holds the underlying callback // support wrapper-tracing. Thus, this object holds the underlying callback
// functions as persistent handles. This is acceptable because the request // functions as persistent handles. This is acceptable because the request
......
...@@ -12,20 +12,23 @@ ...@@ -12,20 +12,23 @@
namespace blink { namespace blink {
RTCVoidRequestPromiseImpl* RTCVoidRequestPromiseImpl::Create( RTCVoidRequestPromiseImpl* RTCVoidRequestPromiseImpl::Create(
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester, RTCPeerConnection* requester,
ScriptPromiseResolver* resolver, ScriptPromiseResolver* resolver,
const char* interface_name, const char* interface_name,
const char* property_name) { const char* property_name) {
return new RTCVoidRequestPromiseImpl(requester, resolver, interface_name, return new RTCVoidRequestPromiseImpl(std::move(operation), requester,
property_name); resolver, interface_name, property_name);
} }
RTCVoidRequestPromiseImpl::RTCVoidRequestPromiseImpl( RTCVoidRequestPromiseImpl::RTCVoidRequestPromiseImpl(
base::Optional<RTCSetSessionDescriptionOperation> operation,
RTCPeerConnection* requester, RTCPeerConnection* requester,
ScriptPromiseResolver* resolver, ScriptPromiseResolver* resolver,
const char* interface_name, const char* interface_name,
const char* property_name) const char* property_name)
: requester_(requester), : operation_(std::move(operation)),
requester_(requester),
resolver_(resolver), resolver_(resolver),
interface_name_(interface_name), interface_name_(interface_name),
property_name_(property_name) { property_name_(property_name) {
...@@ -37,6 +40,8 @@ RTCVoidRequestPromiseImpl::~RTCVoidRequestPromiseImpl() = default; ...@@ -37,6 +40,8 @@ RTCVoidRequestPromiseImpl::~RTCVoidRequestPromiseImpl() = default;
void RTCVoidRequestPromiseImpl::RequestSucceeded() { void RTCVoidRequestPromiseImpl::RequestSucceeded() {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) { if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
if (operation_)
requester_->NoteVoidRequestCompleted(*operation_, true);
resolver_->Resolve(); resolver_->Resolve();
} else { } else {
// This is needed to have the resolver release its internal resources // This is needed to have the resolver release its internal resources
...@@ -49,6 +54,8 @@ void RTCVoidRequestPromiseImpl::RequestSucceeded() { ...@@ -49,6 +54,8 @@ void RTCVoidRequestPromiseImpl::RequestSucceeded() {
void RTCVoidRequestPromiseImpl::RequestFailed(const webrtc::RTCError& error) { void RTCVoidRequestPromiseImpl::RequestFailed(const webrtc::RTCError& error) {
if (requester_ && requester_->ShouldFireDefaultCallbacks()) { if (requester_ && requester_->ShouldFireDefaultCallbacks()) {
if (operation_)
requester_->NoteVoidRequestCompleted(*operation_, false);
ScriptState::Scope scope(resolver_->GetScriptState()); ScriptState::Scope scope(resolver_->GetScriptState());
ExceptionState exception_state(resolver_->GetScriptState()->GetIsolate(), ExceptionState exception_state(resolver_->GetScriptState()->GetIsolate(),
ExceptionState::kExecutionContext, ExceptionState::kExecutionContext,
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_VOID_REQUEST_PROMISE_IMPL_H_ #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_ #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/peerconnection/rtc_void_request.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
...@@ -13,9 +15,14 @@ namespace blink { ...@@ -13,9 +15,14 @@ namespace blink {
class ScriptPromiseResolver; class ScriptPromiseResolver;
class RTCPeerConnection; 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 { class RTCVoidRequestPromiseImpl final : public RTCVoidRequest {
public: public:
static RTCVoidRequestPromiseImpl* Create(RTCPeerConnection*, static RTCVoidRequestPromiseImpl* Create(
base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*,
ScriptPromiseResolver*, ScriptPromiseResolver*,
const char* interface_name, const char* interface_name,
const char* property_name); const char* property_name);
...@@ -28,13 +35,15 @@ class RTCVoidRequestPromiseImpl final : public RTCVoidRequest { ...@@ -28,13 +35,15 @@ class RTCVoidRequestPromiseImpl final : public RTCVoidRequest {
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
private: private:
RTCVoidRequestPromiseImpl(RTCPeerConnection*, RTCVoidRequestPromiseImpl(base::Optional<RTCSetSessionDescriptionOperation>,
RTCPeerConnection*,
ScriptPromiseResolver*, ScriptPromiseResolver*,
const char* interface_name, const char* interface_name,
const char* property_name); const char* property_name);
void Clear(); void Clear();
base::Optional<RTCSetSessionDescriptionOperation> operation_;
Member<RTCPeerConnection> requester_; Member<RTCPeerConnection> requester_;
Member<ScriptPromiseResolver> resolver_; Member<ScriptPromiseResolver> resolver_;
const char* interface_name_; const char* interface_name_;
......
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
namespace blink { 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 { class MockWebRTCPeerConnectionHandler : public WebRTCPeerConnectionHandler {
public: public:
MockWebRTCPeerConnectionHandler(); 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