Changeset 268769 in webkit
- Timestamp:
- Oct 20, 2020, 3:41:46 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 10 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/media/media-session (added)
-
LayoutTests/media/media-session/mock-actionHandlers-expected.txt (added)
-
LayoutTests/media/media-session/mock-actionHandlers.html (added)
-
LayoutTests/media/media-session/mock-currentPosition-expected.txt (added)
-
LayoutTests/media/media-session/mock-currentPosition.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/mediasession/MediaSession.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/mediasession/MediaSession.h (modified) (3 diffs)
-
Source/WebCore/Modules/mediasession/MediaSession.idl (modified) (1 diff)
-
Source/WebCore/Modules/mediasession/MediaSessionAction.h (modified) (1 diff)
-
Source/WebCore/Modules/mediasession/MediaSessionActionDetails.idl (modified) (1 diff)
-
Source/WebCore/testing/Internals.cpp (modified) (2 diffs)
-
Source/WebCore/testing/Internals.h (modified) (3 diffs)
-
Source/WebCore/testing/Internals.idl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r268767 r268769 1 2020-10-20 Jer Noble <jer.noble@apple.com> 2 3 [media-session] Basic support for MediaSession.setPositionState() and MediaSession.setActionHandler() 4 https://bugs.webkit.org/show_bug.cgi?id=217963 5 6 Reviewed by Eric Carlson. 7 8 * media/media-session/mock-actionHandlers-expected.txt: Added. 9 * media/media-session/mock-actionHandlers.html: Added. 10 * media/media-session/mock-currentPosition-expected.txt: Added. 11 * media/media-session/mock-currentPosition.html: Added. 12 1 13 2020-10-20 Diego Pino Garcia <dpino@igalia.com> 2 14 -
trunk/Source/WebCore/ChangeLog
r268766 r268769 1 2020-10-20 Jer Noble <jer.noble@apple.com> 2 3 [media-session] Basic support for MediaSession.setPositionState() and MediaSession.setActionHandler() 4 https://bugs.webkit.org/show_bug.cgi?id=217963 5 6 Reviewed by Eric Carlson. 7 8 Tests: media/media-session/mock-actionHandlers.html 9 media/media-session/mock-currentPosition.html 10 11 Add basic support for setPositionState() and currentTime calculations of the Media Session 12 standard, basic support for setActionHandler(), and Internals methods to query the internal 13 state of both those APIs from layout tests. 14 15 * Modules/mediasession/MediaSession.cpp: 16 (WebCore::MediaSession::setMetadata): 17 (WebCore::MediaSession::setPlaybackState): 18 (WebCore::MediaSession::setActionHandler): 19 (WebCore::MediaSession::handlerForAction const): 20 (WebCore::MediaSession::setPositionState): 21 (WebCore::MediaSession::currentPosition const): 22 * Modules/mediasession/MediaSession.h: 23 (WebCore::MediaSession::playbackState const): 24 * Modules/mediasession/MediaSession.idl: 25 * Modules/mediasession/MediaSessionAction.h: 26 * Modules/mediasession/MediaSessionActionDetails.idl: 27 * testing/Internals.cpp: 28 (WebCore::Internals::currentMediaSessionPosition): 29 (WebCore::Internals::sendMediaSessionAction): 30 * testing/Internals.h: 31 * testing/Internals.idl: 32 1 33 2020-10-20 Don Olmstead <don.olmstead@sony.com> 2 34 -
trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp
r268735 r268769 58 58 void MediaSession::setPlaybackState(MediaSessionPlaybackState state) 59 59 { 60 if (m_playbackState == state) 61 return; 62 63 auto currentPosition = this->currentPosition(); 64 if (m_positionState && currentPosition) { 65 m_positionState->position = *currentPosition; 66 m_timeAtLastPositionUpdate = MonotonicTime::now(); 67 } 60 68 m_playbackState = state; 61 69 } 62 70 63 void MediaSession::setActionHandler(MediaSessionAction , RefPtr<MediaSessionActionHandler>&&)71 void MediaSession::setActionHandler(MediaSessionAction action, RefPtr<MediaSessionActionHandler>&& handler) 64 72 { 73 if (handler) 74 m_actionHandlers.set(action, handler); 75 else 76 m_actionHandlers.remove(action); 77 actionHandlersUpdated(); 78 } 79 80 bool MediaSession::hasActionHandler(MediaSessionAction action) const 81 { 82 return m_actionHandlers.contains(action); 83 } 84 85 RefPtr<MediaSessionActionHandler> MediaSession::handlerForAction(MediaSessionAction action) const 86 { 87 return m_actionHandlers.get(action); 65 88 } 66 89 67 90 ExceptionOr<void> MediaSession::setPositionState(Optional<MediaPositionState>&& state) 68 91 { 69 if (!state) 92 if (!state) { 93 m_positionState = WTF::nullopt; 70 94 return { }; 71 if (state->duration >= 0 95 } 96 97 if (!(state->duration >= 0 72 98 && state->position >= 0 73 99 && state->position <= state->duration 74 100 && std::isfinite(state->playbackRate) 75 && state->playbackRate != 0)76 return {};101 && state->playbackRate)) 102 return Exception { TypeError }; 77 103 78 return Exception { TypeError }; 104 m_positionState = WTFMove(state); 105 m_lastReportedPosition = m_positionState->position; 106 m_timeAtLastPositionUpdate = MonotonicTime::now(); 107 return { }; 108 } 109 110 Optional<double> MediaSession::currentPosition() const 111 { 112 if (!m_positionState || !m_lastReportedPosition) 113 return WTF::nullopt; 114 115 auto actualPlaybackRate = m_playbackState == MediaSessionPlaybackState::Playing ? m_positionState->playbackRate : 0; 116 117 auto elapsedTime = (MonotonicTime::now() - m_timeAtLastPositionUpdate) * actualPlaybackRate; 118 119 return std::max(0., std::min(*m_lastReportedPosition + elapsedTime.value(), m_positionState->duration)); 79 120 } 80 121 … … 83 124 } 84 125 126 void MediaSession::actionHandlersUpdated() 127 { 128 } 129 85 130 } 86 131 -
trunk/Source/WebCore/Modules/mediasession/MediaSession.h
r268735 r268769 32 32 #include "MediaSessionActionHandler.h" 33 33 #include "MediaSessionPlaybackState.h" 34 #include <wtf/MonotonicTime.h> 34 35 #include <wtf/Optional.h> 35 36 #include <wtf/UniqueRef.h> … … 54 55 void setActionHandler(MediaSessionAction, RefPtr<MediaSessionActionHandler>&&); 55 56 ExceptionOr<void> setPositionState(Optional<MediaPositionState>&&); 57 WEBCORE_EXPORT Optional<double> currentPosition() const; 56 58 57 59 void metadataUpdated(); 60 void actionHandlersUpdated(); 61 bool hasActionHandler(MediaSessionAction) const; 62 WEBCORE_EXPORT RefPtr<MediaSessionActionHandler> handlerForAction(MediaSessionAction) const; 58 63 59 64 private: … … 63 68 RefPtr<MediaMetadata> m_metadata; 64 69 MediaSessionPlaybackState m_playbackState { MediaSessionPlaybackState::None }; 70 Optional<MediaPositionState> m_positionState; 71 Optional<double> m_lastReportedPosition; 72 MonotonicTime m_timeAtLastPositionUpdate; 73 HashMap<MediaSessionAction, RefPtr<MediaSessionActionHandler>, WTF::IntHash<MediaSessionAction>, WTF::StrongEnumHashTraits<MediaSessionAction>> m_actionHandlers; 65 74 }; 66 75 -
trunk/Source/WebCore/Modules/mediasession/MediaSession.idl
r268735 r268769 28 28 Exposed=Window, 29 29 ImplementationLacksVTable, 30 ExportMacro=WEBCORE_EXPORT, 30 31 ] interface MediaSession { 31 32 attribute MediaMetadata? metadata; -
trunk/Source/WebCore/Modules/mediasession/MediaSessionAction.h
r268735 r268769 44 44 } // namespace WebCore 45 45 46 namespace WTF { 47 48 template<> struct EnumTraits<WebCore::MediaSessionAction> { 49 using values = EnumValues< 50 WebCore::MediaSessionAction, 51 WebCore::MediaSessionAction::Play, 52 WebCore::MediaSessionAction::Pause, 53 WebCore::MediaSessionAction::Seekbackward, 54 WebCore::MediaSessionAction::Seekforward, 55 WebCore::MediaSessionAction::Previoustrack, 56 WebCore::MediaSessionAction::Nexttrack, 57 WebCore::MediaSessionAction::Skipad, 58 WebCore::MediaSessionAction::Stop, 59 WebCore::MediaSessionAction::Seekto 60 >; 61 }; 62 63 } 64 46 65 #endif // ENABLE(MEDIA_SESSION) -
trunk/Source/WebCore/Modules/mediasession/MediaSessionActionDetails.idl
r268735 r268769 27 27 Conditional=MEDIA_SESSION, 28 28 JSGenerateToJSObject, 29 ExportMacro=WEBCORE_EXPORT, 29 30 ] dictionary MediaSessionActionDetails { 30 31 required MediaSessionAction action; -
trunk/Source/WebCore/testing/Internals.cpp
r268635 r268769 129 129 #include "MediaRecorderProvider.h" 130 130 #include "MediaResourceLoader.h" 131 #include "MediaSession.h" 132 #include "MediaSessionActionDetails.h" 131 133 #include "MediaStreamTrack.h" 132 134 #include "MediaUsageInfo.h" … … 5964 5966 #endif 5965 5967 5968 #if ENABLE(MEDIA_SESSION) 5969 ExceptionOr<double> Internals::currentMediaSessionPosition(const MediaSession& session) 5970 { 5971 if (auto currentPosition = session.currentPosition()) 5972 return *currentPosition; 5973 return Exception { InvalidStateError }; 5974 } 5975 5976 ExceptionOr<void> Internals::sendMediaSessionAction(MediaSession& session, const MediaSessionActionDetails& actionDetails) 5977 { 5978 if (auto handler = session.handlerForAction(actionDetails.action)) { 5979 handler->handleEvent(actionDetails); 5980 return { }; 5981 } 5982 return Exception { InvalidStateError }; 5983 } 5984 #endif 5985 5986 5966 5987 } // namespace WebCore -
trunk/Source/WebCore/testing/Internals.h
r268600 r268769 81 81 class Location; 82 82 class MallocStatistics; 83 class MediaSession;84 83 class MediaStream; 85 84 class MediaStreamTrack; … … 126 125 #if ENABLE(WEBXR) 127 126 class WebXRTest; 127 #endif 128 129 #if ENABLE(MEDIA_SESSION) 130 class MediaSession; 131 struct MediaSessionActionDetails; 128 132 #endif 129 133 … … 1049 1053 #endif 1050 1054 1055 #if ENABLE(MEDIA_SESSION) 1056 ExceptionOr<double> currentMediaSessionPosition(const MediaSession&); 1057 ExceptionOr<void> sendMediaSessionAction(MediaSession&, const MediaSessionActionDetails&); 1058 #endif 1059 1051 1060 private: 1052 1061 explicit Internals(Document&); -
trunk/Source/WebCore/testing/Internals.idl
r268600 r268769 953 953 954 954 [Conditional=ATTACHMENT_ELEMENT, MayThrowException] AttachmentThumbnailInfo attachmentThumbnailInfo(HTMLAttachmentElement element); 955 }; 955 956 [Conditional=MEDIA_SESSION, MayThrowException] double currentMediaSessionPosition(MediaSession session); 957 [Conditional=MEDIA_SESSION, MayThrowException] undefined sendMediaSessionAction(MediaSession session, MediaSessionActionDetails actionDetails); 958 };
Note:
See TracChangeset
for help on using the changeset viewer.