Changeset 249574 in webkit
- Timestamp:
- Sep 6, 2019 8:49:39 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r249572 r249574 1 2019-09-06 Youenn Fablet <youenn@apple.com> 2 3 Remove MediaStreamPrivate::scheduleDeferredTask 4 https://bugs.webkit.org/show_bug.cgi?id=200975 5 6 Reviewed by Eric Carlson. 7 8 * web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt: 9 1 10 2019-09-06 Rob Buis <rbuis@igalia.com> 2 11 -
trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt
r223189 r249574 6 6 7 7 8 FAIL 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 8 PASS Tests that adding a track to an inactive MediaStream is allowed 9 9 -
trunk/Source/WebCore/ChangeLog
r249572 r249574 1 2019-09-06 Youenn Fablet <youenn@apple.com> 2 3 Remove MediaStreamPrivate::scheduleDeferredTask 4 https://bugs.webkit.org/show_bug.cgi?id=200975 5 6 Reviewed by Eric Carlson. 7 8 All calls to scheduleDeferredTask are done on the main thread. 9 This was initially done to trigger less reconfiguration. 10 But this makes the implementation significantly more complex. 11 12 For instance, we have to wait for the document to update its media state 13 and send it to UIProcess before calling the allow completion handler. 14 15 Covered by existing tests. 16 17 * Modules/mediastream/MediaStream.cpp: 18 (WebCore::MediaStream::MediaStream): 19 Make sure to update the document media state once the tracks have been added, similarly to the other constructor. 20 This ensures the document media state is computed with the new MediaStreamTrack. 21 * Modules/mediastream/UserMediaRequest.cpp: 22 (WebCore::isMediaStreamCorrectlyStarted): 23 (WebCore::UserMediaRequest::allow): 24 (WebCore::UserMediaRequest::stop): 25 (WebCore::UserMediaRequest::mediaStreamDidFail): 26 * Modules/mediastream/UserMediaRequest.h: 27 * page/MediaProducer.h: 28 (WebCore::MediaProducer::isCapturing): 29 Make sure to include getDisplayMedia as part of capture check. 30 * platform/mediastream/MediaStreamPrivate.cpp: 31 (WebCore::MediaStreamPrivate::trackMutedChanged): 32 (WebCore::MediaStreamPrivate::trackEnabledChanged): 33 (WebCore::MediaStreamPrivate::trackStarted): 34 (WebCore::MediaStreamPrivate::trackEnded): 35 * platform/mediastream/MediaStreamPrivate.h: 36 1 37 2019-09-06 Rob Buis <rbuis@igalia.com> 2 38 -
trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp
r248467 r249574 102 102 ALWAYS_LOG(LOGIDENTIFIER); 103 103 104 setIsActive(m_private->active());105 m_private->addObserver(*this);106 107 104 for (auto& trackPrivate : m_private->tracks()) { 108 105 auto track = MediaStreamTrack::create(document, *trackPrivate); … … 110 107 m_trackSet.add(track->id(), WTFMove(track)); 111 108 } 109 110 setIsActive(m_private->active()); 111 m_private->addObserver(*this); 112 112 suspendIfNeeded(); 113 113 } -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
r248896 r249574 216 216 } 217 217 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 218 228 void UserMediaRequest::allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&& completionHandler) 219 229 { … … 221 231 222 232 auto callback = [this, protector = makePendingActivity(*this), completionHandler = WTFMove(completionHandler)](RefPtr<MediaStreamPrivate>&& privateStream) mutable { 223 auto scopeExit = makeScopeExit([ &]{233 auto scopeExit = makeScopeExit([completionHandler = WTFMove(completionHandler)]() mutable { 224 234 completionHandler(); 225 235 }); 226 if ( !m_scriptExecutionContext)236 if (isContextStopped()) 227 237 return; 228 238 … … 232 242 return; 233 243 } 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()) { 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)) { 238 252 deny(MediaAccessDenialReason::HardwareError); 239 253 return; 240 254 } 241 255 242 scopeExit.release(); 243 m_pendingActivationMediaStream = makeUnique<PendingActivationMediaStream>(WTFMove(protector), *this, WTFMove(stream), WTFMove(completionHandler)); 256 ASSERT(document.isCapturing()); 257 stream->document()->setHasCaptureMediaStreamTrack(); 258 m_promise.resolve(WTFMove(stream)); 244 259 }; 245 260 … … 311 326 void UserMediaRequest::stop() 312 327 { 313 // Protecting 'this' since nulling m_pendingActivationMediaStream might destroy it.314 Ref<UserMediaRequest> protectedThis(*this);315 316 m_pendingActivationMediaStream = nullptr;317 318 328 auto& document = downcast<Document>(*m_scriptExecutionContext); 319 329 if (auto* controller = UserMediaController::from(document.page())) … … 334 344 { 335 345 return downcast<Document>(m_scriptExecutionContext); 336 }337 338 UserMediaRequest::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 348 UserMediaRequest::PendingActivationMediaStream::~PendingActivationMediaStream()349 {350 m_mediaStream->privateStream().removeObserver(*this);351 m_completionHandler();352 if (auto* document = m_mediaStream->document())353 document->updateIsPlayingMedia();354 }355 356 void 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 374 void 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;380 346 } 381 347 … … 396 362 } 397 363 m_promise.reject(NotReadableError, makeString("Failed starting capture of a "_s, typeDescription, " track"_s)); 398 m_pendingActivationMediaStream = nullptr;399 364 } 400 365 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h
r248896 r249574 80 80 bool canSuspendForDocumentSuspension() const final; 81 81 82 void mediaStreamIsReady(Ref<MediaStream>&&);83 82 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 };99 83 100 84 Vector<String> m_videoDeviceUIDs; … … 102 86 103 87 DOMPromiseDeferred<IDLInterface<MediaStream>> m_promise; 104 std::unique_ptr<PendingActivationMediaStream> m_pendingActivationMediaStream;105 88 MediaStreamRequest m_request; 106 89 }; -
trunk/Source/WebCore/page/MediaProducer.h
r244815 r249574 59 59 VideoCaptureMask = HasActiveVideoCaptureDevice | HasMutedVideoCaptureDevice | HasInterruptedVideoCaptureDevice, 60 60 DisplayCaptureMask = HasActiveDisplayCaptureDevice | HasMutedDisplayCaptureDevice | HasInterruptedDisplayCaptureDevice, 61 ActiveCaptureMask = HasActiveAudioCaptureDevice | HasActiveVideoCaptureDevice | HasActiveDisplayCaptureDevice, 61 62 MutedCaptureMask = HasMutedAudioCaptureDevice | HasMutedVideoCaptureDevice | HasMutedDisplayCaptureDevice, 62 63 MediaCaptureMask = AudioCaptureMask | VideoCaptureMask | DisplayCaptureMask, … … 64 65 typedef unsigned MediaStateFlags; 65 66 66 static bool isCapturing(MediaStateFlags state) { return (state & HasActiveAudioCaptureDevice) || (state & HasActiveVideoCaptureDevice) || (state & HasMutedAudioCaptureDevice) || (state & HasMutedVideoCaptureDevice); }67 static bool isCapturing(MediaStateFlags state) { return (state & ActiveCaptureMask) || (state & MutedCaptureMask); } 67 68 68 69 virtual MediaStateFlags mediaState() const = 0; -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp
r246436 r249574 283 283 284 284 ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier(), " ", track.muted()); 285 scheduleDeferredTask([this] { 286 characteristicsChanged(); 287 }); 285 characteristicsChanged(); 288 286 } 289 287 … … 302 300 updateActiveVideoTrack(); 303 301 304 scheduleDeferredTask([this] { 305 characteristicsChanged(); 306 }); 302 characteristicsChanged(); 307 303 } 308 304 … … 314 310 315 311 ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier()); 316 scheduleDeferredTask([this] { 317 characteristicsChanged(); 318 }); 312 characteristicsChanged(); 319 313 } 320 314 … … 326 320 327 321 ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier()); 328 scheduleDeferredTask([this] { 329 updateActiveState(NotifyClientOption::Notify); 330 characteristicsChanged(); 331 }); 332 } 333 334 void 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 }); 322 updateActiveState(NotifyClientOption::Notify); 323 characteristicsChanged(); 343 324 } 344 325 -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h
r246436 r249574 48 48 #include <wtf/UUID.h> 49 49 #include <wtf/Vector.h> 50 #include <wtf/WeakPtr.h>51 50 52 51 namespace WebCore { … … 58 57 : public MediaStreamTrackPrivate::Observer 59 58 , public RefCounted<MediaStreamPrivate> 60 , public CanMakeWeakPtr<MediaStreamPrivate>61 59 #if !RELEASE_LOG_DISABLED 62 60 , private LoggerHelper … … 129 127 void updateActiveVideoTrack(); 130 128 131 void scheduleDeferredTask(Function<void ()>&&);132 129 void forEachObserver(const WTF::Function<void(Observer&)>&) const; 133 130
Note: See TracChangeset
for help on using the changeset viewer.