Changeset 202376 in webkit


Ignore:
Timestamp:
Jun 23, 2016 6:52:13 AM (8 years ago)
Author:
adam.bergkvist@ericsson.com
Message:

WebRTC: Add support for RTCPeerConnection legacy MediaStream-based API
https://bugs.webkit.org/show_bug.cgi?id=158940

Reviewed by Eric Carlson.

Source/WebCore:

Implement the legacy MediaStream-based RTCPeerConnection API as JS built-ins. The
getRemoteStreams() function and the 'addstream' event are partly implemented with native
code.

Test: fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html

  • Modules/mediastream/MediaEndpointPeerConnection.cpp:

(WebCore::MediaEndpointPeerConnection::setRemoteDescriptionTask):
(WebCore::MediaEndpointPeerConnection::getRemoteStreams):
The getRemoteStreams() function and the 'addstream' event is backed up by native code.

  • Modules/mediastream/MediaEndpointPeerConnection.h:
  • Modules/mediastream/MediaStream.idl:
  • Modules/mediastream/PeerConnectionBackend.h:
  • Modules/mediastream/RTCPeerConnection.h:
  • Modules/mediastream/RTCPeerConnection.idl:
  • Modules/mediastream/RTCPeerConnection.js:

(initializeRTCPeerConnection):
(getLocalStreams):
(getRemoteStreams):
(getStreamById):
(addStream):
(removeStream):
Legacy API implemented as JS built-ins.

  • bindings/js/JSDOMGlobalObject.cpp:

(WebCore::JSDOMGlobalObject::addBuiltinGlobals):

  • bindings/js/WebCoreBuiltinNames.h:

LayoutTests:

Add test for RTCPeerConnection legacy MediaStream-based API.

  • fast/mediastream/RTCPeerConnection-legacy-stream-based-api-expected.txt: Added.
  • fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html: Added.
  • platform/mac/TestExpectations:

Skip test for mac port (not building with WEB_RTC yet)

Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r202375 r202376  
     12016-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
    1152016-06-23  Per Arne Vollan  <pvollan@apple.com>
    216
  • trunk/LayoutTests/platform/mac/TestExpectations

    r202360 r202376  
    205205fast/mediastream/RTCPeerConnection-media-setup-two-dialogs.html
    206206fast/mediastream/RTCPeerConnection-media-setup-callbacks-single-dialog.html
     207fast/mediastream/RTCPeerConnection-legacy-stream-based-api.html
    207208
    208209# Asserts in debug.
  • trunk/Source/WebCore/ChangeLog

    r202371 r202376  
     12016-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
    1352016-06-23  Carlos Garcia Campos  <cgarcia@igalia.com>
    236
  • trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp

    r202339 r202376  
    3838#include "MediaEndpointSessionConfiguration.h"
    3939#include "MediaStream.h"
     40#include "MediaStreamEvent.h"
    4041#include "MediaStreamTrack.h"
    4142#include "PeerMediaDescription.h"
     
    476477        return;
    477478    }
     479
     480    // One legacy MediaStreamEvent will be fired for every new MediaStream created as this remote description is set.
     481    Vector<RefPtr<MediaStreamEvent>> legacyMediaStreamEvents;
    478482
    479483    for (auto mediaDescription : mediaDescriptions) {
     
    530534                    auto newStream = MediaStream::create(*m_client->scriptExecutionContext(), MediaStreamTrackVector({ receiver.track() }));
    531535                    m_remoteStreamMap.add(id, newStream.copyRef());
     536                    legacyMediaStreamEvents.append(MediaStreamEvent::create(eventNames().addstreamEvent, false, false, newStream.copyRef()));
    532537                    trackEventMediaStreams.add(id, WTFMove(newStream));
    533538                }
     
    541546        }
    542547    }
     548
     549    // Fire legacy addstream events.
     550    for (auto& event : legacyMediaStreamEvents)
     551        m_client->fireEvent(*event);
    543552
    544553    SignalingState newSignalingState;
     
    670679
    671680    promise.reject(NOT_SUPPORTED_ERR);
     681}
     682
     683Vector<RefPtr<MediaStream>> MediaEndpointPeerConnection::getRemoteStreams() const
     684{
     685    Vector<RefPtr<MediaStream>> remoteStreams;
     686    copyValuesToVector(m_remoteStreamMap, remoteStreams);
     687    return remoteStreams;
    672688}
    673689
  • trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h

    r202339 r202376  
    7474    void getStats(MediaStreamTrack*, PeerConnection::StatsPromise&&) override;
    7575
     76    Vector<RefPtr<MediaStream>> getRemoteStreams() const override;
     77
    7678    RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) override;
    7779    void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) override;
  • trunk/Source/WebCore/Modules/mediastream/MediaStream.idl

    r200231 r202376  
    3535    sequence<MediaStreamTrack> getAudioTracks();
    3636    sequence<MediaStreamTrack> getVideoTracks();
    37     sequence<MediaStreamTrack> getTracks();
     37    [PrivateIdentifier, PublicIdentifier] sequence<MediaStreamTrack> getTracks();
    3838    MediaStreamTrack getTrackById(DOMString trackId);
    3939
  • trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h

    r202026 r202376  
    4141class DOMError;
    4242class Event;
     43class MediaStream;
    4344class MediaStreamTrack;
    4445class PeerConnectionBackend;
     
    107108    virtual void getStats(MediaStreamTrack*, PeerConnection::StatsPromise&&) = 0;
    108109
     110    virtual Vector<RefPtr<MediaStream>> getRemoteStreams() const = 0;
     111
    109112    virtual RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) = 0;
    110113    virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) = 0;
  • trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h

    r202337 r202376  
    6969    const Vector<RefPtr<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->getReceivers(); }
    7070    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(); }
    7174
    7275    RefPtr<RTCRtpSender> addTrack(Ref<MediaStreamTrack>&&, const Vector<MediaStream*>&, ExceptionCode&);
  • trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl

    r202337 r202376  
    4242
    4343    // RTP Media API extensions
    44     sequence<RTCRtpSender> getSenders();
     44    [PrivateIdentifier, PublicIdentifier] sequence<RTCRtpSender> getSenders();
    4545    sequence<RTCRtpReceiver> getReceivers();
    4646    sequence<RTCRtpTransceiver> getTransceivers();
    4747
    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);
    5050
    5151    [StrictTypeChecking, RaisesException] RTCRtpTransceiver addTransceiver(MediaStreamTrack track, optional RTCRtpTransceiverInit init);
    5252    [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);
    5361
    5462    [JSBuiltin] Promise createOffer(optional Dictionary offerOptions);
     
    118126    attribute EventHandler onicegatheringstatechange;
    119127    attribute EventHandler ondatachannel;
     128
     129    // Legacy event handler (MediaStream-based API)
     130    attribute EventHandler onaddstream;
    120131};
    121132
  • trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.js

    r202337 r202376  
    4949        throw new @TypeError(message);
    5050    }
     51
     52    this.@localStreams = [];
     53
    5154    return this;
     55}
     56
     57function 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
     67function 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
     84function 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
     104function 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);
    52129}
    53130
  • trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp

    r201253 r202376  
    3131#include "JSDOMWindow.h"
    3232#include "JSEventListener.h"
     33#include "JSMediaStream.h"
    3334#include "JSMediaStreamTrack.h"
    3435#include "JSRTCIceCandidate.h"
     
    8485        JSDOMGlobalObject::GlobalPropertyInfo(clientData.builtinNames().streamWritablePrivateName(), jsNumber(6), DontDelete | ReadOnly),
    8586#if ENABLE(MEDIA_STREAM)
     87        JSDOMGlobalObject::GlobalPropertyInfo(clientData.builtinNames().MediaStreamPrivateName(), JSMediaStream::getConstructor(vm, this), DontDelete | ReadOnly),
    8688        JSDOMGlobalObject::GlobalPropertyInfo(clientData.builtinNames().MediaStreamTrackPrivateName(), JSMediaStreamTrack::getConstructor(vm, this), DontDelete | ReadOnly),
    8789#endif
  • trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h

    r198889 r202376  
    3333
    3434#define WEBCORE_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro)\
     35    macro(addTrack) \
    3536    macro(appendFromJS) \
    3637    macro(closeRequested) \
     
    4142    macro(fillFromJS) \
    4243    macro(getUserMediaFromJS) \
     44    macro(getRemoteStreams) \
     45    macro(getSenders) \
     46    macro(getTracks) \
    4347    macro(initializeWith) \
     48    macro(localStreams) \
    4449    macro(operations) \
    4550    macro(ownerReadableStream) \
     
    5661    macro(readRequests) \
    5762    macro(readyPromiseCapability) \
     63    macro(removeTrack) \
    5864    macro(state) \
    5965    macro(started) \
     
    7076    macro(underlyingSource) \
    7177    macro(writing) \
     78    macro(MediaStream) \
    7279    macro(MediaStreamTrack) \
    7380    macro(ReadableStream) \
Note: See TracChangeset for help on using the changeset viewer.