Title: [185270] trunk/Source/WebCore
Revision
185270
Author
[email protected]
Date
2015-06-05 15:33:23 -0700 (Fri, 05 Jun 2015)

Log Message

MediaSessions should keep track of their participating media elements.
https://bugs.webkit.org/show_bug.cgi?id=145703

Patch by Matt Rajca <[email protected]> on 2015-06-05
Reviewed by Eric Carlson.

* Modules/mediasession/MediaSession.cpp:
(WebCore::MediaSession::addMediaElement): Add the given media element to the media session.
(WebCore::MediaSession::removeMediaElement): Remove the given media element from the media session.
(WebCore::MediaSession::activeParticipatingElements): Dynamically build a vector of actively-playing media
  elements.
* Modules/mediasession/MediaSession.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::~HTMLMediaElement): Ensure the element is removed from its media session.
(WebCore::HTMLMediaElement::setSession): Update sessions' references to their media elements.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (185269 => 185270)


--- trunk/Source/WebCore/ChangeLog	2015-06-05 22:10:19 UTC (rev 185269)
+++ trunk/Source/WebCore/ChangeLog	2015-06-05 22:33:23 UTC (rev 185270)
@@ -1,3 +1,20 @@
+2015-06-05  Matt Rajca  <[email protected]>
+
+        MediaSessions should keep track of their participating media elements.
+        https://bugs.webkit.org/show_bug.cgi?id=145703
+
+        Reviewed by Eric Carlson.
+
+        * Modules/mediasession/MediaSession.cpp:
+        (WebCore::MediaSession::addMediaElement): Add the given media element to the media session.
+        (WebCore::MediaSession::removeMediaElement): Remove the given media element from the media session.
+        (WebCore::MediaSession::activeParticipatingElements): Dynamically build a vector of actively-playing media
+          elements.
+        * Modules/mediasession/MediaSession.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::~HTMLMediaElement): Ensure the element is removed from its media session.
+        (WebCore::HTMLMediaElement::setSession): Update sessions' references to their media elements.
+
 2015-06-05  Chris Dumez  <[email protected]>
 
         Regression(r176212): Broke app switching on iCloud.com

Modified: trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp (185269 => 185270)


--- trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp	2015-06-05 22:10:19 UTC (rev 185269)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp	2015-06-05 22:33:23 UTC (rev 185270)
@@ -28,6 +28,8 @@
 
 #if ENABLE(MEDIA_SESSION)
 
+#include "HTMLMediaElement.h"
+
 namespace WebCore {
 
 MediaSession::MediaSession(ScriptExecutionContext& context, const String& kind)
@@ -48,6 +50,30 @@
     return controls;
 }
 
+void MediaSession::addMediaElement(HTMLMediaElement& element)
+{
+    ASSERT(!m_participatingElements.contains(&element));
+    m_participatingElements.append(&element);
+}
+
+void MediaSession::removeMediaElement(HTMLMediaElement& element)
+{
+    ASSERT(m_participatingElements.contains(&element));
+    m_participatingElements.remove(m_participatingElements.find(&element));
+}
+
+Vector<HTMLMediaElement*> MediaSession::activeParticipatingElements() const
+{
+    Vector<HTMLMediaElement*> elements;
+
+    for (auto* element : m_participatingElements) {
+        if (element->isPlaying())
+            elements.append(element);
+    }
+
+    return elements;
+}
+
 void MediaSession::releaseSession()
 {
 }

Modified: trunk/Source/WebCore/Modules/mediasession/MediaSession.h (185269 => 185270)


--- trunk/Source/WebCore/Modules/mediasession/MediaSession.h	2015-06-05 22:10:19 UTC (rev 185269)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSession.h	2015-06-05 22:33:23 UTC (rev 185270)
@@ -32,6 +32,8 @@
 
 namespace WebCore {
 
+class HTMLMediaElement;
+
 class MediaSession final : public RefCounted<MediaSession> {
 public:
     static Ref<MediaSession> create(ScriptExecutionContext& context, const String& kind)
@@ -54,7 +56,15 @@
         Interrupted
     };
 
+    friend class HTMLMediaElement;
+
+    void addMediaElement(HTMLMediaElement&);
+    void removeMediaElement(HTMLMediaElement&);
+
+    Vector<HTMLMediaElement*> activeParticipatingElements() const;
+
     State m_currentState { State::Idle };
+    Vector<HTMLMediaElement*> m_participatingElements;
 
     const String m_kind;
     RefPtr<MediaRemoteControls> m_controls;

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (185269 => 185270)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2015-06-05 22:10:19 UTC (rev 185269)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2015-06-05 22:33:23 UTC (rev 185270)
@@ -457,6 +457,13 @@
         m_isolatedWorld->clearWrappers();
 #endif
 
+#if ENABLE(MEDIA_SESSION)
+    if (m_session) {
+        m_session->removeMediaElement(*this);
+        m_session = nullptr;
+    }
+#endif
+
     m_seekTaskQueue.close();
 
     m_completelyLoaded = true;
@@ -6367,7 +6374,13 @@
 
 void HTMLMediaElement::setSession(MediaSession* session)
 {
+    if (m_session)
+        m_session->removeMediaElement(*this);
+
     m_session = session;
+
+    if (session)
+        session->addMediaElement(*this);
 }
 
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to