Title: [202425] trunk/Source
Revision
202425
Author
[email protected]
Date
2016-06-24 10:12:10 -0700 (Fri, 24 Jun 2016)

Log Message

Playback controls refer to wrong element when playing multiple items in a page.
https://bugs.webkit.org/show_bug.cgi?id=159076
<rdar://problem/26953532>

Reviewed by Beth Dakin.

Source/WebCore:

Use a new method PlatformMediaSessionManager::currentSessionMatching() to get
the most recently active media element which qualifies for playback controls.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::updatePlaybackControlsManager): Get the most recently active session.
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::canControlControlsManager): Make virtual; no longer takes an element.
* html/MediaElementSession.h:
(isType): Allow downcasting from PlatformMediaSession -> MediaElementSession.
* page/ChromeClient.h:
* platform/audio/PlatformMediaSession.h:
(WebCore::PlatformMediaSession::canControlControlsManager): Defaults to false;
* platform/audio/PlatformMediaSessionManager.cpp:
(WebCore::PlatformMediaSessionManager::currentSessionMatching): Added.
* platform/audio/PlatformMediaSessionManager.h:

Source/WebKit/mac:

clearPlaybackControlsManager() no longer takes a parameter.

* WebCoreSupport/WebChromeClient.h:
* WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::clearPlaybackControlsManager):
* WebView/WebView.mm:
(-[WebView _clearPlaybackControlsManager]): Renamed from _clearPlaybackControlsManagerForMediaElement:.
* WebView/WebViewInternal.h:

Source/WebKit2:

clearPlaybackControlsManager() no longer takes a parameter.

* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::clearPlaybackControlsManager):
* WebProcess/WebCoreSupport/WebChromeClient.h:
* WebProcess/cocoa/WebPlaybackSessionManager.h:
* WebProcess/cocoa/WebPlaybackSessionManager.mm:
(WebKit::WebPlaybackSessionManager::setUpPlaybackControlsManager): Make sure to removeClientForContext()
    if the old context refers to a live media element.
(WebKit::WebPlaybackSessionManager::clearPlaybackControlsManager):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (202424 => 202425)


--- trunk/Source/WebCore/ChangeLog	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/ChangeLog	2016-06-24 17:12:10 UTC (rev 202425)
@@ -1,3 +1,27 @@
+2016-06-24  Jer Noble  <[email protected]>
+
+        Playback controls refer to wrong element when playing multiple items in a page.
+        https://bugs.webkit.org/show_bug.cgi?id=159076
+        <rdar://problem/26953532>
+
+        Reviewed by Beth Dakin.
+
+        Use a new method PlatformMediaSessionManager::currentSessionMatching() to get
+        the most recently active media element which qualifies for playback controls.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::updatePlaybackControlsManager): Get the most recently active session.
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::canControlControlsManager): Make virtual; no longer takes an element.
+        * html/MediaElementSession.h:
+        (isType): Allow downcasting from PlatformMediaSession -> MediaElementSession.
+        * page/ChromeClient.h:
+        * platform/audio/PlatformMediaSession.h:
+        (WebCore::PlatformMediaSession::canControlControlsManager): Defaults to false;
+        * platform/audio/PlatformMediaSessionManager.cpp:
+        (WebCore::PlatformMediaSessionManager::currentSessionMatching): Added.
+        * platform/audio/PlatformMediaSessionManager.h:
+
 2016-06-24  Dan Bernstein  <[email protected]>
 
         Fixed the macOS build.

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (202424 => 202425)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-06-24 17:12:10 UTC (rev 202425)
@@ -7090,10 +7090,14 @@
     if (!page)
         return;
 
-    if (m_mediaSession->canControlControlsManager(*this))
-        page->chrome().client().setUpPlaybackControlsManager(*this);
+    PlatformMediaSession* session = PlatformMediaSessionManager::sharedManager().currentSessionMatching([] (const PlatformMediaSession& session) {
+        return session.canControlControlsManager();
+    });
+
+    if (!is<MediaElementSession>(session))
+        page->chrome().client().clearPlaybackControlsManager();
     else
-        page->chrome().client().clearPlaybackControlsManager(*this);
+        page->chrome().client().setUpPlaybackControlsManager(downcast<MediaElementSession>(session)->element());
 }
 
 bool HTMLMediaElement::shouldOverrideBackgroundLoadingRestriction() const

Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (202424 => 202425)


--- trunk/Source/WebCore/html/MediaElementSession.cpp	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp	2016-06-24 17:12:10 UTC (rev 202425)
@@ -211,45 +211,45 @@
     return true;
 }
 
-bool MediaElementSession::canControlControlsManager(const HTMLMediaElement& element) const
+bool MediaElementSession::canControlControlsManager() const
 {
-    if (!element.hasAudio()) {
+    if (!m_element.hasAudio()) {
         LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No audio");
         return false;
     }
 
-    if (element.muted()) {
+    if (m_element.muted()) {
         LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Muted");
         return false;
     }
 
-    if (element.ended()) {
+    if (m_element.ended()) {
         LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Ended");
         return false;
     }
 
-    if (element.document().activeDOMObjectsAreSuspended()) {
+    if (m_element.document().activeDOMObjectsAreSuspended()) {
         LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: activeDOMObjectsAreSuspended()");
         return false;
     }
 
-    if (!playbackPermitted(element)) {
+    if (!playbackPermitted(m_element)) {
         LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Playback not permitted");
         return false;
     }
 
-    if (element.isVideo()) {
-        if (!element.renderer()) {
+    if (m_element.isVideo()) {
+        if (!m_element.renderer()) {
             LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No renderer");
             return false;
         }
 
-        if (!element.hasVideo()) {
+        if (!m_element.hasVideo()) {
             LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No video");
             return false;
         }
 
-        if (isElementLargeEnoughForMainContent(element)) {
+        if (isElementLargeEnoughForMainContent(m_element)) {
             LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is main content");
             return true;
         }

Modified: trunk/Source/WebCore/html/MediaElementSession.h (202424 => 202425)


--- trunk/Source/WebCore/html/MediaElementSession.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/html/MediaElementSession.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -31,6 +31,7 @@
 #include "MediaPlayer.h"
 #include "PlatformMediaSession.h"
 #include "Timer.h"
+#include <wtf/TypeCasts.h>
 
 namespace WebCore {
 
@@ -53,7 +54,7 @@
     bool pageAllowsDataLoading(const HTMLMediaElement&) const;
     bool pageAllowsPlaybackAfterResuming(const HTMLMediaElement&) const;
 
-    bool canControlControlsManager(const HTMLMediaElement&) const;
+    bool canControlControlsManager() const override;
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     void showPlaybackTargetPicker(const HTMLMediaElement&);
@@ -107,6 +108,8 @@
     size_t maximumMediaSourceBufferSize(const SourceBuffer&) const;
 #endif
 
+    HTMLMediaElement& element() const { return m_element; }
+
 private:
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
@@ -142,6 +145,10 @@
 
 }
 
-#endif // MediaElementSession_h
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::MediaElementSession)
+static bool isType(const WebCore::PlatformMediaSession& session) { return session.mediaType() == WebCore::PlatformMediaSession::Video || session.mediaType() == WebCore::PlatformMediaSession::Audio; }
+SPECIALIZE_TYPE_TRAITS_END()
 
 #endif // ENABLE(VIDEO)
+
+#endif // MediaElementSession_h

Modified: trunk/Source/WebCore/page/ChromeClient.h (202424 => 202425)


--- trunk/Source/WebCore/page/ChromeClient.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/page/ChromeClient.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -342,7 +342,7 @@
 #if ENABLE(VIDEO)
     virtual void enterVideoFullscreenForVideoElement(HTMLVideoElement&, HTMLMediaElementEnums::VideoFullscreenMode) { }
     virtual void setUpPlaybackControlsManager(HTMLMediaElement&) { }
-    virtual void clearPlaybackControlsManager(HTMLMediaElement&) { }
+    virtual void clearPlaybackControlsManager() { }
 #endif
     virtual void exitVideoFullscreenForVideoElement(WebCore::HTMLVideoElement&) { }
     virtual void exitVideoFullscreenToModeWithoutAnimation(WebCore::HTMLVideoElement&, HTMLMediaElementEnums::VideoFullscreenMode /*targetMode*/) { }

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSession.h (202424 => 202425)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSession.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSession.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -139,6 +139,7 @@
 
     bool shouldOverrideBackgroundLoadingRestriction() const;
 
+    virtual bool canControlControlsManager() const { return false; }
     virtual bool canPlayToWirelessPlaybackTarget() const { return false; }
     virtual bool isPlayingToWirelessPlaybackTarget() const { return m_isPlayingToWirelessPlaybackTarget; }
     void isPlayingToWirelessPlaybackTargetChanged(bool);

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp (202424 => 202425)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp	2016-06-24 17:12:10 UTC (rev 202425)
@@ -277,6 +277,15 @@
 
     return m_sessions[0];
 }
+
+PlatformMediaSession* PlatformMediaSessionManager::currentSessionMatching(std::function<bool(const PlatformMediaSession &)> filter)
+{
+    for (auto& session : m_sessions) {
+        if (filter(*session))
+            return session;
+    }
+    return nullptr;
+}
     
 bool PlatformMediaSessionManager::sessionCanLoadMedia(const PlatformMediaSession& session) const
 {

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h (202424 => 202425)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -92,6 +92,8 @@
     void setCurrentSession(PlatformMediaSession&);
     PlatformMediaSession* currentSession();
 
+    PlatformMediaSession* currentSessionMatching(std::function<bool(const PlatformMediaSession&)>);
+
     void sessionIsPlayingToWirelessPlaybackTargetChanged(PlatformMediaSession&);
     void sessionCanProduceAudioChanged(PlatformMediaSession&);
 

Modified: trunk/Source/WebKit/mac/ChangeLog (202424 => 202425)


--- trunk/Source/WebKit/mac/ChangeLog	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit/mac/ChangeLog	2016-06-24 17:12:10 UTC (rev 202425)
@@ -1,3 +1,20 @@
+2016-06-24  Jer Noble  <[email protected]>
+
+        Playback controls refer to wrong element when playing multiple items in a page.
+        https://bugs.webkit.org/show_bug.cgi?id=159076
+        <rdar://problem/26953532>
+
+        Reviewed by Beth Dakin.
+
+        clearPlaybackControlsManager() no longer takes a parameter.
+
+        * WebCoreSupport/WebChromeClient.h:
+        * WebCoreSupport/WebChromeClient.mm:
+        (WebChromeClient::clearPlaybackControlsManager):
+        * WebView/WebView.mm:
+        (-[WebView _clearPlaybackControlsManager]): Renamed from _clearPlaybackControlsManagerForMediaElement:.
+        * WebView/WebViewInternal.h:
+
 2016-06-23  Alex Christensen  <[email protected]>
 
         Remove unused didCancelAuthenticationChallenge

Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h (202424 => 202425)


--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -177,7 +177,7 @@
 #if ENABLE(VIDEO)
 #if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
     void setUpPlaybackControlsManager(WebCore::HTMLMediaElement&) override;
-    void clearPlaybackControlsManager(WebCore::HTMLMediaElement&) override;
+    void clearPlaybackControlsManager() override;
 #endif
 
     bool supportsVideoFullscreen(WebCore::HTMLMediaElementEnums::VideoFullscreenMode) override;

Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm (202424 => 202425)


--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm	2016-06-24 17:12:10 UTC (rev 202425)
@@ -939,9 +939,9 @@
     [m_webView _setUpPlaybackControlsManagerForMediaElement:element];
 }
 
-void WebChromeClient::clearPlaybackControlsManager(HTMLMediaElement& element)
+void WebChromeClient::clearPlaybackControlsManager()
 {
-    [m_webView _clearPlaybackControlsManagerForMediaElement:element];
+    [m_webView _clearPlaybackControlsManager];
 }
 #endif // PLATFORM(MAC)
 #endif // ENABLE(VIDEO)

Modified: trunk/Source/WebKit/mac/WebView/WebView.mm (202424 => 202425)


--- trunk/Source/WebKit/mac/WebView/WebView.mm	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit/mac/WebView/WebView.mm	2016-06-24 17:12:10 UTC (rev 202425)
@@ -8612,9 +8612,9 @@
     [self updateWebViewAdditions];
 }
 
-- (void)_clearPlaybackControlsManagerForMediaElement:(WebCore::HTMLMediaElement&)mediaElement
+- (void)_clearPlaybackControlsManager
 {
-    if (!_private->playbackSessionModel || _private->playbackSessionModel->mediaElement() != &mediaElement)
+    if (!_private->playbackSessionModel || !_private->playbackSessionModel->mediaElement())
         return;
 
     _private->playbackSessionModel->setMediaElement(nullptr);

Modified: trunk/Source/WebKit/mac/WebView/WebViewInternal.h (202424 => 202425)


--- trunk/Source/WebKit/mac/WebView/WebViewInternal.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit/mac/WebView/WebViewInternal.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -255,7 +255,7 @@
 #if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
 - (BOOL)_hasActiveVideoForControlsInterface;
 - (void)_setUpPlaybackControlsManagerForMediaElement:(WebCore::HTMLMediaElement&)mediaElement;
-- (void)_clearPlaybackControlsManagerForMediaElement:(WebCore::HTMLMediaElement&)mediaElement;
+- (void)_clearPlaybackControlsManager;
 #endif
 #endif
 

Modified: trunk/Source/WebKit2/ChangeLog (202424 => 202425)


--- trunk/Source/WebKit2/ChangeLog	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit2/ChangeLog	2016-06-24 17:12:10 UTC (rev 202425)
@@ -1,3 +1,22 @@
+2016-06-24  Jer Noble  <[email protected]>
+
+        Playback controls refer to wrong element when playing multiple items in a page.
+        https://bugs.webkit.org/show_bug.cgi?id=159076
+        <rdar://problem/26953532>
+
+        Reviewed by Beth Dakin.
+
+        clearPlaybackControlsManager() no longer takes a parameter.
+
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::clearPlaybackControlsManager):
+        * WebProcess/WebCoreSupport/WebChromeClient.h:
+        * WebProcess/cocoa/WebPlaybackSessionManager.h:
+        * WebProcess/cocoa/WebPlaybackSessionManager.mm:
+        (WebKit::WebPlaybackSessionManager::setUpPlaybackControlsManager): Make sure to removeClientForContext()
+            if the old context refers to a live media element.
+        (WebKit::WebPlaybackSessionManager::clearPlaybackControlsManager):
+
 2016-06-24  Brady Eidson  <[email protected]>
 
         IDB tests crashing attempting to register sandbox extensions for blob files.

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (202424 => 202425)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp	2016-06-24 17:12:10 UTC (rev 202425)
@@ -856,9 +856,9 @@
     m_page->playbackSessionManager().setUpPlaybackControlsManager(mediaElement);
 }
 
-void WebChromeClient::clearPlaybackControlsManager(WebCore::HTMLMediaElement& mediaElement)
+void WebChromeClient::clearPlaybackControlsManager()
 {
-    m_page->playbackSessionManager().clearPlaybackControlsManager(mediaElement);
+    m_page->playbackSessionManager().clearPlaybackControlsManager();
 }
 
 void WebChromeClient::enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement& videoElement, WebCore::HTMLMediaElementEnums::VideoFullscreenMode mode)

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h (202424 => 202425)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -244,7 +244,7 @@
 #if (PLATFORM(IOS) && HAVE(AVKIT)) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
     bool supportsVideoFullscreen(WebCore::HTMLMediaElementEnums::VideoFullscreenMode) override;
     void setUpPlaybackControlsManager(WebCore::HTMLMediaElement&) override;
-    void clearPlaybackControlsManager(WebCore::HTMLMediaElement&) override;
+    void clearPlaybackControlsManager() override;
     void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement&, WebCore::HTMLMediaElementEnums::VideoFullscreenMode) override;
     void exitVideoFullscreenForVideoElement(WebCore::HTMLVideoElement&) override;
 #if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)

Modified: trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.h (202424 => 202425)


--- trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.h	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.h	2016-06-24 17:12:10 UTC (rev 202425)
@@ -94,7 +94,7 @@
     void didReceiveMessage(IPC::Connection&, IPC::MessageDecoder&) final;
 
     void setUpPlaybackControlsManager(WebCore::HTMLMediaElement&);
-    void clearPlaybackControlsManager(WebCore::HTMLMediaElement&);
+    void clearPlaybackControlsManager();
     uint64_t contextIdForMediaElement(WebCore::HTMLMediaElement&);
 
 protected:

Modified: trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm (202424 => 202425)


--- trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm	2016-06-24 17:05:46 UTC (rev 202424)
+++ trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm	2016-06-24 17:12:10 UTC (rev 202425)
@@ -246,6 +246,8 @@
     } else {
         auto addResult = m_mediaElements.ensure(&mediaElement, [&] { return nextContextId(); });
         auto contextId = addResult.iterator->value;
+        if (m_controlsManagerContextId)
+            removeClientForContext(m_controlsManagerContextId);
         m_controlsManagerContextId = contextId;
         ensureModel(contextId).setMediaElement(&mediaElement);
     }
@@ -255,16 +257,12 @@
 #endif
 }
 
-void WebPlaybackSessionManager::clearPlaybackControlsManager(WebCore::HTMLMediaElement& mediaElement)
+void WebPlaybackSessionManager::clearPlaybackControlsManager()
 {
 #if PLATFORM(MAC)
-    auto foundIterator = m_mediaElements.find(&mediaElement);
-    if (foundIterator == m_mediaElements.end())
+    if (!m_controlsManagerContextId)
         return;
 
-    if (!m_controlsManagerContextId || m_controlsManagerContextId != foundIterator->value)
-        return;
-
     removeClientForContext(m_controlsManagerContextId);
     m_controlsManagerContextId = 0;
     m_page->send(Messages::WebPlaybackSessionManagerProxy::ClearPlaybackControlsManager(), m_page->pageID());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to