Title: [188345] trunk/Source
Revision
188345
Author
[email protected]
Date
2015-08-12 12:22:49 -0700 (Wed, 12 Aug 2015)

Log 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.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (188344 => 188345)


--- trunk/Source/WebCore/ChangeLog	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebCore/ChangeLog	2015-08-12 19:22:49 UTC (rev 188345)
@@ -1,3 +1,27 @@
+2015-08-07  Matt Rajca  <[email protected]>
+
+        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.
+
+        * 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:
+
 2015-08-12  Alex Christensen  <[email protected]>
 
         Fix Debug CMake builds on Windows

Modified: trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.cpp (188344 => 188345)


--- trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.cpp	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.cpp	2015-08-12 19:22:49 UTC (rev 188345)
@@ -28,18 +28,47 @@
 
 #if ENABLE(MEDIA_SESSION)
 
+#include "MediaSession.h"
+
 namespace WebCore {
 
-MediaRemoteControls::MediaRemoteControls(ScriptExecutionContext& context)
+MediaRemoteControls::MediaRemoteControls(ScriptExecutionContext& context, MediaSession* session)
     : m_scriptExecutionContext(context)
+    , m_session(session)
 {
 }
 
+void MediaRemoteControls::clearSession()
+{
+    m_session = nullptr;
+}
+
 MediaRemoteControls::~MediaRemoteControls()
 {
-    
 }
 
+void MediaRemoteControls::setPreviousTrackEnabled(bool isEnabled)
+{
+    if (m_previousTrackEnabled == isEnabled)
+        return;
+
+    m_previousTrackEnabled = isEnabled;
+
+    if (m_session)
+        m_session->controlIsEnabledDidChange();
 }
 
+void MediaRemoteControls::setNextTrackEnabled(bool isEnabled)
+{
+    if (m_nextTrackEnabled == isEnabled)
+        return;
+
+    m_nextTrackEnabled = isEnabled;
+
+    if (m_session)
+        m_session->controlIsEnabledDidChange();
+}
+
+}
+
 #endif /* ENABLE(MEDIA_SESSION) */

Modified: trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.h (188344 => 188345)


--- trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.h	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebCore/Modules/mediasession/MediaRemoteControls.h	2015-08-12 19:22:49 UTC (rev 188345)
@@ -33,35 +33,41 @@
 
 namespace WebCore {
 
+class MediaSession;
+
 class MediaRemoteControls : public RefCounted<MediaRemoteControls>, public EventTargetWithInlineData {
 public:
-    static Ref<MediaRemoteControls> create(ScriptExecutionContext& context)
+    static Ref<MediaRemoteControls> create(ScriptExecutionContext& context, MediaSession* session = nullptr)
     {
-        return adoptRef(*new MediaRemoteControls(context));
+        return adoptRef(*new MediaRemoteControls(context, session));
     }
 
     bool previousTrackEnabled() const { return m_previousTrackEnabled; }
-    void setPreviousTrackEnabled(bool enabled) { m_previousTrackEnabled = enabled; }
+    void setPreviousTrackEnabled(bool);
 
     bool nextTrackEnabled() const { return m_nextTrackEnabled; }
-    void setNextTrackEnabled(bool enabled) { m_nextTrackEnabled = enabled; }
+    void setNextTrackEnabled(bool);
 
     using RefCounted<MediaRemoteControls>::ref;
     using RefCounted<MediaRemoteControls>::deref;
 
+    void clearSession();
+
     virtual ~MediaRemoteControls();
 
-    MediaRemoteControls(ScriptExecutionContext&);
-
     virtual EventTargetInterface eventTargetInterface() const override { return MediaRemoteControlsEventTargetInterfaceType; }
     virtual ScriptExecutionContext* scriptExecutionContext() const override { return &m_scriptExecutionContext; }
 
 private:
+    MediaRemoteControls(ScriptExecutionContext&, MediaSession*);
+
     ScriptExecutionContext& m_scriptExecutionContext;
 
     bool m_previousTrackEnabled { false };
     bool m_nextTrackEnabled { false };
 
+    MediaSession* m_session { nullptr };
+
     virtual void refEventTarget() override final { ref(); }
     virtual void derefEventTarget() override final { deref(); }
 };

Modified: trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp (188344 => 188345)


--- trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp	2015-08-12 19:22:49 UTC (rev 188345)
@@ -71,7 +71,7 @@
     // 3. If media session's current media session type is "content", then create a new media remote controller for media
     //    session. (Otherwise media session has no media remote controller.)
     if (m_kind == Kind::Content)
-        m_controls = adoptRef(*new MediaRemoteControls(context));
+        m_controls = MediaRemoteControls::create(context, this);
 
     MediaSessionManager::singleton().addMediaSession(*this);
 }
@@ -79,6 +79,9 @@
 MediaSession::~MediaSession()
 {
     MediaSessionManager::singleton().removeMediaSession(*this);
+
+    if (m_controls)
+        m_controls->clearSession();
 }
 
 String MediaSession::kind() const
@@ -317,6 +320,21 @@
         m_controls->dispatchEvent(Event::create(eventNames().previoustrackEvent, false, false));
 }
 
+void MediaSession::controlIsEnabledDidChange()
+{
+    // Media remote controls are only allowed on Content media sessions.
+    ASSERT(m_kind == Kind::Content);
+
+    // Media elements belonging to Content media sessions have mutually-exclusive playback.
+    ASSERT(m_activeParticipatingElements.size() <= 1);
+
+    if (m_activeParticipatingElements.isEmpty())
+        return;
+
+    HTMLMediaElement* element = *m_activeParticipatingElements.begin();
+    m_document.updateIsPlayingMedia(element->elementID());
 }
 
+}
+
 #endif /* ENABLE(MEDIA_SESSION) */

Modified: trunk/Source/WebCore/Modules/mediasession/MediaSession.h (188344 => 188345)


--- trunk/Source/WebCore/Modules/mediasession/MediaSession.h	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSession.h	2015-08-12 19:22:49 UTC (rev 188345)
@@ -86,6 +86,8 @@
     void skipToNextTrack();
     void skipToPreviousTrack();
 
+    void controlIsEnabledDidChange();
+
 private:
     friend class HTMLMediaElement;
 

Modified: trunk/Source/WebCore/dom/Document.cpp (188344 => 188345)


--- trunk/Source/WebCore/dom/Document.cpp	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebCore/dom/Document.cpp	2015-08-12 19:22:49 UTC (rev 188345)
@@ -3516,6 +3516,16 @@
     if (HTMLMediaElement* sourceElement = HTMLMediaElement::elementWithID(sourceElementID)) {
         if (sourceElement->isPlaying())
             state |= MediaProducer::IsSourceElementPlaying;
+
+        if (MediaSession* session = sourceElement->session()) {
+            bool isNull;
+            if (MediaRemoteControls* controls = session->controls(isNull)) {
+                if (controls->previousTrackEnabled())
+                    state |= MediaProducer::IsPreviousTrackControlEnabled;
+                if (controls->nextTrackEnabled())
+                    state |= MediaProducer::IsNextTrackControlEnabled;
+            }
+        }
     }
 #endif
 

Modified: trunk/Source/WebCore/page/MediaProducer.h (188344 => 188345)


--- trunk/Source/WebCore/page/MediaProducer.h	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebCore/page/MediaProducer.h	2015-08-12 19:22:49 UTC (rev 188345)
@@ -39,6 +39,8 @@
         ExternalDeviceAutoPlayCandidate = 1 << 4,
         DidPlayToEnd = 1 << 5,
         IsSourceElementPlaying = 1 << 6,
+        IsNextTrackControlEnabled = 1 << 7,
+        IsPreviousTrackControlEnabled = 1 << 8,
     };
     typedef unsigned MediaStateFlags;
 

Modified: trunk/Source/WebKit2/ChangeLog (188344 => 188345)


--- trunk/Source/WebKit2/ChangeLog	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebKit2/ChangeLog	2015-08-12 19:22:49 UTC (rev 188345)
@@ -1,3 +1,17 @@
+2015-08-07  Matt Rajca  <[email protected]>
+
+        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.
+
+        * 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.
+
 2015-08-12  Devin Rousso  <[email protected]>
 
         Web Inspector: Implement selector highlighting for iOS

Modified: trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.cpp (188344 => 188345)


--- trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.cpp	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.cpp	2015-08-12 19:22:49 UTC (rev 188345)
@@ -70,16 +70,23 @@
     return m_playbackAttributes & attribute;
 }
 
-void WebMediaSessionFocusManager::mediaElementIsPlayingDidChange(WebPageProxy* proxy, uint64_t elementID, bool isPlaying)
+void WebMediaSessionFocusManager::updatePlaybackAttribute(WKMediaSessionFocusManagerPlaybackAttribute attribute, bool value)
 {
+    if (value)
+        m_playbackAttributes |= attribute;
+    else
+        m_playbackAttributes &= ~attribute;
+
+    m_client.didChangePlaybackAttribute(this, attribute, value);
+}
+
+void WebMediaSessionFocusManager::updatePlaybackAttributesFromMediaState(WebPageProxy* proxy, uint64_t elementID, WebCore::MediaProducer::MediaStateFlags flags)
+{
     if (m_focusedMediaElement) {
         if (proxy == m_focusedMediaElement->first && elementID == m_focusedMediaElement->second) {
-            if (isPlaying)
-                m_playbackAttributes |= IsPlaying;
-            else
-                m_playbackAttributes &= ~IsPlaying;
-
-            m_client.didChangePlaybackAttribute(this, IsPlaying, isPlaying);
+            updatePlaybackAttribute(IsPlaying, flags & WebCore::MediaProducer::IsSourceElementPlaying);
+            updatePlaybackAttribute(IsNextTrackControlEnabled, flags & WebCore::MediaProducer::IsNextTrackControlEnabled);
+            updatePlaybackAttribute(IsPreviousTrackControlEnabled, flags & WebCore::MediaProducer::IsPreviousTrackControlEnabled);
         }
     }
 }

Modified: trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.h (188344 => 188345)


--- trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.h	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebKit2/UIProcess/WebMediaSessionFocusManager.h	2015-08-12 19:22:49 UTC (rev 188345)
@@ -46,7 +46,7 @@
     void initializeClient(const WKMediaSessionFocusManagerClientBase*);
 
     bool valueForPlaybackAttribute(WKMediaSessionFocusManagerPlaybackAttribute) const;
-    void mediaElementIsPlayingDidChange(WebPageProxy*, uint64_t, bool);
+    void updatePlaybackAttributesFromMediaState(WebPageProxy*, uint64_t, WebCore::MediaProducer::MediaStateFlags);
 
     void setFocusedMediaElement(WebPageProxy&, uint64_t);
     void clearFocusedMediaElement();
@@ -61,6 +61,8 @@
     virtual void refWebContextSupplement() override;
     virtual void derefWebContextSupplement() override;
 
+    void updatePlaybackAttribute(WKMediaSessionFocusManagerPlaybackAttribute, bool);
+
     std::unique_ptr<FocusedMediaElement> m_focusedMediaElement;
     WKMediaSessionFocusManagerPlaybackAttributes m_playbackAttributes { 0 };
     WebMediaSessionFocusManagerClient m_client;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (188344 => 188345)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2015-08-12 19:16:49 UTC (rev 188344)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2015-08-12 19:22:49 UTC (rev 188345)
@@ -5949,7 +5949,7 @@
 #if ENABLE(MEDIA_SESSION)
     WebMediaSessionFocusManager* focusManager = process().processPool().supplement<WebMediaSessionFocusManager>();
     ASSERT(focusManager);
-    focusManager->mediaElementIsPlayingDidChange(this, sourceElementID, state & MediaProducer::IsSourceElementPlaying);
+    focusManager->updatePlaybackAttributesFromMediaState(this, sourceElementID, state);
 #endif
 
     if (state == m_mediaState)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to