Changeset 243899 in webkit
- Timestamp:
- Apr 4, 2019, 1:44:29 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 20 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/mediastream/media-stream-page-muted-expected.txt (added)
-
LayoutTests/fast/mediastream/media-stream-page-muted.html (added)
-
LayoutTests/fast/mediastream/media-stream-track-interrupted.html (modified) (3 diffs)
-
LayoutTests/fast/mediastream/media-stream-track-muted.html (modified) (4 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/mediastream/MediaStream.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (modified) (6 diffs)
-
Source/WebCore/Modules/mediastream/MediaStreamTrack.h (modified) (2 diffs)
-
Source/WebCore/page/MediaProducer.h (modified) (2 diffs)
-
Source/WebCore/page/Page.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/MediaStreamPrivate.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (modified) (2 diffs)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKPagePrivate.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (modified) (2 diffs)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (modified) (2 diffs)
-
Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (3 diffs)
-
Source/WebKit/UIProcess/WebPageProxy.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r243893 r243899 1 2019-04-04 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Host should be able to mute screen capture and camera/microphone independently 4 https://bugs.webkit.org/show_bug.cgi?id=196555 5 <rdar://problem/47303865> 6 7 Reviewed by Youenn Fablet. 8 9 * fast/mediastream/media-stream-page-muted-expected.txt: Added. 10 * fast/mediastream/media-stream-page-muted.html: Added. 11 * fast/mediastream/media-stream-track-interrupted.html: Read page muted state before 12 interrupting capture track because the page state now changes immediately. 13 * fast/mediastream/media-stream-track-muted.html: Ditto, for muting. 14 1 15 2019-04-04 Antti Koivisto <antti@apple.com> 2 16 -
trunk/LayoutTests/fast/mediastream/media-stream-track-interrupted.html
r237837 r243899 46 46 track.onmute = () => { 47 47 new Promise((innerResolve, innerReject) => { 48 waitForPageStateChange(10, internals.pageMediaState(), innerResolve, innerReject)48 waitForPageStateChange(10, pageState, innerResolve, innerReject) 49 49 }).then((pageMediaState) => { 50 50 51 51 track.onunmute = (evt) => { 52 waitForPageStateChange(10, internals.pageMediaState(), resolve, reject)52 waitForPageStateChange(10, pageState, resolve, reject) 53 53 } 54 54 … … 58 58 assert_true(pageMediaState.includes(isVideo ? 'HasActiveAudioCaptureDevice' : 'HasActiveVideoCaptureDevice')); 59 59 assert_false(pageMediaState.includes(isVideo ? 'HasActiveVideoCaptureDevice' : 'HasActiveAudioCaptureDevice')); 60 pageState = internals.pageMediaState(); 60 61 internals.setMediaStreamSourceInterrupted(track, false) 61 62 } … … 63 64 } 64 65 65 if (window.internals) 66 if (window.internals) { 67 pageState = internals.pageMediaState(); 66 68 internals.setMediaStreamSourceInterrupted(track, true); 69 } 67 70 setTimeout(() => reject("Muted state did not change in 1 second"), 1000); 68 71 }); -
trunk/LayoutTests/fast/mediastream/media-stream-track-muted.html
r217775 r243899 40 40 track.onmute = () => { 41 41 new Promise((innerResolve, innerReject) => { 42 waitForPageStateChange(10, internals.pageMediaState(), innerResolve, innerReject)42 waitForPageStateChange(10, pageState, innerResolve, innerReject) 43 43 }).then((pageMediaState) => { 44 44 45 45 track.onunmute = (evt) => { 46 waitForPageStateChange(10, internals.pageMediaState(), resolve, reject)46 waitForPageStateChange(10, pageState, resolve, reject) 47 47 } 48 48 … … 52 52 assert_true(pageMediaState.includes(isVideo ? 'HasActiveAudioCaptureDevice' : 'HasActiveVideoCaptureDevice')); 53 53 assert_false(pageMediaState.includes(isVideo ? 'HasActiveVideoCaptureDevice' : 'HasActiveAudioCaptureDevice')); 54 pageState = internals.pageMediaState(); 54 55 internals.setMediaStreamTrackMuted(track, false) 55 56 } … … 57 58 } 58 59 59 if (window.internals) 60 if (window.internals) { 61 pageState = internals.pageMediaState(); 60 62 internals.setMediaStreamTrackMuted(track, true); 63 } 61 64 setTimeout(() => reject("Muted state did not change in .5 second"), 500); 62 65 }); … … 72 75 }, "Create stream"); 73 76 74 75 77 </script> 76 78 </head> -
trunk/Source/WebCore/ChangeLog
r243895 r243899 1 2019-04-04 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Host should be able to mute screen capture and camera/microphone independently 4 https://bugs.webkit.org/show_bug.cgi?id=196555 5 <rdar://problem/47303865> 6 7 Reviewed by Youenn Fablet. 8 9 Test: fast/mediastream/media-stream-page-muted.html 10 11 * Modules/mediastream/MediaStream.cpp: 12 (WebCore::MediaStream::MediaStream): Call setCaptureTracksMuted to pass page muted 13 state to tracks. 14 (WebCore::MediaStream::startProducingData): Ditto. 15 (WebCore::MediaStream::setCaptureTracksMuted): New. 16 * Modules/mediastream/MediaStream.h: 17 18 * Modules/mediastream/MediaStreamTrack.cpp: 19 (WebCore::MediaStreamTrack::MediaStreamTrack): Call setMuted with page muted state. 20 (WebCore::MediaStreamTrack::setMuted): Set muted according to page state and source type. 21 (WebCore::MediaStreamTrack::pageMutedStateDidChange): Call setMuted. 22 (WebCore::MediaStreamTrack::mediaState const): Update for new page state. 23 * Modules/mediastream/MediaStreamTrack.h: 24 25 * page/MediaProducer.h: Split capture muted state into two: camera/microphone and screen. 26 27 * page/Page.h: 28 (WebCore::Page::isMediaCaptureMuted const): Update for state changes. 29 30 * platform/mediastream/MediaStreamPrivate.cpp: 31 (WebCore::MediaStreamPrivate::setCaptureTracksMuted): Deleted. 32 (WebCore::MediaStreamPrivate::hasCaptureVideoSource const): Deleted. 33 * platform/mediastream/MediaStreamPrivate.h: 34 35 * platform/mediastream/RealtimeMediaSource.cpp: 36 (WebCore::RealtimeMediaSource::setMuted): Log state. 37 (WebCore::RealtimeMediaSource::notifyMutedChange): Call notifyMutedObservers on the 38 next runloop so events aren't dispatched synchronously. 39 40 * testing/Internals.cpp: 41 (WebCore::Internals::setPageMuted): Add new state. 42 1 43 2019-04-04 Chris Dumez <cdumez@apple.com> 2 44 -
trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp
r243887 r243899 120 120 #endif 121 121 setIsActive(m_private->active()); 122 if (document()->page() && document()->page()->isMediaCaptureMuted())123 m_private->setCaptureTracksMuted(true);124 122 m_private->addObserver(*this); 125 123 MediaStreamRegistry::shared().registerStream(*this); … … 327 325 m_mediaSession->canProduceAudioChanged(); 328 326 m_private->startProducingData(); 329 330 if (document->page()->isMediaCaptureMuted())331 m_private->setCaptureTracksMuted(true);332 327 } 333 328 -
trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp
r243887 r243899 72 72 m_private->addObserver(*this); 73 73 74 if (auto document = this->document()) 74 if (auto document = this->document()) { 75 75 document->addAudioProducer(*this); 76 if (isCaptureTrack() && document->page() && document->page()->mutedState()) 77 setMuted(document->page()->mutedState()); 78 } 76 79 } 77 80 … … 170 173 { 171 174 return m_private->muted(); 175 } 176 177 void MediaStreamTrack::setMuted(MediaProducer::MutedStateFlags state) 178 { 179 bool trackMuted = false; 180 switch (source().deviceType()) { 181 case CaptureDevice::DeviceType::Microphone: 182 case CaptureDevice::DeviceType::Camera: 183 trackMuted = state & AudioAndVideoCaptureIsMuted; 184 break; 185 case CaptureDevice::DeviceType::Screen: 186 case CaptureDevice::DeviceType::Window: 187 trackMuted = state & ScreenCaptureIsMuted; 188 break; 189 case CaptureDevice::DeviceType::Unknown: 190 ASSERT_NOT_REACHED(); 191 break; 192 } 193 194 m_private->setMuted(trackMuted); 172 195 } 173 196 … … 374 397 return; 375 398 376 m_private->setMuted(document->page()->isMediaCaptureMuted());399 setMuted(document->page()->mutedState()); 377 400 } 378 401 … … 386 409 return IsNotPlaying; 387 410 388 bool pageCaptureMuted = document->page()->isMediaCaptureMuted();389 390 411 if (source().type() == RealtimeMediaSource::Type::Audio) { 391 if (source().interrupted() && ! pageCaptureMuted)412 if (source().interrupted() && !source().muted()) 392 413 return HasInterruptedAudioCaptureDevice; 393 414 if (muted()) … … 398 419 auto deviceType = source().deviceType(); 399 420 ASSERT(deviceType == CaptureDevice::DeviceType::Camera || deviceType == CaptureDevice::DeviceType::Screen || deviceType == CaptureDevice::DeviceType::Window); 400 if (source().interrupted() && ! pageCaptureMuted)421 if (source().interrupted() && !source().muted()) 401 422 return deviceType == CaptureDevice::DeviceType::Camera ? HasInterruptedVideoCaptureDevice : HasInterruptedDisplayCaptureDevice; 402 423 if (muted()) … … 443 464 return; 444 465 445 AtomicString eventType = muted() ? eventNames().muteEvent : eventNames().unmuteEvent; 446 dispatchEvent(Event::create(eventType, Event::CanBubble::No, Event::IsCancelable::No)); 466 m_eventTaskQueue.enqueueTask([this, muted = this->muted()] { 467 AtomicString eventType = muted ? eventNames().muteEvent : eventNames().unmuteEvent; 468 dispatchEvent(Event::create(eventType, Event::CanBubble::No, Event::IsCancelable::No)); 469 }); 447 470 448 471 configureTrackRendering(); -
trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h
r243887 r243899 83 83 84 84 bool muted() const; 85 void setMuted(MediaProducer::MutedStateFlags); 85 86 86 87 enum class State { Live, Ended }; … … 200 201 Optional<DOMPromiseDeferred<void>> m_promise; 201 202 GenericTaskQueue<ScriptExecutionContext> m_taskQueue; 203 GenericTaskQueue<Timer> m_eventTaskQueue; 202 204 203 205 bool m_ended { false }; -
trunk/Source/WebCore/page/MediaProducer.h
r239840 r243899 57 57 VideoCaptureMask = HasActiveVideoCaptureDevice | HasMutedVideoCaptureDevice | HasInterruptedVideoCaptureDevice, 58 58 DisplayCaptureMask = HasActiveDisplayCaptureDevice | HasMutedDisplayCaptureDevice | HasInterruptedDisplayCaptureDevice, 59 MutedCaptureMask = HasMutedAudioCaptureDevice | HasMutedVideoCaptureDevice | HasMutedDisplayCaptureDevice, 59 60 MediaCaptureMask = AudioCaptureMask | VideoCaptureMask | DisplayCaptureMask, 60 61 }; … … 68 69 NoneMuted = 0, 69 70 AudioIsMuted = 1 << 0, 70 CaptureDevicesAreMuted = 1 << 1, 71 AudioAndVideoCaptureIsMuted = 1 << 1, 72 ScreenCaptureIsMuted = 1 << 2, 73 74 MediaStreamCaptureIsMuted = AudioAndVideoCaptureIsMuted | ScreenCaptureIsMuted, 71 75 }; 72 76 typedef unsigned MutedStateFlags; -
trunk/Source/WebCore/page/Page.h
r243762 r243899 622 622 MediaProducer::MutedStateFlags mutedState() const { return m_mutedState; } 623 623 bool isAudioMuted() const { return m_mutedState & MediaProducer::AudioIsMuted; } 624 bool isMediaCaptureMuted() const { return m_mutedState & MediaProducer:: CaptureDevicesAreMuted; };624 bool isMediaCaptureMuted() const { return m_mutedState & MediaProducer::MediaStreamCaptureIsMuted; }; 625 625 void schedulePlaybackControlsManagerUpdate(); 626 626 WEBCORE_EXPORT void setMuted(MediaProducer::MutedStateFlags); -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp
r243666 r243899 194 194 } 195 195 196 void MediaStreamPrivate::setCaptureTracksMuted(bool muted)197 {198 ALWAYS_LOG(LOGIDENTIFIER, muted);199 for (auto& track : m_trackSet.values()) {200 if (track->isCaptureTrack())201 track->setMuted(muted);202 }203 }204 205 196 bool MediaStreamPrivate::hasVideo() const 206 197 { -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h
r243033 r243899 106 106 bool hasCaptureVideoSource() const; 107 107 bool hasCaptureAudioSource() const; 108 void setCaptureTracksMuted(bool);109 108 110 109 FloatSize intrinsicSize() const; -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp
r243033 r243899 92 92 void RealtimeMediaSource::setMuted(bool muted) 93 93 { 94 ALWAYS_LOG_IF(m_logger, LOGIDENTIFIER );94 ALWAYS_LOG_IF(m_logger, LOGIDENTIFIER, muted); 95 95 96 96 if (muted) … … 111 111 return; 112 112 113 ALWAYS_LOG_IF(m_logger, LOGIDENTIFIER );113 ALWAYS_LOG_IF(m_logger, LOGIDENTIFIER, muted); 114 114 m_muted = muted; 115 115 -
trunk/Source/WebCore/testing/Internals.cpp
r243811 r243899 4053 4053 state |= MediaProducer::AudioIsMuted; 4054 4054 if (equalLettersIgnoringASCIICase(stateString, "capturedevices")) 4055 state |= MediaProducer::CaptureDevicesAreMuted; 4055 state |= MediaProducer::AudioAndVideoCaptureIsMuted; 4056 if (equalLettersIgnoringASCIICase(stateString, "screencapture")) 4057 state |= MediaProducer::ScreenCaptureIsMuted; 4056 4058 } 4057 4059 -
trunk/Source/WebKit/ChangeLog
r243888 r243899 1 2019-04-04 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] Host should be able to mute screen capture and camera/microphone independently 4 https://bugs.webkit.org/show_bug.cgi?id=196555 5 <rdar://problem/47303865> 6 7 Reviewed by Youenn Fablet. 8 9 * UIProcess/API/C/WKPagePrivate.h: Add kWKMediaScreenCaptureMuted. 10 11 * UIProcess/API/Cocoa/WKWebView.mm: 12 (-[WKWebView _setPageMuted:]): 13 (-[WKWebView _setMediaCaptureMuted:]): Deleted, it was unused. 14 (-[WKWebView _muteMediaCapture]): Deleted, it was unused. 15 * UIProcess/API/Cocoa/WKWebViewPrivate.h: 16 17 * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: 18 (WebKit::UserMediaPermissionRequestManagerProxy::processUserMediaPermissionValidRequest): Fix 19 a log comment typo. 20 21 * UIProcess/WebPageProxy.cpp: 22 (WebKit::WebPageProxy::setMediaStreamCaptureMuted): Use the new flag. 23 (WebKit::WebPageProxy::activateMediaStreamCaptureInPage): Ditto. 24 (WebKit::WebPageProxy::setMuted): Ditto. 25 * UIProcess/WebPageProxy.h: 26 (WebKit::WebPageProxy::isMediaStreamCaptureMuted const): Ditto. 27 1 28 2019-04-04 Per Arne Vollan <pvollan@apple.com> 2 29 -
trunk/Source/WebKit/UIProcess/API/C/WKPagePrivate.h
r241451 r243899 127 127 kWKMediaAudioMuted = 1 << 0, 128 128 kWKMediaCaptureDevicesMuted = 1 << 1, 129 kWKMediaScreenCaptureMuted = 1 << 2, 129 130 }; 130 131 typedef uint32_t WKMediaMutedState; -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r243787 r243899 5777 5777 } 5778 5778 5779 - (void)_setMediaCaptureMuted:(BOOL)muted5780 {5781 _page->setMediaStreamCaptureMuted(muted);5782 }5783 5784 - (void)_muteMediaCapture5785 {5786 _page->setMediaStreamCaptureMuted(true);5787 }5788 5789 5779 - (void)_setMediaCaptureEnabled:(BOOL)enabled 5790 5780 { … … 5804 5794 coreState |= WebCore::MediaProducer::AudioIsMuted; 5805 5795 if (mutedState & _WKMediaCaptureDevicesMuted) 5806 coreState |= WebCore::MediaProducer::CaptureDevicesAreMuted; 5796 coreState |= WebCore::MediaProducer::AudioAndVideoCaptureIsMuted; 5797 if (mutedState & _WKMediaScreenCaptureMuted) 5798 coreState |= WebCore::MediaProducer::ScreenCaptureIsMuted; 5807 5799 5808 5800 _page->setMuted(coreState); -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
r243523 r243899 54 54 _WKMediaAudioMuted = 1 << 0, 55 55 _WKMediaCaptureDevicesMuted = 1 << 1, 56 _WKMediaScreenCaptureMuted = 1 << 2, 56 57 } WK_API_AVAILABLE(macos(10.13), ios(11.0)); 57 58 … … 408 409 @property (nonatomic, readonly) _WKMediaCaptureState _mediaCaptureState WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 409 410 410 - (void)_setMediaCaptureMuted:(BOOL)muted WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));411 - (void)_muteMediaCapture WK_API_AVAILABLE(macos(10.13), ios(11.0));412 411 - (void)_setPageMuted:(_WKMediaMutedState)mutedState WK_API_AVAILABLE(macos(10.13), ios(11.0)); 413 412 -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
r243328 r243899 430 430 void UserMediaPermissionRequestManagerProxy::processUserMediaPermissionValidRequest(Ref<UserMediaPermissionRequestProxy>&& request, Vector<CaptureDevice>&& audioDevices, Vector<CaptureDevice>&& videoDevices, String&& deviceIdentifierHashSalt) 431 431 { 432 ALWAYS_LOG(LOGIDENTIFIER, request->userMediaID(), ", video: ,", videoDevices.size(), " audio: ", audioDevices.size());432 ALWAYS_LOG(LOGIDENTIFIER, request->userMediaID(), ", video: ", videoDevices.size(), " audio: ", audioDevices.size()); 433 433 if (videoDevices.isEmpty() && audioDevices.isEmpty()) { 434 434 denyRequest(request->userMediaID(), UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::NoConstraints, emptyString()); -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r243848 r243899 2057 2057 { 2058 2058 if (muted) 2059 setMuted(m_mutedState | WebCore::MediaProducer:: CaptureDevicesAreMuted);2059 setMuted(m_mutedState | WebCore::MediaProducer::MediaStreamCaptureIsMuted); 2060 2060 else 2061 setMuted(m_mutedState & ~WebCore::MediaProducer:: CaptureDevicesAreMuted);2061 setMuted(m_mutedState & ~WebCore::MediaProducer::MediaStreamCaptureIsMuted); 2062 2062 } 2063 2063 … … 2067 2067 UserMediaProcessManager::singleton().muteCaptureMediaStreamsExceptIn(*this); 2068 2068 #endif 2069 setMuted(m_mutedState & ~WebCore::MediaProducer:: CaptureDevicesAreMuted);2069 setMuted(m_mutedState & ~WebCore::MediaProducer::MediaStreamCaptureIsMuted); 2070 2070 } 2071 2071 … … 5349 5349 5350 5350 #if ENABLE(MEDIA_STREAM) 5351 bool hasMutedCaptureStreams = m_mediaState & (WebCore::MediaProducer::HasMutedAudioCaptureDevice | WebCore::MediaProducer::HasMutedVideoCaptureDevice);5352 if (hasMutedCaptureStreams && !(state & WebCore::MediaProducer:: CaptureDevicesAreMuted))5351 bool hasMutedCaptureStreams = m_mediaState & WebCore::MediaProducer::MutedCaptureMask; 5352 if (hasMutedCaptureStreams && !(state & WebCore::MediaProducer::MediaStreamCaptureIsMuted)) 5353 5353 UserMediaProcessManager::singleton().muteCaptureMediaStreamsExceptIn(*this); 5354 5354 #endif -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r243861 r243899 615 615 616 616 void activateMediaStreamCaptureInPage(); 617 bool isMediaStreamCaptureMuted() const { return m_mutedState & WebCore::MediaProducer:: CaptureDevicesAreMuted; }617 bool isMediaStreamCaptureMuted() const { return m_mutedState & WebCore::MediaProducer::MediaStreamCaptureIsMuted; } 618 618 void setMediaStreamCaptureMuted(bool); 619 619 void executeEditCommand(const String& commandName, const String& argument, WTF::Function<void(CallbackBase::Error)>&&);
Note:
See TracChangeset
for help on using the changeset viewer.