- 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()];