Media Session: implement algorithm for updating a media element's session (6.1)
authormrajca@apple.com <mrajca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Jun 2015 18:10:55 +0000 (18:10 +0000)
committermrajca@apple.com <mrajca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Jun 2015 18:10:55 +0000 (18:10 +0000)
https://bugs.webkit.org/show_bug.cgi?id=146460

Reviewed by Darin Adler.

In addition to storing a pointer to the new media session, we now:

- pause the media element if it is 'active' in the current media session
- remove the media element from the current media session
- release the current media session if there are no more active media elements
- set the default media session if the new media session is null
- update the 'kind' attribute to match the kind of the new media session

* Modules/mediasession/MediaSession.cpp:
(WebCore::MediaSession::isMediaElementActive):
(WebCore::MediaSession::hasActiveMediaElements):
* Modules/mediasession/MediaSession.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::setSession):
(WebCore::HTMLMediaElement::setSessionInternal):
* html/HTMLMediaElement.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@186123 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/Modules/mediasession/MediaSession.cpp
Source/WebCore/Modules/mediasession/MediaSession.h
Source/WebCore/html/HTMLMediaElement.cpp
Source/WebCore/html/HTMLMediaElement.h

index dd82b89..d335866 100644 (file)
@@ -1,3 +1,27 @@
+2015-06-30  Matt Rajca  <mrajca@apple.com>
+
+        Media Session: implement algorithm for updating a media element's session (6.1)
+        https://bugs.webkit.org/show_bug.cgi?id=146460
+
+        Reviewed by Darin Adler.
+
+        In addition to storing a pointer to the new media session, we now:
+
+        - pause the media element if it is 'active' in the current media session
+        - remove the media element from the current media session
+        - release the current media session if there are no more active media elements
+        - set the default media session if the new media session is null
+        - update the 'kind' attribute to match the kind of the new media session
+
+        * Modules/mediasession/MediaSession.cpp:
+        (WebCore::MediaSession::isMediaElementActive):
+        (WebCore::MediaSession::hasActiveMediaElements):
+        * Modules/mediasession/MediaSession.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::setSession):
+        (WebCore::HTMLMediaElement::setSessionInternal):
+        * html/HTMLMediaElement.h:
+
 2015-06-29  Anders Carlsson  <andersca@apple.com>
 
         Get rid of unused WKSI functions
index 266397b..f9d5090 100644 (file)
@@ -125,6 +125,16 @@ void MediaSession::addActiveMediaElement(HTMLMediaElement& element)
     m_activeParticipatingElements.add(&element);
 }
 
+bool MediaSession::isMediaElementActive(HTMLMediaElement& element)
+{
+    return m_activeParticipatingElements.contains(&element);
+}
+
+bool MediaSession::hasActiveMediaElements()
+{
+    return !m_activeParticipatingElements.isEmpty();
+}
+
 void MediaSession::setMetadata(const Dictionary& metadata)
 {
     // 5.1.3
index 739bda3..2ceabf5 100644 (file)
@@ -88,6 +88,8 @@ private:
     void removeMediaElement(HTMLMediaElement&);
 
     void addActiveMediaElement(HTMLMediaElement&);
+    bool isMediaElementActive(HTMLMediaElement&);
+    bool hasActiveMediaElements();
 
     void releaseInternal();
 
index e435c74..b7c34ea 100644 (file)
@@ -6452,13 +6452,44 @@ MediaSession* HTMLMediaElement::session() const
 
 void HTMLMediaElement::setSession(MediaSession* session)
 {
-    if (m_session)
+    // 6.1
+    // 1. Let m be the media element in question.
+    // 2. Let old media session be m's current media session, if it has one, and null otherwise.
+    // 3. Let new media session be null.
+    // 4. Set m's current media session to null, if it currently has one.
+    // 5. Let m's current media session be the new value or the top-level browsing context's media session if the new
+    //    value is null.
+    // 6. If the new value is null, then set the m's kind IDL attribute to the empty string. Otherwise, set m's kind IDL
+    //    attribute to the value of current media session's kind attribute.
+    // 7. Let new media session be m's current media session.
+    // 8. Update media sessions: If old media session and new media session are the same (whether both null or both the
+    //    same media session), then terminate these steps.
+    // 9. If m is an active audio-producing participant of old media session, then pause m and remove m from old media
+    //    session's active audio-producing participants.
+    // 10. If old media session is not null and no longer has one or more active audio-producing participants, then run
+    //     the media session release algorithm for old media session.
+
+    if (m_session) {
+        if (m_session->isMediaElementActive(*this))
+            pause();
+
         m_session->removeMediaElement(*this);
 
-    m_session = session;
+        if (!m_session->hasActiveMediaElements())
+            m_session->releaseSession();
+    }
 
     if (session)
-        session->addMediaElement(*this);
+        setSessionInternal(*session);
+    else
+        setSessionInternal(document().defaultMediaSession());
+}
+
+void HTMLMediaElement::setSessionInternal(MediaSession& session)
+{
+    m_session = &session;
+    session.addMediaElement(*this);
+    m_kind = session.kind();
 }
 
 #endif
index 4d9c771..9eae862 100644 (file)
@@ -556,6 +556,10 @@ private:
     virtual bool dispatchEvent(PassRefPtr<Event>) override;
 #endif
 
+#if ENABLE(MEDIA_SESSION)
+    void setSessionInternal(MediaSession&);
+#endif
+
     virtual String mediaPlayerReferrer() const override;
     virtual String mediaPlayerUserAgent() const override;