Title: [226171] trunk/Source/WebCore
Revision
226171
Author
[email protected]
Date
2017-12-19 19:17:24 -0800 (Tue, 19 Dec 2017)

Log Message

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

Patch by Youenn Fablet <[email protected]> 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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (226170 => 226171)


--- trunk/Source/WebCore/ChangeLog	2017-12-20 01:58:41 UTC (rev 226170)
+++ trunk/Source/WebCore/ChangeLog	2017-12-20 03:17:24 UTC (rev 226171)
@@ -1,3 +1,21 @@
+2017-12-19  Youenn Fablet  <[email protected]>
+
+        UserMediaRequest should stop a request when Document is being stopped
+        https://bugs.webkit.org/show_bug.cgi?id=180962
+
+        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:
+
 2017-12-19  Antti Koivisto  <[email protected]>
 
         Move first-letter building code to RenderTreeBuilder

Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (226170 => 226171)


--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2017-12-20 01:58:41 UTC (rev 226170)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2017-12-20 03:17:24 UTC (rev 226171)
@@ -60,10 +60,11 @@
 }
 
 UserMediaRequest::UserMediaRequest(Document& document, MediaStreamRequest&& request, DOMPromiseDeferred<IDLInterface<MediaStream>>&& promise)
-    : ContextDestructionObserver(&document)
+    : ActiveDOMObject(&document)
     , m_promise(WTFMove(promise))
     , m_request(WTFMove(request))
 {
+    suspendIfNeeded();
 }
 
 UserMediaRequest::~UserMediaRequest() = default;
@@ -203,7 +204,7 @@
 {
     RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDevice ? audioDevice.persistentId().utf8().data() : "", videoDevice ? videoDevice.persistentId().utf8().data() : "");
 
-    auto callback = [this, protectedThis = makeRef(*this)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
+    auto callback = [this, protector = makePendingActivity(*this)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
         if (!m_scriptExecutionContext)
             return;
 
@@ -219,7 +220,7 @@
             return;
         }
 
-        m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protectedThis), WTFMove(stream));
+        m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protector), *this, WTFMove(stream));
     };
 
     m_request.audioConstraints.deviceIDHashSalt = deviceIdentifierHashSalt;
@@ -274,11 +275,8 @@
     }
 }
 
-void UserMediaRequest::contextDestroyed()
+void UserMediaRequest::stop()
 {
-    if (!m_scriptExecutionContext)
-        return;
-
     auto& document = downcast<Document>(*m_scriptExecutionContext);
     auto* controller = UserMediaController::from(document.page());
 
@@ -290,13 +288,24 @@
     controller->cancelUserMediaAccessRequest(*this);
 }
 
+const char* UserMediaRequest::activeDOMObjectName() const
+{
+    return "UserMediaRequest";
+}
+
+bool UserMediaRequest::canSuspendForDocumentSuspension() const
+{
+    return !hasPendingActivity();
+}
+
 Document* UserMediaRequest::document() const
 {
     return downcast<Document>(m_scriptExecutionContext);
 }
 
-UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<UserMediaRequest>&& request, Ref<MediaStream>&& stream)
-    : m_userMediaRequest(WTFMove(request))
+UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream)
+    : m_protectingUserMediaRequest(WTFMove(protectingUserMediaRequest))
+    , m_userMediaRequest(userMediaRequest)
     , m_mediaStream(WTFMove(stream))
 {
     m_mediaStream->privateStream().addObserver(*this);
@@ -311,7 +320,7 @@
 void UserMediaRequest::PendingActivationMediaStream::characteristicsChanged()
 {
     if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio())
-        m_userMediaRequest->mediaStreamIsReady(m_mediaStream.copyRef());
+        m_userMediaRequest.mediaStreamIsReady(m_mediaStream.copyRef());
 }
 
 void UserMediaRequest::mediaStreamIsReady(Ref<MediaStream>&& stream)

Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (226170 => 226171)


--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h	2017-12-20 01:58:41 UTC (rev 226170)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h	2017-12-20 03:17:24 UTC (rev 226171)
@@ -46,7 +46,7 @@
 class MediaStream;
 class SecurityOrigin;
 
-class UserMediaRequest : public RefCounted<UserMediaRequest>, private ContextDestructionObserver {
+class UserMediaRequest : public RefCounted<UserMediaRequest>, public ActiveDOMObject {
 public:
     static RefPtr<UserMediaRequest> create(Document&, MediaStreamRequest&&, DOMPromiseDeferred<IDLInterface<MediaStream>>&&);
     virtual ~UserMediaRequest();
@@ -74,24 +74,27 @@
 private:
     UserMediaRequest(Document&, MediaStreamRequest&&, DOMPromiseDeferred<IDLInterface<MediaStream>>&&);
 
-    void contextDestroyed() final;
+    void stop() final;
+    const char* activeDOMObjectName() const final;
+    bool canSuspendForDocumentSuspension() const final;
 
     void mediaStreamIsReady(Ref<MediaStream>&&);
 
     class PendingActivationMediaStream : public RefCounted<PendingActivationMediaStream>, private MediaStreamPrivate::Observer {
     public:
-        static Ref<PendingActivationMediaStream> create(Ref<UserMediaRequest>&& request, Ref<MediaStream>&& stream)
+        static Ref<PendingActivationMediaStream> create(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream)
         {
-            return adoptRef(*new PendingActivationMediaStream { WTFMove(request), WTFMove(stream) });
+            return adoptRef(*new PendingActivationMediaStream { WTFMove(protectingUserMediaRequest), userMediaRequest, WTFMove(stream) });
         }
         ~PendingActivationMediaStream();
 
     private:
-        PendingActivationMediaStream(Ref<UserMediaRequest>&&, Ref<MediaStream>&&);
+        PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&&);
 
         void characteristicsChanged() final;
 
-        Ref<UserMediaRequest> m_userMediaRequest;
+        Ref<PendingActivity<UserMediaRequest>> m_protectingUserMediaRequest;
+        UserMediaRequest& m_userMediaRequest;
         Ref<MediaStream> m_mediaStream;
     };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to