Changeset 202376 in webkit
- Timestamp:
- Jun 23, 2016 6:52:13 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r202375 r202376 1 2016-06-23 Adam Bergkvist <adam.bergkvist@ericsson.com> 2 3 WebRTC: Add support for RTCPeerConnection legacy MediaStream-based API 4 https://bugs.webkit.org/show_bug.cgi?id=158940 5 6 Reviewed by Eric Carlson. 7 8 Add test for RTCPeerConnection legacy MediaStream-based API. 9 10 * fast/mediastream/RTCPeerConnection-legacy-stream-based-api-expected.txt: Added. 11 * fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html: Added. 12 * platform/mac/TestExpectations: 13 Skip test for mac port (not building with WEB_RTC yet) 14 1 15 2016-06-23 Per Arne Vollan <pvollan@apple.com> 2 16 -
trunk/LayoutTests/platform/mac/TestExpectations
r202360 r202376 205 205 fast/mediastream/RTCPeerConnection-media-setup-two-dialogs.html 206 206 fast/mediastream/RTCPeerConnection-media-setup-callbacks-single-dialog.html 207 fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html 207 208 208 209 # Asserts in debug. -
trunk/Source/WebCore/ChangeLog
r202371 r202376 1 2016-06-23 Adam Bergkvist <adam.bergkvist@ericsson.com> 2 3 WebRTC: Add support for RTCPeerConnection legacy MediaStream-based API 4 https://bugs.webkit.org/show_bug.cgi?id=158940 5 6 Reviewed by Eric Carlson. 7 8 Implement the legacy MediaStream-based RTCPeerConnection API as JS built-ins. The 9 getRemoteStreams() function and the 'addstream' event are partly implemented with native 10 code. 11 12 Test: fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html 13 14 * Modules/mediastream/MediaEndpointPeerConnection.cpp: 15 (WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask): 16 (WebCore::MediaEndpointPeerConnection::getRemoteStreams): 17 The getRemoteStreams() function and the 'addstream' event is backed up by native code. 18 * Modules/mediastream/MediaEndpointPeerConnection.h: 19 * Modules/mediastream/MediaStream.idl: 20 * Modules/mediastream/PeerConnectionBackend.h: 21 * Modules/mediastream/RTCPeerConnection.h: 22 * Modules/mediastream/RTCPeerConnection.idl: 23 * Modules/mediastream/RTCPeerConnection.js: 24 (initializeRTCPeerConnection): 25 (getLocalStreams): 26 (getRemoteStreams): 27 (getStreamById): 28 (addStream): 29 (removeStream): 30 Legacy API implemented as JS built-ins. 31 * bindings/js/JSDOMGlobalObject.cpp: 32 (WebCore::JSDOMGlobalObject::addBuiltinGlobals): 33 * bindings/js/WebCoreBuiltinNames.h: 34 1 35 2016-06-23 Carlos Garcia Campos <cgarcia@igalia.com> 2 36 -
trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp
r202339 r202376 38 38 #include "MediaEndpointSessionConfiguration.h" 39 39 #include "MediaStream.h" 40 #include "MediaStreamEvent.h" 40 41 #include "MediaStreamTrack.h" 41 42 #include "PeerMediaDescription.h" … … 476 477 return; 477 478 } 479 480 // One legacy MediaStreamEvent will be fired for every new MediaStream created as this remote description is set. 481 Vector<RefPtr<MediaStreamEvent>> legacyMediaStreamEvents; 478 482 479 483 for (auto mediaDescription : mediaDescriptions) { … … 530 534 auto newStream = MediaStream::create(*m_client->scriptExecutionContext(), MediaStreamTrackVector({ receiver.track() })); 531 535 m_remoteStreamMap.add(id, newStream.copyRef()); 536 legacyMediaStreamEvents.append(MediaStreamEvent::create(eventNames().addstreamEvent, false, false, newStream.copyRef())); 532 537 trackEventMediaStreams.add(id, WTFMove(newStream)); 533 538 } … … 541 546 } 542 547 } 548 549 // Fire legacy addstream events. 550 for (auto& event : legacyMediaStreamEvents) 551 m_client->fireEvent(*event); 543 552 544 553 SignalingState newSignalingState; … … 670 679 671 680 promise.reject(NOT_SUPPORTED_ERR); 681 } 682 683 Vector<RefPtr<MediaStream>> MediaEndpointPeerConnection::getRemoteStreams() const 684 { 685 Vector<RefPtr<MediaStream>> remoteStreams; 686 copyValuesToVector(m_remoteStreamMap, remoteStreams); 687 return remoteStreams; 672 688 } 673 689 -
trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h
r202339 r202376 74 74 void getStats(MediaStreamTrack*, PeerConnection::StatsPromise&&) override; 75 75 76 Vector<RefPtr<MediaStream>> getRemoteStreams() const override; 77 76 78 RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) override; 77 79 void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) override; -
trunk/Source/WebCore/Modules/mediastream/MediaStream.idl
r200231 r202376 35 35 sequence<MediaStreamTrack> getAudioTracks(); 36 36 sequence<MediaStreamTrack> getVideoTracks(); 37 sequence<MediaStreamTrack> getTracks();37 [PrivateIdentifier, PublicIdentifier] sequence<MediaStreamTrack> getTracks(); 38 38 MediaStreamTrack getTrackById(DOMString trackId); 39 39 -
trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h
r202026 r202376 41 41 class DOMError; 42 42 class Event; 43 class MediaStream; 43 44 class MediaStreamTrack; 44 45 class PeerConnectionBackend; … … 107 108 virtual void getStats(MediaStreamTrack*, PeerConnection::StatsPromise&&) = 0; 108 109 110 virtual Vector<RefPtr<MediaStream>> getRemoteStreams() const = 0; 111 109 112 virtual RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0; 110 113 virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) = 0; -
trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h
r202337 r202376 69 69 const Vector<RefPtr<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->getReceivers(); } 70 70 const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const override { return m_transceiverSet->list(); } 71 72 // Part of legacy MediaStream-based API (mostly implemented as JS built-ins) 73 Vector<RefPtr<MediaStream>> getRemoteStreams() const { return m_backend->getRemoteStreams(); } 71 74 72 75 RefPtr<RTCRtpSender> addTrack(Ref<MediaStreamTrack>&&, const Vector<MediaStream*>&, ExceptionCode&); -
trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl
r202337 r202376 42 42 43 43 // RTP Media API extensions 44 sequence<RTCRtpSender> getSenders();44 [PrivateIdentifier, PublicIdentifier] sequence<RTCRtpSender> getSenders(); 45 45 sequence<RTCRtpReceiver> getReceivers(); 46 46 sequence<RTCRtpTransceiver> getTransceivers(); 47 47 48 [ StrictTypeChecking, RaisesException] RTCRtpSender addTrack(MediaStreamTrack track, MediaStream... streams);49 [ StrictTypeChecking, RaisesException] void removeTrack(RTCRtpSender sender);48 [PrivateIdentifier, PublicIdentifier, StrictTypeChecking, RaisesException] RTCRtpSender addTrack(MediaStreamTrack track, MediaStream... streams); 49 [PrivateIdentifier, PublicIdentifier, StrictTypeChecking, RaisesException] void removeTrack(RTCRtpSender sender); 50 50 51 51 [StrictTypeChecking, RaisesException] RTCRtpTransceiver addTransceiver(MediaStreamTrack track, optional RTCRtpTransceiverInit init); 52 52 [StrictTypeChecking, RaisesException] RTCRtpTransceiver addTransceiver(DOMString kind, optional RTCRtpTransceiverInit init); 53 54 // Legacy MediaSream-based API (implemented on top of the RTP Media API) 55 [JSBuiltin] sequence<MediaStream> getLocalStreams(); 56 [PrivateIdentifier, PublicIdentifier] sequence<MediaStream> getRemoteStreams(); 57 [JSBuiltin] MediaStream getStreamById(DOMString streamId); 58 59 [JSBuiltin] void addStream(MediaStream stream); 60 [JSBuiltin] void removeStream(MediaStream stream); 53 61 54 62 [JSBuiltin] Promise createOffer(optional Dictionary offerOptions); … … 118 126 attribute EventHandler onicegatheringstatechange; 119 127 attribute EventHandler ondatachannel; 128 129 // Legacy event handler (MediaStream-based API) 130 attribute EventHandler onaddstream; 120 131 }; 121 132 -
trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.js
r202337 r202376 49 49 throw new @TypeError(message); 50 50 } 51 52 this.@localStreams = []; 53 51 54 return this; 55 } 56 57 function getLocalStreams() 58 { 59 "use strict"; 60 61 if (!@isRTCPeerConnection(this)) 62 throw new @TypeError("Function should be called on an RTCPeerConnection"); 63 64 return this.@localStreams.slice(); 65 } 66 67 function getStreamById(streamIdArg) 68 { 69 "use strict"; 70 71 if (!@isRTCPeerConnection(this)) 72 throw new @TypeError("Function should be called on an RTCPeerConnection"); 73 74 if (arguments.length < 1) 75 throw new @TypeError("Not enough arguments"); 76 77 const streamId = @String(streamIdArg); 78 79 return this.@localStreams.find(stream => stream.id === streamId) 80 || this.@getRemoteStreams().find(stream => stream.id === streamId) 81 || null; 82 } 83 84 function addStream(stream) 85 { 86 "use strict"; 87 88 if (!@isRTCPeerConnection(this)) 89 throw new @TypeError("Function should be called on an RTCPeerConnection"); 90 91 if (arguments.length < 1) 92 throw new @TypeError("Not enough arguments"); 93 94 if (!(stream instanceof @MediaStream)) 95 throw new @TypeError("Argument 1 ('stream') to RTCPeerConnection.addStream must be an instance of MediaStream"); 96 97 if (this.@localStreams.find(localStream => localStream.id === stream.id)) 98 return; 99 100 this.@localStreams.@push(stream); 101 stream.@getTracks().forEach(track => this.@addTrack(track, stream)); 102 } 103 104 function removeStream(stream) 105 { 106 "use strict"; 107 108 if (!@isRTCPeerConnection(this)) 109 throw new @TypeError("Function should be called on an RTCPeerConnection"); 110 111 if (arguments.length < 1) 112 throw new @TypeError("Not enough arguments"); 113 114 if (!(stream instanceof @MediaStream)) 115 throw new @TypeError("Argument 1 ('stream') to RTCPeerConnection.removeStream must be an instance of MediaStream"); 116 117 const indexOfStreamToRemove = this.@localStreams.findIndex(localStream => localStream.id === stream.id); 118 if (indexOfStreamToRemove === -1) 119 return; 120 121 const senders = this.@getSenders(); 122 this.@localStreams[indexOfStreamToRemove].@getTracks().forEach(track => { 123 const senderForTrack = senders.find(sender => sender.track && sender.track.id === track.id); 124 if (senderForTrack) 125 this.@removeTrack(senderForTrack); 126 }); 127 128 this.@localStreams.splice(indexOfStreamToRemove, 1); 52 129 } 53 130 -
trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp
r201253 r202376 31 31 #include "JSDOMWindow.h" 32 32 #include "JSEventListener.h" 33 #include "JSMediaStream.h" 33 34 #include "JSMediaStreamTrack.h" 34 35 #include "JSRTCIceCandidate.h" … … 84 85 JSDOMGlobalObject::GlobalPropertyInfo(clientData.builtinNames().streamWritablePrivateName(), jsNumber(6), DontDelete | ReadOnly), 85 86 #if ENABLE(MEDIA_STREAM) 87 JSDOMGlobalObject::GlobalPropertyInfo(clientData.builtinNames().MediaStreamPrivateName(), JSMediaStream::getConstructor(vm, this), DontDelete | ReadOnly), 86 88 JSDOMGlobalObject::GlobalPropertyInfo(clientData.builtinNames().MediaStreamTrackPrivateName(), JSMediaStreamTrack::getConstructor(vm, this), DontDelete | ReadOnly), 87 89 #endif -
trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h
r198889 r202376 33 33 34 34 #define WEBCORE_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro)\ 35 macro(addTrack) \ 35 36 macro(appendFromJS) \ 36 37 macro(closeRequested) \ … … 41 42 macro(fillFromJS) \ 42 43 macro(getUserMediaFromJS) \ 44 macro(getRemoteStreams) \ 45 macro(getSenders) \ 46 macro(getTracks) \ 43 47 macro(initializeWith) \ 48 macro(localStreams) \ 44 49 macro(operations) \ 45 50 macro(ownerReadableStream) \ … … 56 61 macro(readRequests) \ 57 62 macro(readyPromiseCapability) \ 63 macro(removeTrack) \ 58 64 macro(state) \ 59 65 macro(started) \ … … 70 76 macro(underlyingSource) \ 71 77 macro(writing) \ 78 macro(MediaStream) \ 72 79 macro(MediaStreamTrack) \ 73 80 macro(ReadableStream) \
Note: See TracChangeset
for help on using the changeset viewer.