Changeset 278222 in webkit


Ignore:
Timestamp:
May 28, 2021 1:08:08 PM (14 months ago)
Author:
Jean-Yves Avenard
Message:

Add MediaSession.callActionHandler
https://bugs.webkit.org/show_bug.cgi?id=226077
rdar://77463304

Reviewed by Eric Carlson.

Source/WebCore:

Make it possible for JavaScript to be able to trigger a MediaSession action
handler so a MediaSession.coordinator polyfill such as one provided by an
external JS library will work.
Test: media/media-session/callActionHandler.html

  • Modules/mediasession/MediaSession.cpp:

(WebCore::MediaSession::callActionHandler):

  • Modules/mediasession/MediaSession.h:
  • Modules/mediasession/MediaSession.idl: Add method definition.

LayoutTests:

  • media/media-session/callActionHandler-expected.txt: Added.
  • media/media-session/callActionHandler.html: Added.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r278219 r278222  
     12021-05-28  Jean-Yves Avenard  <jya@apple.com>
     2
     3        Add MediaSession.callActionHandler
     4        https://bugs.webkit.org/show_bug.cgi?id=226077
     5        rdar://77463304
     6
     7        Reviewed by Eric Carlson.
     8
     9        * media/media-session/callActionHandler-expected.txt: Added.
     10        * media/media-session/callActionHandler.html: Added.
     11
    1122021-05-28  Alan Bujtas  <zalan@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r278219 r278222  
     12021-05-28  Jean-Yves Avenard  <jya@apple.com>
     2
     3        Add MediaSession.callActionHandler
     4        https://bugs.webkit.org/show_bug.cgi?id=226077
     5        rdar://77463304
     6
     7        Reviewed by Eric Carlson.
     8
     9        Make it possible for JavaScript to be able to trigger a MediaSession action
     10        handler so a MediaSession.coordinator polyfill such as one provided by an
     11        external JS library will work.
     12        Test: media/media-session/callActionHandler.html
     13
     14        * Modules/mediasession/MediaSession.cpp:
     15        (WebCore::MediaSession::callActionHandler):
     16        * Modules/mediasession/MediaSession.h:
     17        * Modules/mediasession/MediaSession.idl: Add method definition.
     18
    1192021-05-28  Alan Bujtas  <zalan@apple.com>
    220
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp

    r278185 r278222  
    3232#include "EventNames.h"
    3333#include "HTMLMediaElement.h"
     34#include "JSDOMPromiseDeferred.h"
    3435#include "JSMediaPositionState.h"
    3536#include "JSMediaSessionAction.h"
     
    273274}
    274275
    275 bool MediaSession::callActionHandler(const MediaSessionActionDetails& actionDetails)
     276void MediaSession::callActionHandler(const MediaSessionActionDetails& actionDetails, DOMPromiseDeferred<void>&& promise)
     277{
     278    ALWAYS_LOG(LOGIDENTIFIER);
     279
     280    if (!callActionHandler(actionDetails, TriggerGestureIndicator::No)) {
     281        promise.reject(InvalidStateError);
     282        return;
     283    }
     284
     285    promise.resolve();
     286}
     287
     288bool MediaSession::callActionHandler(const MediaSessionActionDetails& actionDetails, TriggerGestureIndicator triggerGestureIndicator)
    276289{
    277290    if (auto handler = m_actionHandlers.get(actionDetails.action)) {
    278         UserGestureIndicator gestureIndicator(ProcessingUserGesture, document());
     291        Optional<UserGestureIndicator> maybeGestureIndicator;
     292        if (triggerGestureIndicator == TriggerGestureIndicator::Yes)
     293            maybeGestureIndicator.emplace(ProcessingUserGesture, document());
    279294        handler->handleEvent(actionDetails);
    280295        return true;
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.h

    r278143 r278222  
    5151class MediaSessionCoordinatorPrivate;
    5252class Navigator;
     53template<typename> class DOMPromiseDeferred;
    5354
    5455class MediaSession : public RefCounted<MediaSession>, public ActiveDOMObject, public EventTargetWithInlineData {
     
    6667
    6768    void setActionHandler(MediaSessionAction, RefPtr<MediaSessionActionHandler>&&);
     69
     70    void callActionHandler(const MediaSessionActionDetails&, DOMPromiseDeferred<void>&&);
    6871
    6972    ExceptionOr<void> setPositionState(Optional<MediaPositionState>&&);
     
    8891
    8992    bool hasActiveActionHandlers() const { return !m_actionHandlers.isEmpty(); }
    90     WEBCORE_EXPORT bool callActionHandler(const MediaSessionActionDetails&);
     93    enum class TriggerGestureIndicator {
     94        No,
     95        Yes,
     96    };
     97    WEBCORE_EXPORT bool callActionHandler(const MediaSessionActionDetails&, TriggerGestureIndicator = TriggerGestureIndicator::Yes);
    9198
    9299    const Logger& logger() const { return *m_logger.get(); }
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.idl

    r275314 r278222  
    3838    undefined setActionHandler(MediaSessionAction action, MediaSessionActionHandler? handler);
    3939
     40    Promise<undefined> callActionHandler(MediaSessionActionDetails actionDetails);
     41
    4042    undefined setPositionState(optional MediaPositionState? state = null);
    4143};
Note: See TracChangeset for help on using the changeset viewer.