<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[207220] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/207220">207220</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2016-10-12 09:48:21 -0700 (Wed, 12 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Now playing media sessions are always cleared for the active foreground tab
https://bugs.webkit.org/show_bug.cgi?id=163310
&lt;rdar://problem/28573301&gt;

Reviewed by Jer Noble.

Source/WebCore:

Currently, we clear out Now Playing info whenever we set the visibility of Now Playing controls to Never. This
is incorrect, as the Now Playing session needs to still be active (just not visible) in this state. Instead, we
should not be taking the active/foregrounded-ness of a media session for Now Playing into account in
MediaElementSession::canShowControlsManager so that even if a media session is in the active/foreground tab, we
will update the Now Playing session with the latest info. However, when setting the visibility, we now check
and see if the session allows Now Playing visibility, and set the Now Playing visibility to Always or Never
depending on the answer.

Tweaked existing unit tests in NowPlayingControlsTests.

* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::canShowControlsManager):
(WebCore::MediaElementSession::allowsNowPlayingControlsVisibility):
(WebCore::MediaElementSession::pageAllowsNowPlayingControls): Deleted.
* html/MediaElementSession.h:
* platform/audio/PlatformMediaSession.h:
(WebCore::PlatformMediaSession::allowsNowPlayingControlsVisibility):
* platform/audio/mac/MediaSessionManagerMac.mm:
(WebCore::MediaSessionManagerMac::updateNowPlayingInfo):

Tools:

Tweaks existing unit tests to verify that media session info persists when backgrounding and foregrounding, but
that media session info is correctly cleared out if the media session itself is no longer eligible for Now
Playing (not accounting for foreground/active state). Previously, these tests were verifying that we would
always clear out the information, but this is incorrect, and is the source of the problem.

* TestWebKitAPI/Tests/WebKit2Cocoa/NowPlayingControlsTests.mm:
(-[NowPlayingTestWebView waitForNowPlayingInfoToChange]):
(TestWebKitAPI::TEST):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaElementSessioncpp">trunk/Source/WebCore/html/MediaElementSession.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaElementSessionh">trunk/Source/WebCore/html/MediaElementSession.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioPlatformMediaSessionh">trunk/Source/WebCore/platform/audio/PlatformMediaSession.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudiomacMediaSessionManagerMacmm">trunk/Source/WebCore/platform/audio/mac/MediaSessionManagerMac.mm</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2CocoaNowPlayingControlsTestsmm">trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/NowPlayingControlsTests.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207219 => 207220)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-12 16:45:55 UTC (rev 207219)
+++ trunk/Source/WebCore/ChangeLog        2016-10-12 16:48:21 UTC (rev 207220)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2016-10-12  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Now playing media sessions are always cleared for the active foreground tab
+        https://bugs.webkit.org/show_bug.cgi?id=163310
+        &lt;rdar://problem/28573301&gt;
+
+        Reviewed by Jer Noble.
+
+        Currently, we clear out Now Playing info whenever we set the visibility of Now Playing controls to Never. This
+        is incorrect, as the Now Playing session needs to still be active (just not visible) in this state. Instead, we
+        should not be taking the active/foregrounded-ness of a media session for Now Playing into account in
+        MediaElementSession::canShowControlsManager so that even if a media session is in the active/foreground tab, we
+        will update the Now Playing session with the latest info. However, when setting the visibility, we now check
+        and see if the session allows Now Playing visibility, and set the Now Playing visibility to Always or Never
+        depending on the answer.
+
+        Tweaked existing unit tests in NowPlayingControlsTests.
+
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::canShowControlsManager):
+        (WebCore::MediaElementSession::allowsNowPlayingControlsVisibility):
+        (WebCore::MediaElementSession::pageAllowsNowPlayingControls): Deleted.
+        * html/MediaElementSession.h:
+        * platform/audio/PlatformMediaSession.h:
+        (WebCore::PlatformMediaSession::allowsNowPlayingControlsVisibility):
+        * platform/audio/mac/MediaSessionManagerMac.mm:
+        (WebCore::MediaSessionManagerMac::updateNowPlayingInfo):
+
</ins><span class="cx"> 2016-10-12  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Refactor LineLayoutState's float box handling.
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaElementSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (207219 => 207220)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaElementSession.cpp        2016-10-12 16:45:55 UTC (rev 207219)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp        2016-10-12 16:48:21 UTC (rev 207220)
</span><span class="lines">@@ -221,11 +221,6 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaElementSession::canShowControlsManager(PlaybackControlsPurpose purpose) const
</span><span class="cx"> {
</span><del>-    if (purpose == PlaybackControlsPurpose::NowPlaying &amp;&amp; !pageAllowsNowPlayingControls()) {
-        LOG(Media, &quot;MediaElementSession::canShowControlsManager - returning FALSE: Now playing not allowed in foreground tab&quot;);
-        return false;
-    }
-
</del><span class="cx">     if (m_element.isFullscreen()) {
</span><span class="cx">         LOG(Media, &quot;MediaElementSession::canShowControlsManager - returning TRUE: Is fullscreen&quot;);
</span><span class="cx">         return true;
</span><span class="lines">@@ -751,7 +746,7 @@
</span><span class="cx">     return m_isMainContent;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool MediaElementSession::pageAllowsNowPlayingControls() const
</del><ins>+bool MediaElementSession::allowsNowPlayingControlsVisibility() const
</ins><span class="cx"> {
</span><span class="cx">     auto page = m_element.document().page();
</span><span class="cx">     return page &amp;&amp; !page-&gt;isVisibleAndActive();
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaElementSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaElementSession.h (207219 => 207220)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaElementSession.h        2016-10-12 16:45:55 UTC (rev 207219)
+++ trunk/Source/WebCore/html/MediaElementSession.h        2016-10-12 16:48:21 UTC (rev 207220)
</span><span class="lines">@@ -125,6 +125,7 @@
</span><span class="cx">     double mostRecentUserInteractionTime() const;
</span><span class="cx"> 
</span><span class="cx">     bool allowsPlaybackControlsForAutoplayingAudio() const;
</span><ins>+    bool allowsNowPlayingControlsVisibility() const override;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx"> 
</span><span class="lines">@@ -142,8 +143,6 @@
</span><span class="cx">     bool updateIsMainContent() const;
</span><span class="cx">     void mainContentCheckTimerFired();
</span><span class="cx"> 
</span><del>-    bool pageAllowsNowPlayingControls() const;
-
</del><span class="cx">     HTMLMediaElement&amp; m_element;
</span><span class="cx">     BehaviorRestrictions m_restrictions;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioPlatformMediaSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSession.h (207219 => 207220)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/PlatformMediaSession.h        2016-10-12 16:45:55 UTC (rev 207219)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSession.h        2016-10-12 16:48:21 UTC (rev 207220)
</span><span class="lines">@@ -168,6 +168,8 @@
</span><span class="cx">     virtual void resetPlaybackSessionState() { }
</span><span class="cx">     String sourceApplicationIdentifier() const;
</span><span class="cx"> 
</span><ins>+    virtual bool allowsNowPlayingControlsVisibility() const { return false; }
+
</ins><span class="cx"> protected:
</span><span class="cx">     PlatformMediaSessionClient&amp; client() const { return m_client; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudiomacMediaSessionManagerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/mac/MediaSessionManagerMac.mm (207219 => 207220)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/mac/MediaSessionManagerMac.mm        2016-10-12 16:45:55 UTC (rev 207219)
+++ trunk/Source/WebCore/platform/audio/mac/MediaSessionManagerMac.mm        2016-10-12 16:48:21 UTC (rev 207220)
</span><span class="lines">@@ -129,24 +129,22 @@
</span><span class="cx">     LOG(Media, &quot;MediaSessionManagerMac::updateNowPlayingInfo - currentSession = %p&quot;, currentSession);
</span><span class="cx"> 
</span><span class="cx">     if (!currentSession) {
</span><del>-        if (m_nowPlayingActive) {
-            if (canLoad_MediaRemote_MRMediaRemoteSetNowPlayingVisibility())
-                MRMediaRemoteSetNowPlayingVisibility(MRMediaRemoteGetLocalOrigin(), MRNowPlayingClientVisibilityNeverVisible);
</del><ins>+        if (canLoad_MediaRemote_MRMediaRemoteSetNowPlayingVisibility())
+            MRMediaRemoteSetNowPlayingVisibility(MRMediaRemoteGetLocalOrigin(), MRNowPlayingClientVisibilityNeverVisible);
</ins><span class="cx"> 
</span><del>-            LOG(Media, &quot;MediaSessionManagerMac::updateNowPlayingInfo - clearing now playing info&quot;);
-            MRMediaRemoteSetNowPlayingInfo(nullptr);
-            m_nowPlayingActive = false;
-            m_lastUpdatedNowPlayingTitle = emptyString();
-            m_lastUpdatedNowPlayingDuration = NAN;
-            m_lastUpdatedNowPlayingElapsedTime = NAN;
-            MRMediaRemoteSetNowPlayingApplicationPlaybackStateForOrigin(MRMediaRemoteGetLocalOrigin(), kMRPlaybackStateStopped, dispatch_get_main_queue(), ^(MRMediaRemoteError error) {
</del><ins>+        LOG(Media, &quot;MediaSessionManagerMac::updateNowPlayingInfo - clearing now playing info&quot;);
+        MRMediaRemoteSetNowPlayingInfo(nullptr);
+        m_nowPlayingActive = false;
+        m_lastUpdatedNowPlayingTitle = emptyString();
+        m_lastUpdatedNowPlayingDuration = NAN;
+        m_lastUpdatedNowPlayingElapsedTime = NAN;
+        MRMediaRemoteSetNowPlayingApplicationPlaybackStateForOrigin(MRMediaRemoteGetLocalOrigin(), kMRPlaybackStateStopped, dispatch_get_main_queue(), ^(MRMediaRemoteError error) {
</ins><span class="cx"> #if LOG_DISABLED
</span><del>-                UNUSED_PARAM(error);
</del><ins>+            UNUSED_PARAM(error);
</ins><span class="cx"> #else
</span><del>-                LOG(Media, &quot;MediaSessionManagerMac::updateNowPlayingInfo - MRMediaRemoteSetNowPlayingApplicationPlaybackStateForOrigin(stopped) failed with error %ud&quot;, error);
</del><ins>+            LOG(Media, &quot;MediaSessionManagerMac::updateNowPlayingInfo - MRMediaRemoteSetNowPlayingApplicationPlaybackStateForOrigin(stopped) failed with error %ud&quot;, error);
</ins><span class="cx"> #endif
</span><del>-            });
-        }
</del><ins>+        });
</ins><span class="cx"> 
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -189,7 +187,7 @@
</span><span class="cx">     if (canLoad_MediaRemote_MRMediaRemoteSetParentApplication() &amp;&amp; !parentApplication.isEmpty())
</span><span class="cx">         MRMediaRemoteSetParentApplication(MRMediaRemoteGetLocalOrigin(), parentApplication.createCFString().get());
</span><span class="cx"> 
</span><del>-    m_nowPlayingActive = true;
</del><ins>+    m_nowPlayingActive = currentSession-&gt;allowsNowPlayingControlsVisibility();
</ins><span class="cx">     MRPlaybackState playbackState = (currentSession-&gt;state() == PlatformMediaSession::Playing) ? kMRPlaybackStatePlaying : kMRPlaybackStatePaused;
</span><span class="cx">     MRMediaRemoteSetNowPlayingApplicationPlaybackStateForOrigin(MRMediaRemoteGetLocalOrigin(), playbackState, dispatch_get_main_queue(), ^(MRMediaRemoteError error) {
</span><span class="cx"> #if LOG_DISABLED
</span><span class="lines">@@ -200,8 +198,10 @@
</span><span class="cx">     });
</span><span class="cx">     MRMediaRemoteSetNowPlayingInfo(info.get());
</span><span class="cx"> 
</span><del>-    if (canLoad_MediaRemote_MRMediaRemoteSetNowPlayingVisibility())
-        MRMediaRemoteSetNowPlayingVisibility(MRMediaRemoteGetLocalOrigin(), MRNowPlayingClientVisibilityAlwaysVisible);
</del><ins>+    if (canLoad_MediaRemote_MRMediaRemoteSetNowPlayingVisibility()) {
+        MRNowPlayingClientVisibility visibility = currentSession-&gt;allowsNowPlayingControlsVisibility() ? MRNowPlayingClientVisibilityAlwaysVisible : MRNowPlayingClientVisibilityNeverVisible;
+        MRMediaRemoteSetNowPlayingVisibility(MRMediaRemoteGetLocalOrigin(), visibility);
+    }
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (207219 => 207220)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-10-12 16:45:55 UTC (rev 207219)
+++ trunk/Tools/ChangeLog        2016-10-12 16:48:21 UTC (rev 207220)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-10-12  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Now playing media sessions are always cleared for the active foreground tab
+        https://bugs.webkit.org/show_bug.cgi?id=163310
+        &lt;rdar://problem/28573301&gt;
+
+        Reviewed by Jer Noble.
+
+        Tweaks existing unit tests to verify that media session info persists when backgrounding and foregrounding, but
+        that media session info is correctly cleared out if the media session itself is no longer eligible for Now
+        Playing (not accounting for foreground/active state). Previously, these tests were verifying that we would
+        always clear out the information, but this is incorrect, and is the source of the problem.
+
+        * TestWebKitAPI/Tests/WebKit2Cocoa/NowPlayingControlsTests.mm:
+        (-[NowPlayingTestWebView waitForNowPlayingInfoToChange]):
+        (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2016-10-12  Per Arne Vollan  &lt;pvollan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Win] Parallel DRTs are sharing preferences and cache.
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2CocoaNowPlayingControlsTestsmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/NowPlayingControlsTests.mm (207219 => 207220)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/NowPlayingControlsTests.mm        2016-10-12 16:45:55 UTC (rev 207219)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/NowPlayingControlsTests.mm        2016-10-12 16:48:21 UTC (rev 207220)
</span><span class="lines">@@ -62,6 +62,28 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)waitForNowPlayingInfoToChange
+{
+    BOOL initialHasActiveNowPlayingSession = self.hasActiveNowPlayingSession;
+    NSString *initialTitle = self.lastUpdatedTitle;
+    double initialDuration = self.lastUpdatedDuration;
+    double initialElapsedTime = self.lastUpdatedElapsedTime;
+    while ([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]) {
+        BOOL currentlyHasActiveNowPlayingSession = self.hasActiveNowPlayingSession;
+        if (initialHasActiveNowPlayingSession != currentlyHasActiveNowPlayingSession)
+            break;
+
+        if (initialDuration != self.lastUpdatedDuration)
+            break;
+
+        if (initialElapsedTime != self.lastUpdatedElapsedTime)
+            break;
+
+        if (![initialTitle isEqualToString:self.lastUpdatedTitle] &amp;&amp; self.lastUpdatedTitle != initialTitle)
+            break;
+    }
+}
+
</ins><span class="cx"> - (void)_handleActiveNowPlayingSessionInfoResponse:(BOOL)hasActiveSession title:(NSString *)title duration:(double)duration elapsedTime:(double)elapsedTime
</span><span class="cx"> {
</span><span class="cx">     _hasActiveNowPlayingSession = hasActiveSession;
</span><span class="lines">@@ -87,9 +109,9 @@
</span><span class="cx">     [webView.window makeKeyWindow];
</span><span class="cx">     [webView expectHasActiveNowPlayingSession:NO];
</span><span class="cx"> 
</span><del>-    ASSERT_STREQ(&quot;&quot;, webView.lastUpdatedTitle.UTF8String);
-    ASSERT_TRUE(isnan(webView.lastUpdatedDuration));
-    ASSERT_TRUE(isnan(webView.lastUpdatedElapsedTime));
</del><ins>+    ASSERT_STREQ(&quot;foo&quot;, webView.lastUpdatedTitle.UTF8String);
+    ASSERT_EQ(10, webView.lastUpdatedDuration);
+    ASSERT_GE(webView.lastUpdatedElapsedTime, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TEST(NowPlayingControlsTests, NowPlayingControlsShowForBackgroundPage)
</span><span class="lines">@@ -109,7 +131,7 @@
</span><span class="cx">     ASSERT_GE(webView.lastUpdatedElapsedTime, 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TEST(NowPlayingControlsTests, NowPlayingControlsHideAfterShowingClearsInfo)
</del><ins>+TEST(NowPlayingControlsTests, NowPlayingControlsHideAfterShowingKeepsSessionActive)
</ins><span class="cx"> {
</span><span class="cx">     WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
</span><span class="cx">     configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
</span><span class="lines">@@ -127,9 +149,9 @@
</span><span class="cx"> 
</span><span class="cx">     [webView expectHasActiveNowPlayingSession:NO];
</span><span class="cx"> 
</span><del>-    ASSERT_STREQ(&quot;&quot;, webView.lastUpdatedTitle.UTF8String);
-    ASSERT_TRUE(isnan(webView.lastUpdatedDuration));
-    ASSERT_TRUE(isnan(webView.lastUpdatedElapsedTime));
</del><ins>+    ASSERT_STREQ(&quot;foo&quot;, webView.lastUpdatedTitle.UTF8String);
+    ASSERT_EQ(10, webView.lastUpdatedDuration);
+    ASSERT_GE(webView.lastUpdatedElapsedTime, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TEST(NowPlayingControlsTests, NowPlayingControlsClearInfoAfterSessionIsNoLongerValid)
</span><span class="lines">@@ -144,7 +166,7 @@
</span><span class="cx">     [webView.window setIsVisible:NO];
</span><span class="cx">     [webView.window resignKeyWindow];
</span><span class="cx"> 
</span><del>-    [webView expectHasActiveNowPlayingSession:NO];
</del><ins>+    [webView waitForNowPlayingInfoToChange];
</ins><span class="cx"> 
</span><span class="cx">     ASSERT_STREQ(&quot;&quot;, webView.lastUpdatedTitle.UTF8String);
</span><span class="cx">     ASSERT_TRUE(isnan(webView.lastUpdatedDuration));
</span></span></pre>
</div>
</div>

</body>
</html>