Title: [233425] trunk/Source/WebCore
Revision
233425
Author
[email protected]
Date
2018-07-02 10:29:03 -0700 (Mon, 02 Jul 2018)

Log 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):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (233424 => 233425)


--- trunk/Source/WebCore/ChangeLog	2018-07-02 17:16:38 UTC (rev 233424)
+++ trunk/Source/WebCore/ChangeLog	2018-07-02 17:29:03 UTC (rev 233425)
@@ -1,3 +1,29 @@
+2018-07-02  Youenn Fablet  <[email protected]>
+
+        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):
+
 2018-07-01  Fujii Hironori  <[email protected]>
 
         [WK2] fast/parser/document-open-in-unload.html makes the following test crash

Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (233424 => 233425)


--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2018-07-02 17:16:38 UTC (rev 233424)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2018-07-02 17:29:03 UTC (rev 233425)
@@ -347,12 +347,25 @@
 
 void UserMediaRequest::PendingActivationMediaStream::characteristicsChanged()
 {
-    if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio())
-        m_userMediaRequest.mediaStreamIsReady(m_mediaStream.copyRef());
+    if (!m_userMediaRequest.m_pendingActivationMediaStream)
+        return;
+
+    for (auto& track : m_mediaStream->privateStream().tracks()) {
+        if (track->source().captureDidFail()) {
+            m_userMediaRequest.mediaStreamDidFail(track->source().type());
+            return;
+        }
+    }
+
+    if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio()) {
+        m_userMediaRequest.mediaStreamIsReady(WTFMove(m_mediaStream));
+        return;
+    }
 }
 
 void UserMediaRequest::mediaStreamIsReady(Ref<MediaStream>&& stream)
 {
+    RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamIsReady");
     stream->document()->setHasCaptureMediaStreamTrack();
     m_promise.resolve(WTFMove(stream));
     // We are in an observer iterator loop, we do not want to change the observers within this loop.
@@ -359,6 +372,26 @@
     callOnMainThread([stream = WTFMove(m_pendingActivationMediaStream)] { });
 }
 
+void UserMediaRequest::mediaStreamDidFail(RealtimeMediaSource::Type type)
+{
+    RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamDidFail");
+    const char* typeDescription = "";
+    switch (type) {
+    case RealtimeMediaSource::Type::Audio:
+        typeDescription = "audio";
+        break;
+    case RealtimeMediaSource::Type::Video:
+        typeDescription = "video";
+        break;
+    case RealtimeMediaSource::Type::None:
+        typeDescription = "unknown";
+        break;
+    }
+    m_promise.reject(NotReadableError, makeString("Failed starting capture of a "_s, typeDescription, " track"_s));
+    // We are in an observer iterator loop, we do not want to change the observers within this loop.
+    callOnMainThread([stream = WTFMove(m_pendingActivationMediaStream)] { });
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (233424 => 233425)


--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h	2018-07-02 17:16:38 UTC (rev 233424)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h	2018-07-02 17:29:03 UTC (rev 233425)
@@ -79,6 +79,7 @@
     bool canSuspendForDocumentSuspension() const final;
 
     void mediaStreamIsReady(Ref<MediaStream>&&);
+    void mediaStreamDidFail(RealtimeMediaSource::Type);
 
     class PendingActivationMediaStream : public RefCounted<PendingActivationMediaStream>, private MediaStreamPrivate::Observer {
     public:

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (233424 => 233425)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2018-07-02 17:16:38 UTC (rev 233424)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2018-07-02 17:29:03 UTC (rev 233425)
@@ -90,8 +90,6 @@
     void stopProducingData();
     bool isProducingData() const;
 
-    void endStream();
-
     bool hasVideo() const;
     bool hasAudio() const;
     bool muted() const;

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (233424 => 233425)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2018-07-02 17:16:38 UTC (rev 233424)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2018-07-02 17:29:03 UTC (rev 233425)
@@ -36,6 +36,7 @@
 #if ENABLE(MEDIA_STREAM)
 #include "RealtimeMediaSource.h"
 
+#include "Logging.h"
 #include "MediaConstraints.h"
 #include "NotImplemented.h"
 #include "RealtimeMediaSourceCapabilities.h"
@@ -187,6 +188,8 @@
 
 void RealtimeMediaSource::captureFailed()
 {
+    RELEASE_LOG_ERROR(MediaStream, "RealtimeMediaSource::captureFailed");
+
     m_isProducingData = false;
     m_captureDidFailed = true;
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm (233424 => 233425)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2018-07-02 17:16:38 UTC (rev 233424)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2018-07-02 17:29:03 UTC (rev 233425)
@@ -384,12 +384,12 @@
     NSError *error = nil;
     RetainPtr<AVCaptureDeviceInputType> videoIn = adoptNS([allocAVCaptureDeviceInputInstance() initWithDevice:device() error:&error]);
     if (error) {
-        LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), failed to allocate AVCaptureDeviceInput: %s", this, [[error localizedDescription] UTF8String]);
+        RELEASE_LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), failed to allocate AVCaptureDeviceInput: %s", this, [[error localizedDescription] UTF8String]);
         return false;
     }
 
     if (![session() canAddInput:videoIn.get()]) {
-        LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video input device", this);
+        RELEASE_LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video input device", this);
         return false;
     }
     [session() addInput:videoIn.get()];
@@ -409,7 +409,7 @@
     setVideoSampleBufferDelegate(m_videoOutput.get());
 
     if (![session() canAddOutput:m_videoOutput.get()]) {
-        LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video sample buffer output delegate", this);
+        RELEASE_LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video sample buffer output delegate", this);
         return false;
     }
     [session() addOutput:m_videoOutput.get()];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to