Commit 68c1d92a authored by Samuel Huang's avatar Samuel Huang Committed by Commit Bot

Revert "Create RTCDtlsTransport objects in the blink layer"

This reverts commit d7d59c5b.

Reason for revert: virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCRtpSender-transport.https.html fails in "WebKit Linux Trusty MSAN".

Original change's description:
> Create RTCDtlsTransport objects in the blink layer
> 
> This CL does on-demand creation of blink-layer transport
> objects. It also introduces a way to get at the webrtc::PeerConnection
> object from the WebPeerConnectionHandler API.
> 
> Bug: chromium:907849
> Change-Id: Ic86a5a66289c31d1f939a47d58bc194c32471cbd
> Reviewed-on: https://chromium-review.googlesource.com/c/1358060
> Commit-Queue: Harald Alvestrand <hta@chromium.org>
> Reviewed-by: Guido Urdaneta <guidou@chromium.org>
> Reviewed-by: Henrik Boström <hbos@chromium.org>
> Reviewed-by: Kentaro Hara <haraken@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#615072}

TBR=hta@chromium.org,haraken@chromium.org,hbos@chromium.org,guidou@chromium.org

Change-Id: Ie9c8d2e3dc5f97fc94ca5bf43cc30a9407d9fa4c
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: chromium:907849
Reviewed-on: https://chromium-review.googlesource.com/c/1369719Reviewed-by: default avatarSamuel Huang <huangs@chromium.org>
Commit-Queue: Samuel Huang <huangs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#615115}
parent 0817cc92
......@@ -13,7 +13,6 @@
#include "base/macros.h"
#include "base/optional.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/webrtc/api/dtlstransportinterface.h"
#include "third_party/webrtc/api/peerconnectioninterface.h"
#include "third_party/webrtc/api/stats/rtcstatsreport.h"
......@@ -158,10 +157,6 @@ class MockPeerConnectionImpl : public webrtc::PeerConnectionInterface {
void SetGetStatsResult(bool result) { getstats_result_ = result; }
// Set the report that |GetStats(RTCStatsCollectorCallback*)| returns.
void SetGetStatsReport(webrtc::RTCStatsReport* report);
rtc::scoped_refptr<webrtc::DtlsTransportInterface> LookupDtlsTransportByMid(
const std::string& mid) override {
return nullptr;
}
SignalingState signaling_state() override {
NOTIMPLEMENTED();
......
......@@ -1924,11 +1924,6 @@ blink::WebString RTCPeerConnectionHandler::Id() const {
return blink::WebString::FromASCII(id_);
}
webrtc::PeerConnectionInterface*
RTCPeerConnectionHandler::NativePeerConnection() {
return native_peer_connection();
}
void RTCPeerConnectionHandler::OnSignalingChange(
webrtc::PeerConnectionInterface::SignalingState new_state) {
DCHECK(task_runner_->RunsTasksInCurrentSequence());
......
......@@ -170,7 +170,6 @@ class CONTENT_EXPORT RTCPeerConnectionHandler
const blink::WebRTCDataChannelInit& init) override;
void Stop() override;
blink::WebString Id() const override;
webrtc::PeerConnectionInterface* NativePeerConnection() override;
// Delegate functions to allow for mocking of WebKit interfaces.
// getStats takes ownership of request parameter.
......
......@@ -131,9 +131,6 @@ class WebRTCPeerConnectionHandler {
// Origin Trial - RtcPeerConnectionId
virtual WebString Id() const = 0;
// Returns a pointer to the underlying native PeerConnection object.
virtual webrtc::PeerConnectionInterface* NativePeerConnection() = 0;
};
} // namespace blink
......
......@@ -21,7 +21,6 @@
#include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_ice_event_init.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_quic_transport.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
#include "third_party/webrtc/api/dtlstransportinterface.h"
#include "third_party/webrtc/api/jsepicecandidate.h"
#include "third_party/webrtc/api/peerconnectioninterface.h"
#include "third_party/webrtc/p2p/base/portallocator.h"
......@@ -31,10 +30,12 @@
namespace blink {
RTCDtlsTransport::RTCDtlsTransport(
ExecutionContext* context,
rtc::scoped_refptr<webrtc::DtlsTransportInterface> native_transport)
: ContextClient(context), native_transport_(native_transport) {}
RTCDtlsTransport* RTCDtlsTransport::Create(ExecutionContext* context) {
return MakeGarbageCollected<RTCDtlsTransport>(context);
}
RTCDtlsTransport::RTCDtlsTransport(ExecutionContext* context)
: ContextClient(context) {}
RTCDtlsTransport::~RTCDtlsTransport() {}
......@@ -54,10 +55,6 @@ RTCIceTransport* RTCDtlsTransport::iceTransport() const {
return nullptr;
}
webrtc::DtlsTransportInterface* RTCDtlsTransport::native_transport() {
return native_transport_.get();
}
const AtomicString& RTCDtlsTransport::InterfaceName() const {
return event_target_names::kRTCDtlsTransport;
}
......
......@@ -8,11 +8,6 @@
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
#include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/webrtc/api/scoped_refptr.h"
namespace webrtc {
class DtlsTransportInterface;
}
namespace blink {
......@@ -37,9 +32,9 @@ class MODULES_EXPORT RTCDtlsTransport final : public EventTargetWithInlineData,
USING_GARBAGE_COLLECTED_MIXIN(RTCDtlsTransport);
public:
RTCDtlsTransport(
ExecutionContext* context,
rtc::scoped_refptr<webrtc::DtlsTransportInterface> native_context);
static RTCDtlsTransport* Create(ExecutionContext* context);
explicit RTCDtlsTransport(ExecutionContext* context);
~RTCDtlsTransport() override;
// rtc_dtls_transport.idl
......@@ -55,11 +50,9 @@ class MODULES_EXPORT RTCDtlsTransport final : public EventTargetWithInlineData,
ExecutionContext* GetExecutionContext() const override;
// For garbage collection.
void Trace(blink::Visitor* visitor) override;
webrtc::DtlsTransportInterface* native_transport();
private:
HeapVector<Member<DOMArrayBuffer>> remote_certificates_;
rtc::scoped_refptr<webrtc::DtlsTransportInterface> native_transport_;
};
} // namespace blink
......
......@@ -87,7 +87,6 @@
#include "third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_data_channel_event.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_data_channel_init.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_dtls_transport.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_error_util.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_ice_server.h"
......@@ -118,7 +117,6 @@
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
#include "third_party/blink/renderer/platform/wtf/time.h"
#include "third_party/webrtc/api/dtlstransportinterface.h"
#include "third_party/webrtc/api/jsep.h"
#include "third_party/webrtc/api/peerconnectioninterface.h"
#include "third_party/webrtc/pc/sessiondescription.h"
......@@ -1138,47 +1136,6 @@ bool RTCPeerConnection::HasDocumentMedia() const {
user_media_controller->HasRequestedUserMedia();
}
RTCDtlsTransport* RTCPeerConnection::LookupDtlsTransportByMid(String mid) {
if (mid.IsNull())
return nullptr;
webrtc::PeerConnectionInterface* native_pc =
peer_handler_->NativePeerConnection();
if (!native_pc)
return nullptr;
auto native_transport =
native_pc->LookupDtlsTransportByMid(std::string(mid.Utf8().data()));
if (!native_transport)
return nullptr;
// Check for previously created RTCDtlsTransport objects referencing
// this transport.
auto transport_iterator = dtls_transports_by_mid_.find(mid);
if (transport_iterator != dtls_transports_by_mid_.end()) {
if (transport_iterator->value->native_transport() !=
native_transport.get()) {
// The mid's transport has changed. Erase the reference to
// the old transport, and continue.
dtls_transports_by_mid_.erase(transport_iterator);
} else {
return transport_iterator->value;
}
}
// Check if the same transport has been returned for another mid.
for (auto const& transport_iterator : dtls_transports_by_mid_) {
if (transport_iterator.value->native_transport() ==
native_transport.get()) {
dtls_transports_by_mid_.insert(mid, transport_iterator.value);
return transport_iterator.value;
}
}
// The transport is previously unseen. Create object and hold on to
// a reference to it.
RTCDtlsTransport* transport = MakeGarbageCollected<RTCDtlsTransport>(
GetExecutionContext(), native_transport);
dtls_transports_by_mid_.insert(mid, transport);
return transport;
}
void RTCPeerConnection::ReportSetSdpUsage(
SetSdpOperationType operation_type,
const RTCSessionDescriptionInit* session_description_init) const {
......@@ -2380,8 +2337,8 @@ RTCRtpReceiver* RTCPeerConnection::CreateOrUpdateReceiver(
RTCRtpReceiver* receiver;
if (receiver_it == rtp_receivers_.end()) {
// Create new receiver.
receiver = MakeGarbageCollected<RTCRtpReceiver>(
this, std::move(web_receiver), track, MediaStreamVector());
receiver = MakeGarbageCollected<RTCRtpReceiver>(std::move(web_receiver),
track, MediaStreamVector());
// Receiving tracks should be muted by default. SetReadyState() propagates
// the related state changes to ensure it is muted on all layers. It also
// fires events - which is not desired - but because they fire synchronously
......@@ -2617,7 +2574,7 @@ void RTCPeerConnection::DidAddReceiverPlanB(
}
DCHECK(FindReceiver(*web_receiver) == rtp_receivers_.end());
RTCRtpReceiver* rtp_receiver = MakeGarbageCollected<RTCRtpReceiver>(
this, std::move(web_receiver), track, streams);
std::move(web_receiver), track, streams);
rtp_receivers_.push_back(rtp_receiver);
ScheduleDispatchEvent(MakeGarbageCollected<RTCTrackEvent>(
rtp_receiver, rtp_receiver->track(), streams, nullptr));
......@@ -3054,7 +3011,6 @@ void RTCPeerConnection::Trace(blink::Visitor* visitor) {
visitor->Trace(transceivers_);
visitor->Trace(dispatch_scheduled_event_runner_);
visitor->Trace(scheduled_events_);
visitor->Trace(dtls_transports_by_mid_);
EventTargetWithInlineData::Trace(visitor);
PausableObject::Trace(visitor);
MediaStreamObserver::Trace(visitor);
......
......@@ -62,7 +62,6 @@ class MediaStreamTrack;
class MediaStreamTrackOrString;
class RTCAnswerOptions;
class RTCConfiguration;
class RTCDtlsTransport;
class RTCDTMFSender;
class RTCDataChannel;
class RTCDataChannelInit;
......@@ -335,8 +334,6 @@ class MODULES_EXPORT RTCPeerConnection final
// getUserMedia().
bool HasDocumentMedia() const;
// Look up, and potentially create, a DTLSTransport object.
RTCDtlsTransport* LookupDtlsTransportByMid(String mid);
void Trace(blink::Visitor*) override;
private:
......@@ -497,11 +494,6 @@ class MODULES_EXPORT RTCPeerConnection final
HeapVector<Member<RTCRtpReceiver>> rtp_receivers_;
HeapVector<Member<RTCRtpTransceiver>> transceivers_;
// A map of all transports that have been looked up by MID.
// A transport may be referenced by more than one mid, so may
// be present multiple times in the table.
HeapHashMap<String, Member<RTCDtlsTransport>> dtls_transports_by_mid_;
std::unique_ptr<WebRTCPeerConnectionHandler> peer_handler_;
Member<AsyncMethodRunner<RTCPeerConnection>> dispatch_scheduled_event_runner_;
......
......@@ -7,7 +7,6 @@
#include "third_party/blink/public/platform/web_media_stream.h"
#include "third_party/blink/public/platform/web_media_stream_track.h"
#include "third_party/blink/public/platform/web_rtc_rtp_contributing_source.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_rtp_capabilities.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h"
#include "third_party/blink/renderer/modules/peerconnection/web_rtc_stats_report_callback_resolver.h"
......@@ -18,12 +17,10 @@
namespace blink {
RTCRtpReceiver::RTCRtpReceiver(RTCPeerConnection* pc,
std::unique_ptr<WebRTCRtpReceiver> receiver,
RTCRtpReceiver::RTCRtpReceiver(std::unique_ptr<WebRTCRtpReceiver> receiver,
MediaStreamTrack* track,
MediaStreamVector streams)
: pc_(pc),
receiver_(std::move(receiver)),
: receiver_(std::move(receiver)),
track_(track),
streams_(std::move(streams)) {
DCHECK(receiver_);
......@@ -34,17 +31,6 @@ MediaStreamTrack* RTCRtpReceiver::track() const {
return track_;
}
RTCDtlsTransport* RTCRtpReceiver::transport() {
if (!transceiver_)
return nullptr;
return pc_->LookupDtlsTransportByMid(transceiver_->mid());
}
RTCDtlsTransport* RTCRtpReceiver::rtcp_transport() {
// Chrome does not support turning off RTCP-mux.
return nullptr;
}
const HeapVector<Member<RTCRtpContributingSource>>&
RTCRtpReceiver::getContributingSources() {
UpdateSourcesIfNeeded();
......@@ -71,10 +57,6 @@ void RTCRtpReceiver::set_streams(MediaStreamVector streams) {
streams_ = std::move(streams);
}
void RTCRtpReceiver::set_transceiver(RTCRtpTransceiver* transceiver) {
transceiver_ = transceiver;
}
void RTCRtpReceiver::UpdateSourcesIfNeeded() {
if (!contributing_sources_needs_updating_)
return;
......@@ -110,11 +92,9 @@ void RTCRtpReceiver::SetContributingSourcesNeedsUpdating() {
}
void RTCRtpReceiver::Trace(blink::Visitor* visitor) {
visitor->Trace(pc_);
visitor->Trace(track_);
visitor->Trace(streams_);
visitor->Trace(contributing_sources_);
visitor->Trace(transceiver_);
ScriptWrappable::Trace(visitor);
}
......
......@@ -18,10 +18,7 @@
#include "third_party/blink/renderer/platform/heap/visitor.h"
namespace blink {
class RTCDtlsTransport;
class RTCPeerConnection;
class RTCRtpCapabilities;
class RTCRtpTransceiver;
// https://w3c.github.io/webrtc-pc/#rtcrtpreceiver-interface
class RTCRtpReceiver final : public ScriptWrappable {
......@@ -29,29 +26,24 @@ class RTCRtpReceiver final : public ScriptWrappable {
public:
// Takes ownership of the receiver.
RTCRtpReceiver(RTCPeerConnection*,
std::unique_ptr<WebRTCRtpReceiver>,
RTCRtpReceiver(std::unique_ptr<WebRTCRtpReceiver>,
MediaStreamTrack*,
MediaStreamVector);
static RTCRtpCapabilities* getCapabilities(const String& kind);
MediaStreamTrack* track() const;
RTCDtlsTransport* transport();
RTCDtlsTransport* rtcp_transport();
const HeapVector<Member<RTCRtpContributingSource>>& getContributingSources();
ScriptPromise getStats(ScriptState*);
const WebRTCRtpReceiver& web_receiver() const;
MediaStreamVector streams() const;
void set_streams(MediaStreamVector streams);
void set_transceiver(RTCRtpTransceiver*);
void UpdateSourcesIfNeeded();
void Trace(blink::Visitor*) override;
private:
Member<RTCPeerConnection> pc_;
void SetContributingSourcesNeedsUpdating();
std::unique_ptr<WebRTCRtpReceiver> receiver_;
......@@ -61,7 +53,6 @@ class RTCRtpReceiver final : public ScriptWrappable {
// The current contributing sources (|getContributingSources|).
HeapVector<Member<RTCRtpContributingSource>> contributing_sources_;
bool contributing_sources_needs_updating_ = true;
Member<RTCRtpTransceiver> transceiver_;
};
} // namespace blink
......
......@@ -6,8 +6,6 @@
[Exposed=Window]
interface RTCRtpReceiver {
readonly attribute MediaStreamTrack track;
[RuntimeEnabled=RTCDtlsTransport] readonly attribute RTCDtlsTransport? transport;
[RuntimeEnabled=RTCDtlsTransport] readonly attribute RTCDtlsTransport? rtcp_transport;
static RTCRtpCapabilities? getCapabilities(DOMString kind);
sequence<RTCRtpContributingSource> getContributingSources();
[CallWith=ScriptState] Promise<RTCStatsReport> getStats();
......
......@@ -274,17 +274,6 @@ MediaStreamTrack* RTCRtpSender::track() {
return track_;
}
RTCDtlsTransport* RTCRtpSender::transport() {
if (!transceiver_)
return nullptr;
return pc_->LookupDtlsTransportByMid(transceiver_->mid());
}
RTCDtlsTransport* RTCRtpSender::rtcp_transport() {
// Chrome does not support turning off RTCP-mux.
return nullptr;
}
ScriptPromise RTCRtpSender::replaceTrack(ScriptState* script_state,
MediaStreamTrack* with_track) {
ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
......@@ -452,10 +441,6 @@ void RTCRtpSender::set_streams(MediaStreamVector streams) {
streams_ = std::move(streams);
}
void RTCRtpSender::set_transceiver(RTCRtpTransceiver* transceiver) {
transceiver_ = transceiver;
}
RTCDTMFSender* RTCRtpSender::dtmf() {
// Lazy initialization of dtmf_ to avoid overhead when not used.
if (!dtmf_ && kind_ == "audio") {
......@@ -476,7 +461,6 @@ void RTCRtpSender::Trace(blink::Visitor* visitor) {
visitor->Trace(dtmf_);
visitor->Trace(streams_);
visitor->Trace(last_returned_parameters_);
visitor->Trace(transceiver_);
ScriptWrappable::Trace(visitor);
}
......
......@@ -20,11 +20,9 @@
namespace blink {
class MediaStreamTrack;
class RTCDtlsTransport;
class RTCDTMFSender;
class RTCPeerConnection;
class RTCRtpCapabilities;
class RTCRtpTransceiver;
webrtc::RtpEncodingParameters ToRtpEncodingParameters(
const RTCRtpEncodingParameters*);
......@@ -43,8 +41,6 @@ class RTCRtpSender final : public ScriptWrappable {
MediaStreamVector streams);
MediaStreamTrack* track();
RTCDtlsTransport* transport();
RTCDtlsTransport* rtcp_transport();
ScriptPromise replaceTrack(ScriptState*, MediaStreamTrack*);
RTCDTMFSender* dtmf();
static RTCRtpCapabilities* getCapabilities(const String& kind);
......@@ -59,7 +55,6 @@ class RTCRtpSender final : public ScriptWrappable {
void ClearLastReturnedParameters();
MediaStreamVector streams() const;
void set_streams(MediaStreamVector streams);
void set_transceiver(RTCRtpTransceiver*);
void Trace(blink::Visitor*) override;
......@@ -73,7 +68,6 @@ class RTCRtpSender final : public ScriptWrappable {
Member<RTCDTMFSender> dtmf_;
MediaStreamVector streams_;
Member<RTCRtpSendParameters> last_returned_parameters_;
Member<RTCRtpTransceiver> transceiver_;
};
} // namespace blink
......
......@@ -6,8 +6,6 @@
[Exposed=Window]
interface RTCRtpSender {
readonly attribute MediaStreamTrack? track;
[RuntimeEnabled=RTCDtlsTransport] readonly attribute RTCDtlsTransport? transport;
[RuntimeEnabled=RTCDtlsTransport] readonly attribute RTCDtlsTransport? rtcp_transport;
static RTCRtpCapabilities? getCapabilities(DOMString kind);
[RuntimeEnabled=RTCRtpSenderParameters, CallWith=ScriptState] Promise<void> setParameters(optional RTCRtpSendParameters parameters);
[RuntimeEnabled=RTCRtpSenderParameters] RTCRtpSendParameters getParameters();
......
......@@ -100,8 +100,6 @@ RTCRtpTransceiver::RTCRtpTransceiver(
DCHECK(sender_);
DCHECK(receiver_);
UpdateMembers();
sender_->set_transceiver(this);
receiver_->set_transceiver(this);
}
String RTCRtpTransceiver::mid() const {
......
......@@ -216,11 +216,6 @@ WebString MockWebRTCPeerConnectionHandler::Id() const {
return WebString();
}
webrtc::PeerConnectionInterface*
MockWebRTCPeerConnectionHandler::NativePeerConnection() {
return nullptr;
}
std::unique_ptr<WebRTCPeerConnectionHandler>
TestingPlatformSupportWithWebRTC::CreateRTCPeerConnectionHandler(
WebRTCPeerConnectionHandlerClient*,
......
......@@ -64,7 +64,6 @@ class MockWebRTCPeerConnectionHandler : public WebRTCPeerConnectionHandler {
const WebRTCDataChannelInit&) override;
void Stop() override;
WebString Id() const override;
webrtc::PeerConnectionInterface* NativePeerConnection() override;
};
class TestingPlatformSupportWithWebRTC : public TestingPlatformSupport {
......
This is a testharness.js-based test.
PASS RTCRtpSender.transport is null when unconnected
FAIL RTCRtpSender/receiver.transport has a value when connected assert_not_equals: got disallowed value null
FAIL RTCRtpSender/receiver.transport at the right time, with bundle policy balanced assert_not_equals: got disallowed value null
FAIL RTCRtpSender/receiver.transport at the right time, with bundle policy max-bundle assert_not_equals: got disallowed value null
FAIL RTCRtpSender/receiver.transport at the right time, with bundle policy max-compat assert_not_equals: got disallowed value null
Harness: the test ran to completion.
<!doctype html>
<meta charset=utf-8>
<title>RTCRtpSender.transport</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="dictionary-helper.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';
// Spec link: http://w3c.github.io/webrtc-pc/#dom-rtcrtpsender-transport
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = caller.addTrack(track);
assert_equals(sender.transport, null);
}, 'RTCRtpSender.transport is null when unconnected');
// Test for the simple/happy path of connecting a single track
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = caller.addTrack(track);
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
exchangeIceCandidates(caller, callee);
await exchangeOfferAndListenToOntrack(t, caller, callee);
assert_not_equals(sender.transport, null);
const [transceiver] = caller.getTransceivers();
assert_equals(transceiver.sender.transport,
transceiver.receiver.transport);
}, 'RTCRtpSender/receiver.transport has a value when connected');
// Test with multiple tracks, and checking details of when things show up
// for different bundle policies.
for (let bundle_policy of ['balanced', 'max-bundle', 'max-compat']) {
promise_test(async t => {
const caller = new RTCPeerConnection({bundlePolicy: bundle_policy});
t.add_cleanup(() => caller.close());
const stream = await navigator.mediaDevices.getUserMedia(
{audio: true, video:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track1, track2] = stream.getTracks();
const sender1 = caller.addTrack(track1);
const sender2 = caller.addTrack(track2);
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
exchangeIceCandidates(caller, callee);
const offer = await caller.createOffer();
assert_equals(sender1.transport, null);
assert_equals(sender2.transport, null);
await caller.setLocalDescription(offer);
assert_not_equals(sender1.transport, null);
assert_not_equals(sender2.transport, null);
const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers();
assert_equals(sender1.transport, caller_transceiver1.sender.transport);
if (bundle_policy == 'max-bundle') {
assert_equals(caller_transceiver1.sender.transport,
caller_transceiver2.sender.transport);
} else {
assert_not_equals(caller_transceiver1.sender.transport,
caller_transceiver2.sender.transport);
}
await callee.setRemoteDescription(offer);
const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers();
assert_not_equals(callee_transceiver1.receiver.transport, null);
assert_not_equals(callee_transceiver2.receiver.transport, null);
const answer = await callee.createAnswer();
await callee.setLocalDescription(answer);
// At this point, bundle should have kicked in.
assert_equals(callee_transceiver1.receiver.transport,
callee_transceiver2.receiver.transport);
await caller.setRemoteDescription(answer);
assert_equals(caller_transceiver1.receiver.transport,
caller_transceiver2.receiver.transport);
}, 'RTCRtpSender/receiver.transport at the right time, with bundle policy ' + bundle_policy);
}
</script>
......@@ -228,7 +228,7 @@ PASS RTCRtpSender interface: existence and properties of interface prototype obj
PASS RTCRtpSender interface: existence and properties of interface prototype object's "constructor" property
PASS RTCRtpSender interface: existence and properties of interface prototype object's @@unscopables property
PASS RTCRtpSender interface: attribute track
PASS RTCRtpSender interface: attribute transport
FAIL RTCRtpSender interface: attribute transport assert_true: The prototype object must have a property "transport" expected true got false
FAIL RTCRtpSender interface: attribute rtcpTransport assert_true: The prototype object must have a property "rtcpTransport" expected true got false
PASS RTCRtpSender interface: operation getCapabilities(DOMString)
FAIL RTCRtpSender interface: operation setParameters(RTCRtpSendParameters) assert_equals: property has wrong .length expected 1 but got 0
......@@ -260,7 +260,7 @@ PASS RTCRtpReceiver interface: existence and properties of interface prototype o
PASS RTCRtpReceiver interface: existence and properties of interface prototype object's "constructor" property
PASS RTCRtpReceiver interface: existence and properties of interface prototype object's @@unscopables property
PASS RTCRtpReceiver interface: attribute track
PASS RTCRtpReceiver interface: attribute transport
FAIL RTCRtpReceiver interface: attribute transport assert_true: The prototype object must have a property "transport" expected true got false
FAIL RTCRtpReceiver interface: attribute rtcpTransport assert_true: The prototype object must have a property "rtcpTransport" expected true got false
PASS RTCRtpReceiver interface: operation getCapabilities(DOMString)
FAIL RTCRtpReceiver interface: operation getParameters() assert_own_property: interface prototype object missing non-static operation expected property "getParameters" missing
......
This is a testharness.js-based test.
PASS RTCRtpSender.transport is null when unconnected
PASS RTCRtpSender/receiver.transport has a value when connected
PASS RTCRtpSender/receiver.transport at the right time, with bundle policy balanced
PASS RTCRtpSender/receiver.transport at the right time, with bundle policy max-bundle
PASS RTCRtpSender/receiver.transport at the right time, with bundle policy max-compat
Harness: the test ran to completion.
......@@ -228,7 +228,7 @@ PASS RTCRtpSender interface: existence and properties of interface prototype obj
PASS RTCRtpSender interface: existence and properties of interface prototype object's "constructor" property
PASS RTCRtpSender interface: existence and properties of interface prototype object's @@unscopables property
PASS RTCRtpSender interface: attribute track
PASS RTCRtpSender interface: attribute transport
FAIL RTCRtpSender interface: attribute transport assert_true: The prototype object must have a property "transport" expected true got false
FAIL RTCRtpSender interface: attribute rtcpTransport assert_true: The prototype object must have a property "rtcpTransport" expected true got false
PASS RTCRtpSender interface: operation getCapabilities(DOMString)
FAIL RTCRtpSender interface: operation setParameters(RTCRtpSendParameters) assert_equals: property has wrong .length expected 1 but got 0
......@@ -240,7 +240,7 @@ PASS RTCRtpSender interface: attribute dtmf
PASS RTCRtpSender must be primary interface of new RTCPeerConnection().addTransceiver('audio').sender
PASS Stringification of new RTCPeerConnection().addTransceiver('audio').sender
PASS RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "track" with the proper type
PASS RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "transport" with the proper type
FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "transport" with the proper type assert_inherits: property "transport" not found in prototype chain
FAIL RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "rtcpTransport" with the proper type assert_inherits: property "rtcpTransport" not found in prototype chain
PASS RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "getCapabilities(DOMString)" with the proper type
PASS RTCRtpSender interface: calling getCapabilities(DOMString) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError
......@@ -260,7 +260,7 @@ PASS RTCRtpReceiver interface: existence and properties of interface prototype o
PASS RTCRtpReceiver interface: existence and properties of interface prototype object's "constructor" property
PASS RTCRtpReceiver interface: existence and properties of interface prototype object's @@unscopables property
PASS RTCRtpReceiver interface: attribute track
PASS RTCRtpReceiver interface: attribute transport
FAIL RTCRtpReceiver interface: attribute transport assert_true: The prototype object must have a property "transport" expected true got false
FAIL RTCRtpReceiver interface: attribute rtcpTransport assert_true: The prototype object must have a property "rtcpTransport" expected true got false
PASS RTCRtpReceiver interface: operation getCapabilities(DOMString)
FAIL RTCRtpReceiver interface: operation getParameters() assert_own_property: interface prototype object missing non-static operation expected property "getParameters" missing
......@@ -270,7 +270,7 @@ PASS RTCRtpReceiver interface: operation getStats()
PASS RTCRtpReceiver must be primary interface of new RTCPeerConnection().addTransceiver('audio').receiver
PASS Stringification of new RTCPeerConnection().addTransceiver('audio').receiver
PASS RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "track" with the proper type
PASS RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "transport" with the proper type
FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "transport" with the proper type assert_inherits: property "transport" not found in prototype chain
FAIL RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "rtcpTransport" with the proper type assert_inherits: property "rtcpTransport" not found in prototype chain
PASS RTCRtpReceiver interface: new RTCPeerConnection().addTransceiver('audio').receiver must inherit property "getCapabilities(DOMString)" with the proper type
PASS RTCRtpReceiver interface: calling getCapabilities(DOMString) on new RTCPeerConnection().addTransceiver('audio').receiver with too few arguments must throw TypeError
......
......@@ -5674,9 +5674,7 @@ interface RTCRtpContributingSource
interface RTCRtpReceiver
static method getCapabilities
attribute @@toStringTag
getter rtcp_transport
getter track
getter transport
method constructor
method getContributingSources
method getStats
......@@ -5684,9 +5682,7 @@ interface RTCRtpSender
static method getCapabilities
attribute @@toStringTag
getter dtmf
getter rtcp_transport
getter track
getter transport
method constructor
method getParameters
method getStats
......
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