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)