Changeset 186593 in webkit


Ignore:
Timestamp:
Jul 9, 2015 9:26:33 AM (9 years ago)
Author:
mrajca@apple.com
Message:

Media Session: report to chrome client 'hasActiveMediaElements' changes
https://bugs.webkit.org/show_bug.cgi?id=146745

Reviewed by Eric Carlson.

  • Modules/mediasession/MediaSession.cpp: All updates to active media elements are now funneled through a helper method that will invoke the 'hasMediaSessionWithActiveMediaElementsDidChange' callback when necessary.

(WebCore::MediaSession::removeMediaElement):
(WebCore::MediaSession::changeActiveMediaElements):
(WebCore::MediaSession::addActiveMediaElement):
(WebCore::MediaSession::releaseSession):

  • Modules/mediasession/MediaSession.h:
  • Modules/mediasession/MediaSessionManager.cpp:

(WebCore::MediaSessionManager::hasActiveMediaElements):

  • Modules/mediasession/MediaSessionManager.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r186592 r186593  
     12015-07-08  Matt Rajca  <mrajca@apple.com>
     2
     3        Media Session: report to chrome client 'hasActiveMediaElements' changes
     4        https://bugs.webkit.org/show_bug.cgi?id=146745
     5
     6        Reviewed by Eric Carlson.
     7
     8        * Modules/mediasession/MediaSession.cpp: All updates to active media elements are now funneled through a helper
     9          method that will invoke the 'hasMediaSessionWithActiveMediaElementsDidChange' callback when necessary.
     10        (WebCore::MediaSession::removeMediaElement):
     11        (WebCore::MediaSession::changeActiveMediaElements):
     12        (WebCore::MediaSession::addActiveMediaElement):
     13        (WebCore::MediaSession::releaseSession):
     14        * Modules/mediasession/MediaSession.h:
     15        * Modules/mediasession/MediaSessionManager.cpp:
     16        (WebCore::MediaSessionManager::hasActiveMediaElements):
     17        * Modules/mediasession/MediaSessionManager.h:
     18
    1192015-07-09  Darin Adler  <darin@apple.com>
    220
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp

    r186123 r186593  
    116116    m_participatingElements.remove(&element);
    117117
    118     m_activeParticipatingElements.remove(&element);
     118    changeActiveMediaElements([&]() {
     119        m_activeParticipatingElements.remove(&element);
     120    });
     121
    119122    if (m_iteratedActiveParticipatingElements)
    120123        m_iteratedActiveParticipatingElements->remove(&element);
    121124}
    122125
     126void MediaSession::changeActiveMediaElements(std::function<void(void)> worker)
     127{
     128    if (Page *page = m_document.page()) {
     129        bool hadActiveMediaElements = MediaSessionManager::singleton().hasActiveMediaElements();
     130
     131        worker();
     132
     133        bool hasActiveMediaElements = MediaSessionManager::singleton().hasActiveMediaElements();
     134        if (hadActiveMediaElements != hasActiveMediaElements)
     135            page->chrome().client().hasMediaSessionWithActiveMediaElementsDidChange(hasActiveMediaElements);
     136    } else
     137        worker();
     138}
     139
    123140void MediaSession::addActiveMediaElement(HTMLMediaElement& element)
    124141{
    125     m_activeParticipatingElements.add(&element);
     142    changeActiveMediaElements([&]() {
     143        m_activeParticipatingElements.add(&element);
     144    });
    126145}
    127146
     
    131150}
    132151
    133 bool MediaSession::hasActiveMediaElements()
     152bool MediaSession::hasActiveMediaElements() const
    134153{
    135154    return !m_activeParticipatingElements.isEmpty();
     
    172191    // 2. Indefinitely pause all of media session's active participating media elements.
    173192    // 3. Reset media session's active participating media elements to an empty list.
    174     while (!m_activeParticipatingElements.isEmpty())
    175         m_activeParticipatingElements.takeAny()->pause();
     193    changeActiveMediaElements([&]() {
     194        while (!m_activeParticipatingElements.isEmpty())
     195            m_activeParticipatingElements.takeAny()->pause();
     196    });
    176197
    177198    // 4. Run the media session release algorithm for media session.
  • trunk/Source/WebCore/Modules/mediasession/MediaSession.h

    r186123 r186593  
    5959
    6060    State currentState() const { return m_currentState; }
     61    bool hasActiveMediaElements() const;
    6162
    6263    void setMetadata(const Dictionary&);
     
    8889    void removeMediaElement(HTMLMediaElement&);
    8990
     91    void changeActiveMediaElements(std::function<void(void)>);
    9092    void addActiveMediaElement(HTMLMediaElement&);
    9193    bool isMediaElementActive(HTMLMediaElement&);
    92     bool hasActiveMediaElements();
    9394
    9495    void releaseInternal();
  • trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.cpp

    r185678 r186593  
    4040    static NeverDestroyed<MediaSessionManager> manager;
    4141    return manager;
     42}
     43
     44bool MediaSessionManager::hasActiveMediaElements() const
     45{
     46    for (auto* session : m_sessions) {
     47        if (session->hasActiveMediaElements())
     48            return true;
     49    }
     50
     51    return false;
    4252}
    4353
  • trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.h

    r185678 r186593  
    4646    friend class MediaSession;
    4747
     48    bool hasActiveMediaElements() const;
     49
    4850    void addMediaSession(MediaSession&);
    4951    void removeMediaSession(MediaSession&);
Note: See TracChangeset for help on using the changeset viewer.