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());