Changeset 188345 in webkit


Ignore:
Timestamp:
Aug 12, 2015 12:22:49 PM (9 years ago)
Author:
mrajca@apple.com
Message:

Media Session: notify the UI process when media controls are enabled/disabled
https://bugs.webkit.org/show_bug.cgi?id=147802

Reviewed by Eric Carlson.

WebCore:

  • Modules/mediasession/MediaRemoteControls.cpp:

(WebCore::MediaRemoteControls::MediaRemoteControls): Keep track of the parent session.
(WebCore::MediaRemoteControls::~MediaRemoteControls): Removed unnecessary line.
(WebCore::MediaRemoteControls::setPreviousTrackEnabled): Tell the session a control was enabled/disabled.
(WebCore::MediaRemoteControls::setNextTrackEnabled): Tell the session a control was enabled/disabled.

  • Modules/mediasession/MediaRemoteControls.h:

(WebCore::MediaRemoteControls::create):
(WebCore::MediaRemoteControls::setPreviousTrackEnabled): Moved to implementation file.
(WebCore::MediaRemoteControls::setNextTrackEnabled): Moved to implementation file.

  • Modules/mediasession/MediaSession.cpp:

(WebCore::MediaSession::MediaSession): Keep track of the remote controls' parent session.
(WebCore::MediaSession::controlIsEnabledDidChange): Propagate the new media state to the UI process.

  • Modules/mediasession/MediaSession.h:
  • dom/Document.cpp:

(WebCore::Document::updateIsPlayingMedia): Include whether we can skip to the previous/next track.

  • page/MediaProducer.h:

WebKit2:

  • UIProcess/WebMediaSessionFocusManager.cpp:

(WebKit::WebMediaSessionFocusManager::playbackAttributeDidChange): Generalized to take different attributes.
(WebKit::WebMediaSessionFocusManager::mediaElementIsPlayingDidChange): Deleted.

  • UIProcess/WebMediaSessionFocusManager.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::isPlayingMediaDidChange): Process new attributes for enabling/disabling media controls.

Location:
trunk/Source
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r188342 r188345  
     12015-08-07  Matt Rajca  <mrajca@apple.com>
     2
     3        Media Session: notify the UI process when media controls are enabled/disabled
     4        https://bugs.webkit.org/show_bug.cgi?id=147802
     5
     6        Reviewed by Eric Carlson.
     7
     8        * Modules/mediasession/MediaRemoteControls.cpp:
     9        (WebCore::MediaRemoteControls::MediaRemoteControls): Keep track of the parent session.
     10        (WebCore::MediaRemoteControls::~MediaRemoteControls): Removed unnecessary line.
     11        (WebCore::MediaRemoteControls::setPreviousTrackEnabled): Tell the session a control was enabled/disabled.
     12        (WebCore::MediaRemoteControls::setNextTrackEnabled): Tell the session a control was enabled/disabled.
     13        * Modules/mediasession/MediaRemoteControls.h:
     14        (WebCore::MediaRemoteControls::create):
     15        (WebCore::MediaRemoteControls::setPreviousTrackEnabled): Moved to implementation file.
     16        (WebCore::MediaRemoteControls::setNextTrackEnabled): Moved to implementation file.
     17        * Modules/mediasession/MediaSession.cpp:
     18        (WebCore::MediaSession::MediaSession): Keep track of the remote controls' parent session.
     19        (WebCore::MediaSession::controlIsEnabledDidChange): Propagate the new media state to the UI process.
     20        * Modules/mediasession/MediaSession.h:
     21        * dom/Document.cpp:
     22        (WebCore::Document::updateIsPlayingMedia): Include whether we can skip to the previous/next track.
     23        * page/MediaProducer.h:
     24
    1252015-08-12  Alex Christensen  <achristensen@webkit.org>
    226
  • trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.cpp

    r185077 r188345  
    2929#if ENABLE(MEDIA_SESSION)
    3030
     31#include "MediaSession.h"
     32
    3133namespace WebCore {
    3234
    33 MediaRemoteControls::MediaRemoteControls(ScriptExecutionContext& context)
     35MediaRemoteControls::MediaRemoteControls(ScriptExecutionContext& context, MediaSession* session)
    3436    : m_scriptExecutionContext(context)
     37    , m_session(session)
    3538{
     39}
     40
     41void MediaRemoteControls::clearSession()
     42{
     43    m_session = nullptr;
    3644}
    3745
    3846MediaRemoteControls::~MediaRemoteControls()
    3947{
    40    
     48}
     49
     50void MediaRemoteControls::setPreviousTrackEnabled(bool isEnabled)
     51{
     52    if (m_previousTrackEnabled == isEnabled)
     53        return;
     54
     55    m_previousTrackEnabled = isEnabled;
     56
     57    if (m_session)
     58        m_session->controlIsEnabledDidChange();
     59}
     60
     61void MediaRemoteControls::setNextTrackEnabled(bool isEnabled)
     62{
     63    if (m_nextTrackEnabled == isEnabled)
     64        return;
     65
     66    m_nextTrackEnabled = isEnabled;
     67
     68    if (m_session)
     69        m_session->controlIsEnabledDidChange();
    4170}
    4271
  • trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.h

    r186482 r188345  
    3434namespace WebCore {
    3535
     36class MediaSession;
     37
    3638class MediaRemoteControls : public RefCounted<MediaRemoteControls>, public EventTargetWithInlineData {
    3739public:
    38     static Ref<MediaRemoteControls> create(ScriptExecutionContext& context)
     40    static Ref<MediaRemoteControls> create(ScriptExecutionContext& context, MediaSession* session = nullptr)
    3941    {
    40         return adoptRef(*new MediaRemoteControls(context));
     42        return adoptRef(*new MediaRemoteControls(context, session));
    4143    }
    4244
    4345    bool previousTrackEnabled() const { return m_previousTrackEnabled; }
    44     void setPreviousTrackEnabled(bool enabled) { m_previousTrackEnabled = enabled; }
     46    void setPreviousTrackEnabled(bool);
    4547
    4648    bool nextTrackEnabled() const { return m_nextTrackEnabled; }
    47     void setNextTrackEnabled(bool enabled) { m_nextTrackEnabled = enabled; }
     49    void setNextTrackEnabled(bool);
    4850
    4951    using RefCounted<MediaRemoteControls>::ref;
    5052    using RefCounted<MediaRemoteControls>::deref;
    5153
     54    void clearSession();
     55
    5256    virtual ~MediaRemoteControls();
    53 
    54     MediaRemoteControls(ScriptExecutionContext&);
    5557
    5658    virtual EventTargetInterface eventTargetInterface() const override { return MediaRemoteControlsEventTargetInterfaceType; }
     
    5860
    5961private:
     62    MediaRemoteControls(ScriptExecutionContext&, MediaSession*);
     63
    6064    ScriptExecutionContext& m_scriptExecutionContext;
    6165
    6266    bool m_previousTrackEnabled { false };
    6367    bool m_nextTrackEnabled { false };
     68
     69    MediaSession* m_session { nullptr };
    6470
    6571    virtual void refEventTarget() override final { ref(); }
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp

    r187257 r188345  
    7272    //    session. (Otherwise media session has no media remote controller.)
    7373    if (m_kind == Kind::Content)
    74         m_controls = adoptRef(*new MediaRemoteControls(context));
     74        m_controls = MediaRemoteControls::create(context, this);
    7575
    7676    MediaSessionManager::singleton().addMediaSession(*this);
     
    8080{
    8181    MediaSessionManager::singleton().removeMediaSession(*this);
     82
     83    if (m_controls)
     84        m_controls->clearSession();
    8285}
    8386
     
    318321}
    319322
     323void MediaSession::controlIsEnabledDidChange()
     324{
     325    // Media remote controls are only allowed on Content media sessions.
     326    ASSERT(m_kind == Kind::Content);
     327
     328    // Media elements belonging to Content media sessions have mutually-exclusive playback.
     329    ASSERT(m_activeParticipatingElements.size() <= 1);
     330
     331    if (m_activeParticipatingElements.isEmpty())
     332        return;
     333
     334    HTMLMediaElement* element = *m_activeParticipatingElements.begin();
     335    m_document.updateIsPlayingMedia(element->elementID());
     336}
     337
    320338}
    321339
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.h

    r187006 r188345  
    8787    void skipToPreviousTrack();
    8888
     89    void controlIsEnabledDidChange();
     90
    8991private:
    9092    friend class HTMLMediaElement;
  • trunk/Source/WebCore/dom/Document.cpp

    r188062 r188345  
    35173517        if (sourceElement->isPlaying())
    35183518            state |= MediaProducer::IsSourceElementPlaying;
     3519
     3520        if (MediaSession* session = sourceElement->session()) {
     3521            bool isNull;
     3522            if (MediaRemoteControls* controls = session->controls(isNull)) {
     3523                if (controls->previousTrackEnabled())
     3524                    state |= MediaProducer::IsPreviousTrackControlEnabled;
     3525                if (controls->nextTrackEnabled())
     3526                    state |= MediaProducer::IsNextTrackControlEnabled;
     3527            }
     3528        }
    35193529    }
    35203530#endif
  • trunk/Source/WebCore/page/MediaProducer.h

    r188030 r188345  
    4040        DidPlayToEnd = 1 << 5,
    4141        IsSourceElementPlaying = 1 << 6,
     42        IsNextTrackControlEnabled = 1 << 7,
     43        IsPreviousTrackControlEnabled = 1 << 8,
    4244    };
    4345    typedef unsigned MediaStateFlags;
  • trunk/Source/WebKit2/ChangeLog

    r188337 r188345  
     12015-08-07  Matt Rajca  <mrajca@apple.com>
     2
     3        Media Session: notify the UI process when media controls are enabled/disabled
     4        https://bugs.webkit.org/show_bug.cgi?id=147802
     5
     6        Reviewed by Eric Carlson.
     7
     8        * UIProcess/WebMediaSessionFocusManager.cpp:
     9        (WebKit::WebMediaSessionFocusManager::playbackAttributeDidChange): Generalized to take different attributes.
     10        (WebKit::WebMediaSessionFocusManager::mediaElementIsPlayingDidChange): Deleted.
     11        * UIProcess/WebMediaSessionFocusManager.h:
     12        * UIProcess/WebPageProxy.cpp:
     13        (WebKit::WebPageProxy::isPlayingMediaDidChange): Process new attributes for enabling/disabling media controls.
     14
    1152015-08-12  Devin Rousso  <drousso@apple.com>
    216
  • trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.cpp

    r188218 r188345  
    7171}
    7272
    73 void WebMediaSessionFocusManager::mediaElementIsPlayingDidChange(WebPageProxy* proxy, uint64_t elementID, bool isPlaying)
     73void WebMediaSessionFocusManager::updatePlaybackAttribute(WKMediaSessionFocusManagerPlaybackAttribute attribute, bool value)
     74{
     75    if (value)
     76        m_playbackAttributes |= attribute;
     77    else
     78        m_playbackAttributes &= ~attribute;
     79
     80    m_client.didChangePlaybackAttribute(this, attribute, value);
     81}
     82
     83void WebMediaSessionFocusManager::updatePlaybackAttributesFromMediaState(WebPageProxy* proxy, uint64_t elementID, WebCore::MediaProducer::MediaStateFlags flags)
    7484{
    7585    if (m_focusedMediaElement) {
    7686        if (proxy == m_focusedMediaElement->first && elementID == m_focusedMediaElement->second) {
    77             if (isPlaying)
    78                 m_playbackAttributes |= IsPlaying;
    79             else
    80                 m_playbackAttributes &= ~IsPlaying;
    81 
    82             m_client.didChangePlaybackAttribute(this, IsPlaying, isPlaying);
     87            updatePlaybackAttribute(IsPlaying, flags & WebCore::MediaProducer::IsSourceElementPlaying);
     88            updatePlaybackAttribute(IsNextTrackControlEnabled, flags & WebCore::MediaProducer::IsNextTrackControlEnabled);
     89            updatePlaybackAttribute(IsPreviousTrackControlEnabled, flags & WebCore::MediaProducer::IsPreviousTrackControlEnabled);
    8390        }
    8491    }
  • trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.h

    r188218 r188345  
    4747
    4848    bool valueForPlaybackAttribute(WKMediaSessionFocusManagerPlaybackAttribute) const;
    49     void mediaElementIsPlayingDidChange(WebPageProxy*, uint64_t, bool);
     49    void updatePlaybackAttributesFromMediaState(WebPageProxy*, uint64_t, WebCore::MediaProducer::MediaStateFlags);
    5050
    5151    void setFocusedMediaElement(WebPageProxy&, uint64_t);
     
    6262    virtual void derefWebContextSupplement() override;
    6363
     64    void updatePlaybackAttribute(WKMediaSessionFocusManagerPlaybackAttribute, bool);
     65
    6466    std::unique_ptr<FocusedMediaElement> m_focusedMediaElement;
    6567    WKMediaSessionFocusManagerPlaybackAttributes m_playbackAttributes { 0 };
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r188257 r188345  
    59505950    WebMediaSessionFocusManager* focusManager = process().processPool().supplement<WebMediaSessionFocusManager>();
    59515951    ASSERT(focusManager);
    5952     focusManager->mediaElementIsPlayingDidChange(this, sourceElementID, state & MediaProducer::IsSourceElementPlaying);
     5952    focusManager->updatePlaybackAttributesFromMediaState(this, sourceElementID, state);
    59535953#endif
    59545954
Note: See TracChangeset for help on using the changeset viewer.