Title: [200765] branches/safari-601.1.46-branch/Source/WebCore

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()];
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to