Title: [249651] trunk
Revision
249651
Author
ryanhad...@apple.com
Date
2019-09-09 10:52:15 -0700 (Mon, 09 Sep 2019)

Log Message

Unreviewed, rolling out r249574.

Caused fast/mediastream/media-stream-track-source-failure.html
to become flaky.

Reverted changeset:

"Remove MediaStreamPrivate::scheduleDeferredTask"
https://bugs.webkit.org/show_bug.cgi?id=200975
https://trac.webkit.org/changeset/249574

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (249650 => 249651)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2019-09-09 17:52:15 UTC (rev 249651)
@@ -1,3 +1,16 @@
+2019-09-09  Ryan Haddad  <ryanhad...@apple.com>
+
+        Unreviewed, rolling out r249574.
+
+        Caused fast/mediastream/media-stream-track-source-failure.html
+        to become flaky.
+
+        Reverted changeset:
+
+        "Remove MediaStreamPrivate::scheduleDeferredTask"
+        https://bugs.webkit.org/show_bug.cgi?id=200975
+        https://trac.webkit.org/changeset/249574
+
 2019-09-09  Rob Buis  <rb...@igalia.com>
 
         [GTK][WPE] Remove attributes deprecated from MathML3

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt (249650 => 249651)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt	2019-09-09 17:52:15 UTC (rev 249651)
@@ -5,5 +5,5 @@
 This test checks that adding a track to an inactive MediaStream is allowed.
 
 
-PASS Tests that adding a track to an inactive MediaStream is allowed 
+FAIL Tests that adding a track to an inactive MediaStream is allowed assert_false: audio stream is inactive after stopping its only audio track expected false got true
 

Modified: trunk/Source/WebCore/ChangeLog (249650 => 249651)


--- trunk/Source/WebCore/ChangeLog	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/ChangeLog	2019-09-09 17:52:15 UTC (rev 249651)
@@ -1,3 +1,16 @@
+2019-09-09  Ryan Haddad  <ryanhad...@apple.com>
+
+        Unreviewed, rolling out r249574.
+
+        Caused fast/mediastream/media-stream-track-source-failure.html
+        to become flaky.
+
+        Reverted changeset:
+
+        "Remove MediaStreamPrivate::scheduleDeferredTask"
+        https://bugs.webkit.org/show_bug.cgi?id=200975
+        https://trac.webkit.org/changeset/249574
+
 2019-09-09  Rob Buis  <rb...@igalia.com>
 
         [GTK][WPE] Remove attributes deprecated from MathML3

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (249650 => 249651)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2019-09-09 17:52:15 UTC (rev 249651)
@@ -101,14 +101,14 @@
 {
     ALWAYS_LOG(LOGIDENTIFIER);
 
+    setIsActive(m_private->active());
+    m_private->addObserver(*this);
+
     for (auto& trackPrivate : m_private->tracks()) {
         auto track = MediaStreamTrack::create(document, *trackPrivate);
         track->addObserver(*this);
         m_trackSet.add(track->id(), WTFMove(track));
     }
-
-    setIsActive(m_private->active());
-    m_private->addObserver(*this);
     suspendIfNeeded();
 }
 

Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (249650 => 249651)


--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2019-09-09 17:52:15 UTC (rev 249651)
@@ -215,25 +215,15 @@
     controller->requestUserMediaAccess(*this);
 }
 
-static inline bool isMediaStreamCorrectlyStarted(const MediaStream& stream)
-{
-    if (stream.getTracks().isEmpty())
-        return false;
-
-    return WTF::allOf(stream.getTracks(), [](auto& track) {
-        return !track->source().captureDidFail();
-    });
-}
-
 void UserMediaRequest::allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&& completionHandler)
 {
     RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDevice ? audioDevice.persistentId().utf8().data() : "", videoDevice ? videoDevice.persistentId().utf8().data() : "");
 
     auto callback = [this, protector = makePendingActivity(*this), completionHandler = WTFMove(completionHandler)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
-        auto scopeExit = makeScopeExit([completionHandler = WTFMove(completionHandler)]() mutable {
+        auto scopeExit = makeScopeExit([&] {
             completionHandler();
         });
-        if (isContextStopped())
+        if (!m_scriptExecutionContext)
             return;
 
         if (!privateStream) {
@@ -241,21 +231,16 @@
             deny(MediaAccessDenialReason::HardwareError);
             return;
         }
+        privateStream->monitorOrientation(downcast<Document>(m_scriptExecutionContext)->orientationNotifier());
 
-        auto& document = downcast<Document>(*m_scriptExecutionContext);
-        privateStream->monitorOrientation(document.orientationNotifier());
-
-        auto stream = MediaStream::create(document, privateStream.releaseNonNull());
-        stream->startProducingData();
-
-        if (!isMediaStreamCorrectlyStarted(stream)) {
+        auto stream = MediaStream::create(*downcast<Document>(m_scriptExecutionContext), privateStream.releaseNonNull());
+        if (stream->getTracks().isEmpty()) {
             deny(MediaAccessDenialReason::HardwareError);
             return;
         }
 
-        ASSERT(document.isCapturing());
-        stream->document()->setHasCaptureMediaStreamTrack();
-        m_promise.resolve(WTFMove(stream));
+        scopeExit.release();
+        m_pendingActivationMediaStream = makeUnique<PendingActivationMediaStream>(WTFMove(protector), *this, WTFMove(stream), WTFMove(completionHandler));
     };
 
     auto& document = downcast<Document>(*scriptExecutionContext());
@@ -325,6 +310,11 @@
 
 void UserMediaRequest::stop()
 {
+    // Protecting 'this' since nulling m_pendingActivationMediaStream might destroy it.
+    Ref<UserMediaRequest> protectedThis(*this);
+
+    m_pendingActivationMediaStream = nullptr;
+
     auto& document = downcast<Document>(*m_scriptExecutionContext);
     if (auto* controller = UserMediaController::from(document.page()))
         controller->cancelUserMediaAccessRequest(*this);
@@ -345,6 +335,50 @@
     return downcast<Document>(m_scriptExecutionContext);
 }
 
+UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream, CompletionHandler<void()>&& completionHandler)
+    : m_protectingUserMediaRequest(WTFMove(protectingUserMediaRequest))
+    , m_userMediaRequest(userMediaRequest)
+    , m_mediaStream(WTFMove(stream))
+    , m_completionHandler(WTFMove(completionHandler))
+{
+    m_mediaStream->privateStream().addObserver(*this);
+    m_mediaStream->startProducingData();
+}
+
+UserMediaRequest::PendingActivationMediaStream::~PendingActivationMediaStream()
+{
+    m_mediaStream->privateStream().removeObserver(*this);
+    m_completionHandler();
+    if (auto* document = m_mediaStream->document())
+        document->updateIsPlayingMedia();
+}
+
+void UserMediaRequest::PendingActivationMediaStream::characteristicsChanged()
+{
+    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));
+    m_pendingActivationMediaStream = nullptr;
+}
+
 void UserMediaRequest::mediaStreamDidFail(RealtimeMediaSource::Type type)
 {
     RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamDidFail");
@@ -361,6 +395,7 @@
         break;
     }
     m_promise.reject(NotReadableError, makeString("Failed starting capture of a "_s, typeDescription, " track"_s));
+    m_pendingActivationMediaStream = nullptr;
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (249650 => 249651)


--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h	2019-09-09 17:52:15 UTC (rev 249651)
@@ -79,12 +79,29 @@
     const char* activeDOMObjectName() const final;
     bool canSuspendForDocumentSuspension() const final;
 
+    void mediaStreamIsReady(Ref<MediaStream>&&);
     void mediaStreamDidFail(RealtimeMediaSource::Type);
 
+    class PendingActivationMediaStream : private MediaStreamPrivate::Observer {
+        WTF_MAKE_FAST_ALLOCATED;
+    public:
+        PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&&, CompletionHandler<void()>&&);
+        ~PendingActivationMediaStream();
+
+    private:
+        void characteristicsChanged() final;
+
+        Ref<PendingActivity<UserMediaRequest>> m_protectingUserMediaRequest;
+        UserMediaRequest& m_userMediaRequest;
+        Ref<MediaStream> m_mediaStream;
+        CompletionHandler<void()> m_completionHandler;
+    };
+
     Vector<String> m_videoDeviceUIDs;
     Vector<String> m_audioDeviceUIDs;
 
     DOMPromiseDeferred<IDLInterface<MediaStream>> m_promise;
+    std::unique_ptr<PendingActivationMediaStream> m_pendingActivationMediaStream;
     MediaStreamRequest m_request;
 };
 

Modified: trunk/Source/WebCore/page/MediaProducer.h (249650 => 249651)


--- trunk/Source/WebCore/page/MediaProducer.h	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/page/MediaProducer.h	2019-09-09 17:52:15 UTC (rev 249651)
@@ -58,13 +58,12 @@
         AudioCaptureMask = HasActiveAudioCaptureDevice | HasMutedAudioCaptureDevice | HasInterruptedAudioCaptureDevice,
         VideoCaptureMask = HasActiveVideoCaptureDevice | HasMutedVideoCaptureDevice | HasInterruptedVideoCaptureDevice,
         DisplayCaptureMask = HasActiveDisplayCaptureDevice | HasMutedDisplayCaptureDevice | HasInterruptedDisplayCaptureDevice,
-        ActiveCaptureMask = HasActiveAudioCaptureDevice | HasActiveVideoCaptureDevice | HasActiveDisplayCaptureDevice,
         MutedCaptureMask =  HasMutedAudioCaptureDevice | HasMutedVideoCaptureDevice | HasMutedDisplayCaptureDevice,
         MediaCaptureMask = AudioCaptureMask | VideoCaptureMask | DisplayCaptureMask,
     };
     typedef unsigned MediaStateFlags;
 
-    static bool isCapturing(MediaStateFlags state) { return (state & ActiveCaptureMask) || (state & MutedCaptureMask); }
+    static bool isCapturing(MediaStateFlags state) { return (state & HasActiveAudioCaptureDevice) || (state & HasActiveVideoCaptureDevice) || (state & HasMutedAudioCaptureDevice) || (state & HasMutedVideoCaptureDevice); }
 
     virtual MediaStateFlags mediaState() const = 0;
 

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (249650 => 249651)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp	2019-09-09 17:52:15 UTC (rev 249651)
@@ -282,7 +282,9 @@
 #endif
 
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier(), " ", track.muted());
-    characteristicsChanged();
+    scheduleDeferredTask([this] {
+        characteristicsChanged();
+    });
 }
 
 void MediaStreamPrivate::trackSettingsChanged(MediaStreamTrackPrivate&)
@@ -299,7 +301,9 @@
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier(), " ", track.enabled());
     updateActiveVideoTrack();
 
-    characteristicsChanged();
+    scheduleDeferredTask([this] {
+        characteristicsChanged();
+    });
 }
 
 void MediaStreamPrivate::trackStarted(MediaStreamTrackPrivate& track)
@@ -309,7 +313,9 @@
 #endif
 
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
-    characteristicsChanged();
+    scheduleDeferredTask([this] {
+        characteristicsChanged();
+    });
 }
 
 void MediaStreamPrivate::trackEnded(MediaStreamTrackPrivate& track)
@@ -319,10 +325,23 @@
 #endif
 
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
-    updateActiveState(NotifyClientOption::Notify);
-    characteristicsChanged();
+    scheduleDeferredTask([this] {
+        updateActiveState(NotifyClientOption::Notify);
+        characteristicsChanged();
+    });
 }
 
+void MediaStreamPrivate::scheduleDeferredTask(Function<void ()>&& function)
+{
+    ASSERT(function);
+    callOnMainThread([weakThis = makeWeakPtr(*this), function = WTFMove(function)] {
+        if (!weakThis)
+            return;
+
+        function();
+    });
+}
+
 void MediaStreamPrivate::monitorOrientation(OrientationNotifier& notifier)
 {
     for (auto& track : m_trackSet.values()) {

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (249650 => 249651)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2019-09-09 17:52:15 UTC (rev 249651)
@@ -47,6 +47,7 @@
 #include <wtf/RefPtr.h>
 #include <wtf/UUID.h>
 #include <wtf/Vector.h>
+#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
@@ -56,6 +57,7 @@
 class MediaStreamPrivate final
     : public MediaStreamTrackPrivate::Observer
     , public RefCounted<MediaStreamPrivate>
+    , public CanMakeWeakPtr<MediaStreamPrivate>
 #if !RELEASE_LOG_DISABLED
     , private LoggerHelper
 #endif
@@ -126,6 +128,7 @@
     void characteristicsChanged();
     void updateActiveVideoTrack();
 
+    void scheduleDeferredTask(Function<void ()>&&);
     void forEachObserver(const WTF::Function<void(Observer&)>&) const;
 
 #if !RELEASE_LOG_DISABLED
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to