Changeset 249651 in webkit


Ignore:
Timestamp:
Sep 9, 2019 10:52:15 AM (5 years ago)
Author:
Ryan Haddad
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

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r249645 r249651  
     12019-09-09  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, rolling out r249574.
     4
     5        Caused fast/mediastream/media-stream-track-source-failure.html
     6        to become flaky.
     7
     8        Reverted changeset:
     9
     10        "Remove MediaStreamPrivate::scheduleDeferredTask"
     11        https://bugs.webkit.org/show_bug.cgi?id=200975
     12        https://trac.webkit.org/changeset/249574
     13
    1142019-09-09  Rob Buis  <rbuis@igalia.com>
    215
  • trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt

    r249574 r249651  
    66
    77
    8 PASS Tests that adding a track to an inactive MediaStream is allowed
     8FAIL 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
    99
  • trunk/Source/WebCore/ChangeLog

    r249645 r249651  
     12019-09-09  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, rolling out r249574.
     4
     5        Caused fast/mediastream/media-stream-track-source-failure.html
     6        to become flaky.
     7
     8        Reverted changeset:
     9
     10        "Remove MediaStreamPrivate::scheduleDeferredTask"
     11        https://bugs.webkit.org/show_bug.cgi?id=200975
     12        https://trac.webkit.org/changeset/249574
     13
    1142019-09-09  Rob Buis  <rbuis@igalia.com>
    215
  • trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp

    r249574 r249651  
    102102    ALWAYS_LOG(LOGIDENTIFIER);
    103103
     104    setIsActive(m_private->active());
     105    m_private->addObserver(*this);
     106
    104107    for (auto& trackPrivate : m_private->tracks()) {
    105108        auto track = MediaStreamTrack::create(document, *trackPrivate);
     
    107110        m_trackSet.add(track->id(), WTFMove(track));
    108111    }
    109 
    110     setIsActive(m_private->active());
    111     m_private->addObserver(*this);
    112112    suspendIfNeeded();
    113113}
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp

    r249574 r249651  
    216216}
    217217
    218 static inline bool isMediaStreamCorrectlyStarted(const MediaStream& stream)
    219 {
    220     if (stream.getTracks().isEmpty())
    221         return false;
    222 
    223     return WTF::allOf(stream.getTracks(), [](auto& track) {
    224         return !track->source().captureDidFail();
    225     });
    226 }
    227 
    228218void UserMediaRequest::allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&& completionHandler)
    229219{
     
    231221
    232222    auto callback = [this, protector = makePendingActivity(*this), completionHandler = WTFMove(completionHandler)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
    233         auto scopeExit = makeScopeExit([completionHandler = WTFMove(completionHandler)]() mutable {
     223        auto scopeExit = makeScopeExit([&] {
    234224            completionHandler();
    235225        });
    236         if (isContextStopped())
     226        if (!m_scriptExecutionContext)
    237227            return;
    238228
     
    242232            return;
    243233        }
    244 
    245         auto& document = downcast<Document>(*m_scriptExecutionContext);
    246         privateStream->monitorOrientation(document.orientationNotifier());
    247 
    248         auto stream = MediaStream::create(document, privateStream.releaseNonNull());
    249         stream->startProducingData();
    250 
    251         if (!isMediaStreamCorrectlyStarted(stream)) {
     234        privateStream->monitorOrientation(downcast<Document>(m_scriptExecutionContext)->orientationNotifier());
     235
     236        auto stream = MediaStream::create(*downcast<Document>(m_scriptExecutionContext), privateStream.releaseNonNull());
     237        if (stream->getTracks().isEmpty()) {
    252238            deny(MediaAccessDenialReason::HardwareError);
    253239            return;
    254240        }
    255241
    256         ASSERT(document.isCapturing());
    257         stream->document()->setHasCaptureMediaStreamTrack();
    258         m_promise.resolve(WTFMove(stream));
     242        scopeExit.release();
     243        m_pendingActivationMediaStream = makeUnique<PendingActivationMediaStream>(WTFMove(protector), *this, WTFMove(stream), WTFMove(completionHandler));
    259244    };
    260245
     
    326311void UserMediaRequest::stop()
    327312{
     313    // Protecting 'this' since nulling m_pendingActivationMediaStream might destroy it.
     314    Ref<UserMediaRequest> protectedThis(*this);
     315
     316    m_pendingActivationMediaStream = nullptr;
     317
    328318    auto& document = downcast<Document>(*m_scriptExecutionContext);
    329319    if (auto* controller = UserMediaController::from(document.page()))
     
    344334{
    345335    return downcast<Document>(m_scriptExecutionContext);
     336}
     337
     338UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream, CompletionHandler<void()>&& completionHandler)
     339    : m_protectingUserMediaRequest(WTFMove(protectingUserMediaRequest))
     340    , m_userMediaRequest(userMediaRequest)
     341    , m_mediaStream(WTFMove(stream))
     342    , m_completionHandler(WTFMove(completionHandler))
     343{
     344    m_mediaStream->privateStream().addObserver(*this);
     345    m_mediaStream->startProducingData();
     346}
     347
     348UserMediaRequest::PendingActivationMediaStream::~PendingActivationMediaStream()
     349{
     350    m_mediaStream->privateStream().removeObserver(*this);
     351    m_completionHandler();
     352    if (auto* document = m_mediaStream->document())
     353        document->updateIsPlayingMedia();
     354}
     355
     356void UserMediaRequest::PendingActivationMediaStream::characteristicsChanged()
     357{
     358    if (!m_userMediaRequest.m_pendingActivationMediaStream)
     359        return;
     360
     361    for (auto& track : m_mediaStream->privateStream().tracks()) {
     362        if (track->source().captureDidFail()) {
     363            m_userMediaRequest.mediaStreamDidFail(track->source().type());
     364            return;
     365        }
     366    }
     367
     368    if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio()) {
     369        m_userMediaRequest.mediaStreamIsReady(WTFMove(m_mediaStream));
     370        return;
     371    }
     372}
     373
     374void UserMediaRequest::mediaStreamIsReady(Ref<MediaStream>&& stream)
     375{
     376    RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamIsReady");
     377    stream->document()->setHasCaptureMediaStreamTrack();
     378    m_promise.resolve(WTFMove(stream));
     379    m_pendingActivationMediaStream = nullptr;
    346380}
    347381
     
    362396    }
    363397    m_promise.reject(NotReadableError, makeString("Failed starting capture of a "_s, typeDescription, " track"_s));
     398    m_pendingActivationMediaStream = nullptr;
    364399}
    365400
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h

    r249574 r249651  
    8080    bool canSuspendForDocumentSuspension() const final;
    8181
     82    void mediaStreamIsReady(Ref<MediaStream>&&);
    8283    void mediaStreamDidFail(RealtimeMediaSource::Type);
     84
     85    class PendingActivationMediaStream : private MediaStreamPrivate::Observer {
     86        WTF_MAKE_FAST_ALLOCATED;
     87    public:
     88        PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&&, CompletionHandler<void()>&&);
     89        ~PendingActivationMediaStream();
     90
     91    private:
     92        void characteristicsChanged() final;
     93
     94        Ref<PendingActivity<UserMediaRequest>> m_protectingUserMediaRequest;
     95        UserMediaRequest& m_userMediaRequest;
     96        Ref<MediaStream> m_mediaStream;
     97        CompletionHandler<void()> m_completionHandler;
     98    };
    8399
    84100    Vector<String> m_videoDeviceUIDs;
     
    86102
    87103    DOMPromiseDeferred<IDLInterface<MediaStream>> m_promise;
     104    std::unique_ptr<PendingActivationMediaStream> m_pendingActivationMediaStream;
    88105    MediaStreamRequest m_request;
    89106};
  • trunk/Source/WebCore/page/MediaProducer.h

    r249574 r249651  
    5959        VideoCaptureMask = HasActiveVideoCaptureDevice | HasMutedVideoCaptureDevice | HasInterruptedVideoCaptureDevice,
    6060        DisplayCaptureMask = HasActiveDisplayCaptureDevice | HasMutedDisplayCaptureDevice | HasInterruptedDisplayCaptureDevice,
    61         ActiveCaptureMask = HasActiveAudioCaptureDevice | HasActiveVideoCaptureDevice | HasActiveDisplayCaptureDevice,
    6261        MutedCaptureMask =  HasMutedAudioCaptureDevice | HasMutedVideoCaptureDevice | HasMutedDisplayCaptureDevice,
    6362        MediaCaptureMask = AudioCaptureMask | VideoCaptureMask | DisplayCaptureMask,
     
    6564    typedef unsigned MediaStateFlags;
    6665
    67     static bool isCapturing(MediaStateFlags state) { return (state & ActiveCaptureMask) || (state & MutedCaptureMask); }
     66    static bool isCapturing(MediaStateFlags state) { return (state & HasActiveAudioCaptureDevice) || (state & HasActiveVideoCaptureDevice) || (state & HasMutedAudioCaptureDevice) || (state & HasMutedVideoCaptureDevice); }
    6867
    6968    virtual MediaStateFlags mediaState() const = 0;
  • trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp

    r249574 r249651  
    283283
    284284    ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier(), " ", track.muted());
    285     characteristicsChanged();
     285    scheduleDeferredTask([this] {
     286        characteristicsChanged();
     287    });
    286288}
    287289
     
    300302    updateActiveVideoTrack();
    301303
    302     characteristicsChanged();
     304    scheduleDeferredTask([this] {
     305        characteristicsChanged();
     306    });
    303307}
    304308
     
    310314
    311315    ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
    312     characteristicsChanged();
     316    scheduleDeferredTask([this] {
     317        characteristicsChanged();
     318    });
    313319}
    314320
     
    320326
    321327    ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
    322     updateActiveState(NotifyClientOption::Notify);
    323     characteristicsChanged();
     328    scheduleDeferredTask([this] {
     329        updateActiveState(NotifyClientOption::Notify);
     330        characteristicsChanged();
     331    });
     332}
     333
     334void MediaStreamPrivate::scheduleDeferredTask(Function<void ()>&& function)
     335{
     336    ASSERT(function);
     337    callOnMainThread([weakThis = makeWeakPtr(*this), function = WTFMove(function)] {
     338        if (!weakThis)
     339            return;
     340
     341        function();
     342    });
    324343}
    325344
  • trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h

    r249574 r249651  
    4848#include <wtf/UUID.h>
    4949#include <wtf/Vector.h>
     50#include <wtf/WeakPtr.h>
    5051
    5152namespace WebCore {
     
    5758    : public MediaStreamTrackPrivate::Observer
    5859    , public RefCounted<MediaStreamPrivate>
     60    , public CanMakeWeakPtr<MediaStreamPrivate>
    5961#if !RELEASE_LOG_DISABLED
    6062    , private LoggerHelper
     
    127129    void updateActiveVideoTrack();
    128130
     131    void scheduleDeferredTask(Function<void ()>&&);
    129132    void forEachObserver(const WTF::Function<void(Observer&)>&) const;
    130133
Note: See TracChangeset for help on using the changeset viewer.