Diff
Modified: trunk/Source/WebCore/ChangeLog (275202 => 275203)
--- trunk/Source/WebCore/ChangeLog 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/ChangeLog 2021-03-30 14:12:07 UTC (rev 275203)
@@ -1,3 +1,40 @@
+2021-03-30 Jean-Yves Avenard <[email protected]>
+
+ Now Playing content isn't updated when media session's Metadata is modified
+ https://bugs.webkit.org/show_bug.cgi?id=223795
+ <rdar://problem/75883478>
+
+ Reviewed by Eric Carlson.
+
+ Manually tested. Ensuring that immediately after modifying the MediaSession metadata, NowPlaying reflects the change.
+
+ * Modules/mediasession/MediaSession.h:
+ (WebCore::MediaSession::Observer::metadataChanged): Change method prototype to avoid unnecessary refcount.
+ (WebCore::MediaSession::Observer::positionStateChanged): Change method prototype to pass argument by reference rather than value (and easier forward declaration).
+ * Modules/mediasession/MediaSessionCoordinator.cpp:
+ (WebCore::MediaSessionCoordinator::positionStateChanged): Pass argument by reference rather than value.
+ * Modules/mediasession/MediaSessionCoordinator.h:
+ * Modules/mediasession/MediaSessionCoordinatorPrivate.h:
+ * html/MediaElementSession.cpp: Add MediaSessionObserver class, we use separate proxy to avoid multiple inheritance of CanMakeWeakPtr.
+ (WebCore::MediaSessionObserver::MediaSessionObserver):
+ (WebCore::MediaSessionObserver::~MediaSessionObserver):
+ (WebCore::MediaSessionObserver::actionHandlersChanged):
+ (WebCore::MediaElementSession::registerWithDocument): Add MediaElementSession as Media Session observer when it's added to the DOM.
+ (WebCore::MediaElementSession::unregisterWithDocument): Remove MediaElementSession as Media Session observer when it's removed from the DOM.
+ (WebCore::MediaElementSession::didReceiveRemoteControlCommand): Simplify with new mediaSession() helper.
+ (WebCore::MediaElementSession::nowPlayingInfo const): Simplify with new mediaSession() helper.
+ (WebCore::MediaElementSession::mediaSession const): Helper to retrieve associated mediaSession object.
+ (WebCore::MediaElementSession::ensureIsObservingMediaSession):
+ (WebCore::MediaElementSession::metadataChanged): Call clientCharacteristicsChanged which will trigger the PlatformMediaSessionManager to refresh the NowPlayingInfo content.
+ (WebCore::MediaElementSession::positionStateChanged): Method currently doing nothing. Preparing for future change.
+ (WebCore::MediaElementSession::playbackStateChanged): Method currently doing nothing. Preparing for future change.
+ (WebCore::MediaElementSession::actionHandlersChanged): Method currently doing nothing. Preparing for future change.
+ * html/MediaElementSession.h: Add methods.
+ * platform/cocoa/RemoteCommandListenerCocoa.h: Remove trailing whitespace.
+ * testing/MockMediaSessionCoordinator.cpp:
+ (WebCore::MockMediaSessionCoordinator::positionStateChanged): Update for new method prototyping.
+ * testing/MockMediaSessionCoordinator.h:
+
2021-03-30 Antoine Quint <[email protected]>
Account for "cover" and "contain" when interpolating background-size
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSession.h (275202 => 275203)
--- trunk/Source/WebCore/Modules/mediasession/MediaSession.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSession.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -100,8 +100,8 @@
public:
virtual ~Observer() = default;
- virtual void metadataChanged(RefPtr<MediaMetadata>) { }
- virtual void positionStateChanged(Optional<MediaPositionState>) { }
+ virtual void metadataChanged(const RefPtr<MediaMetadata>&) { }
+ virtual void positionStateChanged(const Optional<MediaPositionState>&) { }
virtual void playbackStateChanged(MediaSessionPlaybackState) { }
virtual void actionHandlersChanged() { }
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp (275202 => 275203)
--- trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp 2021-03-30 14:12:07 UTC (rev 275203)
@@ -190,7 +190,7 @@
m_session->addObserver(*this);
}
-void MediaSessionCoordinator::positionStateChanged(Optional<MediaPositionState> state)
+void MediaSessionCoordinator::positionStateChanged(const Optional<MediaPositionState>& state)
{
if (!state) {
m_privateCoordinator->positionStateChanged({ });
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h (275202 => 275203)
--- trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -59,7 +59,7 @@
explicit MediaSessionCoordinator(Ref<MediaSessionCoordinatorPrivate>&&);
// MediaSession::Observer
- void positionStateChanged(Optional<MediaPositionState>) final;
+ void positionStateChanged(const Optional<MediaPositionState>&) final;
void playbackStateChanged(MediaSessionPlaybackState) final;
void readyStateChanged(MediaSessionReadyState) final;
Modified: trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinatorPrivate.h (275202 => 275203)
--- trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinatorPrivate.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinatorPrivate.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -58,7 +58,7 @@
virtual void pause(CompletionHandler<void(Optional<Exception>&&)>&&) = 0;
virtual void setTrack(const String&, CompletionHandler<void(Optional<Exception>&&)>&&) = 0;
- virtual void positionStateChanged(Optional<MediaPositionState>) = 0;
+ virtual void positionStateChanged(const Optional<MediaPositionState>&) = 0;
virtual void readyStateChanged(MediaSessionReadyState) = 0;
virtual void playbackStateChanged(MediaSessionPlaybackState) = 0;
Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (275202 => 275203)
--- trunk/Source/WebCore/html/MediaElementSession.cpp 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp 2021-03-30 14:12:07 UTC (rev 275203)
@@ -56,7 +56,9 @@
#if ENABLE(MEDIA_SESSION)
#include "MediaMetadata.h"
+#include "MediaPositionState.h"
#include "MediaSession.h"
+#include "MediaSessionPlaybackState.h"
#include "NavigatorMediaSession.h"
#endif
@@ -114,6 +116,46 @@
return document.isMediaDocument() && !document.ownerElement() && page && page->allowsMediaDocumentInlinePlayback();
}
+#if ENABLE(MEDIA_SESSION)
+class MediaSessionObserver : public MediaSession::Observer {
+ WTF_MAKE_FAST_ALLOCATED;
+
+public:
+ MediaSessionObserver(MediaElementSession& session, const Ref<MediaSession>& mediaSession)
+ : m_session(makeWeakPtr(session)), m_mediaSession(mediaSession)
+ {
+ m_mediaSession->addObserver(*this);
+ }
+ ~MediaSessionObserver()
+ {
+ m_mediaSession->removeObserver(*this);
+ }
+ void metadataChanged(const RefPtr<MediaMetadata>& metadata) final
+ {
+ if (m_session)
+ m_session->metadataChanged(metadata);
+ }
+ void positionStateChanged(const Optional<MediaPositionState>& state) final
+ {
+ if (m_session)
+ m_session->positionStateChanged(state);
+ }
+ void playbackStateChanged(MediaSessionPlaybackState state) final
+ {
+ if (m_session)
+ m_session->playbackStateChanged(state);
+ }
+ void actionHandlersChanged()
+ {
+ if (m_session)
+ m_session->actionHandlersChanged();
+ }
+private:
+ WeakPtr<MediaElementSession> m_session;
+ Ref<MediaSession> m_mediaSession;
+};
+#endif
+
MediaElementSession::MediaElementSession(HTMLMediaElement& element)
: PlatformMediaSession(PlatformMediaSessionManager::sharedManager(), element)
, m_element(element)
@@ -161,6 +203,7 @@
#else
UNUSED_PARAM(document);
#endif
+ ensureIsObservingMediaSession();
}
void MediaElementSession::unregisterWithDocument(Document& document)
@@ -170,6 +213,9 @@
#else
UNUSED_PARAM(document);
#endif
+#if ENABLE(MEDIA_SESSION)
+ m_observer = nullptr;
+#endif
}
void MediaElementSession::clientWillBeginAutoplaying()
@@ -1028,8 +1074,7 @@
#if ENABLE(MEDIA_SESSION)
void MediaElementSession::didReceiveRemoteControlCommand(RemoteControlCommandType commandType, const RemoteCommandArgument& argument)
{
- auto* window = m_element.document().domWindow();
- auto* session = window ? &NavigatorMediaSession::mediaSession(window->navigator()) : nullptr;
+ auto* session = mediaSession();
if (!session || !session->hasActiveActionHandlers()) {
PlatformMediaSession::didReceiveRemoteControlCommand(commandType, argument);
return;
@@ -1108,12 +1153,11 @@
currentTime = MediaPlayer::invalidTime();
#if ENABLE(MEDIA_SESSION)
- auto* window = m_element.document().domWindow();
- auto* sessionMetadata = window ? NavigatorMediaSession::mediaSession(window->navigator()).metadata() : nullptr;
+ auto* session = mediaSession();
+ auto* sessionMetadata = session ? session->metadata() : nullptr;
if (sessionMetadata) {
Optional<NowPlayingInfoArtwork> artwork;
if (sessionMetadata->artworkImage()) {
- // FIXME: Optimize so that we only send an image if it changes.
artwork = NowPlayingInfoArtwork { sessionMetadata->artworkSrc(), sessionMetadata->artworkImage()->mimeType(), sessionMetadata->artworkImage()->data() };
}
return NowPlayingInfo { sessionMetadata->title(), sessionMetadata->artist(), sessionMetadata->album(), m_element.sourceApplicationIdentifier(), duration, currentTime, supportsSeeking, m_element.mediaSessionUniqueIdentifier(), isPlaying, allowsNowPlayingControlsVisibility, WTFMove(artwork) };
@@ -1201,6 +1245,39 @@
return values[static_cast<size_t>(enumerationValue)];
}
+MediaSession* MediaElementSession::mediaSession() const
+{
+#if ENABLE(MEDIA_SESSION)
+ auto* window = m_element.document().domWindow();
+ if (!window)
+ return nullptr;
+ return &NavigatorMediaSession::mediaSession(window->navigator());
+#else
+ return nullptr;
+#endif
}
+void MediaElementSession::ensureIsObservingMediaSession()
+{
+#if ENABLE(MEDIA_SESSION)
+ auto* session = mediaSession();
+ if (!session || m_observer)
+ return;
+ m_observer = makeUnique<MediaSessionObserver>(*this, *session);
+#endif
+}
+
+void MediaElementSession::metadataChanged(const RefPtr<MediaMetadata>&)
+{
+ clientCharacteristicsChanged();
+}
+
+void MediaElementSession::positionStateChanged(const Optional<MediaPositionState>&) { }
+
+void MediaElementSession::playbackStateChanged(MediaSessionPlaybackState) { }
+
+void MediaElementSession::actionHandlersChanged() { }
+
+}
+
#endif // ENABLE(VIDEO)
Modified: trunk/Source/WebCore/html/MediaElementSession.h (275202 => 275203)
--- trunk/Source/WebCore/html/MediaElementSession.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/html/MediaElementSession.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -36,6 +36,10 @@
#include <wtf/Optional.h>
#include <wtf/TypeCasts.h>
+#if ENABLE(MEDIA_SESSION)
+#include <memory>
+#endif
+
namespace WebCore {
enum class MediaSessionMainContentPurpose {
@@ -57,7 +61,12 @@
class Document;
class HTMLMediaElement;
+class MediaMetadata;
+struct MediaPositionState;
+class MediaSession;
+class MediaSessionObserver;
class SourceBuffer;
+enum class MediaSessionPlaybackState : uint8_t;
class MediaElementSession final : public PlatformMediaSession
{
@@ -178,6 +187,10 @@
#if ENABLE(MEDIA_SESSION)
void didReceiveRemoteControlCommand(RemoteControlCommandType, const RemoteCommandArgument&) final;
#endif
+ void metadataChanged(const RefPtr<MediaMetadata>&);
+ void positionStateChanged(const Optional<MediaPositionState>&);
+ void playbackStateChanged(MediaSessionPlaybackState);
+ void actionHandlersChanged();
private:
@@ -193,6 +206,9 @@
#if PLATFORM(IOS_FAMILY)
bool requiresPlaybackTargetRouteMonitoring() const override;
#endif
+ void ensureIsObservingMediaSession();
+ MediaSession* mediaSession() const;
+
bool updateIsMainContent() const;
void mainContentCheckTimerFired();
@@ -236,6 +252,7 @@
#if ENABLE(MEDIA_SESSION)
bool m_isScrubbing { false };
+ std::unique_ptr<MediaSessionObserver> m_observer;
#endif
};
Modified: trunk/Source/WebCore/platform/cocoa/RemoteCommandListenerCocoa.h (275202 => 275203)
--- trunk/Source/WebCore/platform/cocoa/RemoteCommandListenerCocoa.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/platform/cocoa/RemoteCommandListenerCocoa.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -47,7 +47,7 @@
const RemoteCommandsSet& defaultCommands();
RemoteCommandsSet m_currentCommands;
};
-
+
}
#endif // PLATFORM(MAC)
Modified: trunk/Source/WebCore/testing/MockMediaSessionCoordinator.cpp (275202 => 275203)
--- trunk/Source/WebCore/testing/MockMediaSessionCoordinator.cpp 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/testing/MockMediaSessionCoordinator.cpp 2021-03-30 14:12:07 UTC (rev 275203)
@@ -91,7 +91,7 @@
});
}
-void MockMediaSessionCoordinator::positionStateChanged(Optional<MediaPositionState>)
+void MockMediaSessionCoordinator::positionStateChanged(const Optional<MediaPositionState>&)
{
ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER);
m_stateChangeListener->scheduleCallback(m_context.get(), "positionStateChanged");
Modified: trunk/Source/WebCore/testing/MockMediaSessionCoordinator.h (275202 => 275203)
--- trunk/Source/WebCore/testing/MockMediaSessionCoordinator.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebCore/testing/MockMediaSessionCoordinator.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -52,7 +52,7 @@
void pause(CompletionHandler<void(Optional<Exception>&&)>&&) final;
void setTrack(const String&, CompletionHandler<void(Optional<Exception>&&)>&&) final;
- void positionStateChanged(Optional<MediaPositionState>) final;
+ void positionStateChanged(const Optional<MediaPositionState>&) final;
void readyStateChanged(MediaSessionReadyState) final;
void playbackStateChanged(MediaSessionPlaybackState) final;
Modified: trunk/Source/WebKit/ChangeLog (275202 => 275203)
--- trunk/Source/WebKit/ChangeLog 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebKit/ChangeLog 2021-03-30 14:12:07 UTC (rev 275203)
@@ -1,3 +1,17 @@
+2021-03-30 Jean-Yves Avenard <[email protected]>
+
+ Now Playing content isn't updated when media session's Metadata is modified
+ https://bugs.webkit.org/show_bug.cgi?id=223795
+
+ Reviewed by Eric Carlson.
+
+ * UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h: Update for new method prototyping.
+ * UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp:
+ (WebKit::RemoteMediaSessionCoordinatorProxy::positionStateChanged): Update for new method prototyping.
+ * WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp:
+ (WebKit::RemoteMediaSessionCoordinator::positionStateChanged): Update for new method prototyping.
+ * WebProcess/MediaSession/RemoteMediaSessionCoordinator.h:
+
2021-03-29 Jiewen Tan <[email protected]>
Safari crashed and lost all tabs, after unlocking sleeping device
Modified: trunk/Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h (275202 => 275203)
--- trunk/Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebKit/UIProcess/Media/MediaSessionCoordinatorPrivateProxy.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -44,7 +44,7 @@
virtual void pause(CompletionHandler<void(const WebCore::ExceptionData&)>&&) = 0;
virtual void setTrack(const String&, CompletionHandler<void(const WebCore::ExceptionData&)>&&) = 0;
- virtual void positionStateChanged(Optional<WebCore::MediaPositionState>) = 0;
+ virtual void positionStateChanged(const Optional<WebCore::MediaPositionState>&) = 0;
virtual void readyStateChanged(WebCore::MediaSessionReadyState) = 0;
virtual void playbackStateChanged(WebCore::MediaSessionPlaybackState) = 0;
Modified: trunk/Source/WebKit/UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp (275202 => 275203)
--- trunk/Source/WebKit/UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebKit/UIProcess/Media/RemoteMediaSessionCoordinatorProxy.cpp 2021-03-30 14:12:07 UTC (rev 275203)
@@ -102,7 +102,7 @@
});
}
-void RemoteMediaSessionCoordinatorProxy::positionStateChanged(Optional<WebCore::MediaPositionState> state)
+void RemoteMediaSessionCoordinatorProxy::positionStateChanged(const Optional<WebCore::MediaPositionState>& state)
{
ALWAYS_LOG(LOGIDENTIFIER);
m_privateCoordinator->positionStateChanged(state);
Modified: trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp (275202 => 275203)
--- trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.cpp 2021-03-30 14:12:07 UTC (rev 275203)
@@ -133,7 +133,7 @@
}, 0);
}
-void RemoteMediaSessionCoordinator::positionStateChanged(Optional<WebCore::MediaPositionState> state)
+void RemoteMediaSessionCoordinator::positionStateChanged(const Optional<WebCore::MediaPositionState>& state)
{
ALWAYS_LOG_IF_POSSIBLE(LOGIDENTIFIER);
m_page.send(Messages::RemoteMediaSessionCoordinatorProxy::PositionStateChanged { state }, 0);
Modified: trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.h (275202 => 275203)
--- trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.h 2021-03-30 10:02:28 UTC (rev 275202)
+++ trunk/Source/WebKit/WebProcess/MediaSession/RemoteMediaSessionCoordinator.h 2021-03-30 14:12:07 UTC (rev 275203)
@@ -65,7 +65,7 @@
void pause(CompletionHandler<void(Optional<WebCore::Exception>&&)>&&) final;
void setTrack(const String&, CompletionHandler<void(Optional<WebCore::Exception>&&)>&&) final;
- void positionStateChanged(Optional<WebCore::MediaPositionState>) final;
+ void positionStateChanged(const Optional<WebCore::MediaPositionState>&) final;
void readyStateChanged(WebCore::MediaSessionReadyState) final;
void playbackStateChanged(WebCore::MediaSessionPlaybackState) final;