Changeset 235752 in webkit
- Timestamp:
- Sep 6, 2018, 12:59:33 PM (8 years ago)
- Location:
- trunk/Source
- Files:
-
- 17 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/html/HTMLMediaElement.cpp (modified) (9 diffs)
-
WebCore/html/HTMLMediaElement.h (modified) (2 diffs)
-
WebCore/html/MediaElementSession.cpp (modified) (1 diff)
-
WebCore/html/MediaElementSession.h (modified) (1 diff)
-
WebCore/platform/audio/PlatformMediaSession.h (modified) (2 diffs)
-
WebCore/platform/cocoa/PlaybackSessionModel.h (modified) (1 diff)
-
WebCore/platform/cocoa/PlaybackSessionModelMediaElement.h (modified) (1 diff)
-
WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm (modified) (1 diff)
-
WebCore/platform/ios/WebAVPlayerController.mm (modified) (4 diffs)
-
WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm (modified) (2 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.h (modified) (2 diffs)
-
WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.mm (modified) (2 diffs)
-
WebKit/WebProcess/cocoa/PlaybackSessionManager.h (modified) (1 diff)
-
WebKit/WebProcess/cocoa/PlaybackSessionManager.messages.in (modified) (1 diff)
-
WebKit/WebProcess/cocoa/PlaybackSessionManager.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r235749 r235752 1 2018-09-06 Jer Noble <jer.noble@apple.com> 2 3 Don't pause playback when locking screen if video is being displayed on second screen. 4 https://bugs.webkit.org/show_bug.cgi?id=189321 5 6 Reviewed by Eric Carlson. 7 8 Expand the existing behavior when AirPlaying to an external device to playing to a local 9 external screen. Don't pause when the screen locks, and don't stop buffering in that mode either. 10 11 Add a KVO-observer to the WebAVPlayerController's playingOnSecondScreen property, and pass 12 that observed value on to the media element. 13 14 * html/HTMLMediaElement.cpp: 15 (WebCore::HTMLMediaElement::setShouldPlayToPlaybackTarget): 16 (WebCore::HTMLMediaElement::setPlayingOnSecondScreen): 17 (WebCore::HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction const): 18 (WebCore::HTMLMediaElement::processingUserGestureForMedia const): 19 (WebCore::HTMLMediaElement::mediaState const): 20 (WebCore::HTMLMediaElement::purgeBufferedDataIfPossible): 21 (WebCore::HTMLMediaElement::shouldOverrideBackgroundLoadingRestriction const): 22 (WebCore::HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless const): Deleted. 23 (WebCore::HTMLMediaElement::canPlayToWirelessPlaybackTarget const): Deleted. 24 (WebCore::HTMLMediaElement::isPlayingToWirelessPlaybackTarget const): Deleted. 25 * html/HTMLMediaElement.h: 26 (WebCore::HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless const): 27 (WebCore::HTMLMediaElement::isPlayingToExternalTarget const): 28 * html/MediaElementSession.cpp: 29 (WebCore::MediaElementSession::canPlayToWirelessPlaybackTarget const): Deleted. 30 * html/MediaElementSession.h: 31 * platform/audio/PlatformMediaSession.h: 32 (WebCore::PlatformMediaSessionClient::setWirelessPlaybackTarget): 33 (WebCore::PlatformMediaSessionClient::isPlayingOnSecondScreen const): 34 (WebCore::PlatformMediaSession::canPlayToWirelessPlaybackTarget const): Deleted. 35 (WebCore::PlatformMediaSessionClient::canPlayToWirelessPlaybackTarget const): Deleted. 36 * platform/cocoa/PlaybackSessionModel.h: 37 * platform/cocoa/PlaybackSessionModelMediaElement.h: 38 * platform/cocoa/PlaybackSessionModelMediaElement.mm: 39 (WebCore::PlaybackSessionModelMediaElement::setPlayingOnSecondScreen): 40 * platform/ios/WebAVPlayerController.mm: 41 (-[WebAVPlayerController init]): 42 (-[WebAVPlayerController dealloc]): 43 (-[WebAVPlayerController observeValueForKeyPath:ofObject:change:context:]): 44 * platform/ios/WebVideoFullscreenControllerAVKit.mm: 45 (VideoFullscreenControllerContext::setPlayingOnSecondScreen): 46 1 47 2018-09-06 Frederic Wang <fwang@igalia.com> 2 48 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r235197 r235752 5745 5745 } 5746 5746 5747 bool HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless() const5748 {5749 return m_isPlayingToWirelessTarget;5750 }5751 5752 5747 void HTMLMediaElement::wirelessRoutesAvailableDidChange() 5753 5748 { … … 5837 5832 } 5838 5833 5839 bool HTMLMediaElement::canPlayToWirelessPlaybackTarget() const5840 {5841 bool canPlay = m_player && m_player->canPlayToWirelessPlaybackTarget();5842 5843 INFO_LOG(LOGIDENTIFIER, "returning ", canPlay);5844 5845 return canPlay;5846 }5847 5848 bool HTMLMediaElement::isPlayingToWirelessPlaybackTarget() const5849 {5850 return m_isPlayingToWirelessTarget;5851 }5852 5853 5834 void HTMLMediaElement::setShouldPlayToPlaybackTarget(bool shouldPlay) 5854 5835 { … … 5858 5839 m_player->setShouldPlayToPlaybackTarget(shouldPlay); 5859 5840 } 5860 #else // ENABLE(WIRELESS_PLAYBACK_TARGET)5861 5862 bool HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless() const5863 {5864 return false;5865 }5866 5841 5867 5842 #endif // ENABLE(WIRELESS_PLAYBACK_TARGET) 5843 5844 void HTMLMediaElement::setPlayingOnSecondScreen(bool value) 5845 { 5846 if (value == m_playingOnSecondScreen) 5847 return; 5848 5849 m_playingOnSecondScreen = value; 5850 5851 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 5852 updateMediaState(UpdateState::Asynchronously); 5853 #endif 5854 } 5868 5855 5869 5856 double HTMLMediaElement::minFastReverseRate() const … … 7573 7560 { 7574 7561 if (type == PlatformMediaSession::EnteringBackground) { 7575 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 7576 if (m_isPlayingToWirelessTarget) { 7577 INFO_LOG(LOGIDENTIFIER, "returning true because m_isPlayingToWirelessTarget is true"); 7562 if (isPlayingToExternalTarget()) { 7563 INFO_LOG(LOGIDENTIFIER, "returning true because isPlayingToExternalTarget() is true"); 7578 7564 return true; 7579 7565 } 7580 #endif7581 7566 if (m_videoFullscreenMode & VideoFullscreenModePictureInPicture) 7582 7567 return true; … … 7586 7571 #endif 7587 7572 } else if (type == PlatformMediaSession::SuspendedUnderLock) { 7588 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 7589 if (m_isPlayingToWirelessTarget) { 7590 INFO_LOG(LOGIDENTIFIER, "returning true because m_isPlayingToWirelessTarget is true"); 7573 if (isPlayingToExternalTarget()) { 7574 INFO_LOG(LOGIDENTIFIER, "returning true because isPlayingToExternalTarget() is true"); 7591 7575 return true; 7592 7576 } 7593 #endif7594 7577 } 7595 7578 return false; … … 7600 7583 return document().processingUserGestureForMedia(); 7601 7584 } 7602 7603 7585 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 7586 7604 7587 void HTMLMediaElement::updateMediaState(UpdateState updateState) 7605 7588 { … … 7629 7612 bool hasActiveVideo = isVideo() && hasVideo(); 7630 7613 bool hasAudio = this->hasAudio(); 7614 if (isPlayingToExternalTarget()) 7615 state |= IsPlayingToExternalDevice; 7616 7631 7617 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 7632 if (m_isPlayingToWirelessTarget)7633 state |= IsPlayingToExternalDevice;7634 7635 7618 if (m_hasPlaybackTargetAvailabilityListeners) { 7636 7619 state |= HasPlaybackTargetAvailabilityListener; … … 7755 7738 return; 7756 7739 7757 if ( m_isPlayingToWirelessTarget) {7740 if (isPlayingToExternalTarget()) { 7758 7741 INFO_LOG(LOGIDENTIFIER, "early return because playing to wireless target"); 7759 7742 return; … … 7934 7917 bool HTMLMediaElement::shouldOverrideBackgroundLoadingRestriction() const 7935 7918 { 7936 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 7937 if (isPlayingToWirelessPlaybackTarget()) 7919 if (isPlayingToExternalTarget()) 7938 7920 return true; 7939 #endif7940 7921 7941 7922 return m_videoFullscreenMode == VideoFullscreenModePictureInPicture; -
trunk/Source/WebCore/html/HTMLMediaElement.h
r234501 r235752 405 405 406 406 void wirelessRoutesAvailableDidChange() override; 407 bool canPlayToWirelessPlaybackTarget() const override;408 bool isPlayingToWirelessPlaybackTarget() const override;409 407 void setWirelessPlaybackTarget(Ref<MediaPlaybackTarget>&&) override; 410 408 void setShouldPlayToPlaybackTarget(bool) override; 411 409 #endif 412 bool webkitCurrentPlaybackTargetIsWireless() const; 410 bool isPlayingToWirelessPlaybackTarget() const override { return m_isPlayingToWirelessTarget; }; 411 bool webkitCurrentPlaybackTargetIsWireless() const { return m_isPlayingToWirelessTarget; } 412 413 void setPlayingOnSecondScreen(bool value); 414 bool isPlayingOnSecondScreen() const override { return m_playingOnSecondScreen; } 415 416 bool isPlayingToExternalTarget() const { return isPlayingToWirelessPlaybackTarget() || isPlayingOnSecondScreen(); } 413 417 414 418 // EventTarget function. … … 1171 1175 bool m_hasPlaybackTargetAvailabilityListeners { false }; 1172 1176 bool m_failedToPlayToWirelessTarget { false }; 1177 #endif 1178 1173 1179 bool m_isPlayingToWirelessTarget { false }; 1174 #endif 1180 bool m_playingOnSecondScreen { false }; 1175 1181 }; 1176 1182 -
trunk/Source/WebCore/html/MediaElementSession.cpp
r233485 r235752 652 652 } 653 653 654 bool MediaElementSession::canPlayToWirelessPlaybackTarget() const655 {656 #if !PLATFORM(IOS)657 if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute())658 return false;659 #endif660 661 return client().canPlayToWirelessPlaybackTarget();662 }663 664 654 bool MediaElementSession::isPlayingToWirelessPlaybackTarget() const 665 655 { -
trunk/Source/WebCore/html/MediaElementSession.h
r233485 r235752 88 88 void setHasPlaybackTargetAvailabilityListeners(bool); 89 89 90 bool canPlayToWirelessPlaybackTarget() const override;91 90 bool isPlayingToWirelessPlaybackTarget() const override; 92 91 -
trunk/Source/WebCore/platform/audio/PlatformMediaSession.h
r234703 r235752 153 153 bool shouldOverrideBackgroundLoadingRestriction() const; 154 154 155 virtual bool canPlayToWirelessPlaybackTarget() const { return false; }156 155 virtual bool isPlayingToWirelessPlaybackTarget() const { return m_isPlayingToWirelessPlaybackTarget; } 157 156 void isPlayingToWirelessPlaybackTargetChanged(bool); … … 241 240 virtual void wirelessRoutesAvailableDidChange() { } 242 241 virtual void setWirelessPlaybackTarget(Ref<MediaPlaybackTarget>&&) { } 243 virtual bool canPlayToWirelessPlaybackTarget() const { return false; }244 242 virtual bool isPlayingToWirelessPlaybackTarget() const { return false; } 245 243 virtual void setShouldPlayToPlaybackTarget(bool) { } 244 245 virtual bool isPlayingOnSecondScreen() const { return false; } 246 246 247 247 virtual Document* hostingDocument() const = 0; -
trunk/Source/WebCore/platform/cocoa/PlaybackSessionModel.h
r231231 r235752 60 60 virtual void setMuted(bool) = 0; 61 61 virtual void setVolume(double) = 0; 62 virtual void setPlayingOnSecondScreen(bool) = 0; 62 63 63 64 enum ExternalPlaybackTargetType { TargetTypeNone, TargetTypeAirPlay, TargetTypeTVOut }; -
trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.h
r231231 r235752 74 74 WEBCORE_EXPORT void setMuted(bool) final; 75 75 WEBCORE_EXPORT void setVolume(double) final; 76 WEBCORE_EXPORT void setPlayingOnSecondScreen(bool) final; 76 77 77 78 double duration() const final; -
trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm
r234312 r235752 326 326 } 327 327 328 void PlaybackSessionModelMediaElement::setPlayingOnSecondScreen(bool value) 329 { 330 if (m_mediaElement) 331 m_mediaElement->setPlayingOnSecondScreen(value); 332 } 333 328 334 void PlaybackSessionModelMediaElement::updateMediaSelectionOptions() 329 335 { -
trunk/Source/WebCore/platform/ios/WebAVPlayerController.mm
r232187 r235752 49 49 static void * WebAVPlayerControllerSeekableTimeRangesObserverContext = &WebAVPlayerControllerSeekableTimeRangesObserverContext; 50 50 static void * WebAVPlayerControllerHasLiveStreamingContentObserverContext = &WebAVPlayerControllerHasLiveStreamingContentObserverContext; 51 static void * WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext = &WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext; 51 52 52 53 static double WebAVPlayerControllerLiveStreamSeekableTimeRangeDurationHysteresisDelta = 3.0; // Minimum delta of time required to change the duration of the seekable time range. … … 72 73 [self addObserver:self forKeyPath:@"seekableTimeRanges" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:WebAVPlayerControllerSeekableTimeRangesObserverContext]; 73 74 [self addObserver:self forKeyPath:@"hasLiveStreamingContent" options:NSKeyValueObservingOptionInitial context:WebAVPlayerControllerHasLiveStreamingContentObserverContext]; 74 75 [self addObserver:self forKeyPath:@"playingOnSecondScreen" options:NSKeyValueObservingOptionNew context:WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext]; 75 76 76 77 return self; … … 81 82 [self removeObserver:self forKeyPath:@"seekableTimeRanges" context:WebAVPlayerControllerSeekableTimeRangesObserverContext]; 82 83 [self removeObserver:self forKeyPath:@"hasLiveStreamingContent" context:WebAVPlayerControllerHasLiveStreamingContentObserverContext]; 84 [self removeObserver:self forKeyPath:@"playingOnSecondScreen" context:WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext]; 83 85 84 86 [_playerControllerProxy release]; … … 554 556 } else if (WebAVPlayerControllerHasLiveStreamingContentObserverContext == context) 555 557 [self updateMinMaxTiming]; 558 else if (WebAVPlayerControllerIsPlayingOnSecondScreenObserverContext == context) { 559 if (auto* delegate = self.delegate) 560 delegate->setPlayingOnSecondScreen(_playingOnSecondScreen); 561 } 556 562 } 557 563 -
trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm
r235087 r235752 175 175 void setMuted(bool) final; 176 176 void setVolume(double) final; 177 void setPlayingOnSecondScreen(bool) final; 177 178 178 179 // PlaybackSessionModelClient … … 743 744 } 744 745 746 void VideoFullscreenControllerContext::setPlayingOnSecondScreen(bool value) 747 { 748 ASSERT(isUIThread()); 749 WebThreadRun([protectedThis = makeRefPtr(this), this, value] { 750 if (m_playbackModel) 751 m_playbackModel->setPlayingOnSecondScreen(value); 752 }); 753 } 754 745 755 void VideoFullscreenControllerContext::beginScrubbing() 746 756 { -
trunk/Source/WebKit/ChangeLog
r235748 r235752 1 2018-09-06 Jer Noble <jer.noble@apple.com> 2 3 Don't pause playback when locking screen if video is being displayed on second screen. 4 https://bugs.webkit.org/show_bug.cgi?id=189321 5 6 Reviewed by Eric Carlson. 7 8 Pass the "isPlayingOnSecondScreen" value across the process boundary. 9 10 * UIProcess/Cocoa/PlaybackSessionManagerProxy.h: 11 * UIProcess/Cocoa/PlaybackSessionManagerProxy.mm: 12 (WebKit::PlaybackSessionModelContext::setPlayingOnSecondScreen): 13 (WebKit::PlaybackSessionManagerProxy::setPlayingOnSecondScreen): 14 * WebProcess/cocoa/PlaybackSessionManager.h: 15 * WebProcess/cocoa/PlaybackSessionManager.messages.in: 16 * WebProcess/cocoa/PlaybackSessionManager.mm: 17 (WebKit::PlaybackSessionManager::setPlayingOnSecondScreen): 18 1 19 2018-09-06 Wenson Hsieh <wenson_hsieh@apple.com> 2 20 -
trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.h
r233926 r235752 114 114 void setMuted(bool) final; 115 115 void setVolume(double) final; 116 void setPlayingOnSecondScreen(bool) final; 116 117 117 118 double playbackStartedTime() const final { return m_playbackStartedTime; } … … 232 233 void setMuted(uint64_t contextId, bool); 233 234 void setVolume(uint64_t contextId, double); 235 void setPlayingOnSecondScreen(uint64_t contextId, bool); 234 236 235 237 WebPageProxy* m_page; -
trunk/Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.mm
r235265 r235752 152 152 } 153 153 154 void PlaybackSessionModelContext::setPlayingOnSecondScreen(bool value) 155 { 156 if (m_manager) 157 m_manager->setPlayingOnSecondScreen(m_contextId, value); 158 } 159 154 160 void PlaybackSessionModelContext::playbackStartedTimeChanged(double playbackStartedTime) 155 161 { … … 572 578 } 573 579 580 void PlaybackSessionManagerProxy::setPlayingOnSecondScreen(uint64_t contextId, bool value) 581 { 582 if (m_page) 583 m_page->send(Messages::PlaybackSessionManager::SetPlayingOnSecondScreen(contextId, value), m_page->pageID()); 584 } 585 574 586 void PlaybackSessionManagerProxy::requestControlledElementID() 575 587 { -
trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.h
r232301 r235752 163 163 void setMuted(uint64_t contextId, bool muted); 164 164 void setVolume(uint64_t contextId, double volume); 165 void setPlayingOnSecondScreen(uint64_t contextId, bool value); 165 166 166 167 WebPage* m_page; -
trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.messages.in
r231231 r235752 41 41 SetMuted(uint64_t contextId, bool muted) 42 42 SetVolume(uint64_t contextId, double volume) 43 SetPlayingOnSecondScreen(uint64_t contextId, bool value) 43 44 } 44 45 #endif -
trunk/Source/WebKit/WebProcess/cocoa/PlaybackSessionManager.mm
r235205 r235752 508 508 } 509 509 510 void PlaybackSessionManager::setPlayingOnSecondScreen(uint64_t contextId, bool value) 511 { 512 UserGestureIndicator indicator(ProcessingUserGesture); 513 ensureModel(contextId).setPlayingOnSecondScreen(value); 514 } 515 510 516 } // namespace WebKit 511 517
Note:
See TracChangeset
for help on using the changeset viewer.