Changeset 233425 in webkit


Ignore:
Timestamp:
Jul 2, 2018 10:29:03 AM (6 years ago)
Author:
youenn@apple.com
Message:

Reject getUserMedia promise if capture fails
https://bugs.webkit.org/show_bug.cgi?id=187190

Reviewed by Eric Carlson.

In case PendingActivationMediaStream is notified of a change,
Check whether any track failed to capture.
If so, reject the promise.
Add more release logging in error case.

Covered by manual testing.

  • Modules/mediastream/UserMediaRequest.cpp:

(WebCore::UserMediaRequest::PendingActivationMediaStream::~PendingActivationMediaStream):
(WebCore::UserMediaRequest::PendingActivationMediaStream::characteristicsChanged):
(WebCore::UserMediaRequest::mediaStreamIsReady):
(WebCore::UserMediaRequest::mediaStreamDidFail):

  • Modules/mediastream/UserMediaRequest.h:
  • platform/mediastream/MediaStreamPrivate.h:
  • platform/mediastream/RealtimeMediaSource.cpp:

(WebCore::RealtimeMediaSource::captureFailed):

  • platform/mediastream/mac/AVVideoCaptureSource.mm:

(WebCore::AVVideoCaptureSource::setupCaptureSession):

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r233414 r233425  
     12018-07-02  Youenn Fablet  <youenn@apple.com>
     2
     3        Reject getUserMedia promise if capture fails
     4        https://bugs.webkit.org/show_bug.cgi?id=187190
     5
     6        Reviewed by Eric Carlson.
     7
     8        In case PendingActivationMediaStream is notified of a change,
     9        Check whether any track failed to capture.
     10        If so, reject the promise.
     11        Add more release logging in error case.
     12
     13        Covered by manual testing.
     14
     15        * Modules/mediastream/UserMediaRequest.cpp:
     16        (WebCore::UserMediaRequest::PendingActivationMediaStream::~PendingActivationMediaStream):
     17        (WebCore::UserMediaRequest::PendingActivationMediaStream::characteristicsChanged):
     18        (WebCore::UserMediaRequest::mediaStreamIsReady):
     19        (WebCore::UserMediaRequest::mediaStreamDidFail):
     20        * Modules/mediastream/UserMediaRequest.h:
     21        * platform/mediastream/MediaStreamPrivate.h:
     22        * platform/mediastream/RealtimeMediaSource.cpp:
     23        (WebCore::RealtimeMediaSource::captureFailed):
     24        * platform/mediastream/mac/AVVideoCaptureSource.mm:
     25        (WebCore::AVVideoCaptureSource::setupCaptureSession):
     26
    1272018-07-01  Fujii Hironori  <Hironori.Fujii@sony.com>
    228
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp

    r233122 r233425  
    348348void UserMediaRequest::PendingActivationMediaStream::characteristicsChanged()
    349349{
    350     if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio())
    351         m_userMediaRequest.mediaStreamIsReady(m_mediaStream.copyRef());
     350    if (!m_userMediaRequest.m_pendingActivationMediaStream)
     351        return;
     352
     353    for (auto& track : m_mediaStream->privateStream().tracks()) {
     354        if (track->source().captureDidFail()) {
     355            m_userMediaRequest.mediaStreamDidFail(track->source().type());
     356            return;
     357        }
     358    }
     359
     360    if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio()) {
     361        m_userMediaRequest.mediaStreamIsReady(WTFMove(m_mediaStream));
     362        return;
     363    }
    352364}
    353365
    354366void UserMediaRequest::mediaStreamIsReady(Ref<MediaStream>&& stream)
    355367{
     368    RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamIsReady");
    356369    stream->document()->setHasCaptureMediaStreamTrack();
    357370    m_promise.resolve(WTFMove(stream));
     
    360373}
    361374
     375void UserMediaRequest::mediaStreamDidFail(RealtimeMediaSource::Type type)
     376{
     377    RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamDidFail");
     378    const char* typeDescription = "";
     379    switch (type) {
     380    case RealtimeMediaSource::Type::Audio:
     381        typeDescription = "audio";
     382        break;
     383    case RealtimeMediaSource::Type::Video:
     384        typeDescription = "video";
     385        break;
     386    case RealtimeMediaSource::Type::None:
     387        typeDescription = "unknown";
     388        break;
     389    }
     390    m_promise.reject(NotReadableError, makeString("Failed starting capture of a "_s, typeDescription, " track"_s));
     391    // We are in an observer iterator loop, we do not want to change the observers within this loop.
     392    callOnMainThread([stream = WTFMove(m_pendingActivationMediaStream)] { });
     393}
     394
    362395} // namespace WebCore
    363396
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h

    r231979 r233425  
    8080
    8181    void mediaStreamIsReady(Ref<MediaStream>&&);
     82    void mediaStreamDidFail(RealtimeMediaSource::Type);
    8283
    8384    class PendingActivationMediaStream : public RefCounted<PendingActivationMediaStream>, private MediaStreamPrivate::Observer {
  • trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h

    r232613 r233425  
    9191    bool isProducingData() const;
    9292
    93     void endStream();
    94 
    9593    bool hasVideo() const;
    9694    bool hasAudio() const;
  • trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp

    r233122 r233425  
    3737#include "RealtimeMediaSource.h"
    3838
     39#include "Logging.h"
    3940#include "MediaConstraints.h"
    4041#include "NotImplemented.h"
     
    188189void RealtimeMediaSource::captureFailed()
    189190{
     191    RELEASE_LOG_ERROR(MediaStream, "RealtimeMediaSource::captureFailed");
     192
    190193    m_isProducingData = false;
    191194    m_captureDidFailed = true;
  • trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm

    r232643 r233425  
    385385    RetainPtr<AVCaptureDeviceInputType> videoIn = adoptNS([allocAVCaptureDeviceInputInstance() initWithDevice:device() error:&error]);
    386386    if (error) {
    387         LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), failed to allocate AVCaptureDeviceInput: %s", this, [[error localizedDescription] UTF8String]);
     387        RELEASE_LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), failed to allocate AVCaptureDeviceInput: %s", this, [[error localizedDescription] UTF8String]);
    388388        return false;
    389389    }
    390390
    391391    if (![session() canAddInput:videoIn.get()]) {
    392         LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video input device", this);
     392        RELEASE_LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video input device", this);
    393393        return false;
    394394    }
     
    410410
    411411    if (![session() canAddOutput:m_videoOutput.get()]) {
    412         LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video sample buffer output delegate", this);
     412        RELEASE_LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video sample buffer output delegate", this);
    413413        return false;
    414414    }
Note: See TracChangeset for help on using the changeset viewer.