Title: [186593] trunk/Source/WebCore
- Revision
- 186593
- Author
- mra...@apple.com
- Date
- 2015-07-09 09:26:33 -0700 (Thu, 09 Jul 2015)
Log 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:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (186592 => 186593)
--- trunk/Source/WebCore/ChangeLog 2015-07-09 15:27:43 UTC (rev 186592)
+++ trunk/Source/WebCore/ChangeLog 2015-07-09 16:26:33 UTC (rev 186593)
@@ -1,3 +1,21 @@
+2015-07-08 Matt Rajca <mra...@apple.com>
+
+ 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:
+
2015-07-09 Darin Adler <da...@apple.com>
REGRESSION (r182866): repeated prompts for password on internal Apple website using workers
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp (186592 => 186593)
--- trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp 2015-07-09 15:27:43 UTC (rev 186592)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSession.cpp 2015-07-09 16:26:33 UTC (rev 186593)
@@ -115,14 +115,33 @@
ASSERT(m_participatingElements.contains(&element));
m_participatingElements.remove(&element);
- m_activeParticipatingElements.remove(&element);
+ changeActiveMediaElements([&]() {
+ m_activeParticipatingElements.remove(&element);
+ });
+
if (m_iteratedActiveParticipatingElements)
m_iteratedActiveParticipatingElements->remove(&element);
}
+void MediaSession::changeActiveMediaElements(std::function<void(void)> worker)
+{
+ if (Page *page = m_document.page()) {
+ bool hadActiveMediaElements = MediaSessionManager::singleton().hasActiveMediaElements();
+
+ worker();
+
+ bool hasActiveMediaElements = MediaSessionManager::singleton().hasActiveMediaElements();
+ if (hadActiveMediaElements != hasActiveMediaElements)
+ page->chrome().client().hasMediaSessionWithActiveMediaElementsDidChange(hasActiveMediaElements);
+ } else
+ worker();
+}
+
void MediaSession::addActiveMediaElement(HTMLMediaElement& element)
{
- m_activeParticipatingElements.add(&element);
+ changeActiveMediaElements([&]() {
+ m_activeParticipatingElements.add(&element);
+ });
}
bool MediaSession::isMediaElementActive(HTMLMediaElement& element)
@@ -130,7 +149,7 @@
return m_activeParticipatingElements.contains(&element);
}
-bool MediaSession::hasActiveMediaElements()
+bool MediaSession::hasActiveMediaElements() const
{
return !m_activeParticipatingElements.isEmpty();
}
@@ -171,8 +190,10 @@
// 1. Let media session be the current media session.
// 2. Indefinitely pause all of media session's active participating media elements.
// 3. Reset media session's active participating media elements to an empty list.
- while (!m_activeParticipatingElements.isEmpty())
- m_activeParticipatingElements.takeAny()->pause();
+ changeActiveMediaElements([&]() {
+ while (!m_activeParticipatingElements.isEmpty())
+ m_activeParticipatingElements.takeAny()->pause();
+ });
// 4. Run the media session release algorithm for media session.
releaseInternal();
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSession.h (186592 => 186593)
--- trunk/Source/WebCore/Modules/mediasession/MediaSession.h 2015-07-09 15:27:43 UTC (rev 186592)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSession.h 2015-07-09 16:26:33 UTC (rev 186593)
@@ -58,6 +58,7 @@
MediaRemoteControls* controls(bool& isNull);
State currentState() const { return m_currentState; }
+ bool hasActiveMediaElements() const;
void setMetadata(const Dictionary&);
@@ -87,9 +88,9 @@
void addMediaElement(HTMLMediaElement&);
void removeMediaElement(HTMLMediaElement&);
+ void changeActiveMediaElements(std::function<void(void)>);
void addActiveMediaElement(HTMLMediaElement&);
bool isMediaElementActive(HTMLMediaElement&);
- bool hasActiveMediaElements();
void releaseInternal();
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.cpp (186592 => 186593)
--- trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.cpp 2015-07-09 15:27:43 UTC (rev 186592)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.cpp 2015-07-09 16:26:33 UTC (rev 186593)
@@ -41,6 +41,16 @@
return manager;
}
+bool MediaSessionManager::hasActiveMediaElements() const
+{
+ for (auto* session : m_sessions) {
+ if (session->hasActiveMediaElements())
+ return true;
+ }
+
+ return false;
+}
+
void MediaSessionManager::addMediaSession(MediaSession& session)
{
m_sessions.add(&session);
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.h (186592 => 186593)
--- trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.h 2015-07-09 15:27:43 UTC (rev 186592)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSessionManager.h 2015-07-09 16:26:33 UTC (rev 186593)
@@ -45,6 +45,8 @@
private:
friend class MediaSession;
+ bool hasActiveMediaElements() const;
+
void addMediaSession(MediaSession&);
void removeMediaSession(MediaSession&);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes