Title: [201167] trunk/Source/WebCore
Revision
201167
Author
[email protected]
Date
2016-05-19 09:22:35 -0700 (Thu, 19 May 2016)

Log Message

Playback controls should not be active for muted media elements.
https://bugs.webkit.org/show_bug.cgi?id=157876
<rdar://problem/26007525>

Reviewed by Eric Carlson.

Consolidate calls to setUpPlaybackControlsManager() and clearUpPlaybackControlsManager()
into a new method, updatePlaybackControlsManager(), which checks with the MediaElementSession
whether the media element can currently control the playback controls manager, and call
one or the other method conditionally.

That means more logic needs to be moved into MediaElementSession::canControlControlsManager(),
such as whether the element is muted(), has ended(), or whether the element's document has
been suspended.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::~HTMLMediaElement):
(WebCore::HTMLMediaElement::setMuted):
(WebCore::HTMLMediaElement::updatePlayState):
(WebCore::HTMLMediaElement::clearMediaPlayer):
(WebCore::HTMLMediaElement::stopWithoutDestroyingMediaPlayer):
(WebCore::HTMLMediaElement::createMediaPlayer):
(WebCore::HTMLMediaElement::updatePlaybackControlsManager):
* html/HTMLMediaElement.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::canControlControlsManager):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (201166 => 201167)


--- trunk/Source/WebCore/ChangeLog	2016-05-19 16:11:52 UTC (rev 201166)
+++ trunk/Source/WebCore/ChangeLog	2016-05-19 16:22:35 UTC (rev 201167)
@@ -1,3 +1,32 @@
+2016-05-18  Jer Noble  <[email protected]>
+
+        Playback controls should not be active for muted media elements.
+        https://bugs.webkit.org/show_bug.cgi?id=157876
+        <rdar://problem/26007525>
+
+        Reviewed by Eric Carlson.
+
+        Consolidate calls to setUpPlaybackControlsManager() and clearUpPlaybackControlsManager()
+        into a new method, updatePlaybackControlsManager(), which checks with the MediaElementSession
+        whether the media element can currently control the playback controls manager, and call
+        one or the other method conditionally.
+
+        That means more logic needs to be moved into MediaElementSession::canControlControlsManager(),
+        such as whether the element is muted(), has ended(), or whether the element's document has
+        been suspended.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::~HTMLMediaElement):
+        (WebCore::HTMLMediaElement::setMuted):
+        (WebCore::HTMLMediaElement::updatePlayState):
+        (WebCore::HTMLMediaElement::clearMediaPlayer):
+        (WebCore::HTMLMediaElement::stopWithoutDestroyingMediaPlayer):
+        (WebCore::HTMLMediaElement::createMediaPlayer):
+        (WebCore::HTMLMediaElement::updatePlaybackControlsManager):
+        * html/HTMLMediaElement.h:
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::canControlControlsManager):
+
 2016-05-19  Chris Dumez  <[email protected]>
 
         Kill JSDOMBindings' createNewWrapper()

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (201166 => 201167)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-05-19 16:11:52 UTC (rev 201166)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-05-19 16:22:35 UTC (rev 201167)
@@ -500,9 +500,6 @@
     setShouldDelayLoadEvent(false);
     unregisterWithDocument(document());
 
-    if (document().page())
-        document().page()->chrome().client().clearPlaybackControlsManager(*this);
-
 #if ENABLE(VIDEO_TRACK)
     if (m_audioTracks) {
         m_audioTracks->clearElement();
@@ -562,6 +559,9 @@
     m_pauseAfterDetachedTaskQueue.close();
 
     m_completelyLoaded = true;
+
+    m_player = nullptr;
+    updatePlaybackControlsManager();
 }
 
 void HTMLMediaElement::registerWithDocument(Document& document)
@@ -3353,6 +3353,8 @@
 #endif
     }
 #endif
+
+    updatePlaybackControlsManager();
 }
 
 void HTMLMediaElement::togglePlayState()
@@ -4835,8 +4837,7 @@
     LOG(Media, "HTMLMediaElement::updatePlayState(%p) - shouldBePlaying = %s, playerPaused = %s", this, boolString(shouldBePlaying), boolString(playerPaused));
 
     if (shouldBePlaying) {
-        if (document().page() && m_mediaSession->canControlControlsManager(*this))
-            document().page()->chrome().client().setUpPlaybackControlsManager(*this);
+        updatePlaybackControlsManager();
 
         setDisplayMode(Video);
         invalidateCachedTime();
@@ -4870,8 +4871,7 @@
         startPlaybackProgressTimer();
         setPlaying(true);
     } else {
-        if (endedPlayback() && document().page())
-            document().page()->chrome().client().clearPlaybackControlsManager(*this);
+        updatePlaybackControlsManager();
 
         if (!playerPaused)
             m_player->pause();
@@ -5008,10 +5008,8 @@
         document().removeMediaCanStartListener(this);
     }
 
-    if (document().page())
-        document().page()->chrome().client().clearPlaybackControlsManager(*this);
-
     m_player = nullptr;
+    updatePlaybackControlsManager();
 
     stopPeriodicTimers();
     m_pendingActionTimer.stop();
@@ -5047,9 +5045,7 @@
     if (m_videoFullscreenMode != VideoFullscreenModeNone)
         exitFullscreen();
 
-    if (document().page())
-        document().page()->chrome().client().clearPlaybackControlsManager(*this);
-
+    updatePlaybackControlsManager();
     m_inActiveDocument = false;
 
     // Stop the playback without generating events
@@ -5890,11 +5886,8 @@
 #if ENABLE(VIDEO_TRACK)
     forgetResourceSpecificTracks();
 #endif
-
-    if (document().page())
-        document().page()->chrome().client().clearPlaybackControlsManager(*this);
-
     m_player = std::make_unique<MediaPlayer>(static_cast<MediaPlayerClient&>(*this));
+    updatePlaybackControlsManager();
 
 #if ENABLE(WEB_AUDIO)
     if (m_audioSourceNode) {
@@ -7019,6 +7012,18 @@
         play();
 }
 
+void HTMLMediaElement::updatePlaybackControlsManager()
+{
+    Page* page = document().page();
+    if (!page)
+        return;
+
+    if (m_mediaSession->canControlControlsManager(*this))
+        page->chrome().client().setUpPlaybackControlsManager(*this);
+    else
+        page->chrome().client().clearPlaybackControlsManager(*this);
 }
 
+}
+
 #endif

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (201166 => 201167)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2016-05-19 16:11:52 UTC (rev 201166)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2016-05-19 16:22:35 UTC (rev 201167)
@@ -784,6 +784,7 @@
     void updateShouldAutoplay();
 
     void pauseAfterDetachedTask();
+    void updatePlaybackControlsManager();
 
     Timer m_pendingActionTimer;
     Timer m_progressEventTimer;

Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (201166 => 201167)


--- trunk/Source/WebCore/html/MediaElementSession.cpp	2016-05-19 16:11:52 UTC (rev 201166)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp	2016-05-19 16:22:35 UTC (rev 201167)
@@ -216,6 +216,15 @@
     if (!element.hasAudio())
         return false;
 
+    if (element.muted())
+        return false;
+
+    if (element.ended())
+        return false;
+
+    if (element.document().activeDOMObjectsAreSuspended())
+        return false;
+
     if (!playbackPermitted(element))
         return false;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to