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;
};