Changeset 226171 in webkit


Ignore:
Timestamp:
Dec 19, 2017 7:17:24 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

UserMediaRequest should stop a request when Document is being stopped
https://bugs.webkit.org/show_bug.cgi?id=180962

Patch by Youenn Fablet <youenn@apple.com> on 2017-12-19
Reviewed by Eric Carlson.

Covered by fast/mediastream/destroy-document-while-enumerating-devices.html not crashing anymore under guardmalloc.
Stopping to wait for the media stream to be active whenDocument goes away.

  • Modules/mediastream/UserMediaRequest.cpp:

(WebCore::UserMediaRequest::UserMediaRequest):
(WebCore::UserMediaRequest::stop):
(WebCore::UserMediaRequest::activeDOMObjectName const):
(WebCore::UserMediaRequest::canSuspendForDocumentSuspension const):
(WebCore::UserMediaRequest::contextDestroyed): Deleted.

  • Modules/mediastream/UserMediaRequest.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r226168 r226171  
     12017-12-19  Youenn Fablet  <youenn@apple.com>
     2
     3        UserMediaRequest should stop a request when Document is being stopped
     4        https://bugs.webkit.org/show_bug.cgi?id=180962
     5
     6        Reviewed by Eric Carlson.
     7
     8        Covered by fast/mediastream/destroy-document-while-enumerating-devices.html not crashing anymore under guardmalloc.
     9        Stopping to wait for the media stream to be active whenDocument goes away.
     10
     11        * Modules/mediastream/UserMediaRequest.cpp:
     12        (WebCore::UserMediaRequest::UserMediaRequest):
     13        (WebCore::UserMediaRequest::stop):
     14        (WebCore::UserMediaRequest::activeDOMObjectName const):
     15        (WebCore::UserMediaRequest::canSuspendForDocumentSuspension const):
     16        (WebCore::UserMediaRequest::contextDestroyed): Deleted.
     17        * Modules/mediastream/UserMediaRequest.h:
     18
    1192017-12-19  Antti Koivisto  <antti@apple.com>
    220
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp

    r226160 r226171  
    6161
    6262UserMediaRequest::UserMediaRequest(Document& document, MediaStreamRequest&& request, DOMPromiseDeferred<IDLInterface<MediaStream>>&& promise)
    63     : ContextDestructionObserver(&document)
     63    : ActiveDOMObject(&document)
    6464    , m_promise(WTFMove(promise))
    6565    , m_request(WTFMove(request))
    6666{
     67    suspendIfNeeded();
    6768}
    6869
     
    204205    RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDevice ? audioDevice.persistentId().utf8().data() : "", videoDevice ? videoDevice.persistentId().utf8().data() : "");
    205206
    206     auto callback = [this, protectedThis = makeRef(*this)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
     207    auto callback = [this, protector = makePendingActivity(*this)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
    207208        if (!m_scriptExecutionContext)
    208209            return;
     
    220221        }
    221222
    222         m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protectedThis), WTFMove(stream));
     223        m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protector), *this, WTFMove(stream));
    223224    };
    224225
     
    275276}
    276277
    277 void UserMediaRequest::contextDestroyed()
    278 {
    279     if (!m_scriptExecutionContext)
    280         return;
    281 
     278void UserMediaRequest::stop()
     279{
    282280    auto& document = downcast<Document>(*m_scriptExecutionContext);
    283281    auto* controller = UserMediaController::from(document.page());
     
    291289}
    292290
     291const char* UserMediaRequest::activeDOMObjectName() const
     292{
     293    return "UserMediaRequest";
     294}
     295
     296bool UserMediaRequest::canSuspendForDocumentSuspension() const
     297{
     298    return !hasPendingActivity();
     299}
     300
    293301Document* UserMediaRequest::document() const
    294302{
     
    296304}
    297305
    298 UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<UserMediaRequest>&& request, Ref<MediaStream>&& stream)
    299     : m_userMediaRequest(WTFMove(request))
     306UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream)
     307    : m_protectingUserMediaRequest(WTFMove(protectingUserMediaRequest))
     308    , m_userMediaRequest(userMediaRequest)
    300309    , m_mediaStream(WTFMove(stream))
    301310{
     
    312321{
    313322    if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio())
    314         m_userMediaRequest->mediaStreamIsReady(m_mediaStream.copyRef());
     323        m_userMediaRequest.mediaStreamIsReady(m_mediaStream.copyRef());
    315324}
    316325
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h

    r226160 r226171  
    4747class SecurityOrigin;
    4848
    49 class UserMediaRequest : public RefCounted<UserMediaRequest>, private ContextDestructionObserver {
     49class UserMediaRequest : public RefCounted<UserMediaRequest>, public ActiveDOMObject {
    5050public:
    5151    static RefPtr<UserMediaRequest> create(Document&, MediaStreamRequest&&, DOMPromiseDeferred<IDLInterface<MediaStream>>&&);
     
    7575    UserMediaRequest(Document&, MediaStreamRequest&&, DOMPromiseDeferred<IDLInterface<MediaStream>>&&);
    7676
    77     void contextDestroyed() final;
     77    void stop() final;
     78    const char* activeDOMObjectName() const final;
     79    bool canSuspendForDocumentSuspension() const final;
    7880
    7981    void mediaStreamIsReady(Ref<MediaStream>&&);
     
    8183    class PendingActivationMediaStream : public RefCounted<PendingActivationMediaStream>, private MediaStreamPrivate::Observer {
    8284    public:
    83         static Ref<PendingActivationMediaStream> create(Ref<UserMediaRequest>&& request, Ref<MediaStream>&& stream)
     85        static Ref<PendingActivationMediaStream> create(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream)
    8486        {
    85             return adoptRef(*new PendingActivationMediaStream { WTFMove(request), WTFMove(stream) });
     87            return adoptRef(*new PendingActivationMediaStream { WTFMove(protectingUserMediaRequest), userMediaRequest, WTFMove(stream) });
    8688        }
    8789        ~PendingActivationMediaStream();
    8890
    8991    private:
    90         PendingActivationMediaStream(Ref<UserMediaRequest>&&, Ref<MediaStream>&&);
     92        PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&&);
    9193
    9294        void characteristicsChanged() final;
    9395
    94         Ref<UserMediaRequest> m_userMediaRequest;
     96        Ref<PendingActivity<UserMediaRequest>> m_protectingUserMediaRequest;
     97        UserMediaRequest& m_userMediaRequest;
    9598        Ref<MediaStream> m_mediaStream;
    9699    };
Note: See TracChangeset for help on using the changeset viewer.