WebKit Bugzilla
Attachment 349152 Details for
Bug 189390
: Add support for unified plan transceivers
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-189390-20180907092615.patch (text/plain), 107.15 KB, created by
youenn fablet
on 2018-09-07 09:26:16 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2018-09-07 09:26:16 PDT
Size:
107.15 KB
patch
obsolete
>Subversion Revision: 235759 >diff --git a/Source/ThirdParty/libwebrtc/ChangeLog b/Source/ThirdParty/libwebrtc/ChangeLog >index ddec699540f9f5997ef48bc9655b54a53aa7990b..373d468ff24ed353eb96e278b7d34465b3eea981 100644 >--- a/Source/ThirdParty/libwebrtc/ChangeLog >+++ b/Source/ThirdParty/libwebrtc/ChangeLog >@@ -1,3 +1,15 @@ >+2018-09-06 Youenn Fablet <youenn@apple.com> >+ >+ Add support for unified plan transceivers >+ https://bugs.webkit.org/show_bug.cgi?id=189390 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Expose more symbols. >+ * Configurations/libwebrtc.iOS.exp: >+ * Configurations/libwebrtc.iOSsim.exp: >+ * Configurations/libwebrtc.mac.exp: >+ > 2018-09-05 Youenn Fablet <youenn@apple.com> > > Expose RTCRtpSender.setParameters >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c3a379fa3d282ac05b4073f809d4d7ee54324d97..2c620d37c437e3c9dff6051265bcedfa2a2db5b8 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,83 @@ >+2018-09-06 Youenn Fablet <youenn@apple.com> >+ >+ Add support for unified plan transceivers >+ https://bugs.webkit.org/show_bug.cgi?id=189390 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Keep previous transceiver behavior when unified plan flag is off. >+ Otherwise, use the libwebrtc transceiver API to create and use unified plan transceivers. >+ Fuel the implementation of transceivers through a dedicated backend. >+ >+ Update transceiver IDL and make some smaller fixes at the same time: >+ - Make sure remote sources have a proper name as per https://w3c.github.io/webrtc-pc/#dfn-create-an-rtcrtpreceiver. >+ - Add support for transceiver.currentDirection. >+ >+ Our mock peer connections are only supporting plan B APIs at the moment. >+ We therefore mandate plan B when using such mocks until we can upgrade mocks to support unified plan APIs. >+ >+ Covered by modified and rebased tests. >+ >+ * Modules/mediastream/PeerConnectionBackend.cpp: >+ (WebCore::PeerConnectionBackend::addTrack): >+ * Modules/mediastream/PeerConnectionBackend.h: >+ * Modules/mediastream/RTCPeerConnection.cpp: >+ (WebCore::RTCPeerConnection::addTrack): >+ (WebCore::RTCPeerConnection::addTransceiver): >+ * Modules/mediastream/RTCRtpSender.cpp: >+ (WebCore::RTCRtpSender::RTCRtpSender): >+ * Modules/mediastream/RTCRtpTransceiver.cpp: >+ (WebCore::RTCRtpTransceiver::mid const): >+ (WebCore::RTCRtpTransceiver::currentDirection const): >+ * Modules/mediastream/RTCRtpTransceiver.h: >+ (WebCore::RTCRtpTransceiver::backend): >+ * Modules/mediastream/RTCRtpTransceiver.idl: >+ * Modules/mediastream/RTCRtpTransceiverBackend.h: >+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp: >+ (WebCore::LibWebRTCMediaEndpoint::addTrack): >+ (WebCore::LibWebRTCMediaEndpoint::newTransceiver): >+ (WebCore::LibWebRTCMediaEndpoint::addTransceiver): >+ (WebCore::LibWebRTCMediaEndpoint::transceiverBackendFromSender): >+ (WebCore::LibWebRTCMediaEndpoint::OnAddTrack): >+ (WebCore::LibWebRTCMediaEndpoint::OnTrack): >+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h: >+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: >+ (WebCore::createReceiverForSource): >+ (WebCore::LibWebRTCPeerConnectionBackend::createReceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::videoReceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::audioReceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::addTrack): >+ (WebCore::LibWebRTCPeerConnectionBackend::addTransceiver): >+ (WebCore::backendFromRTPTransceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::existingTransceiver): >+ (WebCore::LibWebRTCPeerConnectionBackend::newTransceiver): >+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h: >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp: >+ (WebCore::LibWebRTCRtpSenderBackend::replaceTrack): >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h: >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.cpp: Added. >+ (WebCore::LibWebRTCRtpTransceiverBackend::createReceiverBackend): >+ (WebCore::LibWebRTCRtpTransceiverBackend::createSenderBackend): >+ (WebCore::LibWebRTCRtpTransceiverBackend::direction const): >+ (WebCore::LibWebRTCRtpTransceiverBackend::currentDirection const): >+ (WebCore::LibWebRTCRtpTransceiverBackend::setDirection): >+ (WebCore::LibWebRTCRtpTransceiverBackend::mid): >+ (WebCore::LibWebRTCRtpTransceiverBackend::stop): >+ * Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.h: Added. >+ * Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp: >+ (WebCore::toRTCRtpTransceiverDirection): >+ (WebCore::fromRTCRtpTransceiverDirection): >+ (WebCore::fromRtpTransceiverInit): >+ * Modules/mediastream/libwebrtc/LibWebRTCUtils.h: >+ * WebCore.xcodeproj/project.pbxproj: >+ * platform/mediastream/RealtimeIncomingAudioSource.cpp: >+ (WebCore::RealtimeIncomingAudioSource::RealtimeIncomingAudioSource): >+ * platform/mediastream/RealtimeIncomingVideoSource.cpp: >+ (WebCore::RealtimeIncomingVideoSource::RealtimeIncomingVideoSource): >+ * platform/mediastream/RealtimeMediaSource.h: >+ * testing/Internals.cpp: >+ (WebCore::Internals::useMockRTCPeerConnectionFactory): >+ > 2018-09-06 Antti Koivisto <antti@apple.com> > > Actively prewarm processes created for prewarm pool >diff --git a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp >index d64cdf08b41b39a57afdb13fb8a78716a650a52d..76497e3c57c1733d166ecaf0750f9ee10024b4aa 100644 >--- a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp >+++ b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp >@@ -212,3 +212,5 @@ __ZN6webrtc12RtpExtensionD1Ev > __ZN6webrtc21RtpEncodingParametersC1ERKS0_ > __ZN6webrtc21RtpEncodingParametersC1Ev > __ZN6webrtc21RtpEncodingParametersD1Ev >+__ZN6webrtc18RtpTransceiverInitC1Ev >+__ZN6webrtc18RtpTransceiverInitD1Ev >diff --git a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp >index 4fc1c4abd7a524b70ce8d50a333c180c63f6d4ff..1e713ce54b8a7d852a43292b8753cc745e9312c4 100644 >--- a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp >+++ b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp >@@ -213,3 +213,6 @@ __ZN6webrtc12RtpExtensionD1Ev > __ZN6webrtc21RtpEncodingParametersC1ERKS0_ > __ZN6webrtc21RtpEncodingParametersC1Ev > __ZN6webrtc21RtpEncodingParametersD1Ev >+ >+__ZN6webrtc18RtpTransceiverInitC1Ev >+__ZN6webrtc18RtpTransceiverInitD1Ev >diff --git a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp >index 4fc1c4abd7a524b70ce8d50a333c180c63f6d4ff..c2e741b36a79a94e9199f13c16344ed853f03b0c 100644 >--- a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp >+++ b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp >@@ -213,3 +213,5 @@ __ZN6webrtc12RtpExtensionD1Ev > __ZN6webrtc21RtpEncodingParametersC1ERKS0_ > __ZN6webrtc21RtpEncodingParametersC1Ev > __ZN6webrtc21RtpEncodingParametersD1Ev >+__ZN6webrtc18RtpTransceiverInitC1Ev >+__ZN6webrtc18RtpTransceiverInitD1Ev >diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt >index ec77463ef1fe6ba471f46b28bddcb97f38c0972a..e2fa2d92d3fba7fec029764aee4a52852b082347 100644 >--- a/Source/WebCore/CMakeLists.txt >+++ b/Source/WebCore/CMakeLists.txt >@@ -1572,6 +1572,7 @@ if (USE_LIBWEBRTC) > Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp > Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp > Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >+ Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.cpp > Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp > ) > endif () >diff --git a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp >index 333113f20e3c657b433b159a67e1af4284f1c707..2f174180cb9c5aea128f8c5cf1d9a7b3cee623c0 100644 >--- a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp >@@ -530,7 +530,7 @@ void PeerConnectionBackend::markAsNeedingNegotiation() > m_peerConnection.scheduleNegotiationNeededEvent(); > } > >-ExceptionOr<Ref<RTCRtpSender>> PeerConnectionBackend::addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&) >+ExceptionOr<Ref<RTCRtpSender>> PeerConnectionBackend::addTrack(MediaStreamTrack&, Vector<String>&&) > { > return Exception { NotSupportedError, "Not implemented"_s }; > } >diff --git a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h >index bc6d2f6f3b95f44dff2b64ae2bb24c159668be1c..284a64a15a0c0fcef895237a73e8a9eb1cb0fba6 100644 >--- a/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h >+++ b/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h >@@ -100,7 +100,7 @@ public: > > virtual void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&) = 0; > >- virtual ExceptionOr<Ref<RTCRtpSender>> addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&); >+ virtual ExceptionOr<Ref<RTCRtpSender>> addTrack(MediaStreamTrack&, Vector<String>&&); > virtual void removeTrack(RTCRtpSender&) { } > > virtual ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(const String&, const RTCRtpTransceiverInit&); >diff --git a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >index 4ad4f7cbf6a7749cebdf72e741a041152beec2ed..566fa3314fa676404fd907ff7bc3d802d2b6815f 100644 >--- a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp >@@ -122,22 +122,7 @@ ExceptionOr<Ref<RTCRtpSender>> RTCPeerConnection::addTrack(Ref<MediaStreamTrack> > for (auto stream : streams) > mediaStreamIds.append(stream.get().id()); > >- RTCRtpSender* sender = nullptr; >- >- // Reuse an existing sender with the same track kind if it has never been used to send before. >- for (auto& transceiver : m_transceiverSet->list()) { >- auto& existingSender = transceiver->sender(); >- if (existingSender.trackKind() == track->kind() && existingSender.trackId().isNull() && !transceiver->hasSendingDirection()) { >- existingSender.setTrack(track.copyRef()); >- existingSender.setMediaStreamIds(WTFMove(mediaStreamIds)); >- transceiver->enableSendingDirection(); >- sender = &existingSender; >- >- break; >- } >- } >- >- return m_backend->addTrack(sender, track.get(), mediaStreamIds); >+ return m_backend->addTrack(track.get(), WTFMove(mediaStreamIds)); > } > > ExceptionOr<void> RTCPeerConnection::removeTrack(RTCRtpSender& sender) >@@ -171,9 +156,15 @@ ExceptionOr<Ref<RTCRtpTransceiver>> RTCPeerConnection::addTransceiver(AddTransce > if (kind != "audio" && kind != "video") > return Exception { TypeError }; > >+ if (isClosed()) >+ return Exception { InvalidStateError }; >+ > return m_backend->addTransceiver(kind, init); > } > >+ if (isClosed()) >+ return Exception { InvalidStateError }; >+ > auto track = WTF::get<RefPtr<MediaStreamTrack>>(withTrack).releaseNonNull(); > return m_backend->addTransceiver(WTFMove(track), init); > } >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h b/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h >index db6b7498b9e083919abb57af71acb4fb64de5f41..ac3da1058f98734da8537e2a80139bd289b34f2a 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h >+++ b/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h >@@ -41,7 +41,7 @@ namespace WebCore { > > class RTCRtpReceiver : public RTCRtpSenderReceiverBase { > public: >- static Ref<RTCRtpReceiver> create(Ref<MediaStreamTrack>&& track, std::unique_ptr<RTCRtpReceiverBackend>&& backend = nullptr) >+ static Ref<RTCRtpReceiver> create(Ref<MediaStreamTrack>&& track, std::unique_ptr<RTCRtpReceiverBackend>&& backend) > { > return adoptRef(*new RTCRtpReceiver(WTFMove(track), WTFMove(backend))); > } >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp b/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >index 75839e19e52a0550525e0cd0d586a761ceb22f36..3a321f6cb510fa5f325bd59d75f3cbd3efcd7e77 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp >@@ -33,6 +33,8 @@ > > #if ENABLE(WEB_RTC) > >+#include "RuntimeEnabledFeatures.h" >+ > namespace WebCore { > > Ref<RTCRtpSender> RTCRtpSender::create(Ref<MediaStreamTrack>&& track, Vector<String>&& mediaStreamIds, std::unique_ptr<RTCRtpSenderBackend>&& backend) >@@ -53,6 +55,7 @@ RTCRtpSender::RTCRtpSender(String&& trackKind, Vector<String>&& mediaStreamIds, > , m_mediaStreamIds(WTFMove(mediaStreamIds)) > , m_backend(WTFMove(backend)) > { >+ ASSERT(!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled() || m_backend); > } > > void RTCRtpSender::setTrackToNull() >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp b/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp >index 674b321cee1388e2e7f28eecff9f013593467ab1..601246e28a6ca35dbf7b19abfc2cdbc6db3b5a3e 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp >+++ b/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp >@@ -47,11 +47,9 @@ RTCRtpTransceiver::RTCRtpTransceiver(Ref<RTCRtpSender>&& sender, Ref<RTCRtpRecei > { > } > >-const String& RTCRtpTransceiver::mid() const >+String RTCRtpTransceiver::mid() const > { >- if (!m_backend) >- return m_mid; >- return m_backend->mid(); >+ return m_backend ? m_backend->mid() : String { }; > } > > bool RTCRtpTransceiver::hasSendingDirection() const >@@ -66,6 +64,13 @@ RTCRtpTransceiverDirection RTCRtpTransceiver::direction() const > return m_backend->direction(); > } > >+std::optional<RTCRtpTransceiverDirection> RTCRtpTransceiver::currentDirection() const >+{ >+ if (!m_backend) >+ return std::nullopt; >+ return m_backend->currentDirection(); >+} >+ > void RTCRtpTransceiver::setDirection(RTCRtpTransceiverDirection direction) > { > m_direction = direction; >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h b/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h >index 802672b50709bb3d3f3bb2e37a760f98fb28fc47..b991d72a11afb8a62aadb444686c8edc8e35ad6a 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h >+++ b/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h >@@ -55,8 +55,9 @@ public: > void disableSendingDirection(); > > RTCRtpTransceiverDirection direction() const; >+ std::optional<RTCRtpTransceiverDirection> currentDirection() const; > void setDirection(RTCRtpTransceiverDirection); >- const String& mid() const; >+ String mid() const; > > RTCRtpSender& sender() { return m_sender.get(); } > RTCRtpReceiver& receiver() { return m_receiver.get(); } >@@ -69,10 +70,11 @@ public: > // transport each. > RTCIceTransport& iceTransport() { return m_iceTransport.get(); } > >+ RTCRtpTransceiverBackend* backend() { return m_backend.get(); } >+ > private: > RTCRtpTransceiver(Ref<RTCRtpSender>&&, Ref<RTCRtpReceiver>&&, std::unique_ptr<RTCRtpTransceiverBackend>&&); > >- String m_mid; > RTCRtpTransceiverDirection m_direction; > > Ref<RTCRtpSender> m_sender; >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.idl b/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.idl >index 407871ebc760f53f2705830804bd9d021cb5f04f..aa166028f2cc724912736512fc779092aa02ced6 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.idl >+++ b/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.idl >@@ -36,13 +36,11 @@ typedef RTCRtpTransceiverDirection RtpTransceiverDirection; > EnabledAtRuntime=PeerConnection > ] interface RTCRtpTransceiver { > readonly attribute DOMString? mid; >- // FIXME 169662: missing [SameObject] >- readonly attribute RTCRtpSender sender; >- // FIXME 169662: missing [SameObject] >- readonly attribute RTCRtpReceiver receiver; >+ [SameObject] readonly attribute RTCRtpSender sender; >+ [SameObject] readonly attribute RTCRtpReceiver receiver; > readonly attribute boolean stopped; > readonly attribute RtpTransceiverDirection direction; >- // FIXME 169662: missing currentDirection >+ readonly attribute RTCRtpTransceiverDirection? currentDirection; > void setDirection(RtpTransceiverDirection direction); > void stop(); > // FIXME 169662: missing setCodecPreferences >diff --git a/Source/WebCore/Modules/mediastream/RTCRtpTransceiverBackend.h b/Source/WebCore/Modules/mediastream/RTCRtpTransceiverBackend.h >index 8dfdf968aec278d9688b7711cd1aab1af6f1b0ae..f280ea40005adf31936f3bf3267e13cb1fddd8bb 100644 >--- a/Source/WebCore/Modules/mediastream/RTCRtpTransceiverBackend.h >+++ b/Source/WebCore/Modules/mediastream/RTCRtpTransceiverBackend.h >@@ -35,9 +35,10 @@ public: > virtual ~RTCRtpTransceiverBackend() = default; > > virtual RTCRtpTransceiverDirection direction() const = 0; >+ virtual std::optional<RTCRtpTransceiverDirection> currentDirection() const = 0; > virtual void setDirection(RTCRtpTransceiverDirection) = 0; > >- virtual const String& mid() = 0; >+ virtual String mid() = 0; > virtual void stop() = 0; > }; > >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >index efa19adc72f4189ebb8940482601a5e6a3f82c1d..89efce152748c128683e9217d6610656e8f04a4c 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp >@@ -34,6 +34,7 @@ > #include "LibWebRTCProvider.h" > #include "LibWebRTCRtpReceiverBackend.h" > #include "LibWebRTCRtpSenderBackend.h" >+#include "LibWebRTCRtpTransceiverBackend.h" > #include "LibWebRTCStatsCollector.h" > #include "LibWebRTCUtils.h" > #include "Logging.h" >@@ -197,7 +198,6 @@ void LibWebRTCMediaEndpoint::doSetRemoteDescription(RTCSessionDescription& descr > bool LibWebRTCMediaEndpoint::addTrack(LibWebRTCRtpSenderBackend& sender, MediaStreamTrack& track, const Vector<String>& mediaStreamIds) > { > ASSERT(m_backend); >- ASSERT(!sender.rtcSender()); > > if (!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) { > String mediaStreamId = mediaStreamIds.isEmpty() ? createCanonicalUUIDString() : mediaStreamIds[0]; >@@ -208,35 +208,41 @@ bool LibWebRTCMediaEndpoint::addTrack(LibWebRTCRtpSenderBackend& sender, MediaSt > }); > } > >- std::vector<std::string> ids; >- for (auto& id : mediaStreamIds) >- ids.push_back(id.utf8().data()); >- >+ LibWebRTCRtpSenderBackend::Source source; >+ rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> rtcTrack; > switch (track.privateTrack().type()) { > case RealtimeMediaSource::Type::Audio: { > auto audioSource = RealtimeOutgoingAudioSource::create(track.privateTrack()); >- auto audioTrack = m_peerConnectionFactory.CreateAudioTrack(track.id().utf8().data(), audioSource.ptr()); >- sender.setSource(WTFMove(audioSource)); >- auto rtpSender = m_backend->AddTrack(audioTrack.get(), WTFMove(ids)); >- if (!rtpSender.ok()) >- return false; >- sender.setRTCSender(rtpSender.MoveValue()); >- return true; >+ rtcTrack = m_peerConnectionFactory.CreateAudioTrack(track.id().utf8().data(), audioSource.ptr()); >+ source = WTFMove(audioSource); >+ break; > } > case RealtimeMediaSource::Type::Video: { > auto videoSource = RealtimeOutgoingVideoSource::create(track.privateTrack()); >- auto videoTrack = m_peerConnectionFactory.CreateVideoTrack(track.id().utf8().data(), videoSource.ptr()); >- sender.setSource(WTFMove(videoSource)); >- auto rtpSender = m_backend->AddTrack(videoTrack.get(), WTFMove(ids)); >- if (!rtpSender.ok()) >- return false; >- sender.setRTCSender(rtpSender.MoveValue()); >- return true; >+ rtcTrack = m_peerConnectionFactory.CreateVideoTrack(track.id().utf8().data(), videoSource.ptr()); >+ source = WTFMove(videoSource); >+ break; > } > case RealtimeMediaSource::Type::None: > ASSERT_NOT_REACHED(); >+ return false; > } >- return false; >+ >+ sender.setSource(WTFMove(source)); >+ if (auto rtpSender = sender.rtcSender()) { >+ rtpSender->SetTrack(rtcTrack.get()); >+ return true; >+ } >+ >+ std::vector<std::string> ids; >+ for (auto& id : mediaStreamIds) >+ ids.push_back(id.utf8().data()); >+ >+ auto newRTPSender = m_backend->AddTrack(rtcTrack.get(), WTFMove(ids)); >+ if (!newRTPSender.ok()) >+ return false; >+ sender.setRTCSender(newRTPSender.MoveValue()); >+ return true; > } > > void LibWebRTCMediaEndpoint::removeTrack(LibWebRTCRtpSenderBackend& sender) >@@ -361,20 +367,131 @@ void LibWebRTCMediaEndpoint::addRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiv > } > > receiver->setBackend(std::make_unique<LibWebRTCRtpReceiverBackend>(WTFMove(rtcReceiver))); >- >- auto* track = receiver->track(); >- ASSERT(track); >+ auto& track = *receiver->track(); >+ fireTrackEvent(receiver.releaseNonNull(), track, rtcStreams, nullptr); >+} > >+void LibWebRTCMediaEndpoint::fireTrackEvent(Ref<RTCRtpReceiver>&& receiver, Ref<MediaStreamTrack>&& track, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& rtcStreams, RefPtr<RTCRtpTransceiver>&& transceiver) >+{ > Vector<RefPtr<MediaStream>> streams; > for (auto& rtcStream : rtcStreams) { > auto& mediaStream = mediaStreamFromRTCStream(*rtcStream.get()); > streams.append(&mediaStream); >- mediaStream.addTrackFromPlatform(*track); >+ mediaStream.addTrackFromPlatform(track.get()); > } > m_peerConnectionBackend.connection().fireEvent(RTCTrackEvent::create(eventNames().trackEvent, >- Event::CanBubble::No, Event::IsCancelable::No, WTFMove(receiver), track, WTFMove(streams), nullptr)); >+ Event::CanBubble::No, Event::IsCancelable::No, WTFMove(receiver), WTFMove(track), WTFMove(streams), WTFMove(transceiver))); >+} >+ >+static inline void setExistingReceiverSourceTrack(RealtimeMediaSource& existingSource, webrtc::RtpReceiverInterface& rtcReceiver) >+{ >+ switch (rtcReceiver.media_type()) { >+ case cricket::MEDIA_TYPE_AUDIO: { >+ ASSERT(existingSource.type() == RealtimeMediaSource::Type::Audio); >+ rtc::scoped_refptr<webrtc::AudioTrackInterface> audioTrack = static_cast<webrtc::AudioTrackInterface*>(rtcReceiver.track().get()); >+ static_cast<RealtimeIncomingAudioSource&>(existingSource).setSourceTrack(WTFMove(audioTrack)); >+ return; >+ } >+ case cricket::MEDIA_TYPE_VIDEO: { >+ ASSERT(existingSource.type() == RealtimeMediaSource::Type::Video); >+ rtc::scoped_refptr<webrtc::VideoTrackInterface> videoTrack = static_cast<webrtc::VideoTrackInterface*>(rtcReceiver.track().get()); >+ static_cast<RealtimeIncomingVideoSource&>(existingSource).setSourceTrack(WTFMove(videoTrack)); >+ return; >+ } >+ case cricket::MEDIA_TYPE_DATA: >+ ASSERT_NOT_REACHED(); >+ return; >+ } >+} >+ >+static inline RefPtr<RealtimeMediaSource> sourceFromNewReceiver(webrtc::RtpReceiverInterface& rtcReceiver) >+{ >+ auto rtcTrack = rtcReceiver.track(); >+ switch (rtcReceiver.media_type()) { >+ case cricket::MEDIA_TYPE_DATA: >+ return nullptr; >+ case cricket::MEDIA_TYPE_AUDIO: { >+ rtc::scoped_refptr<webrtc::AudioTrackInterface> audioTrack = static_cast<webrtc::AudioTrackInterface*>(rtcTrack.get()); >+ return RealtimeIncomingAudioSource::create(WTFMove(audioTrack), fromStdString(rtcTrack->id())); >+ } >+ case cricket::MEDIA_TYPE_VIDEO: { >+ rtc::scoped_refptr<webrtc::VideoTrackInterface> videoTrack = static_cast<webrtc::VideoTrackInterface*>(rtcTrack.get()); >+ return RealtimeIncomingVideoSource::create(WTFMove(videoTrack), fromStdString(rtcTrack->id())); >+ } >+ } >+} >+ >+void LibWebRTCMediaEndpoint::newTransceiver(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>&& rtcTransceiver) >+{ >+ auto* transceiver = m_peerConnectionBackend.existingTransceiver([&](auto& transceiverBackend) { >+ return rtcTransceiver.get() == transceiverBackend.rtcTransceiver(); >+ }); >+ if (transceiver) { >+ setExistingReceiverSourceTrack(transceiver->receiver().track()->source(), *rtcTransceiver->receiver()); >+ return; >+ } >+ >+ auto rtcReceiver = rtcTransceiver->receiver(); >+ auto source = sourceFromNewReceiver(*rtcReceiver); >+ if (!source) >+ return; >+ >+ auto& newTransceiver = m_peerConnectionBackend.newRemoteTransceiver(std::make_unique<LibWebRTCRtpTransceiverBackend>(WTFMove(rtcTransceiver)), source.releaseNonNull()); >+ >+ fireTrackEvent(makeRef(newTransceiver.receiver()), *newTransceiver.receiver().track(), rtcReceiver->streams(), makeRef(newTransceiver)); >+} >+ >+template<typename T> >+std::optional<LibWebRTCMediaEndpoint::Backends> LibWebRTCMediaEndpoint::createTransceiverBackends(T&& trackOrKind, const RTCRtpTransceiverInit& init, LibWebRTCRtpSenderBackend::Source&& source) >+{ >+ auto result = m_backend->AddTransceiver(WTFMove(trackOrKind), fromRtpTransceiverInit(init)); >+ if (!result.ok()) >+ return std::nullopt; >+ >+ auto transceiver = std::make_unique<LibWebRTCRtpTransceiverBackend>(result.MoveValue()); >+ return LibWebRTCMediaEndpoint::Backends { transceiver->createSenderBackend(m_peerConnectionBackend, WTFMove(source)), transceiver->createReceiverBackend(), WTFMove(transceiver) }; >+} >+ >+std::optional<LibWebRTCMediaEndpoint::Backends> LibWebRTCMediaEndpoint::addTransceiver(const String& trackKind, const RTCRtpTransceiverInit& init) >+{ >+ auto type = trackKind == "audio" ? cricket::MediaType::MEDIA_TYPE_AUDIO : cricket::MediaType::MEDIA_TYPE_VIDEO; >+ return createTransceiverBackends(type, init, nullptr); >+} >+ >+std::optional<LibWebRTCMediaEndpoint::Backends> LibWebRTCMediaEndpoint::addTransceiver(MediaStreamTrack& track, const RTCRtpTransceiverInit& init) >+{ >+ LibWebRTCRtpSenderBackend::Source source; >+ rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> rtcTrack; >+ switch (track.privateTrack().type()) { >+ case RealtimeMediaSource::Type::None: >+ return std::nullopt; >+ case RealtimeMediaSource::Type::Audio: { >+ auto audioSource = RealtimeOutgoingAudioSource::create(track.privateTrack()); >+ rtcTrack = m_peerConnectionFactory.CreateAudioTrack(track.id().utf8().data(), audioSource.ptr()); >+ source = WTFMove(audioSource); >+ break; >+ } >+ case RealtimeMediaSource::Type::Video: { >+ auto videoSource = RealtimeOutgoingVideoSource::create(track.privateTrack()); >+ rtcTrack = m_peerConnectionFactory.CreateVideoTrack(track.id().utf8().data(), videoSource.ptr()); >+ source = WTFMove(videoSource); >+ break; >+ } >+ } >+ >+ return createTransceiverBackends(WTFMove(rtcTrack), init, WTFMove(source)); > } > >+std::unique_ptr<LibWebRTCRtpTransceiverBackend> LibWebRTCMediaEndpoint::transceiverBackendFromSender(LibWebRTCRtpSenderBackend& backend) >+{ >+ for (auto& transceiver : m_backend->GetTransceivers()) { >+ if (transceiver->sender().get() == backend.rtcSender()) >+ return std::make_unique<LibWebRTCRtpTransceiverBackend>(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>(transceiver)); >+ } >+ return nullptr; >+} >+ >+ > void LibWebRTCMediaEndpoint::removeRemoteStream(webrtc::MediaStreamInterface& rtcStream) > { > bool removed = m_streams.remove(&rtcStream); >@@ -403,6 +520,9 @@ void LibWebRTCMediaEndpoint::OnRemoveStream(rtc::scoped_refptr<webrtc::MediaStre > > void LibWebRTCMediaEndpoint::OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& streams) > { >+ if (RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) >+ return; >+ > callOnMainThread([protectedThis = makeRef(*this), receiver = WTFMove(receiver), streams]() mutable { > if (protectedThis->isStopped()) > return; >@@ -410,6 +530,19 @@ void LibWebRTCMediaEndpoint::OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverIn > }); > } > >+void LibWebRTCMediaEndpoint::OnTrack(rtc::scoped_refptr<webrtc::RtpTransceiverInterface> transceiver) >+{ >+ if (!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) >+ return; >+ >+ callOnMainThread([protectedThis = makeRef(*this), transceiver = WTFMove(transceiver)]() mutable { >+ if (protectedThis->isStopped()) >+ return; >+ protectedThis->newTransceiver(WTFMove(transceiver)); >+ }); >+} >+ >+ > std::unique_ptr<RTCDataChannelHandler> LibWebRTCMediaEndpoint::createDataChannel(const String& label, const RTCDataChannelInit& options) > { > auto init = LibWebRTCDataChannelHandler::fromRTCDataChannelInit(options); >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h >index f2ba6bc525a32ef42c448208f136c06743e0abc6..3fd50969092aeee02308026b6375659262db42db 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h >@@ -28,10 +28,8 @@ > > #include "LibWebRTCObservers.h" > #include "LibWebRTCProvider.h" >-#include "PeerConnectionBackend.h" >+#include "LibWebRTCRtpSenderBackend.h" > #include "RTCRtpReceiver.h" >-#include "RealtimeOutgoingAudioSource.h" >-#include "RealtimeOutgoingVideoSource.h" > #include <Timer.h> > > #pragma GCC diagnostic push >@@ -61,7 +59,8 @@ namespace WebCore { > > class LibWebRTCProvider; > class LibWebRTCPeerConnectionBackend; >-class LibWebRTCRtpSenderBackend; >+class LibWebRTCRtpReceiverBackend; >+class LibWebRTCRtpTransceiverBackend; > class MediaStreamTrack; > class RTCSessionDescription; > >@@ -101,6 +100,15 @@ public: > bool addTrack(LibWebRTCRtpSenderBackend&, MediaStreamTrack&, const Vector<String>&); > void removeTrack(LibWebRTCRtpSenderBackend&); > >+ struct Backends { >+ std::unique_ptr<LibWebRTCRtpSenderBackend> senderBackend; >+ std::unique_ptr<LibWebRTCRtpReceiverBackend> receiverBackend; >+ std::unique_ptr<LibWebRTCRtpTransceiverBackend> transceiverBackend; >+ }; >+ std::optional<Backends> addTransceiver(const String& trackKind, const RTCRtpTransceiverInit&); >+ std::optional<Backends> addTransceiver(MediaStreamTrack&, const RTCRtpTransceiverInit&); >+ std::unique_ptr<LibWebRTCRtpTransceiverBackend> transceiverBackendFromSender(LibWebRTCRtpSenderBackend&); >+ > private: > LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend&, LibWebRTCProvider&); > >@@ -110,6 +118,8 @@ private: > void OnRemoveStream(rtc::scoped_refptr<webrtc::MediaStreamInterface>) final; > void OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface>) final; > void OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&) final; >+ void OnTrack(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>) final; >+ > void OnRenegotiationNeeded() final; > void OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState) final; > void OnIceGatheringChange(webrtc::PeerConnectionInterface::IceGatheringState) final; >@@ -125,6 +135,12 @@ private: > void addRemoteStream(webrtc::MediaStreamInterface&); > void addRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&); > void removeRemoteStream(webrtc::MediaStreamInterface&); >+ void newTransceiver(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>&&); >+ >+ void fireTrackEvent(Ref<RTCRtpReceiver>&&, Ref<MediaStreamTrack>&&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&, RefPtr<RTCRtpTransceiver>&&); >+ >+ template<typename T> >+ std::optional<Backends> createTransceiverBackends(T&&, const RTCRtpTransceiverInit&, LibWebRTCRtpSenderBackend::Source&&); > > void OnStatsDelivered(const rtc::scoped_refptr<const webrtc::RTCStatsReport>&) final; > void gatherStatsForLogging(); >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >index 50824599bd207174dee176d9f9831294a3ff01b6..8dacb52e1f489c63b10e8820e7beb50d5c7cb6ac 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp >@@ -33,6 +33,7 @@ > #include "LibWebRTCMediaEndpoint.h" > #include "LibWebRTCRtpReceiverBackend.h" > #include "LibWebRTCRtpSenderBackend.h" >+#include "LibWebRTCRtpTransceiverBackend.h" > #include "MediaEndpointConfiguration.h" > #include "Page.h" > #include "RTCIceCandidate.h" >@@ -200,12 +201,12 @@ void LibWebRTCPeerConnectionBackend::doAddIceCandidate(RTCIceCandidate& candidat > addIceCandidateSucceeded(); > } > >-static inline Ref<RTCRtpReceiver> createReceiverForSource(ScriptExecutionContext& context, Ref<RealtimeMediaSource>&& source) >+static inline Ref<RTCRtpReceiver> createReceiverForSource(ScriptExecutionContext& context, Ref<RealtimeMediaSource>&& source, std::unique_ptr<RTCRtpReceiverBackend>&& backend) > { > auto remoteTrackPrivate = MediaStreamTrackPrivate::create(WTFMove(source), String { source->id() }); > auto remoteTrack = MediaStreamTrack::create(context, WTFMove(remoteTrackPrivate)); > >- return RTCRtpReceiver::create(WTFMove(remoteTrack)); >+ return RTCRtpReceiver::create(WTFMove(remoteTrack), WTFMove(backend)); > } > > static inline Ref<RealtimeMediaSource> createEmptySource(const String& trackKind, String&& trackId) >@@ -219,7 +220,7 @@ static inline Ref<RealtimeMediaSource> createEmptySource(const String& trackKind > > Ref<RTCRtpReceiver> LibWebRTCPeerConnectionBackend::createReceiver(const String& trackKind, const String& trackId) > { >- auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), createEmptySource(trackKind, String(trackId))); >+ auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), createEmptySource(trackKind, String(trackId)), nullptr); > m_pendingReceivers.append(receiver.copyRef()); > return receiver; > } >@@ -237,7 +238,7 @@ LibWebRTCPeerConnectionBackend::VideoReceiver LibWebRTCPeerConnectionBackend::vi > } > } > auto source = RealtimeIncomingVideoSource::create(nullptr, WTFMove(trackId)); >- auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef()); >+ auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef(), nullptr); > > auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); > auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("video", { }, WTFMove(senderBackend)), receiver.copyRef(), nullptr); >@@ -260,7 +261,7 @@ LibWebRTCPeerConnectionBackend::AudioReceiver LibWebRTCPeerConnectionBackend::au > } > } > auto source = RealtimeIncomingAudioSource::create(nullptr, WTFMove(trackId)); >- auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef()); >+ auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), source.copyRef(), nullptr); > > auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); > auto transceiver = RTCRtpTransceiver::create(RTCRtpSender::create("audio", { }, WTFMove(senderBackend)), receiver.copyRef(), nullptr); >@@ -316,11 +317,57 @@ RefPtr<RTCSessionDescription> LibWebRTCPeerConnectionBackend::remoteDescription( > > static inline LibWebRTCRtpSenderBackend& backendFromRTPSender(RTCRtpSender& sender) > { >+ ASSERT(!sender.isStopped()); > return static_cast<LibWebRTCRtpSenderBackend&>(*sender.backend()); > } > >-ExceptionOr<Ref<RTCRtpSender>> LibWebRTCPeerConnectionBackend::addTrack(RTCRtpSender* sender, MediaStreamTrack& track, const Vector<String>& mediaStreamIds) >+ >+static inline RefPtr<RTCRtpSender> findExistingSender(const Vector<std::reference_wrapper<RTCRtpSender>>& senders, LibWebRTCRtpSenderBackend& senderBackend) >+{ >+ ASSERT(senderBackend.rtcSender()); >+ for (RTCRtpSender& sender : senders) { >+ if (!sender.isStopped() && senderBackend.rtcSender() == backendFromRTPSender(sender).rtcSender()) >+ return makeRef(sender); >+ } >+ return nullptr; >+} >+ >+ExceptionOr<Ref<RTCRtpSender>> LibWebRTCPeerConnectionBackend::addTrack(MediaStreamTrack& track, Vector<String>&& mediaStreamIds) > { >+ if (RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) { >+ auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); >+ if (!m_endpoint->addTrack(*senderBackend, track, mediaStreamIds)) >+ return Exception { TypeError, "Unable to add track"_s }; >+ >+ if (auto sender = findExistingSender(m_peerConnection.getSenders(), *senderBackend)) { >+ sender->setTrack(makeRef(track)); >+ sender->setMediaStreamIds(WTFMove(mediaStreamIds)); >+ return sender.releaseNonNull(); >+ } >+ >+ auto transceiverBackend = m_endpoint->transceiverBackendFromSender(*senderBackend); >+ >+ auto sender = RTCRtpSender::create(makeRef(track), WTFMove(mediaStreamIds), WTFMove(senderBackend)); >+ auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), createEmptySource(track.kind(), createCanonicalUUIDString()), transceiverBackend->createReceiverBackend()); >+ auto transceiver = RTCRtpTransceiver::create(sender.copyRef(), WTFMove(receiver), WTFMove(transceiverBackend)); >+ m_peerConnection.addInternalTransceiver(WTFMove(transceiver)); >+ return WTFMove(sender); >+ } >+ >+ RTCRtpSender* sender = nullptr; >+ // Reuse an existing sender with the same track kind if it has never been used to send before. >+ for (auto& transceiver : m_peerConnection.getTransceivers()) { >+ auto& existingSender = transceiver->sender(); >+ if (!existingSender.isStopped() && existingSender.trackKind() == track.kind() && existingSender.trackId().isNull() && !transceiver->hasSendingDirection()) { >+ existingSender.setTrack(makeRef(track)); >+ existingSender.setMediaStreamIds(WTFMove(mediaStreamIds)); >+ transceiver->enableSendingDirection(); >+ sender = &existingSender; >+ >+ break; >+ } >+ } >+ > if (!sender) { > const String& trackKind = track.kind(); > String trackId = createCanonicalUUIDString(); >@@ -340,8 +387,25 @@ ExceptionOr<Ref<RTCRtpSender>> LibWebRTCPeerConnectionBackend::addTrack(RTCRtpSe > return makeRef(*sender); > } > >+template<typename T> >+ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addUnifiedPlanTransceiver(T&& trackOrKind, const RTCRtpTransceiverInit& init) >+{ >+ auto backends = m_endpoint->addTransceiver(trackOrKind, init); >+ if (!backends) >+ return Exception { InvalidAccessError, "Unable to add transceiver"_s }; >+ >+ auto sender = RTCRtpSender::create(WTFMove(trackOrKind), Vector<String> { }, WTFMove(backends->senderBackend)); >+ auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), createEmptySource(sender->trackKind(), createCanonicalUUIDString()), WTFMove(backends->receiverBackend)); >+ auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), WTFMove(receiver), WTFMove(backends->transceiverBackend)); >+ m_peerConnection.addInternalTransceiver(transceiver.copyRef()); >+ return transceiver; >+} >+ > ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addTransceiver(const String& trackKind, const RTCRtpTransceiverInit& init) > { >+ if (RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) >+ return addUnifiedPlanTransceiver(String { trackKind }, init); >+ > auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); > auto newSender = RTCRtpSender::create(String(trackKind), Vector<String>(), WTFMove(senderBackend)); > return completeAddTransceiver(WTFMove(newSender), init, createCanonicalUUIDString(), trackKind); >@@ -349,6 +413,9 @@ ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addTransceiv > > ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addTransceiver(Ref<MediaStreamTrack>&& track, const RTCRtpTransceiverInit& init) > { >+ if (RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()) >+ return addUnifiedPlanTransceiver(WTFMove(track), init); >+ > auto senderBackend = std::make_unique<LibWebRTCRtpSenderBackend>(*this, nullptr); > auto& backend = *senderBackend; > auto sender = RTCRtpSender::create(track.copyRef(), Vector<String>(), WTFMove(senderBackend)); >@@ -358,6 +425,29 @@ ExceptionOr<Ref<RTCRtpTransceiver>> LibWebRTCPeerConnectionBackend::addTransceiv > return completeAddTransceiver(WTFMove(sender), init, track->id(), track->kind()); > } > >+static inline LibWebRTCRtpTransceiverBackend& backendFromRTPTransceiver(RTCRtpTransceiver& transceiver) >+{ >+ return static_cast<LibWebRTCRtpTransceiverBackend&>(*transceiver.backend()); >+} >+ >+RTCRtpTransceiver* LibWebRTCPeerConnectionBackend::existingTransceiver(WTF::Function<bool(LibWebRTCRtpTransceiverBackend&)>&& matchingFunction) >+{ >+ for (auto& transceiver : m_peerConnection.getTransceivers()) { >+ if (matchingFunction(backendFromRTPTransceiver(*transceiver))) >+ return transceiver.get(); >+ } >+ return nullptr; >+} >+ >+RTCRtpTransceiver& LibWebRTCPeerConnectionBackend::newRemoteTransceiver(std::unique_ptr<LibWebRTCRtpTransceiverBackend>&& transceiverBackend, Ref<RealtimeMediaSource>&& receiverSource) >+{ >+ auto sender = RTCRtpSender::create(receiverSource->type() == RealtimeMediaSource::Type::Audio ? "audio"_s : "video"_s, Vector<String> { }, transceiverBackend->createSenderBackend(*this, nullptr)); >+ auto receiver = createReceiverForSource(*m_peerConnection.scriptExecutionContext(), WTFMove(receiverSource), transceiverBackend->createReceiverBackend()); >+ auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), WTFMove(receiver), WTFMove(transceiverBackend)); >+ m_peerConnection.addInternalTransceiver(transceiver.copyRef()); >+ return transceiver.get(); >+} >+ > Ref<RTCRtpTransceiver> LibWebRTCPeerConnectionBackend::completeAddTransceiver(Ref<RTCRtpSender>&& sender, const RTCRtpTransceiverInit& init, const String& trackId, const String& trackKind) > { > auto transceiver = RTCRtpTransceiver::create(WTFMove(sender), createReceiver(trackKind, trackId), nullptr); >@@ -373,21 +463,13 @@ void LibWebRTCPeerConnectionBackend::removeTrack(RTCRtpSender& sender) > m_endpoint->removeTrack(backendFromRTPSender(sender)); > } > >-template<typename Source> >-static inline bool updateTrackSource(Source& source, MediaStreamTrack* track) >-{ >- if (!track) { >- source.stop(); >- return true; >- } >- return source.setSource(track->privateTrack()); >-} >- > void LibWebRTCPeerConnectionBackend::applyRotationForOutgoingVideoSources() > { > for (auto& transceiver : m_peerConnection.getTransceivers()) { >- if (auto* videoSource = backendFromRTPSender(transceiver->sender()).videoSource()) >- videoSource->setApplyRotation(true); >+ if (!transceiver->sender().isStopped()) { >+ if (auto* videoSource = backendFromRTPSender(transceiver->sender()).videoSource()) >+ videoSource->setApplyRotation(true); >+ } > } > } > >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >index d376f0ec178eef99f804a5c24198b76ddad8dd34..1f6850d1752325a114b7944745ab15f247ae19c3 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h >@@ -38,11 +38,13 @@ namespace WebCore { > > class LibWebRTCMediaEndpoint; > class LibWebRTCProvider; >+class LibWebRTCRtpTransceiverBackend; > class RTCRtpReceiver; > class RTCSessionDescription; > class RTCStatsReport; > class RealtimeIncomingAudioSource; > class RealtimeIncomingVideoSource; >+class RealtimeMediaSource; > class RealtimeOutgoingAudioSource; > class RealtimeOutgoingVideoSource; > >@@ -84,12 +86,15 @@ private: > > void getStatsSucceeded(const DeferredPromise&, Ref<RTCStatsReport>&&); > >- ExceptionOr<Ref<RTCRtpSender>> addTrack(RTCRtpSender*, MediaStreamTrack&, const Vector<String>&) final; >+ ExceptionOr<Ref<RTCRtpSender>> addTrack(MediaStreamTrack&, Vector<String>&&) final; > void removeTrack(RTCRtpSender&) final; > > ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(const String&, const RTCRtpTransceiverInit&) final; > ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(Ref<MediaStreamTrack>&&, const RTCRtpTransceiverInit&) final; > >+ RTCRtpTransceiver* existingTransceiver(WTF::Function<bool(LibWebRTCRtpTransceiverBackend&)>&&); >+ RTCRtpTransceiver& newRemoteTransceiver(std::unique_ptr<LibWebRTCRtpTransceiverBackend>&&, Ref<RealtimeMediaSource>&&); >+ > struct VideoReceiver { > Ref<RTCRtpReceiver> receiver; > Ref<RealtimeIncomingVideoSource> source; >@@ -108,6 +113,9 @@ private: > > Ref<RTCRtpReceiver> createReceiver(const String& trackKind, const String& trackId); > >+ template<typename T> >+ ExceptionOr<Ref<RTCRtpTransceiver>> addUnifiedPlanTransceiver(T&& trackOrKind, const RTCRtpTransceiverInit&); >+ > Ref<LibWebRTCMediaEndpoint> m_endpoint; > bool m_isLocalDescriptionSet { false }; > bool m_isRemoteDescriptionSet { false }; >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >index ad96b1fccef776375bc3c68f5f1e6b57108e73f4..a0e1488b1eecf887d5cc998d737ad6ec97787555 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp >@@ -90,7 +90,7 @@ void LibWebRTCRtpSenderBackend::replaceTrack(ScriptExecutionContext& context, RT > protectedSender->setTrack(track.releaseNonNull()); > if (!hasTrack) { > // FIXME: In case of unified plan, we should use m_rtcSender->SetTrack and no longer need m_peerConnectionBackend. >- auto result = m_peerConnectionBackend->addTrack(protectedSender.ptr(), *protectedSender->track(), { }); >+ auto result = m_peerConnectionBackend->addTrack(*protectedSender->track(), { }); > if (result.hasException()) { > promise.reject(result.releaseException()); > return; >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >index 9dff4aa9a167776fd6b060f1a31e0eef08b82ff9..c7344043a365b242b821015bea74b1c32b81f0a4 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h >@@ -27,6 +27,7 @@ > #if ENABLE(WEB_RTC) > > #include "LibWebRTCMacros.h" >+#include "LibWebRTCPeerConnectionBackend.h" > #include "RTCRtpSenderBackend.h" > #include "RealtimeOutgoingAudioSource.h" > #include "RealtimeOutgoingVideoSource.h" >@@ -46,12 +47,20 @@ class LibWebRTCPeerConnectionBackend; > > class LibWebRTCRtpSenderBackend final : public RTCRtpSenderBackend { > public: >- explicit LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend& backend, rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender) >+ LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend& backend, rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender) > : m_peerConnectionBackend(makeWeakPtr(&backend)) > , m_rtcSender(WTFMove(rtcSender)) > { > } > >+ using Source = Variant<std::nullptr_t, Ref<RealtimeOutgoingAudioSource>, Ref<RealtimeOutgoingVideoSource>>; >+ LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend& backend, rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender, Source&& source) >+ : m_peerConnectionBackend(makeWeakPtr(&backend)) >+ , m_rtcSender(WTFMove(rtcSender)) >+ , m_source(WTFMove(source)) >+ { >+ } >+ > void setRTCSender(rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender) { m_rtcSender = WTFMove(rtcSender); } > webrtc::RtpSenderInterface* rtcSender() { return m_rtcSender.get(); } > >@@ -71,24 +80,19 @@ public: > ); > } > >- bool hasNoSource() const >+ bool hasSource() const > { > return WTF::switchOn(m_source, >- [] (const std::nullptr_t&) { return true; }, >- [] (const auto&) { return false; } >+ [] (const std::nullptr_t&) { return false; }, >+ [] (const auto&) { return true; } > ); > } > >- void setSource(Ref<RealtimeOutgoingAudioSource>&& source) >- { >- ASSERT(hasNoSource()); >- m_source = WTFMove(source); >- } >- >- void setSource(Ref<RealtimeOutgoingVideoSource>&& source) >+ void setSource(Source&& source) > { >- ASSERT(hasNoSource()); >+ ASSERT(!hasSource()); > m_source = WTFMove(source); >+ ASSERT(hasSource()); > } > > private: >@@ -98,7 +102,7 @@ private: > > WeakPtr<LibWebRTCPeerConnectionBackend> m_peerConnectionBackend; > rtc::scoped_refptr<webrtc::RtpSenderInterface> m_rtcSender; >- Variant<std::nullptr_t, Ref<RealtimeOutgoingAudioSource>, Ref<RealtimeOutgoingVideoSource>> m_source; >+ Source m_source; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..850cfe9e401aedff13125c7a9c46ec7b7b499733 >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.cpp >@@ -0,0 +1,78 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY >+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES >+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; >+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON >+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS >+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "LibWebRTCRtpTransceiverBackend.h" >+ >+#if ENABLE(WEB_RTC) && USE(LIBWEBRTC) >+ >+#include "LibWebRTCRtpReceiverBackend.h" >+#include "LibWebRTCRtpSenderBackend.h" >+#include "LibWebRTCUtils.h" >+ >+namespace WebCore { >+ >+std::unique_ptr<LibWebRTCRtpReceiverBackend> LibWebRTCRtpTransceiverBackend::createReceiverBackend() >+{ >+ return std::make_unique<LibWebRTCRtpReceiverBackend>(m_rtcTransceiver->receiver()); >+} >+ >+std::unique_ptr<LibWebRTCRtpSenderBackend> LibWebRTCRtpTransceiverBackend::createSenderBackend(LibWebRTCPeerConnectionBackend& backend, LibWebRTCRtpSenderBackend::Source&& source) >+{ >+ return std::make_unique<LibWebRTCRtpSenderBackend>(backend, m_rtcTransceiver->sender(), WTFMove(source)); >+} >+ >+RTCRtpTransceiverDirection LibWebRTCRtpTransceiverBackend::direction() const >+{ >+ return toRTCRtpTransceiverDirection(m_rtcTransceiver->direction()); >+} >+ >+std::optional<RTCRtpTransceiverDirection> LibWebRTCRtpTransceiverBackend::currentDirection() const >+{ >+ auto value = m_rtcTransceiver->current_direction(); >+ if (!value) >+ return std::nullopt; >+ return toRTCRtpTransceiverDirection(*value); >+} >+ >+void LibWebRTCRtpTransceiverBackend::setDirection(RTCRtpTransceiverDirection direction) >+{ >+ m_rtcTransceiver->SetDirection(fromRTCRtpTransceiverDirection(direction)); >+} >+ >+String LibWebRTCRtpTransceiverBackend::mid() >+{ >+ if (auto mid = m_rtcTransceiver->mid()) >+ return fromStdString(*mid); >+ return String { }; >+} >+ >+void LibWebRTCRtpTransceiverBackend::stop() >+{ >+ m_rtcTransceiver->Stop(); >+} >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) && USE(LIBWEBRTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.h >new file mode 100644 >index 0000000000000000000000000000000000000000..c47ff2019cc2a62bff97835c11daefc01dcc53db >--- /dev/null >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.h >@@ -0,0 +1,69 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED >+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE >+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY >+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES >+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; >+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON >+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS >+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#if ENABLE(WEB_RTC) && USE(LIBWEBRTC) >+ >+#include "LibWebRTCMacros.h" >+#include "LibWebRTCRtpSenderBackend.h" >+#include "RTCRtpTransceiverBackend.h" >+ >+#pragma GCC diagnostic push >+#pragma GCC diagnostic ignored "-Wunused-parameter" >+ >+#include <webrtc/api/rtptransceiverinterface.h> >+#include <webrtc/rtc_base/scoped_ref_ptr.h> >+ >+#pragma GCC diagnostic pop >+ >+namespace WebCore { >+ >+class LibWebRTCRtpReceiverBackend; >+ >+class LibWebRTCRtpTransceiverBackend final : public RTCRtpTransceiverBackend { >+public: >+ explicit LibWebRTCRtpTransceiverBackend(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>&& rtcTransceiver) >+ : m_rtcTransceiver(WTFMove(rtcTransceiver)) >+ { >+ } >+ >+ std::unique_ptr<LibWebRTCRtpReceiverBackend> createReceiverBackend(); >+ std::unique_ptr<LibWebRTCRtpSenderBackend> createSenderBackend(LibWebRTCPeerConnectionBackend&, LibWebRTCRtpSenderBackend::Source&&); >+ >+ webrtc::RtpTransceiverInterface* rtcTransceiver() { return m_rtcTransceiver.get(); } >+ >+private: >+ RTCRtpTransceiverDirection direction() const final; >+ std::optional<RTCRtpTransceiverDirection> currentDirection() const final; >+ void setDirection(RTCRtpTransceiverDirection) final; >+ String mid() final; >+ void stop() final; >+ >+ rtc::scoped_refptr<webrtc::RtpTransceiverInterface> m_rtcTransceiver; >+}; >+ >+} // namespace WebCore >+ >+#endif // ENABLE(WEB_RTC) && USE(LIBWEBRTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp >index 2f3c10ce05985f71355f614556116552d6f29939..64509d0635b59929e89b872fdb2d887d2b4e9067 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.cpp >@@ -28,10 +28,18 @@ > #if USE(LIBWEBRTC) > > #include "LibWebRTCMacros.h" >+#include "RTCPeerConnection.h" > #include "RTCRtpParameters.h" >-#include <webrtc/api/rtpparameters.h> > #include <wtf/text/WTFString.h> > >+#pragma GCC diagnostic push >+#pragma GCC diagnostic ignored "-Wunused-parameter" >+ >+#include <webrtc/api/rtpparameters.h> >+#include <webrtc/api/rtptransceiverinterface.h> >+ >+#pragma GCC diagnostic pop >+ > namespace WebCore { > > static inline RTCRtpParameters::EncodingParameters toRTCEncodingParameters(const webrtc::RtpEncodingParameters& rtcParameters) >@@ -177,6 +185,41 @@ webrtc::RtpParameters fromRTCRtpParameters(const RTCRtpParameters& parameters) > return rtcParameters; > } > >+RTCRtpTransceiverDirection toRTCRtpTransceiverDirection(webrtc::RtpTransceiverDirection rtcDirection) >+{ >+ switch (rtcDirection) { >+ case webrtc::RtpTransceiverDirection::kSendRecv: >+ return RTCRtpTransceiverDirection::Sendrecv; >+ case webrtc::RtpTransceiverDirection::kSendOnly: >+ return RTCRtpTransceiverDirection::Sendonly; >+ case webrtc::RtpTransceiverDirection::kRecvOnly: >+ return RTCRtpTransceiverDirection::Recvonly; >+ case webrtc::RtpTransceiverDirection::kInactive: >+ return RTCRtpTransceiverDirection::Inactive; >+ }; >+} >+ >+webrtc::RtpTransceiverDirection fromRTCRtpTransceiverDirection(RTCRtpTransceiverDirection direction) >+{ >+ switch (direction) { >+ case RTCRtpTransceiverDirection::Sendrecv: >+ return webrtc::RtpTransceiverDirection::kSendRecv; >+ case RTCRtpTransceiverDirection::Sendonly: >+ return webrtc::RtpTransceiverDirection::kSendOnly; >+ case RTCRtpTransceiverDirection::Recvonly: >+ return webrtc::RtpTransceiverDirection::kRecvOnly; >+ case RTCRtpTransceiverDirection::Inactive: >+ return webrtc::RtpTransceiverDirection::kInactive; >+ }; >+} >+ >+webrtc::RtpTransceiverInit fromRtpTransceiverInit(const RTCRtpTransceiverInit& init) >+{ >+ webrtc::RtpTransceiverInit rtcInit; >+ rtcInit.direction = fromRTCRtpTransceiverDirection(init.direction); >+ return rtcInit; >+} >+ > }; // namespace WebCore > > #endif // USE(LIBWEBRTC) >diff --git a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.h b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.h >index ba63751f1a24deeb1569c323cadcb9bc42e9dfae..c1b307c2228149aa4f51e7a593fd467c464633f2 100644 >--- a/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.h >+++ b/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCUtils.h >@@ -30,15 +30,25 @@ > > namespace webrtc { > struct RtpParameters; >+struct RtpTransceiverInit; >+ >+enum class RtpTransceiverDirection; > } > > namespace WebCore { > > struct RTCRtpParameters; >+struct RTCRtpTransceiverInit; >+ >+enum class RTCRtpTransceiverDirection; > > RTCRtpParameters toRTCRtpParameters(const webrtc::RtpParameters&); > webrtc::RtpParameters fromRTCRtpParameters(const RTCRtpParameters&); > >+RTCRtpTransceiverDirection toRTCRtpTransceiverDirection(webrtc::RtpTransceiverDirection); >+webrtc::RtpTransceiverDirection fromRTCRtpTransceiverDirection(RTCRtpTransceiverDirection); >+webrtc::RtpTransceiverInit fromRtpTransceiverInit(const RTCRtpTransceiverInit&); >+ > inline String fromStdString(const std::string& value) > { > return String::fromUTF8(value.data(), value.length()); >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 4a8ac36dffdb0f3b2e8b894f13fe42c26e47255c..7929ff638f3ae43725aecc0ce92c73409bf58a53 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -1103,6 +1103,7 @@ > 4186BD3E213EE3400001826F /* LibWebRTCUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41D1A049213EDDFD0063FB6B /* LibWebRTCUtils.cpp */; }; > 4186BD3F213EE3430001826F /* LibWebRTCRtpSenderBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41D1A04B213EDDFE0063FB6B /* LibWebRTCRtpSenderBackend.cpp */; }; > 4186BD40213EE3450001826F /* LibWebRTCRtpReceiverBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41D1A04A213EDDFE0063FB6B /* LibWebRTCRtpReceiverBackend.cpp */; }; >+ 4186BD4E2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4186BD4D2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp */; }; > 41885B9311B6FDA6003383BB /* FormSubmission.h in Headers */ = {isa = PBXBuildFile; fileRef = 41885B9111B6FDA6003383BB /* FormSubmission.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 418A06D0133C04D500CD379C /* EventDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 418A06CE133C04D500CD379C /* EventDispatcher.h */; }; > 418F88050FF957AF0080F045 /* JSAbstractWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = 418F88030FF957AE0080F045 /* JSAbstractWorker.h */; }; >@@ -7288,6 +7289,8 @@ > 4186BD3B213EDE380001826F /* LibWebRTCRtpReceiverBackend.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpReceiverBackend.h; path = libwebrtc/LibWebRTCRtpReceiverBackend.h; sourceTree = "<group>"; }; > 4186BD3D213EDE390001826F /* LibWebRTCRtpSenderBackend.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpSenderBackend.h; path = libwebrtc/LibWebRTCRtpSenderBackend.h; sourceTree = "<group>"; }; > 4186BD46214072B60001826F /* RTCRtpTransceiverBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCRtpTransceiverBackend.h; sourceTree = "<group>"; }; >+ 4186BD4B2140A8050001826F /* LibWebRTCRtpTransceiverBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpTransceiverBackend.h; path = libwebrtc/LibWebRTCRtpTransceiverBackend.h; sourceTree = "<group>"; }; >+ 4186BD4D2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCRtpTransceiverBackend.cpp; path = libwebrtc/LibWebRTCRtpTransceiverBackend.cpp; sourceTree = "<group>"; }; > 41885B9111B6FDA6003383BB /* FormSubmission.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormSubmission.h; sourceTree = "<group>"; }; > 41885B9211B6FDA6003383BB /* FormSubmission.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormSubmission.cpp; sourceTree = "<group>"; }; > 418A06CE133C04D500CD379C /* EventDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventDispatcher.h; sourceTree = "<group>"; }; >@@ -16894,6 +16897,8 @@ > 4186BD3B213EDE380001826F /* LibWebRTCRtpReceiverBackend.h */, > 41D1A04B213EDDFE0063FB6B /* LibWebRTCRtpSenderBackend.cpp */, > 4186BD3D213EDE390001826F /* LibWebRTCRtpSenderBackend.h */, >+ 4186BD4D2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp */, >+ 4186BD4B2140A8050001826F /* LibWebRTCRtpTransceiverBackend.h */, > 41D28D0B2139E01D00F4206F /* LibWebRTCStatsCollector.cpp */, > 41D28D0C2139E01E00F4206F /* LibWebRTCStatsCollector.h */, > 41D1A049213EDDFD0063FB6B /* LibWebRTCUtils.cpp */, >@@ -28781,7 +28786,6 @@ > D6489D26166FFCF1007C031B /* JSHTMLTemplateElement.h in Headers */, > A80E7E9D0A1A83E3007FB8C5 /* JSHTMLTextAreaElement.h in Headers */, > 83E359A21BB1031D002CEB98 /* JSHTMLTimeElement.h in Headers */, >- E42050172141901B0066EF3B /* ProcessWarming.h in Headers */, > A80E7B0C0A19D606007FB8C5 /* JSHTMLTitleElement.h in Headers */, > 070756D414239A4F00414161 /* JSHTMLTrackElement.h in Headers */, > 1A85B2110A1B258700D8C87C /* JSHTMLUListElement.h in Headers */, >@@ -29789,6 +29793,7 @@ > B71FE6DF11091CB300DAEF77 /* PrintContext.h in Headers */, > 51F645D51FECDBCE00B54DED /* Process.h in Headers */, > A8EA7EBC0A1945D000A8EF5F /* ProcessingInstruction.h in Headers */, >+ E42050172141901B0066EF3B /* ProcessWarming.h in Headers */, > E44613EC0CD681B500FADA75 /* ProgressEvent.h in Headers */, > A715E653134BBBEC00D8E713 /* ProgressShadowElement.h in Headers */, > 1A2A68240B5BEDE70002A480 /* ProgressTracker.h in Headers */, >@@ -31525,6 +31530,7 @@ > 417612B11E3A994000C3D81D /* LibWebRTCPeerConnectionBackend.cpp in Sources */, > 4186BD40213EE3450001826F /* LibWebRTCRtpReceiverBackend.cpp in Sources */, > 4186BD3F213EE3430001826F /* LibWebRTCRtpSenderBackend.cpp in Sources */, >+ 4186BD4E2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp in Sources */, > 41D28D0D2139E05800F4206F /* LibWebRTCStatsCollector.cpp in Sources */, > 4186BD3E213EE3400001826F /* LibWebRTCUtils.cpp in Sources */, > 9759E93E14EF1CF80026A2DD /* LoadableTextTrack.cpp in Sources */, >diff --git a/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp b/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp >index 471ab3d7683b3b8ffc502bf34652479735c21abb..52331381fe5bbce3dc3cb47cef201eb03219d234 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp >@@ -41,6 +41,7 @@ RealtimeIncomingAudioSource::RealtimeIncomingAudioSource(rtc::scoped_refptr<webr > : RealtimeMediaSource(WTFMove(audioTrackId), RealtimeMediaSource::Type::Audio, String()) > , m_audioTrack(WTFMove(audioTrack)) > { >+ setName("remote audio"); > notifyMutedChange(!m_audioTrack); > } > >diff --git a/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp b/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp >index 259b46bbf45d8e6c14684049acaadc7fb0bb7a4c..f760d40f75f60aadc8af21d2d0f57d67cc0c5508 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp >@@ -41,6 +41,7 @@ RealtimeIncomingVideoSource::RealtimeIncomingVideoSource(rtc::scoped_refptr<webr > : RealtimeMediaSource(WTFMove(videoTrackId), RealtimeMediaSource::Type::Video, String()) > , m_videoTrack(WTFMove(videoTrack)) > { >+ setName("remote video"); > m_currentSettings.setWidth(640); > m_currentSettings.setHeight(480); > notifyMutedChange(!m_videoTrack); >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >index e08e656e3e71e106d69dff907f76826b6a743d2c..ddc93e20a3b0484f3a6fdcef7aee145c4c8b780d 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >@@ -158,7 +158,7 @@ public: > virtual void setInterrupted(bool, bool); > > const String& name() const { return m_name; } >- void setName(const String& name) { m_name = name; } >+ void setName(String&& name) { m_name = WTFMove(name); } > > unsigned fitnessScore() const { return m_fitnessScore; } > >diff --git a/Source/WebCore/testing/Internals.cpp b/Source/WebCore/testing/Internals.cpp >index ef1ea4eb731815ede59d8a70c3d4ae92f8840019..f75ab245ae7009a43813884dc4fc25741639bc0b 100644 >--- a/Source/WebCore/testing/Internals.cpp >+++ b/Source/WebCore/testing/Internals.cpp >@@ -1386,6 +1386,9 @@ void Internals::emulateRTCPeerConnectionPlatformEvent(RTCPeerConnection& connect > > void Internals::useMockRTCPeerConnectionFactory(const String& testCase) > { >+ // FIXME: We should upgrade mocks to support unified plan APIs, until then use plan B in tests using mock. >+ >+ ASSERT(!RuntimeEnabledFeatures::sharedFeatures().webRTCUnifiedPlanEnabled()); > if (!LibWebRTCProvider::webRTCAvailable()) > return; > >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 92d432eb412f728aa3d404e457dcb7a6cce47726..52c887a5c6ccc9efd3eb745261d1b91fb5df8e92 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,48 @@ >+2018-09-06 Youenn Fablet <youenn@apple.com> >+ >+ Add support for unified plan transceivers >+ https://bugs.webkit.org/show_bug.cgi?id=189390 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Update tests using mock to enforce plan B for now until unified plan mocks are supported. >+ >+ * fast/mediastream/RTCPeerConnection-addIceCandidate-expected.txt: >+ * fast/mediastream/RTCPeerConnection-icecandidate-event.html: >+ * fast/mediastream/RTCPeerConnection-iceconnectionstatechange-event.html: >+ * fast/mediastream/RTCPeerConnection-inspect-answer.html: >+ * fast/mediastream/RTCPeerConnection-inspect-offer.html: >+ * fast/mediastream/RTCPeerConnection-media-setup-single-dialog.html: >+ * fast/mediastream/RTCPeerConnection-media-setup-two-dialogs.html: >+ * fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html: >+ * fast/mediastream/RTCPeerConnection-setLocalDescription-offer.html: >+ * fast/mediastream/RTCPeerConnection-setRemoteDescription-offer.html: >+ * webrtc/calling-peerconnection-once-closed.html: >+ Once closed, addTransceiver is expected to throw. >+ * webrtc/libwebrtc/release-while-creating-offer.html: >+ * webrtc/libwebrtc/release-while-getting-stats.html: >+ * webrtc/libwebrtc/release-while-setting-local-description.html: >+ * webrtc/video-getParameters.html: sender and receiver parameters are no longer the same. >+ Testing them individually. >+ * webrtc/video-with-receiver.html: >+ Test is working only with legacy mode. >+ >+2018-09-06 Daniel Bates <dabates@apple.com> >+ >+ [iOS] Add a test to ensure that DOM keyup events have the correct details >+ https://bugs.webkit.org/show_bug.cgi?id=189327 >+ >+ Reviewed by Wenson Hsieh. >+ >+ Until we fix <rdar://problem/35282761> DOM keyup events will have incorrect details on iOS >+ when dispatched in response to a hardware keyboard press. For now, land expected failure results. >+ >+ * fast/events/ios/keyup-expected.txt: Added. >+ * fast/events/ios/keyup.html: Added. >+ * resources/ui-helper.js: >+ (window.UIHelper.typeCharacter): Escape backslash characters in order to build up >+ a well-formed UI script to evaluate. >+ > 2018-09-06 Andy Estes <aestes@apple.com> > > [Apple Pay] Rename the -apple-pay-button-type value "checkout" to "check-out" >diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog >index 2eccbd80bdcc792388aa0c50434cdb73b8e80a27..f6820795810188e68bae53b7e7e7b9933f588cb3 100644 >--- a/LayoutTests/imported/w3c/ChangeLog >+++ b/LayoutTests/imported/w3c/ChangeLog >@@ -1,3 +1,17 @@ >+2018-09-06 Youenn Fablet <youenn@apple.com> >+ >+ Add support for unified plan transceivers >+ https://bugs.webkit.org/show_bug.cgi?id=189390 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt: >+ * web-platform-tests/webrtc/RTCPeerConnection-addTrack.https-expected.txt: >+ * web-platform-tests/webrtc/RTCPeerConnection-addTransceiver-expected.txt: >+ * web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https-expected.txt: >+ * web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt: >+ * web-platform-tests/webrtc/RTCRtpTransceiver-setDirection-expected.txt: >+ > 2018-09-05 Youenn Fablet <youenn@apple.com> > > Expose RTCRtpSender.setParameters >diff --git a/LayoutTests/fast/events/ios/keyup-expected.txt b/LayoutTests/fast/events/ios/keyup-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..feda53286c4da0bf574a4ef75a97153cda1773fa >--- /dev/null >+++ b/LayoutTests/fast/events/ios/keyup-expected.txt >@@ -0,0 +1,73 @@ >+This tests that DOM keyup events are dispatched on iOS for hardware key presses. To run this test manually, focus the text field below and then verify that a message is emitted when you press the following keys: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, `, ~, !, @, #, $, %, ^, &, *, (, ), -, _, =, +, [, ], {, }, \, |, ;, :, ', ", ,, <, ., >, /, ?, <return>. >+ >+ >+type: keyup, key: a, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: b, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: c, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: d, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: e, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: f, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: g, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: h, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: i, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: j, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: k, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: l, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: m, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: n, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: o, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: p, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: q, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: r, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: s, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: t, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: u, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: v, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: w, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: x, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: y, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: z, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 0, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 1, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 2, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 3, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 4, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 5, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 6, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 7, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 8, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: 9, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ~, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ~, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: !, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: @, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: #, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: $, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: %, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ^, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: &, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: *, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: (, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ), code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: -, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: _, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: =, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: +, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: [, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ], code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: {, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: }, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: \, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: |, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ;, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: :, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ', code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ", code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ,, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: <, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ., code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: >, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: /, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: ?, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+type: keyup, key: Enter, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0 >+ >diff --git a/LayoutTests/fast/events/ios/keyup.html b/LayoutTests/fast/events/ios/keyup.html >new file mode 100644 >index 0000000000000000000000000000000000000000..5f0a9b9a82fd562762fbb7818e3d0a48df373b86 >--- /dev/null >+++ b/LayoutTests/fast/events/ios/keyup.html >@@ -0,0 +1,54 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta name="viewport" content="width=device-width"> >+<script src="../../../resources/ui-helper.js"></script> >+<script> >+if (window.testRunner) { >+ testRunner.dumpAsText(); >+ testRunner.waitUntilDone(); >+} >+</script> >+</head> >+<body> >+<p>This tests that DOM keyup events are dispatched on iOS for hardware key presses. To run this test manually, focus the text field below and then verify that a message is emitted when you press the following keys: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, `, ~, !, @, #, $, %, ^, &, *, (, ), -, _, =, +, [, ], {, }, \, |, ;, :, ', ", ,, <, ., >, /, ?, <return>.</p> >+<input type="text" id="input" onkeyup="logKeyEvent(event)"> >+<pre id="console"></pre> >+<script> >+const asciiCharactersToType = "abcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()-_=+[]{}\\|;:'\",<.>/?\r"; >+var numberOfFiredKeyEventsForTestComplete; >+var numberOfFiredKeyEvents = 0; >+ >+function log(message) >+{ >+ document.getElementById("console").appendChild(document.createTextNode(message + "\n")); >+} >+ >+function logKeyEvent(event) >+{ >+ let pieces = []; >+ for (let propertyName of ["type", "key", "code", "keyIdentifier", "keyCode", "charCode", "keyCode", "which"]) >+ pieces.push(`${propertyName}: ${event[propertyName]}`); >+ log(pieces.join(", ")); >+ if (++numberOfFiredKeyEvents >= numberOfFiredKeyEventsForTestComplete && window.testRunner) >+ testRunner.notifyDone(); >+} >+ >+async function runTest() >+{ >+ if (!window.testRunner) >+ return; >+ >+ let charactersToType = asciiCharactersToType.split(""); >+ numberOfFiredKeyEventsForTestComplete = charactersToType.length; >+ >+ let input = document.getElementById("input"); >+ await UIHelper.activateFormControl(input); >+ for (let character of charactersToType) >+ await UIHelper.typeCharacter(character); >+} >+ >+runTest(); >+</script> >+</body> >+</html> >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-addIceCandidate-expected.txt b/LayoutTests/fast/mediastream/RTCPeerConnection-addIceCandidate-expected.txt >index 7ddfc1c64d7ecb2f1f40ab92667babde83889856..80195ba0b6fdc88623f352017bc0aa1a2d26c64c 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-addIceCandidate-expected.txt >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-addIceCandidate-expected.txt >@@ -11,7 +11,7 @@ PASS Remote description set > > *** Define sdpMid, badSdpMid, sdpMLineIndex and badSdpMLineIndex for testing > PASS sdpMLineIndex is not badSdpMLineIndex >-FAIL sdpMid should not be null. >+PASS sdpMid is not null > PASS sdpMid is not badSdpMid > FAIL promise pc.addIceCandidate(new RTCIceCandidate({candidate: validCandidate, sdpMid: badSdpMid})) fulfilled unexpectedly. > FAIL promise pc.addIceCandidate(new RTCIceCandidate({candidate: validCandidate, sdpMLineIndex: badSdpMLineIndex})) fulfilled unexpectedly. >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-icecandidate-event.html b/LayoutTests/fast/mediastream/RTCPeerConnection-icecandidate-event.html >index 48488d551ad9f664862462e37b24aa8f4ba4a146..44e2d3cfe79f82d5edcd0e7b2f27033d8bba444d 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-icecandidate-event.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-icecandidate-event.html >@@ -8,6 +8,9 @@ > <script> > description("Test RTCPeerConnection 'icecandidate' event and gathering done"); > >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory("ICECandidates"); > >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-iceconnectionstatechange-event.html b/LayoutTests/fast/mediastream/RTCPeerConnection-iceconnectionstatechange-event.html >index 4db056479a4b1f75b9e61d561e64074bceabe4a8..ccc2b9210dae437a4bb1d8ad7b935bb15a5f770a 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-iceconnectionstatechange-event.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-iceconnectionstatechange-event.html >@@ -7,6 +7,8 @@ > <body> > <script> > description("Test RTCPeerConnection 'iceconnectionstatechange' event"); >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); > > if (window.internals) > internals.useMockRTCPeerConnectionFactory("ICEConnectionState"); >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-answer.html b/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-answer.html >index 04dd6e388c8f99478b8794d9a263d84d776d384a..ae134285805a075c31f3f987b0e35e5f63424e47 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-answer.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-answer.html >@@ -6,6 +6,9 @@ > </head> > <body> > <script> >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory(""); > >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer.html b/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer.html >index 9c3c20c8b03c39336f985a589979e6f6e935951d..8e636382b0f543d36adb11e8a628d57e36448589 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-inspect-offer.html >@@ -6,6 +6,9 @@ > </head> > <body> > <script> >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory(""); > >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-single-dialog.html b/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-single-dialog.html >index 4821e468fb78ec44452f666a978d1a1a5e14957e..e829328bb736b5b5e1259367f58fc0827a7ccd72 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-single-dialog.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-single-dialog.html >@@ -6,6 +6,9 @@ > </head> > <body> > <script> >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory(""); > >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-two-dialogs.html b/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-two-dialogs.html >index 6887f3b410a582944cca1dd6d64fe4191ec2e914..79e6865193dd6c3f370fe2803e0b1591a5bd59da 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-two-dialogs.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-media-setup-two-dialogs.html >@@ -11,9 +11,10 @@ > > description("Test setting up media between two RTCPeerConnection instances with a single SDP dialog."); > >- if (window.testRunner) >+ if (window.testRunner) { >+ testRunner.setWebRTCUnifiedPlanEnabled(false); > testRunner.setUserMediaPermission(true); >- else { >+ } else { > debug("This test can not be run without the testRunner"); > finishJSTest(); > } >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html b/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html >index 973e139958ee35295f8c430eff2227944c00bd18..0e3b5fd729dc060cd4dc7b9b5b2387799a79d6a4 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-remotely-assigned-transceiver-mid.html >@@ -6,6 +6,9 @@ > </head> > <body> > <script> >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory(""); > >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-setLocalDescription-offer.html b/LayoutTests/fast/mediastream/RTCPeerConnection-setLocalDescription-offer.html >index 229e4b5c7ebe3f4b85d9d4e8b50e193609241f25..cbd516f3d73aed26c88b7b561c51055df6d9a870 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-setLocalDescription-offer.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-setLocalDescription-offer.html >@@ -6,6 +6,9 @@ > </head> > <body> > <script> >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory(""); > >diff --git a/LayoutTests/fast/mediastream/RTCPeerConnection-setRemoteDescription-offer.html b/LayoutTests/fast/mediastream/RTCPeerConnection-setRemoteDescription-offer.html >index cac37f078a704f8450e0f6b021046b5a53386eaa..81183019b15c9583ff6731a17d6883c45c793362 100644 >--- a/LayoutTests/fast/mediastream/RTCPeerConnection-setRemoteDescription-offer.html >+++ b/LayoutTests/fast/mediastream/RTCPeerConnection-setRemoteDescription-offer.html >@@ -6,6 +6,9 @@ > </head> > <body> > <script> >+ if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory(""); > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt >index 03dcca2d51821d47b6b2f858a8944350c7c67522..35dc84de7b5fb1f702558b73395fb7df43dbd854 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https-expected.txt >@@ -2,8 +2,8 @@ > FAIL insertDTMF() should succeed if tones contains valid DTMF characters promise_test: Unhandled rejection with value: object "ReferenceError: Can't find variable: RTCDTMFSender" > FAIL insertDTMF() should throw InvalidCharacterError if tones contains invalid DTMF characters promise_test: Unhandled rejection with value: object "ReferenceError: Can't find variable: RTCDTMFSender" > FAIL insertDTMF() should throw InvalidStateError if transceiver is stopped assert_throws: function "() => dtmfSender.insertDTMF('')" threw object "TypeError: undefined is not an object (evaluating 'dtmfSender.insertDTMF')" that is not a DOMException InvalidStateError: property "code" is equal to undefined, expected 11 >-FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly assert_equals: expected (string) "inactive" but got (undefined) undefined >-FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive assert_equals: expected (string) "inactive" but got (undefined) undefined >+FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly assert_equals: expected (string) "inactive" but got (object) null >+FAIL insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive assert_equals: expected (string) "inactive" but got (object) null > FAIL insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden promise_test: Unhandled rejection with value: object "ReferenceError: Can't find variable: RTCDTMFSender" > FAIL insertDTMF() after remove and close should reject assert_throws: function "() => > dtmfSender.insertDTMF('123')" threw object "TypeError: undefined is not an object (evaluating 'dtmfSender.insertDTMF')" that is not a DOMException InvalidStateError: property "code" is equal to undefined, expected 11 >diff --git a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https-expected.txt >index 78565279eb53ebda2af9176227842185b4760859..067d6437f65ff37e6377d0f112b0e652506508c7 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https-expected.txt >@@ -5,6 +5,6 @@ PASS addTrack with single track argument and single mediaStream should succeed > PASS addTrack with single track argument and multiple mediaStreams should succeed > PASS Adding the same track multiple times should throw InvalidAccessError > PASS addTrack with existing sender with null track, same kind, and recvonly direction should reuse sender >-PASS addTrack with existing sender with null track, same kind, and sendrecv direction should create new sender >+FAIL addTrack with existing sender with null track, same kind, and sendrecv direction should create new sender assert_not_equals: got disallowed value object "[object RTCRtpSender]" > PASS addTrack with existing sender with null track, different kind, and recvonly direction should create new sender > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver-expected.txt >index ff610595f475ecbabec0b25f78ead629657d07a5..81ff9f88b82575f514797ee3536546df2e60eda5 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver-expected.txt >@@ -1,11 +1,11 @@ > > PASS addTransceiver() with string argument as invalid kind should throw TypeError >-FAIL addTransceiver('audio') should return an audio transceiver assert_equals: expected (object) null but got (undefined) undefined >-FAIL addTransceiver('video') should return a video transceiver assert_equals: expected "remote video" but got "" >+PASS addTransceiver('audio') should return an audio transceiver >+PASS addTransceiver('video') should return a video transceiver > PASS addTransceiver() with direction sendonly should have result transceiver.direction be the same > PASS addTransceiver() with direction inactive should have result transceiver.direction be the same > PASS addTransceiver() with invalid direction should throw TypeError >-FAIL addTransceiver(track) should have result with sender.track be given track assert_equals: expected "remote audio" but got "" >+PASS addTransceiver(track) should have result with sender.track be given track > PASS addTransceiver(track) multiple times should create multiple transceivers > FAIL addTransceiver() with rid containing invalid non-alphanumeric characters should throw TypeError assert_throws: function "() => > pc.addTransceiver('audio', { >diff --git a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded-expected.txt >index f83abb2959d4be93f17809e85e2032566d1073d4..a812574e1293102e4678d4864b9f8582353bab36 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded-expected.txt >@@ -3,9 +3,9 @@ Harness Error (TIMEOUT), message = null > > PASS Creating first data channel should fire negotiationneeded event > PASS calling createDataChannel twice should fire negotiationneeded event once >-TIMEOUT addTransceiver() should fire negotiationneeded event Test timed out >-PASS Calling addTransceiver() twice should fire negotiationneeded event once >-PASS Calling both addTransceiver() and createDataChannel() should fire negotiationneeded event once >+PASS addTransceiver() should fire negotiationneeded event >+FAIL Calling addTransceiver() twice should fire negotiationneeded event once assert_unreached: Pending promise should never be resolved. Instead it is fulfilled with: [object Object] Reached unreachable code >+FAIL Calling both addTransceiver() and createDataChannel() should fire negotiationneeded event once assert_unreached: Pending promise should never be resolved. Instead it is fulfilled with: [object Object] Reached unreachable code > PASS negotiationneeded event should not fire if signaling state is not stable >-NOTRUN negotiationneeded event should fire only after signaling state go back to stable >+TIMEOUT negotiationneeded event should fire only after signaling state go back to stable Test timed out > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https-expected.txt >index aae4e59f0e1c16eb760bf292261764b61db87346..b0943ddfc683feee38c2fbe16730fc1b1d74981b 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https-expected.txt >@@ -5,10 +5,10 @@ PASS addTransceiver - Calling removeTrack on different connection that is closed > PASS addTrack - Calling removeTrack on different connection that is closed should throw InvalidStateError > FAIL addTransceiver - Calling removeTrack on different connection should throw InvalidAccessError assert_throws: function "() => pc2.removeTrack(sender)" did not throw > FAIL addTrack - Calling removeTrack on different connection should throw InvalidAccessError assert_throws: function "() => pc2.removeTrack(sender)" did not throw >-FAIL addTransceiver - Calling removeTrack with valid sender should set sender.track to null assert_equals: expected (object) null but got (undefined) undefined >+FAIL addTransceiver - Calling removeTrack with valid sender should set sender.track to null assert_equals: direction should not be altered expected "sendrecv" but got "recvonly" > PASS addTrack - Calling removeTrack with valid sender should set sender.track to null >-FAIL Calling removeTrack with currentDirection sendrecv should set direction to recvonly assert_equals: expected (object) null but got (undefined) undefined >-FAIL Calling removeTrack with currentDirection sendonly should set direction to inactive assert_equals: expected (object) null but got (undefined) undefined >-FAIL Calling removeTrack with currentDirection recvonly should not change direction assert_equals: expected (object) null but got (undefined) undefined >-FAIL Calling removeTrack with currentDirection inactive should not change direction assert_equals: expected (object) null but got (undefined) undefined >+FAIL Calling removeTrack with currentDirection sendrecv should set direction to recvonly assert_equals: expected "sendrecv" but got "sendonly" >+PASS Calling removeTrack with currentDirection sendonly should set direction to inactive >+FAIL Calling removeTrack with currentDirection recvonly should not change direction assert_equals: expected "recvonly" but got "inactive" >+PASS Calling removeTrack with currentDirection inactive should not change direction > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt >index 897129a16eae3af755ca5bcb8c41688848b312c8..7b0d13d934de63e06d1684a17a2d7e5e4a918e25 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver-expected.txt >@@ -1,7 +1,7 @@ > >-FAIL setLocalDescription(offer) with m= section should assign mid to corresponding transceiver assert_equals: Expect transceiver.mid to set to valid string value expected "string" but got "object" >+PASS setLocalDescription(offer) with m= section should assign mid to corresponding transceiver > FAIL setRemoteDescription(offer) with m= section and no existing transceiver should create corresponding transceiver promise_test: Unhandled rejection with value: object "TypeError: pc2.setRemoteDescrption is not a function. (In 'pc2.setRemoteDescrption(offer)', 'pc2.setRemoteDescrption' is undefined)" >-FAIL setLocalDescription(rollback) should unset transceiver.mid assert_not_equals: got disallowed value null >-FAIL setLocalDescription(rollback) should only unset transceiver mids associated with current round assert_not_equals: got disallowed value null >-FAIL setRemoteDescription(rollback) should remove newly created transceiver from transceiver list assert_equals: expected 1 but got 0 >+FAIL setLocalDescription(rollback) should unset transceiver.mid promise_test: Unhandled rejection with value: object "InvalidStateError: Description type incompatible with current signaling state" >+FAIL setLocalDescription(rollback) should only unset transceiver mids associated with current round promise_test: Unhandled rejection with value: object "InvalidStateError: Description type incompatible with current signaling state" >+FAIL setRemoteDescription(rollback) should remove newly created transceiver from transceiver list promise_test: Unhandled rejection with value: object "InvalidStateError: Description type incompatible with current signaling state" > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection-expected.txt >index f95f5c6eaab31ca57fcc9b55599d1e4f6222b2db..ba722a0ba013ad3d99e5ae2a1fecad9b14b0a507 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection-expected.txt >@@ -1,5 +1,5 @@ > >-FAIL setDirection should change transceiver.direction assert_equals: expected (object) null but got (undefined) undefined >+PASS setDirection should change transceiver.direction > PASS setDirection with same direction should have no effect >-FAIL setDirection should change transceiver.direction independent of transceiver.currentDirection assert_equals: expected (object) null but got (undefined) undefined >+FAIL setDirection should change transceiver.direction independent of transceiver.currentDirection assert_equals: expected "recvonly" but got "inactive" > >diff --git a/LayoutTests/webrtc/calling-peerconnection-once-closed.html b/LayoutTests/webrtc/calling-peerconnection-once-closed.html >index c72d93864463afae666922f07e1c4c0df5655f4c..c6a41bd55cb2690290ca7b3cc61bd0753082736b 100644 >--- a/LayoutTests/webrtc/calling-peerconnection-once-closed.html >+++ b/LayoutTests/webrtc/calling-peerconnection-once-closed.html >@@ -42,7 +42,7 @@ promise_test(() => { > > promise_test(() => { > return closedConnection().then((connection) => { >- connection.addTransceiver("video"); >+ assert_throws("InvalidStateError", () => { connection.addTransceiver("video"); }); > }); > }, "Ensuring closed connection addTransceiver does not crash"); > >diff --git a/LayoutTests/webrtc/libwebrtc/release-while-creating-offer.html b/LayoutTests/webrtc/libwebrtc/release-while-creating-offer.html >index cc7bed9f89d66965e2cf6d07249e2274202eaced..518aef79865ef2661235148654c70478044be508 100644 >--- a/LayoutTests/webrtc/libwebrtc/release-while-creating-offer.html >+++ b/LayoutTests/webrtc/libwebrtc/release-while-creating-offer.html >@@ -7,6 +7,9 @@ > <script> > self.jsTestIsAsync = true; > >+if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory("LibWebRTCReleasingWhileCreatingOffer"); > >diff --git a/LayoutTests/webrtc/libwebrtc/release-while-getting-stats.html b/LayoutTests/webrtc/libwebrtc/release-while-getting-stats.html >index a94449ef60fcebeea2812e9c34a78e9189febb26..3f120da4004254fbd5e63d40c39d3717354aec6b 100644 >--- a/LayoutTests/webrtc/libwebrtc/release-while-getting-stats.html >+++ b/LayoutTests/webrtc/libwebrtc/release-while-getting-stats.html >@@ -7,6 +7,9 @@ > <script> > self.jsTestIsAsync = true; > >+if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory("LibWebRTCReleasingWhileGettingStats"); > >diff --git a/LayoutTests/webrtc/libwebrtc/release-while-setting-local-description.html b/LayoutTests/webrtc/libwebrtc/release-while-setting-local-description.html >index 62e899e7f1fa755be8833a75720b9dc9cbbd6ef4..fa9c6534a6544d3bd943b4888680e082b554df3c 100644 >--- a/LayoutTests/webrtc/libwebrtc/release-while-setting-local-description.html >+++ b/LayoutTests/webrtc/libwebrtc/release-while-setting-local-description.html >@@ -10,6 +10,9 @@ self.jsTestIsAsync = true; > // Silence unhandled rejection messages. > window.onunhandledrejection = () => false; > >+if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > if (window.internals) > internals.useMockRTCPeerConnectionFactory("LibWebRTCReleasingWhileSettingDescription"); > >diff --git a/LayoutTests/webrtc/video-getParameters.html b/LayoutTests/webrtc/video-getParameters.html >index e3a2931a296a68007f55f06e745a3c524856adb7..9e43930cecd5e2eb7e2911d0ef3436163fdb848b 100644 >--- a/LayoutTests/webrtc/video-getParameters.html >+++ b/LayoutTests/webrtc/video-getParameters.html >@@ -42,16 +42,13 @@ promise_test((test) => { > > senderParameters.encodings[0].fec.ssrc = 1; > senderParameters.encodings[0].rtx.ssrc = 1; >- receiverParameters.encodings[0].fec.ssrc = 1; >- receiverParameters.encodings[0].rtx.ssrc = 1; > > senderParameters.transactionId = ""; > receiverParameters.transactionId = ""; > >- assert_equals(JSON.stringify(senderParameters), JSON.stringify(receiverParameters), "testing sender vs. receiver parameters"); >- > senderParameters.encodings[0].ssrc = 1; >- assert_equals(JSON.stringify(senderParameters), '{"codecs":[],"degradationPreference":"balanced","encodings":[{"active":true,"fec":{"ssrc":1},"maxBitrate":0,"maxFramerate":0,"priority":"medium","rid":"","rtx":{"ssrc":1},"scaleResolutionDownBy":1,"ssrc":1}],"headerExtensions":[],"transactionId":""}', "Testing sanitized parameters"); >+ assert_equals(JSON.stringify(senderParameters), '{"codecs":[],"degradationPreference":"balanced","encodings":[{"active":true,"fec":{"ssrc":1},"maxBitrate":0,"maxFramerate":0,"priority":"medium","rid":"","rtx":{"ssrc":1},"scaleResolutionDownBy":1,"ssrc":1}],"headerExtensions":[],"transactionId":""}', "Testing sanitized sender parameters"); >+ assert_equals(JSON.stringify(receiverParameters), '{"codecs":[],"degradationPreference":"balanced","encodings":[],"headerExtensions":[],"transactionId":""}', "Testing sanitized receiver parameters"); > }); > }, "Basic video stats"); > </script> >diff --git a/LayoutTests/webrtc/video-with-receiver.html b/LayoutTests/webrtc/video-with-receiver.html >index c0cf821acef6cf452a0ff2bdcce0101f49e0c956..7eef032eabecfb328c0ddc94c0b162c3468a9f0b 100644 >--- a/LayoutTests/webrtc/video-with-receiver.html >+++ b/LayoutTests/webrtc/video-with-receiver.html >@@ -14,6 +14,9 @@ > video = document.getElementById("video"); > canvas = document.getElementById("canvas"); > >+if (window.testRunner) >+ testRunner.setWebRTCUnifiedPlanEnabled(false); >+ > function testImage() > { > canvas.width = video.videoWidth; >@@ -38,7 +41,6 @@ function testImage() > assert_true(data[index + 1] > 200); > assert_true(data[index + 2] < 100); > } >- > promise_test((test) => { > if (window.testRunner) > testRunner.setUserMediaPermission(true);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 189390
:
349115
|
349120
|
349132
|
349149
|
349152
|
349154
|
349188