Changeset 226171 in webkit
- Timestamp:
- Dec 19, 2017 7:17:24 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r226168 r226171 1 2017-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 1 19 2017-12-19 Antti Koivisto <antti@apple.com> 2 20 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
r226160 r226171 61 61 62 62 UserMediaRequest::UserMediaRequest(Document& document, MediaStreamRequest&& request, DOMPromiseDeferred<IDLInterface<MediaStream>>&& promise) 63 : ContextDestructionObserver(&document)63 : ActiveDOMObject(&document) 64 64 , m_promise(WTFMove(promise)) 65 65 , m_request(WTFMove(request)) 66 66 { 67 suspendIfNeeded(); 67 68 } 68 69 … … 204 205 RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDevice ? audioDevice.persistentId().utf8().data() : "", videoDevice ? videoDevice.persistentId().utf8().data() : ""); 205 206 206 auto callback = [this, protect edThis = makeRef(*this)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {207 auto callback = [this, protector = makePendingActivity(*this)](RefPtr<MediaStreamPrivate>&& privateStream) mutable { 207 208 if (!m_scriptExecutionContext) 208 209 return; … … 220 221 } 221 222 222 m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protect edThis), WTFMove(stream));223 m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protector), *this, WTFMove(stream)); 223 224 }; 224 225 … … 275 276 } 276 277 277 void UserMediaRequest::contextDestroyed() 278 { 279 if (!m_scriptExecutionContext) 280 return; 281 278 void UserMediaRequest::stop() 279 { 282 280 auto& document = downcast<Document>(*m_scriptExecutionContext); 283 281 auto* controller = UserMediaController::from(document.page()); … … 291 289 } 292 290 291 const char* UserMediaRequest::activeDOMObjectName() const 292 { 293 return "UserMediaRequest"; 294 } 295 296 bool UserMediaRequest::canSuspendForDocumentSuspension() const 297 { 298 return !hasPendingActivity(); 299 } 300 293 301 Document* UserMediaRequest::document() const 294 302 { … … 296 304 } 297 305 298 UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<UserMediaRequest>&& request, Ref<MediaStream>&& stream) 299 : m_userMediaRequest(WTFMove(request)) 306 UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream) 307 : m_protectingUserMediaRequest(WTFMove(protectingUserMediaRequest)) 308 , m_userMediaRequest(userMediaRequest) 300 309 , m_mediaStream(WTFMove(stream)) 301 310 { … … 312 321 { 313 322 if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio()) 314 m_userMediaRequest ->mediaStreamIsReady(m_mediaStream.copyRef());323 m_userMediaRequest.mediaStreamIsReady(m_mediaStream.copyRef()); 315 324 } 316 325 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h
r226160 r226171 47 47 class SecurityOrigin; 48 48 49 class UserMediaRequest : public RefCounted<UserMediaRequest>, p rivate ContextDestructionObserver{49 class UserMediaRequest : public RefCounted<UserMediaRequest>, public ActiveDOMObject { 50 50 public: 51 51 static RefPtr<UserMediaRequest> create(Document&, MediaStreamRequest&&, DOMPromiseDeferred<IDLInterface<MediaStream>>&&); … … 75 75 UserMediaRequest(Document&, MediaStreamRequest&&, DOMPromiseDeferred<IDLInterface<MediaStream>>&&); 76 76 77 void contextDestroyed() final; 77 void stop() final; 78 const char* activeDOMObjectName() const final; 79 bool canSuspendForDocumentSuspension() const final; 78 80 79 81 void mediaStreamIsReady(Ref<MediaStream>&&); … … 81 83 class PendingActivationMediaStream : public RefCounted<PendingActivationMediaStream>, private MediaStreamPrivate::Observer { 82 84 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) 84 86 { 85 return adoptRef(*new PendingActivationMediaStream { WTFMove( request), WTFMove(stream) });87 return adoptRef(*new PendingActivationMediaStream { WTFMove(protectingUserMediaRequest), userMediaRequest, WTFMove(stream) }); 86 88 } 87 89 ~PendingActivationMediaStream(); 88 90 89 91 private: 90 PendingActivationMediaStream(Ref< UserMediaRequest>&&, Ref<MediaStream>&&);92 PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&&); 91 93 92 94 void characteristicsChanged() final; 93 95 94 Ref<UserMediaRequest> m_userMediaRequest; 96 Ref<PendingActivity<UserMediaRequest>> m_protectingUserMediaRequest; 97 UserMediaRequest& m_userMediaRequest; 95 98 Ref<MediaStream> m_mediaStream; 96 99 };
Note: See TracChangeset
for help on using the changeset viewer.