⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 268769 in webkit


Ignore:
Timestamp:
Oct 20, 2020, 3:41:46 PM (6 years ago)
Author:
jer.noble@apple.com
Message:

[media-session] Basic support for MediaSession.setPositionState() and MediaSession.setActionHandler()
https://bugs.webkit.org/show_bug.cgi?id=217963

Reviewed by Eric Carlson.

Source/WebCore:

Tests: media/media-session/mock-actionHandlers.html

media/media-session/mock-currentPosition.html

Add basic support for setPositionState() and currentTime calculations of the Media Session
standard, basic support for setActionHandler(), and Internals methods to query the internal
state of both those APIs from layout tests.

  • Modules/mediasession/MediaSession.cpp:

(WebCore::MediaSession::setMetadata):
(WebCore::MediaSession::setPlaybackState):
(WebCore::MediaSession::setActionHandler):
(WebCore::MediaSession::handlerForAction const):
(WebCore::MediaSession::setPositionState):
(WebCore::MediaSession::currentPosition const):

  • Modules/mediasession/MediaSession.h:

(WebCore::MediaSession::playbackState const):

  • Modules/mediasession/MediaSession.idl:
  • Modules/mediasession/MediaSessionAction.h:
  • Modules/mediasession/MediaSessionActionDetails.idl:
  • testing/Internals.cpp:

(WebCore::Internals::currentMediaSessionPosition):
(WebCore::Internals::sendMediaSessionAction):

  • testing/Internals.h:
  • testing/Internals.idl:

LayoutTests:

  • media/media-session/mock-actionHandlers-expected.txt: Added.
  • media/media-session/mock-actionHandlers.html: Added.
  • media/media-session/mock-currentPosition-expected.txt: Added.
  • media/media-session/mock-currentPosition.html: Added.
Location:
trunk
Files:
5 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r268767 r268769  
     12020-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
    1132020-10-20  Diego Pino Garcia  <dpino@igalia.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r268766 r268769  
     12020-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
    1332020-10-20  Don Olmstead  <don.olmstead@sony.com>
    234
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp

    r268735 r268769  
    5858void MediaSession::setPlaybackState(MediaSessionPlaybackState state)
    5959{
     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    }
    6068    m_playbackState = state;
    6169}
    6270
    63 void MediaSession::setActionHandler(MediaSessionAction, RefPtr<MediaSessionActionHandler>&&)
     71void MediaSession::setActionHandler(MediaSessionAction action, RefPtr<MediaSessionActionHandler>&& handler)
    6472{
     73    if (handler)
     74        m_actionHandlers.set(action, handler);
     75    else
     76        m_actionHandlers.remove(action);
     77    actionHandlersUpdated();
     78}
     79
     80bool MediaSession::hasActionHandler(MediaSessionAction action) const
     81{
     82    return m_actionHandlers.contains(action);
     83}
     84
     85RefPtr<MediaSessionActionHandler> MediaSession::handlerForAction(MediaSessionAction action) const
     86{
     87    return m_actionHandlers.get(action);
    6588}
    6689
    6790ExceptionOr<void> MediaSession::setPositionState(Optional<MediaPositionState>&& state)
    6891{
    69     if (!state)
     92    if (!state) {
     93        m_positionState = WTF::nullopt;
    7094        return { };
    71     if (state->duration >= 0
     95    }
     96
     97    if (!(state->duration >= 0
    7298        && state->position >= 0
    7399        && state->position <= state->duration
    74100        && std::isfinite(state->playbackRate)
    75         && state->playbackRate != 0)
    76         return { };
     101        && state->playbackRate))
     102        return Exception { TypeError };
    77103
    78     return Exception { TypeError };
     104    m_positionState = WTFMove(state);
     105    m_lastReportedPosition = m_positionState->position;
     106    m_timeAtLastPositionUpdate = MonotonicTime::now();
     107    return { };
     108}
     109
     110Optional<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));
    79120}
    80121
     
    83124}
    84125
     126void MediaSession::actionHandlersUpdated()
     127{
     128}
     129
    85130}
    86131
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.h

    r268735 r268769  
    3232#include "MediaSessionActionHandler.h"
    3333#include "MediaSessionPlaybackState.h"
     34#include <wtf/MonotonicTime.h>
    3435#include <wtf/Optional.h>
    3536#include <wtf/UniqueRef.h>
     
    5455    void setActionHandler(MediaSessionAction, RefPtr<MediaSessionActionHandler>&&);
    5556    ExceptionOr<void> setPositionState(Optional<MediaPositionState>&&);
     57    WEBCORE_EXPORT Optional<double> currentPosition() const;
    5658
    5759    void metadataUpdated();
     60    void actionHandlersUpdated();
     61    bool hasActionHandler(MediaSessionAction) const;
     62    WEBCORE_EXPORT RefPtr<MediaSessionActionHandler> handlerForAction(MediaSessionAction) const;
    5863
    5964private:
     
    6368    RefPtr<MediaMetadata> m_metadata;
    6469    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;
    6574};
    6675
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.idl

    r268735 r268769  
    2828    Exposed=Window,
    2929    ImplementationLacksVTable,
     30    ExportMacro=WEBCORE_EXPORT,
    3031] interface MediaSession {
    3132    attribute MediaMetadata? metadata;
  • trunk/Source/WebCore/Modules/mediasession/MediaSessionAction.h

    r268735 r268769  
    4444} // namespace WebCore
    4545
     46namespace WTF {
     47
     48template<> 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
    4665#endif // ENABLE(MEDIA_SESSION)
  • trunk/Source/WebCore/Modules/mediasession/MediaSessionActionDetails.idl

    r268735 r268769  
    2727    Conditional=MEDIA_SESSION,
    2828    JSGenerateToJSObject,
     29    ExportMacro=WEBCORE_EXPORT,
    2930] dictionary MediaSessionActionDetails {
    3031    required MediaSessionAction action;
  • trunk/Source/WebCore/testing/Internals.cpp

    r268635 r268769  
    129129#include "MediaRecorderProvider.h"
    130130#include "MediaResourceLoader.h"
     131#include "MediaSession.h"
     132#include "MediaSessionActionDetails.h"
    131133#include "MediaStreamTrack.h"
    132134#include "MediaUsageInfo.h"
     
    59645966#endif
    59655967
     5968#if ENABLE(MEDIA_SESSION)
     5969ExceptionOr<double> Internals::currentMediaSessionPosition(const MediaSession& session)
     5970{
     5971    if (auto currentPosition = session.currentPosition())
     5972        return *currentPosition;
     5973    return Exception { InvalidStateError };
     5974}
     5975
     5976ExceptionOr<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
    59665987} // namespace WebCore
  • trunk/Source/WebCore/testing/Internals.h

    r268600 r268769  
    8181class Location;
    8282class MallocStatistics;
    83 class MediaSession;
    8483class MediaStream;
    8584class MediaStreamTrack;
     
    126125#if ENABLE(WEBXR)
    127126class WebXRTest;
     127#endif
     128
     129#if ENABLE(MEDIA_SESSION)
     130class MediaSession;
     131struct MediaSessionActionDetails;
    128132#endif
    129133
     
    10491053#endif
    10501054
     1055#if ENABLE(MEDIA_SESSION)
     1056    ExceptionOr<double> currentMediaSessionPosition(const MediaSession&);
     1057    ExceptionOr<void> sendMediaSessionAction(MediaSession&, const MediaSessionActionDetails&);
     1058#endif
     1059
    10511060private:
    10521061    explicit Internals(Document&);
  • trunk/Source/WebCore/testing/Internals.idl

    r268600 r268769  
    953953
    954954    [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.