<!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>[204989] 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/204989">204989</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2016-08-25 15:01:07 -0700 (Thu, 25 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Dragging against the end of the inline media scrubber causes the media scrubber to hide
https://bugs.webkit.org/show_bug.cgi?id=161207

Reviewed by Eric Carlson.

Source/WebCore:

Previously, we would re-enable behavior restrictions when firing an ended event. However, if the ended event is
caused by the user seeking to the end of the video, the media controls would be taken away from under the user.
To prevent this, we don't add the relevant behavior restrictions upon media ended if media was seeking before
firing the event.

Tweaked an existing WebKit API test to cover this change.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::mediaPlayerTimeChanged):
(WebCore::HTMLMediaElement::addBehaviorRestrictionsOnEndIfNecessary):
* html/HTMLMediaElement.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::canControlControlsManager):

Tools:

Tweaks an existing WebKit API test covering this behavior change. After some discussion, rather than hide media
controls in this case, we should actually continue showing them. This is because seeking due to user gestures
similar to &quot;scrubbing&quot; are indistinguishable from gestures that immediately seek to the end.

* TestWebKitAPI/Tests/WebKit2Cocoa/VideoControlsManager.mm:
(TestWebKitAPI::TEST):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaElementSessioncpp">trunk/Source/WebCore/html/MediaElementSession.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2CocoaVideoControlsManagermm">trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/VideoControlsManager.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (204988 => 204989)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-08-25 21:59:54 UTC (rev 204988)
+++ trunk/Source/WebCore/ChangeLog        2016-08-25 22:01:07 UTC (rev 204989)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2016-08-25  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Dragging against the end of the inline media scrubber causes the media scrubber to hide
+        https://bugs.webkit.org/show_bug.cgi?id=161207
+
+        Reviewed by Eric Carlson.
+
+        Previously, we would re-enable behavior restrictions when firing an ended event. However, if the ended event is
+        caused by the user seeking to the end of the video, the media controls would be taken away from under the user.
+        To prevent this, we don't add the relevant behavior restrictions upon media ended if media was seeking before
+        firing the event.
+
+        Tweaked an existing WebKit API test to cover this change.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::mediaPlayerTimeChanged):
+        (WebCore::HTMLMediaElement::addBehaviorRestrictionsOnEndIfNecessary):
+        * html/HTMLMediaElement.h:
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::canControlControlsManager):
+
</ins><span class="cx"> 2016-08-25  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION: RELEASE_ASSERT in ResourceUsageThread::platformThreadBody when ASan is enabled
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (204988 => 204989)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-08-25 21:59:54 UTC (rev 204988)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-08-25 22:01:07 UTC (rev 204989)
</span><span class="lines">@@ -4365,6 +4365,7 @@
</span><span class="cx">     beginProcessingMediaPlayerCallback();
</span><span class="cx"> 
</span><span class="cx">     invalidateCachedTime();
</span><ins>+    bool wasSeeking = seeking();
</ins><span class="cx"> 
</span><span class="cx">     // 4.8.10.9 step 14 &amp; 15.  Needed if no ReadyState change is associated with the seek.
</span><span class="cx">     if (m_seeking &amp;&amp; m_readyState &gt;= HAVE_CURRENT_DATA &amp;&amp; !m_player-&gt;seeking())
</span><span class="lines">@@ -4402,7 +4403,8 @@
</span><span class="cx">             if (!m_sentEndEvent) {
</span><span class="cx">                 m_sentEndEvent = true;
</span><span class="cx">                 scheduleEvent(eventNames().endedEvent);
</span><del>-                m_mediaSession-&gt;addBehaviorRestriction(MediaElementSession::RequireUserGestureToControlControlsManager | MediaElementSession::RequirePlaybackToControlControlsManager);
</del><ins>+                if (!wasSeeking)
+                    addBehaviorRestrictionsOnEndIfNecessary();
</ins><span class="cx">             }
</span><span class="cx">             // If the media element has a current media controller, then report the controller state
</span><span class="cx">             // for the media element's current media controller.
</span><span class="lines">@@ -4423,7 +4425,8 @@
</span><span class="cx">             if (!m_sentEndEvent &amp;&amp; m_player &amp;&amp; m_player-&gt;ended()) {
</span><span class="cx">                 m_sentEndEvent = true;
</span><span class="cx">                 scheduleEvent(eventNames().endedEvent);
</span><del>-                m_mediaSession-&gt;addBehaviorRestriction(MediaElementSession::RequireUserGestureToControlControlsManager | MediaElementSession::RequirePlaybackToControlControlsManager);
</del><ins>+                if (!wasSeeking)
+                    addBehaviorRestrictionsOnEndIfNecessary();
</ins><span class="cx">                 m_paused = true;
</span><span class="cx">                 setPlaying(false);
</span><span class="cx">             }
</span><span class="lines">@@ -4436,6 +4439,14 @@
</span><span class="cx">     endProcessingMediaPlayerCallback();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void HTMLMediaElement::addBehaviorRestrictionsOnEndIfNecessary()
+{
+    if (isFullscreen())
+        return;
+
+    m_mediaSession-&gt;addBehaviorRestriction(MediaElementSession::RequirePlaybackToControlControlsManager | MediaElementSession::RequireUserGestureToControlControlsManager);
+}
+
</ins><span class="cx"> void HTMLMediaElement::mediaPlayerVolumeChanged(MediaPlayer*)
</span><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;HTMLMediaElement::mediaPlayerVolumeChanged(%p)&quot;, this);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (204988 => 204989)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-08-25 21:59:54 UTC (rev 204988)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-08-25 22:01:07 UTC (rev 204989)
</span><span class="lines">@@ -794,6 +794,8 @@
</span><span class="cx">     void updateUsesLTRUserInterfaceLayoutDirectionJSProperty();
</span><span class="cx">     void setControllerJSProperty(const char*, JSC::JSValue);
</span><span class="cx"> 
</span><ins>+    void addBehaviorRestrictionsOnEndIfNecessary();
+
</ins><span class="cx">     Timer m_pendingActionTimer;
</span><span class="cx">     Timer m_progressEventTimer;
</span><span class="cx">     Timer m_playbackProgressTimer;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaElementSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (204988 => 204989)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaElementSession.cpp        2016-08-25 21:59:54 UTC (rev 204988)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp        2016-08-25 22:01:07 UTC (rev 204989)
</span><span class="lines">@@ -224,11 +224,6 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (m_element.ended()) {
-        LOG(Media, &quot;MediaElementSession::canControlControlsManager - returning FALSE: Ended&quot;);
-        return false;
-    }
-
</del><span class="cx">     if (m_element.document().activeDOMObjectsAreSuspended()) {
</span><span class="cx">         LOG(Media, &quot;MediaElementSession::canControlControlsManager - returning FALSE: activeDOMObjectsAreSuspended()&quot;);
</span><span class="cx">         return false;
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (204988 => 204989)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-08-25 21:59:54 UTC (rev 204988)
+++ trunk/Tools/ChangeLog        2016-08-25 22:01:07 UTC (rev 204989)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-08-25  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Dragging against the end of the inline media scrubber causes the media scrubber to hide
+        https://bugs.webkit.org/show_bug.cgi?id=161207
+
+        Reviewed by Eric Carlson.
+
+        Tweaks an existing WebKit API test covering this behavior change. After some discussion, rather than hide media
+        controls in this case, we should actually continue showing them. This is because seeking due to user gestures
+        similar to &quot;scrubbing&quot; are indistinguishable from gestures that immediately seek to the end.
+
+        * TestWebKitAPI/Tests/WebKit2Cocoa/VideoControlsManager.mm:
+        (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2016-08-25  Daniel Bates  &lt;dabates@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Watch more things.
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2CocoaVideoControlsManagermm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/VideoControlsManager.mm (204988 => 204989)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/VideoControlsManager.mm        2016-08-25 21:59:54 UTC (rev 204988)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/VideoControlsManager.mm        2016-08-25 22:01:07 UTC (rev 204989)
</span><span class="lines">@@ -299,7 +299,7 @@
</span><span class="cx">     TestWebKitAPI::Util::run(&amp;receivedScriptMessage);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TEST(VideoControlsManager, VideoControlsManagerLargeAutoplayingVideoHidesControlsAfterSeekingToEnd)
</del><ins>+TEST(VideoControlsManager, VideoControlsManagerLargeAutoplayingVideoAfterSeekingToEnd)
</ins><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;WKWebViewConfiguration&gt; configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
</span><span class="cx">     configuration.get().mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
</span><span class="lines">@@ -315,8 +315,9 @@
</span><span class="cx">     }]);
</span><span class="cx">     [[configuration userContentController] addScriptMessageHandler:onloadHandler.get() name:@&quot;onloadHandler&quot;];
</span><span class="cx"> 
</span><del>-    // Since the video has ended, the expectation is NO.
-    [handler setExpectedToHaveControlsManager:NO];
</del><ins>+    // We expect there to be media controls, since this is a user gestured seek to the end.
+    // This is akin to seeking to the end by scrubbing in the controls.
+    [handler setExpectedToHaveControlsManager:YES];
</ins><span class="cx">     NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@&quot;large-video-hides-controls-after-seek-to-end&quot; withExtension:@&quot;html&quot; subdirectory:@&quot;TestWebKitAPI.resources&quot;]];
</span><span class="cx">     [webView loadRequest:request];
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>