Diff
Modified: branches/safari-601.1.46-branch/Source/WebCore/ChangeLog (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/ChangeLog 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/ChangeLog 2016-05-12 09:28:04 UTC (rev 200765)
@@ -1,5 +1,51 @@
2016-05-12 Matthew Hanson <matthew_han...@apple.com>
+ Merge r199351. rdar://problem/26228860
+
+ 2016-04-12 Eric Carlson <eric.carl...@apple.com>
+
+ [iOS] media title sometimes remain in Control Center after tab is closed
+ https://bugs.webkit.org/show_bug.cgi?id=156243
+ <rdar://problem/20167445>
+
+ Reviewed by Darin Adler.
+
+ * Modules/webaudio/AudioContext.h: Implement characteristics.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::mediaLoadingFailed): Call mediaSession->clientCharacteristicsChanged.
+ (WebCore::HTMLMediaElement::setReadyState): Ditto.
+ (WebCore::HTMLMediaElement::clearMediaPlayer): Ditto.
+ (WebCore::HTMLMediaElement::stop): Call mediaSession->stopSession.
+ (WebCore::HTMLMediaElement::characteristics): New, return current characteristics.
+ * html/HTMLMediaElement.h:
+
+ * platform/audio/PlatformMediaSession.cpp:
+ (WebCore::PlatformMediaSession::stopSession): Suspend playback, and remove the session
+ from the manager, it will never play again.
+ (WebCore::PlatformMediaSession::characteristics): Return client characteristics.
+ (WebCore::PlatformMediaSession::clientCharacteristicsChanged):
+ * platform/audio/PlatformMediaSession.h:
+
+ * platform/audio/PlatformMediaSessionManager.cpp:
+ (WebCore::PlatformMediaSessionManager::stopAllMediaPlaybackForProcess): Call stopSession
+ instead of pauseSession to signal that playback will never start again.
+ * platform/audio/PlatformMediaSessionManager.h:
+
+ * platform/audio/ios/MediaSessionManagerIOS.h:
+ * platform/audio/ios/MediaSessionManagerIOS.mm:
+ (WebCore::MediaSessionManageriOS::sessionWillBeginPlayback): Add logging.
+ (WebCore::MediaSessionManageriOS::removeSession): Update NowPlaying.
+ (WebCore::MediaSessionManageriOS::sessionWillEndPlayback): Add logging.
+ (WebCore::MediaSessionManageriOS::clientCharacteristicsChanged): Update NowPlaying.
+ (WebCore::MediaSessionManageriOS::nowPlayingEligibleSession): New, return the first session
+ that is an audio or video element with playable audio. WebAudio is not currently controllable
+ so it isn't appropriate to show it in the NowPlaying info center.
+ (WebCore::MediaSessionManageriOS::updateNowPlayingInfo): Remember the last state passed to
+ NowPlaying so we can call it only when something has changed.
+
+2016-05-12 Matthew Hanson <matthew_han...@apple.com>
+
Merge r200375. rdar://problem/26064990
2016-05-03 Pranjal Jumde <pju...@apple.com>
Modified: branches/safari-601.1.46-branch/Source/WebCore/Modules/webaudio/AudioContext.h (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/Modules/webaudio/AudioContext.h 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/Modules/webaudio/AudioContext.h 2016-05-12 09:28:04 UTC (rev 200765)
@@ -318,6 +318,7 @@
// PlatformMediaSessionClient
virtual PlatformMediaSession::MediaType mediaType() const override { return PlatformMediaSession::WebAudio; }
virtual PlatformMediaSession::MediaType presentationType() const override { return PlatformMediaSession::WebAudio; }
+ PlatformMediaSession::CharacteristicsFlags characteristics() const override { return m_state == State::Running ? PlatformMediaSession::HasAudio : PlatformMediaSession::HasNothing; }
virtual void mayResumePlayback(bool shouldResume) override;
virtual void suspendPlayback() override;
virtual bool canReceiveRemoteControlCommands() const override { return false; }
Modified: branches/safari-601.1.46-branch/Source/WebCore/html/HTMLMediaElement.cpp (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/html/HTMLMediaElement.cpp 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/html/HTMLMediaElement.cpp 2016-05-12 09:28:04 UTC (rev 200765)
@@ -2006,6 +2006,8 @@
}
logMediaLoadRequest(document().page(), String(), stringForNetworkState(error), false);
+
+ m_mediaSession->clientCharacteristicsChanged();
}
void HTMLMediaElement::setNetworkState(MediaPlayer::NetworkState state)
@@ -2146,6 +2148,8 @@
downcast<MediaDocument>(document()).mediaElementNaturalSizeChanged(expandedIntSize(m_player->naturalSize()));
logMediaLoadRequest(document().page(), m_player->engineDescription(), String(), true);
+
+ m_mediaSession->clientCharacteristicsChanged();
}
bool shouldUpdateDisplayState = false;
@@ -4931,6 +4935,8 @@
configureTextTrackDisplay();
#endif
+ m_mediaSession->clientCharacteristicsChanged();
+
updateSleepDisabling();
}
@@ -4990,6 +4996,8 @@
// if the media was not fully loaded, but we need the same cleanup if the file was completely
// loaded and calling it again won't cause any problems.
clearMediaPlayer(EveryDelayedAction);
+
+ m_mediaSession->stopSession();
}
void HTMLMediaElement::suspend(ReasonForSuspension why)
@@ -6383,6 +6391,20 @@
return PlatformMediaSession::Normal;
}
+PlatformMediaSession::CharacteristicsFlags HTMLMediaElement::characteristics() const
+{
+ if (m_readyState < HAVE_METADATA)
+ return PlatformMediaSession::HasNothing;
+
+ PlatformMediaSession::CharacteristicsFlags state = PlatformMediaSession::HasNothing;
+ if (isVideo() && hasVideo())
+ state |= PlatformMediaSession::HasVideo;
+ if (this->hasAudio())
+ state |= PlatformMediaSession::HasAudio;
+
+ return state;
+}
+
#if ENABLE(MEDIA_SOURCE)
size_t HTMLMediaElement::maximumSourceBufferSize(const SourceBuffer& buffer) const
{
Modified: branches/safari-601.1.46-branch/Source/WebCore/html/HTMLMediaElement.h (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/html/HTMLMediaElement.h 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/html/HTMLMediaElement.h 2016-05-12 09:28:04 UTC (rev 200765)
@@ -718,6 +718,7 @@
virtual PlatformMediaSession::MediaType mediaType() const override;
virtual PlatformMediaSession::MediaType presentationType() const override;
virtual PlatformMediaSession::DisplayType displayType() const override;
+ PlatformMediaSession::CharacteristicsFlags characteristics() const final;
virtual void suspendPlayback() override;
virtual void mayResumePlayback(bool shouldResume) override;
virtual String mediaSessionTitle() const override;
Modified: branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSession.cpp (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSession.cpp 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSession.cpp 2016-05-12 09:28:04 UTC (rev 200765)
@@ -100,8 +100,10 @@
if (++m_interruptionCount > 1)
return;
- if (client().shouldOverrideBackgroundPlaybackRestriction(type))
+ if (client().shouldOverrideBackgroundPlaybackRestriction(type)) {
+ LOG(Media, "PlatformMediaSession::beginInterruption(%p), returning early because client says to override interruption", this);
return;
+ }
m_stateToRestore = state();
m_notifyingClient = true;
@@ -171,6 +173,13 @@
m_client.suspendPlayback();
}
+void PlatformMediaSession::stopSession()
+{
+ LOG(Media, "PlatformMediaSession::stopSession(%p)", this);
+ m_client.suspendPlayback();
+ PlatformMediaSessionManager::sharedManager().removeSession(*this);
+}
+
PlatformMediaSession::MediaType PlatformMediaSession::mediaType() const
{
return m_client.mediaType();
@@ -181,6 +190,11 @@
return m_client.presentationType();
}
+PlatformMediaSession::CharacteristicsFlags PlatformMediaSession::characteristics() const
+{
+ return m_client.characteristics();
+}
+
String PlatformMediaSession::title() const
{
return m_client.mediaSessionTitle();
@@ -271,5 +285,11 @@
{
return MediaPlayer::invalidTime();
}
+
+void PlatformMediaSession::clientCharacteristicsChanged()
+{
+ PlatformMediaSessionManager::sharedManager().clientCharacteristicsChanged(*this);
}
+
+}
#endif
Modified: branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSession.h (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSession.h 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSession.h 2016-05-12 09:28:04 UTC (rev 200765)
@@ -81,6 +81,16 @@
MayResumePlaying = 1 << 0,
};
+ enum Characteristics {
+ HasNothing = 0,
+ HasAudio = 1 << 0,
+ HasVideo = 1 << 1,
+ };
+ typedef unsigned CharacteristicsFlags;
+
+ CharacteristicsFlags characteristics() const;
+ void clientCharacteristicsChanged();
+
void beginInterruption(InterruptionType);
void endInterruption(EndInterruptionFlags);
@@ -88,6 +98,7 @@
bool clientWillPausePlayback();
void pauseSession();
+ void stopSession();
void visibilityChanged();
@@ -159,6 +170,7 @@
virtual PlatformMediaSession::MediaType mediaType() const = 0;
virtual PlatformMediaSession::MediaType presentationType() const = 0;
virtual PlatformMediaSession::DisplayType displayType() const { return PlatformMediaSession::Normal; }
+ virtual PlatformMediaSession::CharacteristicsFlags characteristics() const = 0;
virtual void mayResumePlayback(bool shouldResume) = 0;
virtual void suspendPlayback() = 0;
Modified: branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp 2016-05-12 09:28:04 UTC (rev 200765)
@@ -143,7 +143,6 @@
LOG(Media, "PlatformMediaSessionManager::removeSession - %p", &session);
size_t index = m_sessions.find(&session);
- ASSERT(index != notFound);
if (index == notFound)
return;
@@ -372,7 +371,7 @@
{
Vector<PlatformMediaSession*> sessions = m_sessions;
for (auto* session : sessions)
- session->pauseSession();
+ session->stopSession();
}
}
Modified: branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSessionManager.h (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSessionManager.h 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/platform/audio/PlatformMediaSessionManager.h 2016-05-12 09:28:04 UTC (rev 200765)
@@ -84,6 +84,7 @@
bool sessionRestrictsInlineVideoPlayback(const PlatformMediaSession&) const;
virtual bool sessionCanLoadMedia(const PlatformMediaSession&) const;
+ virtual void clientCharacteristicsChanged(PlatformMediaSession&) { }
#if PLATFORM(IOS)
virtual void configureWireLessTargetMonitoring() { }
@@ -100,7 +101,7 @@
explicit PlatformMediaSessionManager();
void addSession(PlatformMediaSession&);
- void removeSession(PlatformMediaSession&);
+ virtual void removeSession(PlatformMediaSession&);
Vector<PlatformMediaSession*> sessions() { return m_sessions; }
Modified: branches/safari-601.1.46-branch/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h 2016-05-12 09:28:04 UTC (rev 200765)
@@ -56,9 +56,12 @@
MediaSessionManageriOS();
+ void removeSession(PlatformMediaSession&) override;
+
virtual bool sessionWillBeginPlayback(PlatformMediaSession&) override;
virtual void sessionWillEndPlayback(PlatformMediaSession&) override;
-
+ void clientCharacteristicsChanged(PlatformMediaSession&) override;
+
void updateNowPlayingInfo();
virtual void resetRestrictions() override;
@@ -66,8 +69,11 @@
virtual void configureWireLessTargetMonitoring() override;
virtual bool sessionCanLoadMedia(const PlatformMediaSession&) const override;
+
+ PlatformMediaSession* nowPlayingEligibleSession();
RetainPtr<WebMediaSessionHelper> m_objcObserver;
+ RetainPtr<NSMutableDictionary> m_nowPlayingInfo;
bool m_isInBackground { false };
};
Modified: branches/safari-601.1.46-branch/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm (200764 => 200765)
--- branches/safari-601.1.46-branch/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm 2016-05-12 09:12:40 UTC (rev 200764)
+++ branches/safari-601.1.46-branch/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm 2016-05-12 09:28:04 UTC (rev 200765)
@@ -203,43 +203,87 @@
if (!PlatformMediaSessionManager::sessionWillBeginPlayback(session))
return false;
+ LOG(Media, "MediaSessionManageriOS::sessionWillBeginPlayback");
updateNowPlayingInfo();
return true;
}
-
+
+void MediaSessionManageriOS::removeSession(PlatformMediaSession& session)
+{
+ PlatformMediaSessionManager::removeSession(session);
+ LOG(Media, "MediaSessionManageriOS::removeSession");
+ updateNowPlayingInfo();
+}
+
void MediaSessionManageriOS::sessionWillEndPlayback(PlatformMediaSession& session)
{
PlatformMediaSessionManager::sessionWillEndPlayback(session);
+ LOG(Media, "MediaSessionManageriOS::sessionWillEndPlayback");
updateNowPlayingInfo();
}
-
+
+void MediaSessionManageriOS::clientCharacteristicsChanged(PlatformMediaSession&)
+{
+ LOG(Media, "MediaSessionManageriOS::clientCharacteristicsChanged");
+ updateNowPlayingInfo();
+}
+
+PlatformMediaSession* MediaSessionManageriOS::nowPlayingEligibleSession()
+{
+ for (auto session : sessions()) {
+ PlatformMediaSession::MediaType type = session->mediaType();
+ if (type != PlatformMediaSession::Video && type != PlatformMediaSession::Audio)
+ continue;
+
+ if (session->characteristics() & PlatformMediaSession::HasAudio)
+ return session;
+ }
+
+ return nullptr;
+}
+
void MediaSessionManageriOS::updateNowPlayingInfo()
{
- LOG(Media, "MediaSessionManageriOS::updateNowPlayingInfo");
+ MPNowPlayingInfoCenter *nowPlaying = (MPNowPlayingInfoCenter *)[getMPNowPlayingInfoCenterClass() defaultCenter];
+ const PlatformMediaSession* currentSession = this->nowPlayingEligibleSession();
- MPNowPlayingInfoCenter *nowPlaying = (MPNowPlayingInfoCenter *)[getMPNowPlayingInfoCenterClass() defaultCenter];
- const PlatformMediaSession* currentSession = this->currentSession();
-
+ LOG(Media, "MediaSessionManageriOS::updateNowPlayingInfo - currentSession = %p", currentSession);
+
if (!currentSession) {
- [nowPlaying setNowPlayingInfo:nil];
+ if (m_nowPlayingInfo) {
+ LOG(Media, "MediaSessionManageriOS::updateNowPlayingInfo - clearing now playing info");
+ [nowPlaying setNowPlayingInfo:nil];
+ m_nowPlayingInfo = nil;
+ }
+
return;
}
-
+
RetainPtr<NSMutableDictionary> info = adoptNS([[NSMutableDictionary alloc] init]);
-
+
String title = currentSession->title();
if (!title.isEmpty())
[info setValue:static_cast<NSString *>(title) forKey:MPMediaItemPropertyTitle];
-
+
double duration = currentSession->duration();
if (std::isfinite(duration) && duration != MediaPlayer::invalidTime())
[info setValue:@(duration) forKey:MPMediaItemPropertyPlaybackDuration];
-
+
+ [info setValue:(currentSession->state() == PlatformMediaSession::Playing ? @YES : @NO) forKey:MPNowPlayingInfoPropertyPlaybackRate];
+
+ if ([m_nowPlayingInfo.get() isEqualToDictionary:info.get()]) {
+ LOG(Media, "MediaSessionManageriOS::updateNowPlayingInfo - nothing new to show");
+ return;
+ }
+
+ m_nowPlayingInfo = info;
+
double currentTime = currentSession->currentTime();
if (std::isfinite(currentTime) && currentTime != MediaPlayer::invalidTime())
[info setValue:@(currentTime) forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
-
- [info setValue:(currentSession->state() == PlatformMediaSession::Playing ? @YES : @NO) forKey:MPNowPlayingInfoPropertyPlaybackRate];
+
+ LOG(Media, "MediaSessionManageriOS::updateNowPlayingInfo - title = \"%s\"", [[info.get() valueForKey:MPMediaItemPropertyTitle] UTF8String]);
+
[nowPlaying setNowPlayingInfo:info.get()];
}