<!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>[226150] 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/226150">226150</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2017-12-19 15:16:09 -0800 (Tue, 19 Dec 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Playing media elements which call "pause(); play()" will have the play promise rejected.
https://bugs.webkit.org/show_bug.cgi?id=180781
<rdar://problem/33191377>

Reviewed by Eric Carlson.

Source/WebCore:

Follow-up to address failing iOS API tests. Rather than skipping the call to
prepareForLoad() in the case where media elements are not allowed to load data,
unconditionally call prepareForLoad(), but conditionally call selectMediaResource() inside
that function only if the media elemnet is allowed to load. This ensures that the
MediaPlayer is created when play(), pause(), or load() are called during a user gesture
later, and selectMediaResource() (which depends on having a non-null m_player) is called.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::parseAttribute):
(WebCore::HTMLMediaElement::insertedIntoAncestor):
(WebCore::HTMLMediaElement::load):
(WebCore::HTMLMediaElement::prepareForLoad):
(WebCore::HTMLMediaElement::playInternal):

Source/WebKit:

shouldRequireUserGestureToLoadVideo() should default to false on Mac.

* UIProcess/API/Cocoa/WKWebView.mm:
(shouldRequireUserGestureToLoadVideo):

Source/WebKitLegacy/mac:

shouldRequireUserGestureToLoadVideo() should default to false on Mac.

* WebView/WebView.mm:
(shouldRequireUserGestureToLoadVideo):

LayoutTests:

* media/video-load-require-user-gesture.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsmediavideoloadrequireusergesturehtml">trunk/LayoutTests/media/video-load-require-user-gesture.html</a></li>
<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="#trunkSourceWebCorepageSettingsDefaultValuesh">trunk/Source/WebCore/page/SettingsDefaultValues.h</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitUIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKitLegacymacChangeLog">trunk/Source/WebKitLegacy/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitLegacymacWebViewWebViewmm">trunk/Source/WebKitLegacy/mac/WebView/WebView.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/LayoutTests/ChangeLog 2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2017-12-19  Jer Noble  <jer.noble@apple.com>
+
+        Playing media elements which call "pause(); play()" will have the play promise rejected.
+        https://bugs.webkit.org/show_bug.cgi?id=180781
+        <rdar://problem/33191377>
+
+        Reviewed by Eric Carlson.
+
+        * media/video-load-require-user-gesture.html:
+
</ins><span class="cx"> 2017-12-19  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         scopeURL should start with the provided scriptURL
</span></span></pre></div>
<a id="trunkLayoutTestsmediavideoloadrequireusergesturehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/media/video-load-require-user-gesture.html (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/video-load-require-user-gesture.html     2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/LayoutTests/media/video-load-require-user-gesture.html        2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -6,8 +6,10 @@
</span><span class="cx">             var state = 0;
</span><span class="cx">             var userGestureInitiated = 0;
</span><span class="cx"> 
</span><del>-            if (window.internals) 
</del><ins>+            if (window.internals) {
</ins><span class="cx">                 window.internals.settings.setVideoPlaybackRequiresUserGesture(true);
</span><ins>+                window.internals.settings.setRequiresUserGestureToLoadVideo(true);
+            }
</ins><span class="cx"> 
</span><span class="cx">             function finishTest(success)
</span><span class="cx">             {
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/Source/WebCore/ChangeLog      2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2017-12-19  Jer Noble  <jer.noble@apple.com>
+
+        Playing media elements which call "pause(); play()" will have the play promise rejected.
+        https://bugs.webkit.org/show_bug.cgi?id=180781
+        <rdar://problem/33191377>
+
+        Reviewed by Eric Carlson.
+
+        Follow-up to address failing iOS API tests. Rather than skipping the call to
+        prepareForLoad() in the case where media elements are not allowed to load data,
+        unconditionally call prepareForLoad(), but conditionally call selectMediaResource() inside
+        that function only if the media elemnet is allowed to load. This ensures that the
+        MediaPlayer is created when play(), pause(), or load() are called during a user gesture
+        later, and selectMediaResource() (which depends on having a non-null m_player) is called.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::parseAttribute):
+        (WebCore::HTMLMediaElement::insertedIntoAncestor):
+        (WebCore::HTMLMediaElement::load):
+        (WebCore::HTMLMediaElement::prepareForLoad):
+        (WebCore::HTMLMediaElement::playInternal):
+
</ins><span class="cx"> 2017-12-19  Timothy Hatcher  <timothy@hatcher.name>
</span><span class="cx"> 
</span><span class="cx">         Build failure in WebGL2 when Video feature is disabled
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp   2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp      2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -835,13 +835,7 @@
</span><span class="cx"> 
</span><span class="cx">         // If a src attribute of a media element is set or changed, the user
</span><span class="cx">         // agent must invoke the media element's media element load algorithm.
</span><del>-#if PLATFORM(IOS)
-        // Note, unless the restriction on requiring user action has been removed,
-        // do not begin downloading data on iOS.
-        if (!value.isNull() && m_mediaSession->dataLoadingPermitted(*this))
-#else
</del><span class="cx">         if (!value.isNull())
</span><del>-#endif
</del><span class="cx">             prepareForLoad();
</span><span class="cx">     } else if (name == controlsAttr)
</span><span class="cx">         configureMediaControls();
</span><span class="lines">@@ -918,11 +912,7 @@
</span><span class="cx">     if (insertionType.connectedToDocument) {
</span><span class="cx">         m_inActiveDocument = true;
</span><span class="cx"> 
</span><del>-#if PLATFORM(IOS)
-        if (m_networkState == NETWORK_EMPTY && !attributeWithoutSynchronization(srcAttr).isEmpty() && m_mediaSession->dataLoadingPermitted(*this))
-#else
</del><span class="cx">         if (m_networkState == NETWORK_EMPTY && !attributeWithoutSynchronization(srcAttr).isEmpty())
</span><del>-#endif
</del><span class="cx">             prepareForLoad();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1232,8 +1222,6 @@
</span><span class="cx"> 
</span><span class="cx">     INFO_LOG(LOGIDENTIFIER);
</span><span class="cx"> 
</span><del>-    if (!m_mediaSession->dataLoadingPermitted(*this))
-        return;
</del><span class="cx">     if (processingUserGestureForMedia())
</span><span class="cx">         removeBehaviorsRestrictionsAfterFirstUserGesture();
</span><span class="cx"> 
</span><span class="lines">@@ -1342,7 +1330,10 @@
</span><span class="cx">     mediaSession().clientWillBeginAutoplaying();
</span><span class="cx"> 
</span><span class="cx">     // 9 - Invoke the media element's resource selection algorithm.
</span><del>-    selectMediaResource();
</del><ins>+    // Note, unless the restriction on requiring user action has been removed,
+    // do not begin downloading data.
+    if (m_mediaSession->dataLoadingPermitted(*this))
+        selectMediaResource();
</ins><span class="cx"> 
</span><span class="cx">     // 10 - Note: Playback of any previously playing media resource for this element stops.
</span><span class="cx"> 
</span><span class="lines">@@ -3451,7 +3442,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!m_mediaSession->clientWillBeginPlayback()) {
</span><span class="cx">         ALWAYS_LOG(LOGIDENTIFIER, "  returning because of interruption");
</span><del>-        return; // Treat as success because we will begin playback on cessation of the interruption.
</del><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 4.8.10.9. Playing the media resource
</span></span></pre></div>
<a id="trunkSourceWebCorepageSettingsDefaultValuesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/SettingsDefaultValues.h (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/SettingsDefaultValues.h        2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/Source/WebCore/page/SettingsDefaultValues.h   2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -70,6 +70,7 @@
</span><span class="cx"> static const bool defaultScrollingTreeIncludesFrames = true;
</span><span class="cx"> static const bool defaultMediaControlsScaleWithPageZoom = true;
</span><span class="cx"> static const bool defaultQuickTimePluginReplacementEnabled = true;
</span><ins>+static const bool defaultRequiresUserGestureToLoadVideo = true;
</ins><span class="cx"> #else
</span><span class="cx"> static const bool defaultFixedBackgroundsPaintRelativeToDocument = false;
</span><span class="cx"> static const bool defaultAcceleratedCompositingForFixedPositionEnabled = false;
</span><span class="lines">@@ -83,9 +84,9 @@
</span><span class="cx"> static const bool defaultScrollingTreeIncludesFrames = false;
</span><span class="cx"> static const bool defaultMediaControlsScaleWithPageZoom = true;
</span><span class="cx"> static const bool defaultQuickTimePluginReplacementEnabled = false;
</span><ins>+static const bool defaultRequiresUserGestureToLoadVideo = false;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-static const bool defaultRequiresUserGestureToLoadVideo = true;
</del><span class="cx"> static const bool defaultAllowsPictureInPictureMediaPlayback = true;
</span><span class="cx"> 
</span><span class="cx"> static const double defaultIncrementalRenderingSuppressionTimeoutInSeconds = 5;
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/Source/WebKit/ChangeLog       2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-12-19  Jer Noble  <jer.noble@apple.com>
+
+        Playing media elements which call "pause(); play()" will have the play promise rejected.
+        https://bugs.webkit.org/show_bug.cgi?id=180781
+        <rdar://problem/33191377>
+
+        Reviewed by Eric Carlson.
+
+        shouldRequireUserGestureToLoadVideo() should default to false on Mac.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (shouldRequireUserGestureToLoadVideo):
+
</ins><span class="cx"> 2017-12-19  Chris Dumez  <cdumez@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Handle Fetch should wait for the service worker's state to become activated
</span></span></pre></div>
<a id="trunkSourceWebKitUIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm     2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm        2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -430,7 +430,7 @@
</span><span class="cx">     static bool shouldRequireUserGestureToLoadVideo = dyld_get_program_sdk_version() >= DYLD_IOS_VERSION_10_0;
</span><span class="cx">     return shouldRequireUserGestureToLoadVideo;
</span><span class="cx"> #else
</span><del>-    return true;
</del><ins>+    return false;
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitLegacymacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKitLegacy/mac/ChangeLog  2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog     2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-12-19  Jer Noble  <jer.noble@apple.com>
+
+        Playing media elements which call "pause(); play()" will have the play promise rejected.
+        https://bugs.webkit.org/show_bug.cgi?id=180781
+        <rdar://problem/33191377>
+
+        Reviewed by Eric Carlson.
+
+        shouldRequireUserGestureToLoadVideo() should default to false on Mac.
+
+        * WebView/WebView.mm:
+        (shouldRequireUserGestureToLoadVideo):
+
</ins><span class="cx"> 2017-12-19  Wenson Hsieh  <wenson_hsieh@apple.com>
</span><span class="cx"> 
</span><span class="cx">         API test WKAttachmentTests.InsertPastedAttributedStringContainingMultipleAttachments is failing on El Capitan and Sierra
</span></span></pre></div>
<a id="trunkSourceWebKitLegacymacWebViewWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKitLegacy/mac/WebView/WebView.mm (226149 => 226150)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKitLegacy/mac/WebView/WebView.mm 2017-12-19 23:13:05 UTC (rev 226149)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebView.mm    2017-12-19 23:16:09 UTC (rev 226150)
</span><span class="lines">@@ -1310,7 +1310,7 @@
</span><span class="cx">     static bool shouldRequireUserGestureToLoadVideo = dyld_get_program_sdk_version() >= DYLD_IOS_VERSION_10_0;
</span><span class="cx">     return shouldRequireUserGestureToLoadVideo;
</span><span class="cx"> #else
</span><del>-    return true;
</del><ins>+    return false;
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>